Merge "Avoid running localeconfig change before SDK 17" into androidx-main
diff --git a/activity/activity-compose/api/1.6.0-beta02.txt b/activity/activity-compose/api/1.6.0-beta02.txt
new file mode 100644
index 0000000..66989c4
--- /dev/null
+++ b/activity/activity-compose/api/1.6.0-beta02.txt
@@ -0,0 +1,40 @@
+// 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);
+  }
+
+  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 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();
+  }
+
+}
+
diff --git a/activity/activity-compose/api/public_plus_experimental_1.6.0-beta02.txt b/activity/activity-compose/api/public_plus_experimental_1.6.0-beta02.txt
new file mode 100644
index 0000000..66989c4
--- /dev/null
+++ b/activity/activity-compose/api/public_plus_experimental_1.6.0-beta02.txt
@@ -0,0 +1,40 @@
+// 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);
+  }
+
+  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 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();
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/activity/activity-compose/api/res-1.6.0-beta02.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to activity/activity-compose/api/res-1.6.0-beta02.txt
diff --git a/activity/activity-compose/api/restricted_1.6.0-beta02.txt b/activity/activity-compose/api/restricted_1.6.0-beta02.txt
new file mode 100644
index 0000000..66989c4
--- /dev/null
+++ b/activity/activity-compose/api/restricted_1.6.0-beta02.txt
@@ -0,0 +1,40 @@
+// 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);
+  }
+
+  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 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();
+  }
+
+}
+
diff --git a/activity/activity-ktx/api/1.6.0-beta02.txt b/activity/activity-ktx/api/1.6.0-beta02.txt
new file mode 100644
index 0000000..822d245
--- /dev/null
+++ b/activity/activity-ktx/api/1.6.0-beta02.txt
@@ -0,0 +1,44 @@
+// 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 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 final class PipHintTrackerKt {
+  }
+
+}
+
+package androidx.activity.contextaware {
+
+  public final class ContextAwareKt {
+    method public static suspend inline <R> Object? withContextAvailable(androidx.activity.contextaware.ContextAware, kotlin.jvm.functions.Function1<? super android.content.Context,? extends R> onContextAvailable, kotlin.coroutines.Continuation<? super R>);
+  }
+
+}
+
+package androidx.activity.result {
+
+  public final class ActivityResultCallerKt {
+    method public static <I, O> androidx.activity.result.ActivityResultLauncher<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, androidx.activity.result.ActivityResultRegistry registry, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+    method public static <I, O> androidx.activity.result.ActivityResultLauncher<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+  }
+
+  public final class ActivityResultKt {
+    method public static operator int component1(androidx.activity.result.ActivityResult);
+    method public static operator android.content.Intent? component2(androidx.activity.result.ActivityResult);
+  }
+
+  public final class ActivityResultLauncherKt {
+    method public static void launch(androidx.activity.result.ActivityResultLauncher<java.lang.Void>, optional androidx.core.app.ActivityOptionsCompat? options);
+    method public static void launchUnit(androidx.activity.result.ActivityResultLauncher<kotlin.Unit>, optional androidx.core.app.ActivityOptionsCompat? options);
+  }
+
+}
+
diff --git a/activity/activity-ktx/api/public_plus_experimental_1.6.0-beta02.txt b/activity/activity-ktx/api/public_plus_experimental_1.6.0-beta02.txt
new file mode 100644
index 0000000..f690f03
--- /dev/null
+++ b/activity/activity-ktx/api/public_plus_experimental_1.6.0-beta02.txt
@@ -0,0 +1,45 @@
+// 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 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 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.contextaware {
+
+  public final class ContextAwareKt {
+    method public static suspend inline <R> Object? withContextAvailable(androidx.activity.contextaware.ContextAware, kotlin.jvm.functions.Function1<? super android.content.Context,? extends R> onContextAvailable, kotlin.coroutines.Continuation<? super R>);
+  }
+
+}
+
+package androidx.activity.result {
+
+  public final class ActivityResultCallerKt {
+    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/health/health-connect-client/api/res-current.txt b/activity/activity-ktx/api/res-1.6.0-beta02.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to activity/activity-ktx/api/res-1.6.0-beta02.txt
diff --git a/activity/activity-ktx/api/restricted_1.6.0-beta02.txt b/activity/activity-ktx/api/restricted_1.6.0-beta02.txt
new file mode 100644
index 0000000..822d245
--- /dev/null
+++ b/activity/activity-ktx/api/restricted_1.6.0-beta02.txt
@@ -0,0 +1,44 @@
+// 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 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 final class PipHintTrackerKt {
+  }
+
+}
+
+package androidx.activity.contextaware {
+
+  public final class ContextAwareKt {
+    method public static suspend inline <R> Object? withContextAvailable(androidx.activity.contextaware.ContextAware, kotlin.jvm.functions.Function1<? super android.content.Context,? extends R> onContextAvailable, kotlin.coroutines.Continuation<? super R>);
+  }
+
+}
+
+package androidx.activity.result {
+
+  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/api/1.6.0-beta02.txt b/activity/activity/api/1.6.0-beta02.txt
new file mode 100644
index 0000000..08fffc8
--- /dev/null
+++ b/activity/activity/api/1.6.0-beta02.txt
@@ -0,0 +1,368 @@
+// 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.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 @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 {
+    ctor public ComponentDialog(android.content.Context context, optional @StyleRes int themeResId);
+    ctor public ComponentDialog(android.content.Context context);
+    method public final androidx.lifecycle.Lifecycle getLifecycle();
+    method public final androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+    method @CallSuper public void onBackPressed();
+  }
+
+  public abstract class OnBackPressedCallback {
+    ctor public OnBackPressedCallback(boolean);
+    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);
+  }
+
+  public final class OnBackPressedDispatcher {
+    ctor public OnBackPressedDispatcher();
+    ctor public OnBackPressedDispatcher(Runnable?);
+    method @MainThread public void addCallback(androidx.activity.OnBackPressedCallback);
+    method @MainThread public void addCallback(androidx.lifecycle.LifecycleOwner, androidx.activity.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);
+  }
+
+  public interface OnBackPressedDispatcherOwner extends androidx.lifecycle.LifecycleOwner {
+    method public androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+  }
+
+  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);
+    method public android.content.Context? peekAvailableContext();
+    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+  }
+
+  public final class ContextAwareHelper {
+    ctor public ContextAwareHelper();
+    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+    method public void clearAvailableContext();
+    method public void dispatchOnContextAvailable(android.content.Context);
+    method public android.content.Context? peekAvailableContext();
+    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+  }
+
+  public interface OnContextAvailableListener {
+    method public void onContextAvailable(android.content.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 interface ActivityResultCallback<O> {
+    method public void onActivityResult(O!);
+  }
+
+  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();
+  }
+
+  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, int);
+    field public static final android.os.Parcelable.Creator<androidx.activity.result.IntentSenderRequest!> CREATOR;
+  }
+
+  public static final class IntentSenderRequest.Builder {
+    ctor public IntentSenderRequest.Builder(android.content.IntentSender);
+    ctor public IntentSenderRequest.Builder(android.app.PendingIntent);
+    method public androidx.activity.result.IntentSenderRequest build();
+    method public androidx.activity.result.IntentSenderRequest.Builder setFillInIntent(android.content.Intent?);
+    method public androidx.activity.result.IntentSenderRequest.Builder setFlags(int, int);
+  }
+
+  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);
+  }
+
+  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 public static final boolean isPhotoPickerAvailable();
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.Companion Companion;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.Companion {
+    method public boolean isPhotoPickerAvailable();
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.ImageAndVideo implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.ImageAndVideo INSTANCE;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.ImageOnly implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.ImageOnly INSTANCE;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.SingleMimeType implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
+    ctor public ActivityResultContracts.PickVisualMedia.SingleMimeType(String mimeType);
+    method public String getMimeType();
+    property public final String mimeType;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.VideoOnly implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VideoOnly INSTANCE;
+  }
+
+  public static sealed interface ActivityResultContracts.PickVisualMedia.VisualMediaType {
+  }
+
+  public static final class ActivityResultContracts.RequestMultiplePermissions extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],java.util.Map<java.lang.String,java.lang.Boolean>> {
+    ctor public ActivityResultContracts.RequestMultiplePermissions();
+    method public android.content.Intent createIntent(android.content.Context context, String![] input);
+    method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.Map<java.lang.String,java.lang.Boolean>>? getSynchronousResult(android.content.Context context, String![] input);
+    method public java.util.Map<java.lang.String,java.lang.Boolean> parseResult(int resultCode, android.content.Intent? intent);
+    field public static final String ACTION_REQUEST_PERMISSIONS = "androidx.activity.result.contract.action.REQUEST_PERMISSIONS";
+    field public static final androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions.Companion Companion;
+    field public static final String EXTRA_PERMISSIONS = "androidx.activity.result.contract.extra.PERMISSIONS";
+    field public static final String EXTRA_PERMISSION_GRANT_RESULTS = "androidx.activity.result.contract.extra.PERMISSION_GRANT_RESULTS";
+  }
+
+  public static final class ActivityResultContracts.RequestMultiplePermissions.Companion {
+  }
+
+  public static final class ActivityResultContracts.RequestPermission extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,java.lang.Boolean> {
+    ctor public ActivityResultContracts.RequestPermission();
+    method public android.content.Intent createIntent(android.content.Context context, String input);
+    method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, String input);
+    method public Boolean parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static final class ActivityResultContracts.StartActivityForResult extends androidx.activity.result.contract.ActivityResultContract<android.content.Intent,androidx.activity.result.ActivityResult> {
+    ctor public ActivityResultContracts.StartActivityForResult();
+    method public android.content.Intent createIntent(android.content.Context context, android.content.Intent input);
+    method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
+    field public static final androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult.Companion Companion;
+    field public static final String EXTRA_ACTIVITY_OPTIONS_BUNDLE = "androidx.activity.result.contract.extra.ACTIVITY_OPTIONS_BUNDLE";
+  }
+
+  public static final class ActivityResultContracts.StartActivityForResult.Companion {
+  }
+
+  public static final class ActivityResultContracts.StartIntentSenderForResult extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.IntentSenderRequest,androidx.activity.result.ActivityResult> {
+    ctor public ActivityResultContracts.StartIntentSenderForResult();
+    method public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.IntentSenderRequest input);
+    method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
+    field public static final String ACTION_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.action.INTENT_SENDER_REQUEST";
+    field public static final androidx.activity.result.contract.ActivityResultContracts.StartIntentSenderForResult.Companion Companion;
+    field public static final String EXTRA_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.extra.INTENT_SENDER_REQUEST";
+    field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
+  }
+
+  public static final class ActivityResultContracts.StartIntentSenderForResult.Companion {
+  }
+
+  public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
+    ctor public ActivityResultContracts.TakePicture();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+    method public final Boolean parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static class ActivityResultContracts.TakePicturePreview extends androidx.activity.result.contract.ActivityResultContract<java.lang.Void,android.graphics.Bitmap> {
+    ctor public ActivityResultContracts.TakePicturePreview();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, Void? input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap>? getSynchronousResult(android.content.Context context, Void? input);
+    method public final android.graphics.Bitmap? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @Deprecated public static class ActivityResultContracts.TakeVideo extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.graphics.Bitmap> {
+    ctor @Deprecated public ActivityResultContracts.TakeVideo();
+    method @Deprecated @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri input);
+    method @Deprecated public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+    method @Deprecated public final android.graphics.Bitmap? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+}
+
diff --git a/activity/activity/api/public_plus_experimental_1.6.0-beta02.txt b/activity/activity/api/public_plus_experimental_1.6.0-beta02.txt
new file mode 100644
index 0000000..08fffc8
--- /dev/null
+++ b/activity/activity/api/public_plus_experimental_1.6.0-beta02.txt
@@ -0,0 +1,368 @@
+// 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.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 @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 {
+    ctor public ComponentDialog(android.content.Context context, optional @StyleRes int themeResId);
+    ctor public ComponentDialog(android.content.Context context);
+    method public final androidx.lifecycle.Lifecycle getLifecycle();
+    method public final androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+    method @CallSuper public void onBackPressed();
+  }
+
+  public abstract class OnBackPressedCallback {
+    ctor public OnBackPressedCallback(boolean);
+    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);
+  }
+
+  public final class OnBackPressedDispatcher {
+    ctor public OnBackPressedDispatcher();
+    ctor public OnBackPressedDispatcher(Runnable?);
+    method @MainThread public void addCallback(androidx.activity.OnBackPressedCallback);
+    method @MainThread public void addCallback(androidx.lifecycle.LifecycleOwner, androidx.activity.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);
+  }
+
+  public interface OnBackPressedDispatcherOwner extends androidx.lifecycle.LifecycleOwner {
+    method public androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+  }
+
+  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);
+    method public android.content.Context? peekAvailableContext();
+    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+  }
+
+  public final class ContextAwareHelper {
+    ctor public ContextAwareHelper();
+    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+    method public void clearAvailableContext();
+    method public void dispatchOnContextAvailable(android.content.Context);
+    method public android.content.Context? peekAvailableContext();
+    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+  }
+
+  public interface OnContextAvailableListener {
+    method public void onContextAvailable(android.content.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 interface ActivityResultCallback<O> {
+    method public void onActivityResult(O!);
+  }
+
+  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();
+  }
+
+  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, int);
+    field public static final android.os.Parcelable.Creator<androidx.activity.result.IntentSenderRequest!> CREATOR;
+  }
+
+  public static final class IntentSenderRequest.Builder {
+    ctor public IntentSenderRequest.Builder(android.content.IntentSender);
+    ctor public IntentSenderRequest.Builder(android.app.PendingIntent);
+    method public androidx.activity.result.IntentSenderRequest build();
+    method public androidx.activity.result.IntentSenderRequest.Builder setFillInIntent(android.content.Intent?);
+    method public androidx.activity.result.IntentSenderRequest.Builder setFlags(int, int);
+  }
+
+  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);
+  }
+
+  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 public static final boolean isPhotoPickerAvailable();
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.Companion Companion;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.Companion {
+    method public boolean isPhotoPickerAvailable();
+  }
+
+  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/health/health-connect-client/api/res-current.txt b/activity/activity/api/res-1.6.0-beta02.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to activity/activity/api/res-1.6.0-beta02.txt
diff --git a/activity/activity/api/restricted_1.6.0-beta02.txt b/activity/activity/api/restricted_1.6.0-beta02.txt
new file mode 100644
index 0000000..75909c6
--- /dev/null
+++ b/activity/activity/api/restricted_1.6.0-beta02.txt
@@ -0,0 +1,367 @@
+// 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.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 @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 {
+    ctor public ComponentDialog(android.content.Context context, optional @StyleRes int themeResId);
+    ctor public ComponentDialog(android.content.Context context);
+    method public final androidx.lifecycle.Lifecycle getLifecycle();
+    method public final androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+    method @CallSuper public void onBackPressed();
+  }
+
+  public abstract class OnBackPressedCallback {
+    ctor public OnBackPressedCallback(boolean);
+    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);
+  }
+
+  public final class OnBackPressedDispatcher {
+    ctor public OnBackPressedDispatcher();
+    ctor public OnBackPressedDispatcher(Runnable?);
+    method @MainThread public void addCallback(androidx.activity.OnBackPressedCallback);
+    method @MainThread public void addCallback(androidx.lifecycle.LifecycleOwner, androidx.activity.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);
+  }
+
+  public interface OnBackPressedDispatcherOwner extends androidx.lifecycle.LifecycleOwner {
+    method public androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+  }
+
+  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);
+    method public android.content.Context? peekAvailableContext();
+    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+  }
+
+  public final class ContextAwareHelper {
+    ctor public ContextAwareHelper();
+    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+    method public void clearAvailableContext();
+    method public void dispatchOnContextAvailable(android.content.Context);
+    method public android.content.Context? peekAvailableContext();
+    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+  }
+
+  public interface OnContextAvailableListener {
+    method public void onContextAvailable(android.content.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 interface ActivityResultCallback<O> {
+    method public void onActivityResult(O!);
+  }
+
+  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();
+  }
+
+  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, int);
+    field public static final android.os.Parcelable.Creator<androidx.activity.result.IntentSenderRequest!> CREATOR;
+  }
+
+  public static final class IntentSenderRequest.Builder {
+    ctor public IntentSenderRequest.Builder(android.content.IntentSender);
+    ctor public IntentSenderRequest.Builder(android.app.PendingIntent);
+    method public androidx.activity.result.IntentSenderRequest build();
+    method public androidx.activity.result.IntentSenderRequest.Builder setFillInIntent(android.content.Intent?);
+    method public androidx.activity.result.IntentSenderRequest.Builder setFlags(int, int);
+  }
+
+  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);
+  }
+
+  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 public static final boolean isPhotoPickerAvailable();
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.Companion Companion;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.Companion {
+    method public boolean isPhotoPickerAvailable();
+  }
+
+  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/lint-baseline.xml b/activity/activity/lint-baseline.xml
deleted file mode 100644
index c307ca2e..0000000
--- a/activity/activity/lint-baseline.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 33 (current min is 14): `android.os.ext.SdkExtensions#getExtensionVersion`"
-        errorLine1="                    getExtensionVersion(Build.VERSION_CODES.R) >= 2"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/activity/result/contract/ActivityResultContracts.kt"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 33 (current min is 14): `android.os.ext.SdkExtensions#getExtensionVersion`"
-        errorLine1="                    getExtensionVersion(Build.VERSION_CODES.R) >= 2"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/activity/result/contract/ActivityResultContracts.kt"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 33 (current min is 19): `android.provider.MediaStore#getPickImagesMaxLimit`"
-        errorLine1="                    require(maxItems &lt;= MediaStore.getPickImagesMaxLimit()) {"
-        errorLine2="                                                   ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/activity/result/contract/ActivityResultContracts.kt"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 33 (current min is 19): `android.provider.MediaStore#getPickImagesMaxLimit`"
-        errorLine1="                MediaStore.getPickImagesMaxLimit()"
-        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/activity/result/contract/ActivityResultContracts.kt"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 33; however, the containing class androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    getExtensionVersion(Build.VERSION_CODES.R) >= 2"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/activity/result/contract/ActivityResultContracts.kt"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 33; however, the containing class androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.Companion is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    getExtensionVersion(Build.VERSION_CODES.R) >= 2"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/activity/result/contract/ActivityResultContracts.kt"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 33; however, the containing class androidx.activity.result.contract.ActivityResultContracts.PickMultipleVisualMedia is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    require(maxItems &lt;= MediaStore.getPickImagesMaxLimit()) {"
-        errorLine2="                                                   ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/activity/result/contract/ActivityResultContracts.kt"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 33; however, the containing class androidx.activity.result.contract.ActivityResultContracts.PickMultipleVisualMedia.Companion is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                MediaStore.getPickImagesMaxLimit()"
-        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/activity/result/contract/ActivityResultContracts.kt"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 33; however, the containing class androidx.activity.ComponentActivity is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mOnBackPressedDispatcher.setOnBackInvokedDispatcher(getOnBackInvokedDispatcher());"
-        errorLine2="                                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/activity/ComponentActivity.java"/>
-    </issue>
-
-</issues>
diff --git a/activity/activity/src/androidTest/java/androidx/activity/ComponentActivityCallbacksTest.kt b/activity/activity/src/androidTest/java/androidx/activity/ComponentActivityCallbacksTest.kt
index cc28abf..39dbf89 100644
--- a/activity/activity/src/androidTest/java/androidx/activity/ComponentActivityCallbacksTest.kt
+++ b/activity/activity/src/androidTest/java/androidx/activity/ComponentActivityCallbacksTest.kt
@@ -306,9 +306,11 @@
     fun onMultiWindowModeChangedWithConfig() {
         with(ActivityScenario.launch(ComponentActivity::class.java)) {
             lateinit var receivedInfo: MultiWindowModeChangedInfo
+            var dispatchCount = 0
 
             val listener = Consumer<MultiWindowModeChangedInfo> { info ->
                 receivedInfo = info
+                dispatchCount++
             }
             lateinit var newConfig: Configuration
             withActivity {
@@ -319,6 +321,7 @@
 
             assertThat(receivedInfo.isInMultiWindowMode).isTrue()
             assertThat(receivedInfo.newConfig).isSameInstanceAs(newConfig)
+            assertThat(dispatchCount).isEqualTo(1)
         }
     }
 
@@ -398,9 +401,11 @@
     fun onPictureInPictureModeChangedWithConfig() {
         with(ActivityScenario.launch(ComponentActivity::class.java)) {
             lateinit var receivedInfo: PictureInPictureModeChangedInfo
+            var dispatchCount = 0
 
             val listener = Consumer<PictureInPictureModeChangedInfo> { info ->
                 receivedInfo = info
+                dispatchCount++
             }
             lateinit var newConfig: Configuration
             withActivity {
@@ -411,6 +416,7 @@
 
             assertThat(receivedInfo.isInPictureInPictureMode).isTrue()
             assertThat(receivedInfo.newConfig).isSameInstanceAs(newConfig)
+            assertThat(dispatchCount).isEqualTo(1)
         }
     }
 
diff --git a/activity/activity/src/main/java/androidx/activity/ComponentActivity.java b/activity/activity/src/main/java/androidx/activity/ComponentActivity.java
index 2e82b9e..3292daa 100644
--- a/activity/activity/src/main/java/androidx/activity/ComponentActivity.java
+++ b/activity/activity/src/main/java/androidx/activity/ComponentActivity.java
@@ -48,6 +48,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.Window;
+import android.window.OnBackInvokedDispatcher;
 
 import androidx.activity.contextaware.ContextAware;
 import androidx.activity.contextaware.ContextAwareHelper;
@@ -61,6 +62,7 @@
 import androidx.activity.result.contract.ActivityResultContract;
 import androidx.annotation.CallSuper;
 import androidx.annotation.ContentView;
+import androidx.annotation.DoNotInline;
 import androidx.annotation.LayoutRes;
 import androidx.annotation.MainThread;
 import androidx.annotation.NonNull;
@@ -254,6 +256,9 @@
     private final CopyOnWriteArrayList<Consumer<PictureInPictureModeChangedInfo>>
             mOnPictureInPictureModeChangedListeners = new CopyOnWriteArrayList<>();
 
+    private boolean mDispatchingOnMultiWindowModeChanged = false;
+    private boolean mDispatchingOnPictureInPictureModeChanged = false;
+
     /**
      * Default constructor for ComponentActivity. All Activities must have a default constructor
      * for API 27 and lower devices or when using the default
@@ -358,7 +363,9 @@
         super.onCreate(savedInstanceState);
         ReportFragment.injectIfNeededIn(this);
         if (BuildCompat.isAtLeastT()) {
-            mOnBackPressedDispatcher.setOnBackInvokedDispatcher(getOnBackInvokedDispatcher());
+            mOnBackPressedDispatcher.setOnBackInvokedDispatcher(
+                    Api33Impl.getOnBackInvokedDispatcher(this)
+            );
         }
         if (mContentLayoutId != 0) {
             setContentView(mContentLayoutId);
@@ -943,6 +950,9 @@
         // We specifically do not call super.onMultiWindowModeChanged() to avoid
         // crashing when this method is manually called prior to API 24 (which is
         // when this method was added to the framework)
+        if (mDispatchingOnMultiWindowModeChanged) {
+            return;
+        }
         for (Consumer<MultiWindowModeChangedInfo> listener : mOnMultiWindowModeChangedListeners) {
             listener.accept(new MultiWindowModeChangedInfo(isInMultiWindowMode));
         }
@@ -959,9 +969,15 @@
     @Override
     public void onMultiWindowModeChanged(boolean isInMultiWindowMode,
             @NonNull Configuration newConfig) {
-        // We specifically do not call super.onMultiWindowModeChanged() to avoid
-        // triggering the call to onMultiWindowModeChanged(boolean) which would
-        // send a second callback to listeners without the newConfig
+        mDispatchingOnMultiWindowModeChanged = true;
+        try {
+            // We can unconditionally call super.onMultiWindowModeChanged() here because this
+            // function is marked with RequiresApi, meaning we are always on an API level
+            // where this call is valid.
+            super.onMultiWindowModeChanged(isInMultiWindowMode, newConfig);
+        } finally {
+            mDispatchingOnMultiWindowModeChanged = false;
+        }
         for (Consumer<MultiWindowModeChangedInfo> listener : mOnMultiWindowModeChangedListeners) {
             listener.accept(new MultiWindowModeChangedInfo(isInMultiWindowMode, newConfig));
         }
@@ -994,6 +1010,10 @@
         // We specifically do not call super.onPictureInPictureModeChanged() to avoid
         // crashing when this method is manually called prior to API 24 (which is
         // when this method was added to the framework)
+        if (mDispatchingOnPictureInPictureModeChanged) {
+            return;
+        }
+
         for (Consumer<PictureInPictureModeChangedInfo> listener :
                 mOnPictureInPictureModeChangedListeners) {
             listener.accept(new PictureInPictureModeChangedInfo(isInPictureInPictureMode));
@@ -1011,9 +1031,15 @@
     @Override
     public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode,
             @NonNull Configuration newConfig) {
-        // We specifically do not call super.onPictureInPictureModeChanged() to avoid
-        // triggering the call to onPictureInPictureModeChanged(boolean) which would
-        // send a second callback to listeners without the newConfig
+        mDispatchingOnPictureInPictureModeChanged = true;
+        try {
+            // We can unconditionally call super.onPictureInPictureModeChanged() here because
+            // this function is marked with RequiresApi, meaning we are always on an API level
+            // where this call is valid.
+            super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig);
+        } finally {
+            mDispatchingOnPictureInPictureModeChanged = false;
+        }
         for (Consumer<PictureInPictureModeChangedInfo> listener :
                 mOnPictureInPictureModeChangedListeners) {
             listener.accept(new PictureInPictureModeChangedInfo(
@@ -1069,4 +1095,13 @@
         }
 
     }
+
+    @RequiresApi(Build.VERSION_CODES.TIRAMISU)
+    static class Api33Impl {
+        private Api33Impl() { }
+        @DoNotInline
+        static OnBackInvokedDispatcher getOnBackInvokedDispatcher(Activity activity) {
+            return activity.getOnBackInvokedDispatcher();
+        }
+    }
 }
diff --git a/activity/activity/src/main/java/androidx/activity/OnBackPressedDispatcher.java b/activity/activity/src/main/java/androidx/activity/OnBackPressedDispatcher.java
index e306a9b..10c865e 100644
--- a/activity/activity/src/main/java/androidx/activity/OnBackPressedDispatcher.java
+++ b/activity/activity/src/main/java/androidx/activity/OnBackPressedDispatcher.java
@@ -91,7 +91,7 @@
             if (shouldBeRegistered && !mBackInvokedCallbackRegistered) {
                 Api33Impl.registerOnBackInvokedCallback(
                         mInvokedDispatcher,
-                        OnBackInvokedDispatcher.PRIORITY_OVERLAY,
+                        OnBackInvokedDispatcher.PRIORITY_DEFAULT,
                         mOnBackInvokedCallback
                 );
                 mBackInvokedCallbackRegistered = true;
@@ -127,12 +127,7 @@
                     updateBackInvokedCallbackState();
                 }
             };
-            mOnBackInvokedCallback = new OnBackInvokedCallback() {
-                @Override
-                public void onBackInvoked() {
-                    onBackPressed();
-                }
-            };
+            mOnBackInvokedCallback = Api33Impl.createOnBackInvokedCallback(this::onBackPressed);
         }
     }
 
@@ -331,18 +326,22 @@
 
         @DoNotInline
         static void registerOnBackInvokedCallback(
-                OnBackInvokedDispatcher onBackInvokedDispatcher, int priority,
-                OnBackInvokedCallback onBackInvokedCallback
+                Object dispatcher, int priority, Object callback
         ) {
+            OnBackInvokedDispatcher onBackInvokedDispatcher = (OnBackInvokedDispatcher) dispatcher;
+            OnBackInvokedCallback onBackInvokedCallback = (OnBackInvokedCallback) callback;
             onBackInvokedDispatcher.registerOnBackInvokedCallback(priority, onBackInvokedCallback);
         }
 
         @DoNotInline
-        static void unregisterOnBackInvokedCallback(
-                OnBackInvokedDispatcher onBackInvokedDispatcher,
-                OnBackInvokedCallback onBackInvokedCallback
-        ) {
+        static void unregisterOnBackInvokedCallback(Object dispatcher, Object callback) {
+            OnBackInvokedDispatcher onBackInvokedDispatcher = (OnBackInvokedDispatcher) dispatcher;
+            OnBackInvokedCallback onBackInvokedCallback = (OnBackInvokedCallback) callback;
             onBackInvokedDispatcher.unregisterOnBackInvokedCallback(onBackInvokedCallback);
         }
+        @DoNotInline
+        static OnBackInvokedCallback createOnBackInvokedCallback(Runnable runnable) {
+            return runnable::run;
+        }
     }
 }
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 9ccaffc..a71a414 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
@@ -15,6 +15,7 @@
  */
 package androidx.activity.result.contract
 
+import android.annotation.SuppressLint
 import android.app.Activity
 import android.content.Context
 import android.content.Intent
@@ -33,6 +34,7 @@
 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
+import androidx.annotation.DoNotInline
 import androidx.annotation.RequiresApi
 import androidx.core.content.ContextCompat
 
@@ -620,6 +622,7 @@
              * Check if the current device has support for the photo picker by checking the running
              * Android version or the SDK extension version
              */
+            @SuppressLint("ClassVerificationFailure", "NewApi")
             @JvmStatic
             fun isPhotoPickerAvailable(): Boolean {
                 return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
@@ -737,9 +740,10 @@
             return if (PickVisualMedia.isPhotoPickerAvailable()) {
                 Intent(MediaStore.ACTION_PICK_IMAGES).apply {
                     type = PickVisualMedia.getVisualMimeType(input.mediaType)
-
-                    require(maxItems <= MediaStore.getPickImagesMaxLimit()) {
-                        "Max items must be less or equals MediaStore.getPickImagesMaxLimit()"
+                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+                        require(maxItems <= Api33Impl.getPickImagesMaxLimit()) {
+                            "Max items must be less or equals MediaStore.getPickImagesMaxLimit()"
+                        }
                     }
 
                     putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, maxItems)
@@ -782,11 +786,21 @@
              *
              * @see MediaStore.EXTRA_PICK_IMAGES_MAX
              */
-            internal fun getMaxItems() = if (PickVisualMedia.isPhotoPickerAvailable()) {
-                MediaStore.getPickImagesMaxLimit()
+            internal fun getMaxItems() = if (PickVisualMedia.isPhotoPickerAvailable() &&
+                Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+                Api33Impl.getPickImagesMaxLimit()
             } else {
                 Integer.MAX_VALUE
             }
         }
     }
+
+    @RequiresApi(Build.VERSION_CODES.TIRAMISU)
+    internal object Api33Impl {
+
+        @DoNotInline
+        fun getPickImagesMaxLimit(): Int {
+            return MediaStore.getPickImagesMaxLimit()
+        }
+    }
 }
diff --git a/annotation/annotation-experimental-lint/integration-tests/lint-baseline.xml b/annotation/annotation-experimental-lint/integration-tests/lint-baseline.xml
index 1822def..76be17e 100644
--- a/annotation/annotation-experimental-lint/integration-tests/lint-baseline.xml
+++ b/annotation/annotation-experimental-lint/integration-tests/lint-baseline.xml
@@ -1126,4 +1126,13 @@
             file="src/main/java/sample/optin/UseKtExperimentalFromJava.java"/>
     </issue>
 
+    <issue
+        id="WrongRequiresOptIn"
+        message="Experimental annotation should use kotlin.RequiresOptIn"
+        errorLine1="annotation class ExperimentalKotlinAnnotationWrongAnnotation"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/ExperimentalKotlinAnnotationWrongAnnotation.kt"/>
+    </issue>
+
 </issues>
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/ExperimentalKotlinAnnotationWrongAnnotation.kt b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/ExperimentalKotlinAnnotationWrongAnnotation.kt
new file mode 100644
index 0000000..722bfcb
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/ExperimentalKotlinAnnotationWrongAnnotation.kt
@@ -0,0 +1,22 @@
+/*
+ * 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 sample.kotlin
+
+@Retention(AnnotationRetention.BINARY)
+@Suppress("unused")
+@androidx.annotation.RequiresOptIn(level = androidx.annotation.RequiresOptIn.Level.ERROR)
+annotation class ExperimentalKotlinAnnotationWrongAnnotation
diff --git a/annotation/annotation-experimental-lint/src/main/java/androidx/annotation/experimental/lint/AnnotationRetentionDetector.kt b/annotation/annotation-experimental-lint/src/main/java/androidx/annotation/experimental/lint/AnnotationRetentionDetector.kt
index 94ec534..50643b2 100644
--- a/annotation/annotation-experimental-lint/src/main/java/androidx/annotation/experimental/lint/AnnotationRetentionDetector.kt
+++ b/annotation/annotation-experimental-lint/src/main/java/androidx/annotation/experimental/lint/AnnotationRetentionDetector.kt
@@ -48,12 +48,18 @@
 
     private inner class AnnotationChecker(val context: JavaContext) : UElementHandler() {
         override fun visitAnnotation(node: UAnnotation) {
-            when (node.qualifiedName) {
+            val annotated = node.uastParent as? UAnnotated ?: return
+            val isKotlin = isKotlin(annotated.sourcePsi)
+            val qualifiedName = node.qualifiedName
+
+            if (isKotlin && qualifiedName == JAVA_REQUIRES_OPT_IN_ANNOTATION) {
+                reportKotlinUsage(annotated)
+            }
+
+            when (qualifiedName) {
                 KOTLIN_EXPERIMENTAL_ANNOTATION, KOTLIN_REQUIRES_OPT_IN_ANNOTATION,
                 JAVA_EXPERIMENTAL_ANNOTATION, JAVA_REQUIRES_OPT_IN_ANNOTATION -> {
-                    (node.uastParent as? UAnnotated)?.let { annotated ->
-                        validateAnnotationRetention(annotated)
-                    }
+                    validateAnnotationRetention(annotated)
                 }
             }
         }
@@ -88,7 +94,7 @@
             }?.extractAttribute(context, "value") ?: defaultRetention
 
             if (expectedRetention != actualRetention) {
-                report(
+                reportRetention(
                     annotated,
                     formatRetention(expectedRetention, defaultRetention),
                     formatRetention(actualRetention, defaultRetention),
@@ -108,16 +114,39 @@
          * Reports an issue with the [annotated] element where the [expected] retention does not
          * match the [actual] retention.
          */
-        private fun report(annotated: UAnnotated, expected: String, actual: String) {
+        private fun reportRetention(annotated: UAnnotated, expected: String, actual: String) {
             context.report(
-                ISSUE, annotated, context.getNameLocation(annotated),
+                ISSUE_RETENTION, annotated, context.getNameLocation(annotated),
                 "Experimental annotation has $actual retention, should use $expected"
             )
         }
+
+        /**
+         * Reports an issue with the [annotated] element where the experimental meta-annotation
+         * should be changed to `kotlin.RequiresOptIn`.
+         */
+        private fun reportKotlinUsage(annotated: UAnnotated) {
+            context.report(
+                ISSUE_KOTLIN_USAGE, annotated, context.getNameLocation(annotated),
+                "Experimental annotation should use kotlin.RequiresOptIn"
+            )
+        }
     }
 
     companion object {
-        val ISSUE = Issue.create(
+        val ISSUE_KOTLIN_USAGE = Issue.create(
+            "WrongRequiresOptIn",
+            "Experimental annotations defined in Kotlin must use kotlin.RequiresOptIn",
+            """
+            Experimental features defined in Kotlin source code must be annotated with the Kotlin
+            `@RequiresOptIn` annotation. Using `androidx.annotation.RequiresOptIn` will prevent the
+            Kotlin compiler from enforcing its opt-in policies.
+            """,
+            Category.CORRECTNESS, 4, Severity.ERROR,
+            Implementation(AnnotationRetentionDetector::class.java, Scope.JAVA_FILE_SCOPE)
+        )
+
+        val ISSUE_RETENTION = Issue.create(
             "ExperimentalAnnotationRetention",
             "Experimental annotation with incorrect retention",
             "Experimental annotations defined in Java source should use default " +
@@ -126,6 +155,11 @@
             Category.CORRECTNESS, 5, Severity.ERROR,
             Implementation(AnnotationRetentionDetector::class.java, Scope.JAVA_FILE_SCOPE)
         )
+
+        val ISSUES = listOf(
+            ISSUE_RETENTION,
+            ISSUE_KOTLIN_USAGE
+        )
     }
 }
 
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 83bc43f..0f6ff59 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
@@ -24,7 +24,7 @@
 class ExperimentalIssueRegistry : IssueRegistry() {
     override val minApi = CURRENT_API
     override val api = 13
-    override val issues get() = ExperimentalDetector.ISSUES + AnnotationRetentionDetector.ISSUE
+    override val issues get() = ExperimentalDetector.ISSUES + AnnotationRetentionDetector.ISSUES
     override val vendor = Vendor(
         feedbackUrl = "https://issuetracker.google.com/issues/new?component=459778",
         identifier = "androidx.annotation.experimental",
diff --git a/annotation/annotation-experimental-lint/src/test/kotlin/androidx/annotation/experimental/lint/AnnotationRetentionDetectorTest.kt b/annotation/annotation-experimental-lint/src/test/kotlin/androidx/annotation/experimental/lint/AnnotationRetentionDetectorTest.kt
index d08a07d..f6ee76c 100644
--- a/annotation/annotation-experimental-lint/src/test/kotlin/androidx/annotation/experimental/lint/AnnotationRetentionDetectorTest.kt
+++ b/annotation/annotation-experimental-lint/src/test/kotlin/androidx/annotation/experimental/lint/AnnotationRetentionDetectorTest.kt
@@ -35,7 +35,7 @@
                 RequiresOptInDetectorTest.ANDROIDX_OPT_IN_KT,
                 *testFiles
             )
-            .issues(AnnotationRetentionDetector.ISSUE)
+            .issues(*AnnotationRetentionDetector.ISSUES.toTypedArray())
             .run()
     }
 
@@ -78,4 +78,26 @@
 
         check(*input).expect(expected)
     }
+
+    /**
+     * Test for lint check that discourages the use of Java-style opt-in on Kotlin-sourced
+     * annotations.
+     */
+    @Test
+    fun wrongRequiresOptInAnnotation() {
+        val input = arrayOf(
+            ktSample("sample.kotlin.ExperimentalKotlinAnnotationWrongAnnotation"),
+        )
+
+        /* ktlint-disable max-line-length */
+        val expected = """
+src/sample/kotlin/ExperimentalKotlinAnnotationWrongAnnotation.kt:22: Error: Experimental annotation should use kotlin.RequiresOptIn [WrongRequiresOptIn]
+annotation class ExperimentalKotlinAnnotationWrongAnnotation
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+1 errors, 0 warnings
+        """.trimIndent()
+        /* ktlint-enable max-line-length */
+
+        check(*input).expect(expected)
+    }
 }
\ No newline at end of file
diff --git a/annotation/annotation/api/1.5.0-beta01.txt b/annotation/annotation/api/1.5.0-beta01.txt
new file mode 100644
index 0000000..262ddb2
--- /dev/null
+++ b/annotation/annotation/api/1.5.0-beta01.txt
@@ -0,0 +1,356 @@
+// Signature format: 4.0
+package androidx.annotation {
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface AnimRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface AnimatorRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface AnyRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) public @interface AnyThread {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface ArrayRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface AttrRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) public @interface BinderThread {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface BoolRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER}) public @interface CallSuper {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER}) public @interface CheckResult {
+    method public abstract String suggest() default "";
+    property public abstract String suggest;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.FIELD}) public @interface ChecksSdkIntAtLeast {
+    method public abstract int api() default -1;
+    method public abstract String codename() default "";
+    method public abstract int lambda() default -1;
+    method public abstract int parameter() default -1;
+    property public abstract int api;
+    property public abstract String codename;
+    property public abstract int lambda;
+    property public abstract int parameter;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.FIELD}) public @interface ColorInt {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.FIELD}) public @interface ColorLong {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface ColorRes {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CONSTRUCTOR) public @interface ContentView {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.CONSTRUCTOR}) public @interface DeprecatedSinceApi {
+    method public abstract int api();
+    method public abstract String message() default "";
+    property public abstract int api;
+    property public abstract String message;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface DimenRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS}) public @interface Dimension {
+    method public abstract int unit() default androidx.annotation.Dimension.PX;
+    property public abstract int unit;
+    field public static final androidx.annotation.Dimension.Companion Companion;
+    field public static final int DP = 0; // 0x0
+    field public static final int PX = 1; // 0x1
+    field public static final int SP = 2; // 0x2
+  }
+
+  public static final class Dimension.Companion {
+    field public static final int DP = 0; // 0x0
+    field public static final int PX = 1; // 0x1
+    field public static final int SP = 2; // 0x2
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS}) public @interface Discouraged {
+    method public abstract String message();
+    property public abstract String message;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD}) public @interface DisplayContext {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER}) public @interface DoNotInline {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface DrawableRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface EmptySuper {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS}) public @interface FloatRange {
+    method public abstract double from() default java.lang.Double.NEGATIVE_INFINITY;
+    method public abstract boolean fromInclusive() default true;
+    method public abstract double to() default java.lang.Double.POSITIVE_INFINITY;
+    method public abstract boolean toInclusive() default true;
+    property public abstract double from;
+    property public abstract boolean fromInclusive;
+    property public abstract double to;
+    property public abstract boolean toInclusive;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface FontRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface FractionRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.FIELD}) public @interface GravityInt {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER}) public @interface GuardedBy {
+    method public abstract String value();
+    property public abstract String value;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.FIELD}) public @interface HalfFloat {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface IdRes {
+  }
+
+  @Deprecated @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER}) public @interface InspectableProperty {
+    method @Deprecated public abstract int attributeId() default 0;
+    method @Deprecated public abstract androidx.annotation.InspectableProperty.EnumEntry[] enumMapping();
+    method @Deprecated public abstract androidx.annotation.InspectableProperty.FlagEntry[] flagMapping();
+    method @Deprecated public abstract boolean hasAttributeId() default true;
+    method @Deprecated public abstract String name() default "";
+    method @Deprecated public abstract androidx.annotation.InspectableProperty.ValueType valueType() default androidx.annotation.InspectableProperty.ValueType.INFERRED;
+    property public abstract int attributeId;
+    property public abstract androidx.annotation.InspectableProperty.EnumEntry[] enumMapping;
+    property public abstract androidx.annotation.InspectableProperty.FlagEntry[] flagMapping;
+    property public abstract boolean hasAttributeId;
+    property public abstract String name;
+    property public abstract androidx.annotation.InspectableProperty.ValueType valueType;
+  }
+
+  @Deprecated @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS}) public static @interface InspectableProperty.EnumEntry {
+    method @Deprecated public abstract String name();
+    method @Deprecated public abstract int value();
+    property public abstract String name;
+    property public abstract int value;
+  }
+
+  @Deprecated @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS}) public static @interface InspectableProperty.FlagEntry {
+    method @Deprecated public abstract int mask() default 0;
+    method @Deprecated public abstract String name();
+    method @Deprecated public abstract int target();
+    property public abstract int mask;
+    property public abstract String name;
+    property public abstract int target;
+  }
+
+  @Deprecated public enum InspectableProperty.ValueType {
+    method @Deprecated public static androidx.annotation.InspectableProperty.ValueType valueOf(String name) throws java.lang.IllegalArgumentException;
+    method @Deprecated public static androidx.annotation.InspectableProperty.ValueType[] values();
+    enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType COLOR;
+    enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType GRAVITY;
+    enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType INFERRED;
+    enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType INT_ENUM;
+    enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType INT_FLAG;
+    enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType NONE;
+    enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType RESOURCE_ID;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS) public @interface IntDef {
+    method public abstract boolean flag() default false;
+    method public abstract boolean open() default false;
+    method public abstract int[] value();
+    property public abstract boolean flag;
+    property public abstract boolean open;
+    property public abstract int[] value;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS}) public @interface IntRange {
+    method public abstract long from() default java.lang.Long.MIN_VALUE;
+    method public abstract long to() default java.lang.Long.MAX_VALUE;
+    property public abstract long from;
+    property public abstract long to;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface IntegerRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface InterpolatorRes {
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.PACKAGE, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD}) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FILE, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.FIELD}) public @interface Keep {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface LayoutRes {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS) public @interface LongDef {
+    method public abstract boolean flag() default false;
+    method public abstract boolean open() default false;
+    method public abstract long[] value();
+    property public abstract boolean flag;
+    property public abstract boolean open;
+    property public abstract long[] value;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) public @interface MainThread {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface MenuRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface NavigationRes {
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.PACKAGE}) @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.FILE}) public @interface NonNull {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD}) public @interface NonUiContext {
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.PACKAGE}) @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.FILE}) public @interface Nullable {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CLASS}) public @interface OpenForTesting {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface PluralsRes {
+  }
+
+  @Dimension(unit=androidx.annotation.Dimension.Companion.PX) @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface Px {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface RawRes {
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PACKAGE}) @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FILE}) public @interface RequiresApi {
+    method public abstract int api() default 1;
+    method public abstract int value() default 1;
+    property public abstract int api;
+    property public abstract int value;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR}) public @interface RequiresFeature {
+    method public abstract String enforcement();
+    method public abstract String name();
+    property public abstract String enforcement;
+    property public abstract String name;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) public @interface RequiresPermission {
+    method public abstract String[] allOf();
+    method public abstract String[] anyOf();
+    method public abstract boolean conditional() default false;
+    method public abstract String value() default "";
+    property public abstract String[] allOf;
+    property public abstract String[] anyOf;
+    property public abstract boolean conditional;
+    property public abstract String value;
+  }
+
+  @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) public static @interface RequiresPermission.Read {
+    method public abstract androidx.annotation.RequiresPermission value() default androidx.annotation.RequiresPermission();
+    property public abstract androidx.annotation.RequiresPermission value;
+  }
+
+  @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) public static @interface RequiresPermission.Write {
+    method public abstract androidx.annotation.RequiresPermission value() default androidx.annotation.RequiresPermission();
+    property public abstract androidx.annotation.RequiresPermission value;
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PACKAGE}) @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FILE}) public @interface RestrictTo {
+    method public abstract androidx.annotation.RestrictTo.Scope[] value();
+    property public abstract androidx.annotation.RestrictTo.Scope[] value;
+  }
+
+  public enum RestrictTo.Scope {
+    method public static androidx.annotation.RestrictTo.Scope valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.annotation.RestrictTo.Scope[] values();
+    enum_constant @Deprecated public static final androidx.annotation.RestrictTo.Scope GROUP_ID;
+    enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY;
+    enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY_GROUP;
+    enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY_GROUP_PREFIX;
+    enum_constant public static final androidx.annotation.RestrictTo.Scope SUBCLASSES;
+    enum_constant public static final androidx.annotation.RestrictTo.Scope TESTS;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.CLASS}) public @interface ReturnThis {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS}) public @interface Size {
+    method public abstract long max() default java.lang.Long.MAX_VALUE;
+    method public abstract long min() default java.lang.Long.MIN_VALUE;
+    method public abstract long multiple() default 1;
+    method public abstract long value() default -1;
+    property public abstract long max;
+    property public abstract long min;
+    property public abstract long multiple;
+    property public abstract long value;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS) public @interface StringDef {
+    method public abstract boolean open() default false;
+    method public abstract String[] value();
+    property public abstract boolean open;
+    property public abstract String[] value;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface StringRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface StyleRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface StyleableRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD}) public @interface TransitionRes {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD}) public @interface UiContext {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) public @interface UiThread {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface VisibleForTesting {
+    method public abstract int otherwise() default androidx.annotation.VisibleForTesting.PRIVATE;
+    property public abstract int otherwise;
+    field public static final androidx.annotation.VisibleForTesting.Companion Companion;
+    field public static final int NONE = 5; // 0x5
+    field public static final int PACKAGE_PRIVATE = 3; // 0x3
+    field public static final int PRIVATE = 2; // 0x2
+    field public static final int PROTECTED = 4; // 0x4
+  }
+
+  public static final class VisibleForTesting.Companion {
+    field public static final int NONE = 5; // 0x5
+    field public static final int PACKAGE_PRIVATE = 3; // 0x3
+    field public static final int PRIVATE = 2; // 0x2
+    field public static final int PROTECTED = 4; // 0x4
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) public @interface WorkerThread {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface XmlRes {
+  }
+
+}
+
diff --git a/annotation/annotation/api/public_plus_experimental_1.5.0-beta01.txt b/annotation/annotation/api/public_plus_experimental_1.5.0-beta01.txt
new file mode 100644
index 0000000..262ddb2
--- /dev/null
+++ b/annotation/annotation/api/public_plus_experimental_1.5.0-beta01.txt
@@ -0,0 +1,356 @@
+// Signature format: 4.0
+package androidx.annotation {
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface AnimRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface AnimatorRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface AnyRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) public @interface AnyThread {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface ArrayRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface AttrRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) public @interface BinderThread {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface BoolRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER}) public @interface CallSuper {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER}) public @interface CheckResult {
+    method public abstract String suggest() default "";
+    property public abstract String suggest;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.FIELD}) public @interface ChecksSdkIntAtLeast {
+    method public abstract int api() default -1;
+    method public abstract String codename() default "";
+    method public abstract int lambda() default -1;
+    method public abstract int parameter() default -1;
+    property public abstract int api;
+    property public abstract String codename;
+    property public abstract int lambda;
+    property public abstract int parameter;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.FIELD}) public @interface ColorInt {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.FIELD}) public @interface ColorLong {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface ColorRes {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CONSTRUCTOR) public @interface ContentView {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.CONSTRUCTOR}) public @interface DeprecatedSinceApi {
+    method public abstract int api();
+    method public abstract String message() default "";
+    property public abstract int api;
+    property public abstract String message;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface DimenRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS}) public @interface Dimension {
+    method public abstract int unit() default androidx.annotation.Dimension.PX;
+    property public abstract int unit;
+    field public static final androidx.annotation.Dimension.Companion Companion;
+    field public static final int DP = 0; // 0x0
+    field public static final int PX = 1; // 0x1
+    field public static final int SP = 2; // 0x2
+  }
+
+  public static final class Dimension.Companion {
+    field public static final int DP = 0; // 0x0
+    field public static final int PX = 1; // 0x1
+    field public static final int SP = 2; // 0x2
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS}) public @interface Discouraged {
+    method public abstract String message();
+    property public abstract String message;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD}) public @interface DisplayContext {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER}) public @interface DoNotInline {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface DrawableRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface EmptySuper {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS}) public @interface FloatRange {
+    method public abstract double from() default java.lang.Double.NEGATIVE_INFINITY;
+    method public abstract boolean fromInclusive() default true;
+    method public abstract double to() default java.lang.Double.POSITIVE_INFINITY;
+    method public abstract boolean toInclusive() default true;
+    property public abstract double from;
+    property public abstract boolean fromInclusive;
+    property public abstract double to;
+    property public abstract boolean toInclusive;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface FontRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface FractionRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.FIELD}) public @interface GravityInt {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER}) public @interface GuardedBy {
+    method public abstract String value();
+    property public abstract String value;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.FIELD}) public @interface HalfFloat {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface IdRes {
+  }
+
+  @Deprecated @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER}) public @interface InspectableProperty {
+    method @Deprecated public abstract int attributeId() default 0;
+    method @Deprecated public abstract androidx.annotation.InspectableProperty.EnumEntry[] enumMapping();
+    method @Deprecated public abstract androidx.annotation.InspectableProperty.FlagEntry[] flagMapping();
+    method @Deprecated public abstract boolean hasAttributeId() default true;
+    method @Deprecated public abstract String name() default "";
+    method @Deprecated public abstract androidx.annotation.InspectableProperty.ValueType valueType() default androidx.annotation.InspectableProperty.ValueType.INFERRED;
+    property public abstract int attributeId;
+    property public abstract androidx.annotation.InspectableProperty.EnumEntry[] enumMapping;
+    property public abstract androidx.annotation.InspectableProperty.FlagEntry[] flagMapping;
+    property public abstract boolean hasAttributeId;
+    property public abstract String name;
+    property public abstract androidx.annotation.InspectableProperty.ValueType valueType;
+  }
+
+  @Deprecated @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS}) public static @interface InspectableProperty.EnumEntry {
+    method @Deprecated public abstract String name();
+    method @Deprecated public abstract int value();
+    property public abstract String name;
+    property public abstract int value;
+  }
+
+  @Deprecated @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS}) public static @interface InspectableProperty.FlagEntry {
+    method @Deprecated public abstract int mask() default 0;
+    method @Deprecated public abstract String name();
+    method @Deprecated public abstract int target();
+    property public abstract int mask;
+    property public abstract String name;
+    property public abstract int target;
+  }
+
+  @Deprecated public enum InspectableProperty.ValueType {
+    method @Deprecated public static androidx.annotation.InspectableProperty.ValueType valueOf(String name) throws java.lang.IllegalArgumentException;
+    method @Deprecated public static androidx.annotation.InspectableProperty.ValueType[] values();
+    enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType COLOR;
+    enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType GRAVITY;
+    enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType INFERRED;
+    enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType INT_ENUM;
+    enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType INT_FLAG;
+    enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType NONE;
+    enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType RESOURCE_ID;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS) public @interface IntDef {
+    method public abstract boolean flag() default false;
+    method public abstract boolean open() default false;
+    method public abstract int[] value();
+    property public abstract boolean flag;
+    property public abstract boolean open;
+    property public abstract int[] value;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS}) public @interface IntRange {
+    method public abstract long from() default java.lang.Long.MIN_VALUE;
+    method public abstract long to() default java.lang.Long.MAX_VALUE;
+    property public abstract long from;
+    property public abstract long to;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface IntegerRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface InterpolatorRes {
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.PACKAGE, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD}) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FILE, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.FIELD}) public @interface Keep {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface LayoutRes {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS) public @interface LongDef {
+    method public abstract boolean flag() default false;
+    method public abstract boolean open() default false;
+    method public abstract long[] value();
+    property public abstract boolean flag;
+    property public abstract boolean open;
+    property public abstract long[] value;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) public @interface MainThread {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface MenuRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface NavigationRes {
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.PACKAGE}) @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.FILE}) public @interface NonNull {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD}) public @interface NonUiContext {
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.PACKAGE}) @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.FILE}) public @interface Nullable {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CLASS}) public @interface OpenForTesting {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface PluralsRes {
+  }
+
+  @Dimension(unit=androidx.annotation.Dimension.Companion.PX) @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface Px {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface RawRes {
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PACKAGE}) @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FILE}) public @interface RequiresApi {
+    method public abstract int api() default 1;
+    method public abstract int value() default 1;
+    property public abstract int api;
+    property public abstract int value;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR}) public @interface RequiresFeature {
+    method public abstract String enforcement();
+    method public abstract String name();
+    property public abstract String enforcement;
+    property public abstract String name;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) public @interface RequiresPermission {
+    method public abstract String[] allOf();
+    method public abstract String[] anyOf();
+    method public abstract boolean conditional() default false;
+    method public abstract String value() default "";
+    property public abstract String[] allOf;
+    property public abstract String[] anyOf;
+    property public abstract boolean conditional;
+    property public abstract String value;
+  }
+
+  @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) public static @interface RequiresPermission.Read {
+    method public abstract androidx.annotation.RequiresPermission value() default androidx.annotation.RequiresPermission();
+    property public abstract androidx.annotation.RequiresPermission value;
+  }
+
+  @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) public static @interface RequiresPermission.Write {
+    method public abstract androidx.annotation.RequiresPermission value() default androidx.annotation.RequiresPermission();
+    property public abstract androidx.annotation.RequiresPermission value;
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PACKAGE}) @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FILE}) public @interface RestrictTo {
+    method public abstract androidx.annotation.RestrictTo.Scope[] value();
+    property public abstract androidx.annotation.RestrictTo.Scope[] value;
+  }
+
+  public enum RestrictTo.Scope {
+    method public static androidx.annotation.RestrictTo.Scope valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.annotation.RestrictTo.Scope[] values();
+    enum_constant @Deprecated public static final androidx.annotation.RestrictTo.Scope GROUP_ID;
+    enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY;
+    enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY_GROUP;
+    enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY_GROUP_PREFIX;
+    enum_constant public static final androidx.annotation.RestrictTo.Scope SUBCLASSES;
+    enum_constant public static final androidx.annotation.RestrictTo.Scope TESTS;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.CLASS}) public @interface ReturnThis {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS}) public @interface Size {
+    method public abstract long max() default java.lang.Long.MAX_VALUE;
+    method public abstract long min() default java.lang.Long.MIN_VALUE;
+    method public abstract long multiple() default 1;
+    method public abstract long value() default -1;
+    property public abstract long max;
+    property public abstract long min;
+    property public abstract long multiple;
+    property public abstract long value;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS) public @interface StringDef {
+    method public abstract boolean open() default false;
+    method public abstract String[] value();
+    property public abstract boolean open;
+    property public abstract String[] value;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface StringRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface StyleRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface StyleableRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD}) public @interface TransitionRes {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD}) public @interface UiContext {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) public @interface UiThread {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface VisibleForTesting {
+    method public abstract int otherwise() default androidx.annotation.VisibleForTesting.PRIVATE;
+    property public abstract int otherwise;
+    field public static final androidx.annotation.VisibleForTesting.Companion Companion;
+    field public static final int NONE = 5; // 0x5
+    field public static final int PACKAGE_PRIVATE = 3; // 0x3
+    field public static final int PRIVATE = 2; // 0x2
+    field public static final int PROTECTED = 4; // 0x4
+  }
+
+  public static final class VisibleForTesting.Companion {
+    field public static final int NONE = 5; // 0x5
+    field public static final int PACKAGE_PRIVATE = 3; // 0x3
+    field public static final int PRIVATE = 2; // 0x2
+    field public static final int PROTECTED = 4; // 0x4
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) public @interface WorkerThread {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface XmlRes {
+  }
+
+}
+
diff --git a/annotation/annotation/api/restricted_1.5.0-beta01.txt b/annotation/annotation/api/restricted_1.5.0-beta01.txt
new file mode 100644
index 0000000..262ddb2
--- /dev/null
+++ b/annotation/annotation/api/restricted_1.5.0-beta01.txt
@@ -0,0 +1,356 @@
+// Signature format: 4.0
+package androidx.annotation {
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface AnimRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface AnimatorRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface AnyRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) public @interface AnyThread {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface ArrayRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface AttrRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) public @interface BinderThread {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface BoolRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER}) public @interface CallSuper {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER}) public @interface CheckResult {
+    method public abstract String suggest() default "";
+    property public abstract String suggest;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.FIELD}) public @interface ChecksSdkIntAtLeast {
+    method public abstract int api() default -1;
+    method public abstract String codename() default "";
+    method public abstract int lambda() default -1;
+    method public abstract int parameter() default -1;
+    property public abstract int api;
+    property public abstract String codename;
+    property public abstract int lambda;
+    property public abstract int parameter;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.FIELD}) public @interface ColorInt {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.FIELD}) public @interface ColorLong {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface ColorRes {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CONSTRUCTOR) public @interface ContentView {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.CONSTRUCTOR}) public @interface DeprecatedSinceApi {
+    method public abstract int api();
+    method public abstract String message() default "";
+    property public abstract int api;
+    property public abstract String message;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface DimenRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS}) public @interface Dimension {
+    method public abstract int unit() default androidx.annotation.Dimension.PX;
+    property public abstract int unit;
+    field public static final androidx.annotation.Dimension.Companion Companion;
+    field public static final int DP = 0; // 0x0
+    field public static final int PX = 1; // 0x1
+    field public static final int SP = 2; // 0x2
+  }
+
+  public static final class Dimension.Companion {
+    field public static final int DP = 0; // 0x0
+    field public static final int PX = 1; // 0x1
+    field public static final int SP = 2; // 0x2
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS}) public @interface Discouraged {
+    method public abstract String message();
+    property public abstract String message;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD}) public @interface DisplayContext {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER}) public @interface DoNotInline {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface DrawableRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface EmptySuper {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS}) public @interface FloatRange {
+    method public abstract double from() default java.lang.Double.NEGATIVE_INFINITY;
+    method public abstract boolean fromInclusive() default true;
+    method public abstract double to() default java.lang.Double.POSITIVE_INFINITY;
+    method public abstract boolean toInclusive() default true;
+    property public abstract double from;
+    property public abstract boolean fromInclusive;
+    property public abstract double to;
+    property public abstract boolean toInclusive;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface FontRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface FractionRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.FIELD}) public @interface GravityInt {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER}) public @interface GuardedBy {
+    method public abstract String value();
+    property public abstract String value;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.FIELD}) public @interface HalfFloat {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface IdRes {
+  }
+
+  @Deprecated @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER}) public @interface InspectableProperty {
+    method @Deprecated public abstract int attributeId() default 0;
+    method @Deprecated public abstract androidx.annotation.InspectableProperty.EnumEntry[] enumMapping();
+    method @Deprecated public abstract androidx.annotation.InspectableProperty.FlagEntry[] flagMapping();
+    method @Deprecated public abstract boolean hasAttributeId() default true;
+    method @Deprecated public abstract String name() default "";
+    method @Deprecated public abstract androidx.annotation.InspectableProperty.ValueType valueType() default androidx.annotation.InspectableProperty.ValueType.INFERRED;
+    property public abstract int attributeId;
+    property public abstract androidx.annotation.InspectableProperty.EnumEntry[] enumMapping;
+    property public abstract androidx.annotation.InspectableProperty.FlagEntry[] flagMapping;
+    property public abstract boolean hasAttributeId;
+    property public abstract String name;
+    property public abstract androidx.annotation.InspectableProperty.ValueType valueType;
+  }
+
+  @Deprecated @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS}) public static @interface InspectableProperty.EnumEntry {
+    method @Deprecated public abstract String name();
+    method @Deprecated public abstract int value();
+    property public abstract String name;
+    property public abstract int value;
+  }
+
+  @Deprecated @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS}) public static @interface InspectableProperty.FlagEntry {
+    method @Deprecated public abstract int mask() default 0;
+    method @Deprecated public abstract String name();
+    method @Deprecated public abstract int target();
+    property public abstract int mask;
+    property public abstract String name;
+    property public abstract int target;
+  }
+
+  @Deprecated public enum InspectableProperty.ValueType {
+    method @Deprecated public static androidx.annotation.InspectableProperty.ValueType valueOf(String name) throws java.lang.IllegalArgumentException;
+    method @Deprecated public static androidx.annotation.InspectableProperty.ValueType[] values();
+    enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType COLOR;
+    enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType GRAVITY;
+    enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType INFERRED;
+    enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType INT_ENUM;
+    enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType INT_FLAG;
+    enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType NONE;
+    enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType RESOURCE_ID;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS) public @interface IntDef {
+    method public abstract boolean flag() default false;
+    method public abstract boolean open() default false;
+    method public abstract int[] value();
+    property public abstract boolean flag;
+    property public abstract boolean open;
+    property public abstract int[] value;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS}) public @interface IntRange {
+    method public abstract long from() default java.lang.Long.MIN_VALUE;
+    method public abstract long to() default java.lang.Long.MAX_VALUE;
+    property public abstract long from;
+    property public abstract long to;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface IntegerRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface InterpolatorRes {
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.PACKAGE, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD}) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FILE, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.FIELD}) public @interface Keep {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface LayoutRes {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS) public @interface LongDef {
+    method public abstract boolean flag() default false;
+    method public abstract boolean open() default false;
+    method public abstract long[] value();
+    property public abstract boolean flag;
+    property public abstract boolean open;
+    property public abstract long[] value;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) public @interface MainThread {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface MenuRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface NavigationRes {
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.PACKAGE}) @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.FILE}) public @interface NonNull {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD}) public @interface NonUiContext {
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.PACKAGE}) @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.FILE}) public @interface Nullable {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CLASS}) public @interface OpenForTesting {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface PluralsRes {
+  }
+
+  @Dimension(unit=androidx.annotation.Dimension.Companion.PX) @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface Px {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface RawRes {
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PACKAGE}) @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FILE}) public @interface RequiresApi {
+    method public abstract int api() default 1;
+    method public abstract int value() default 1;
+    property public abstract int api;
+    property public abstract int value;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR}) public @interface RequiresFeature {
+    method public abstract String enforcement();
+    method public abstract String name();
+    property public abstract String enforcement;
+    property public abstract String name;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) public @interface RequiresPermission {
+    method public abstract String[] allOf();
+    method public abstract String[] anyOf();
+    method public abstract boolean conditional() default false;
+    method public abstract String value() default "";
+    property public abstract String[] allOf;
+    property public abstract String[] anyOf;
+    property public abstract boolean conditional;
+    property public abstract String value;
+  }
+
+  @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) public static @interface RequiresPermission.Read {
+    method public abstract androidx.annotation.RequiresPermission value() default androidx.annotation.RequiresPermission();
+    property public abstract androidx.annotation.RequiresPermission value;
+  }
+
+  @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) public static @interface RequiresPermission.Write {
+    method public abstract androidx.annotation.RequiresPermission value() default androidx.annotation.RequiresPermission();
+    property public abstract androidx.annotation.RequiresPermission value;
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PACKAGE}) @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FILE}) public @interface RestrictTo {
+    method public abstract androidx.annotation.RestrictTo.Scope[] value();
+    property public abstract androidx.annotation.RestrictTo.Scope[] value;
+  }
+
+  public enum RestrictTo.Scope {
+    method public static androidx.annotation.RestrictTo.Scope valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.annotation.RestrictTo.Scope[] values();
+    enum_constant @Deprecated public static final androidx.annotation.RestrictTo.Scope GROUP_ID;
+    enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY;
+    enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY_GROUP;
+    enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY_GROUP_PREFIX;
+    enum_constant public static final androidx.annotation.RestrictTo.Scope SUBCLASSES;
+    enum_constant public static final androidx.annotation.RestrictTo.Scope TESTS;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.CLASS}) public @interface ReturnThis {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS}) public @interface Size {
+    method public abstract long max() default java.lang.Long.MAX_VALUE;
+    method public abstract long min() default java.lang.Long.MIN_VALUE;
+    method public abstract long multiple() default 1;
+    method public abstract long value() default -1;
+    property public abstract long max;
+    property public abstract long min;
+    property public abstract long multiple;
+    property public abstract long value;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS) public @interface StringDef {
+    method public abstract boolean open() default false;
+    method public abstract String[] value();
+    property public abstract boolean open;
+    property public abstract String[] value;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface StringRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface StyleRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface StyleableRes {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD}) public @interface TransitionRes {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD}) public @interface UiContext {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) public @interface UiThread {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface VisibleForTesting {
+    method public abstract int otherwise() default androidx.annotation.VisibleForTesting.PRIVATE;
+    property public abstract int otherwise;
+    field public static final androidx.annotation.VisibleForTesting.Companion Companion;
+    field public static final int NONE = 5; // 0x5
+    field public static final int PACKAGE_PRIVATE = 3; // 0x3
+    field public static final int PRIVATE = 2; // 0x2
+    field public static final int PROTECTED = 4; // 0x4
+  }
+
+  public static final class VisibleForTesting.Companion {
+    field public static final int NONE = 5; // 0x5
+    field public static final int PACKAGE_PRIVATE = 3; // 0x3
+    field public static final int PRIVATE = 2; // 0x2
+    field public static final int PROTECTED = 4; // 0x4
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) public @interface WorkerThread {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE}) public @interface XmlRes {
+  }
+
+}
+
diff --git a/appcompat/appcompat-resources/api/1.6.0-beta02.txt b/appcompat/appcompat-resources/api/1.6.0-beta02.txt
new file mode 100644
index 0000000..0d2a788
--- /dev/null
+++ b/appcompat/appcompat-resources/api/1.6.0-beta02.txt
@@ -0,0 +1,57 @@
+// Signature format: 4.0
+package androidx.appcompat.content.res {
+
+  public final class AppCompatResources {
+    method public static android.content.res.ColorStateList! getColorStateList(android.content.Context, @ColorRes int);
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+  }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+  public class AnimatedStateListDrawableCompat extends androidx.appcompat.graphics.drawable.StateListDrawableCompat {
+    ctor public AnimatedStateListDrawableCompat();
+    method public void addState(int[], android.graphics.drawable.Drawable, int);
+    method public <T extends android.graphics.drawable.Drawable & android.graphics.drawable.Animatable> void addTransition(int, int, T, boolean);
+    method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat? create(android.content.Context, @DrawableRes int, android.content.res.Resources.Theme?);
+    method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat createFromXmlInner(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+  }
+
+  public class DrawableContainerCompat extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+    ctor public DrawableContainerCompat();
+    method public void draw(android.graphics.Canvas);
+    method public final android.graphics.drawable.Drawable.ConstantState! getConstantState();
+    method public int getOpacity();
+    method public void invalidateDrawable(android.graphics.drawable.Drawable);
+    method public void scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long);
+    method public void setAlpha(int);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setDither(boolean);
+    method public void setEnterFadeDuration(int);
+    method public void setExitFadeDuration(int);
+    method public void unscheduleDrawable(android.graphics.drawable.Drawable, Runnable);
+  }
+
+  public class DrawableWrapperCompat extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+    ctor public DrawableWrapperCompat(android.graphics.drawable.Drawable!);
+    method public void draw(android.graphics.Canvas!);
+    method public android.graphics.drawable.Drawable? getDrawable();
+    method public int getOpacity();
+    method public void invalidateDrawable(android.graphics.drawable.Drawable!);
+    method public void scheduleDrawable(android.graphics.drawable.Drawable!, Runnable!, long);
+    method public void setAlpha(int);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setDither(boolean);
+    method public void setDrawable(android.graphics.drawable.Drawable?);
+    method public void unscheduleDrawable(android.graphics.drawable.Drawable!, Runnable!);
+  }
+
+  public class StateListDrawableCompat extends androidx.appcompat.graphics.drawable.DrawableContainerCompat {
+    ctor public StateListDrawableCompat();
+    method public void addState(int[]!, android.graphics.drawable.Drawable!);
+    method public void inflate(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+  }
+
+}
+
diff --git a/appcompat/appcompat-resources/api/public_plus_experimental_1.6.0-beta02.txt b/appcompat/appcompat-resources/api/public_plus_experimental_1.6.0-beta02.txt
new file mode 100644
index 0000000..0d2a788
--- /dev/null
+++ b/appcompat/appcompat-resources/api/public_plus_experimental_1.6.0-beta02.txt
@@ -0,0 +1,57 @@
+// Signature format: 4.0
+package androidx.appcompat.content.res {
+
+  public final class AppCompatResources {
+    method public static android.content.res.ColorStateList! getColorStateList(android.content.Context, @ColorRes int);
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+  }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+  public class AnimatedStateListDrawableCompat extends androidx.appcompat.graphics.drawable.StateListDrawableCompat {
+    ctor public AnimatedStateListDrawableCompat();
+    method public void addState(int[], android.graphics.drawable.Drawable, int);
+    method public <T extends android.graphics.drawable.Drawable & android.graphics.drawable.Animatable> void addTransition(int, int, T, boolean);
+    method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat? create(android.content.Context, @DrawableRes int, android.content.res.Resources.Theme?);
+    method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat createFromXmlInner(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+  }
+
+  public class DrawableContainerCompat extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+    ctor public DrawableContainerCompat();
+    method public void draw(android.graphics.Canvas);
+    method public final android.graphics.drawable.Drawable.ConstantState! getConstantState();
+    method public int getOpacity();
+    method public void invalidateDrawable(android.graphics.drawable.Drawable);
+    method public void scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long);
+    method public void setAlpha(int);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setDither(boolean);
+    method public void setEnterFadeDuration(int);
+    method public void setExitFadeDuration(int);
+    method public void unscheduleDrawable(android.graphics.drawable.Drawable, Runnable);
+  }
+
+  public class DrawableWrapperCompat extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+    ctor public DrawableWrapperCompat(android.graphics.drawable.Drawable!);
+    method public void draw(android.graphics.Canvas!);
+    method public android.graphics.drawable.Drawable? getDrawable();
+    method public int getOpacity();
+    method public void invalidateDrawable(android.graphics.drawable.Drawable!);
+    method public void scheduleDrawable(android.graphics.drawable.Drawable!, Runnable!, long);
+    method public void setAlpha(int);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setDither(boolean);
+    method public void setDrawable(android.graphics.drawable.Drawable?);
+    method public void unscheduleDrawable(android.graphics.drawable.Drawable!, Runnable!);
+  }
+
+  public class StateListDrawableCompat extends androidx.appcompat.graphics.drawable.DrawableContainerCompat {
+    ctor public StateListDrawableCompat();
+    method public void addState(int[]!, android.graphics.drawable.Drawable!);
+    method public void inflate(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/appcompat/appcompat-resources/api/res-1.6.0-beta02.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to appcompat/appcompat-resources/api/res-1.6.0-beta02.txt
diff --git a/appcompat/appcompat-resources/api/restricted_1.6.0-beta02.txt b/appcompat/appcompat-resources/api/restricted_1.6.0-beta02.txt
new file mode 100644
index 0000000..d998c06
--- /dev/null
+++ b/appcompat/appcompat-resources/api/restricted_1.6.0-beta02.txt
@@ -0,0 +1,111 @@
+// Signature format: 4.0
+package androidx.appcompat.content.res {
+
+  public final class AppCompatResources {
+    method public static android.content.res.ColorStateList! getColorStateList(android.content.Context, @ColorRes int);
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+  }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+  public class AnimatedStateListDrawableCompat extends androidx.appcompat.graphics.drawable.StateListDrawableCompat implements androidx.core.graphics.drawable.TintAwareDrawable {
+    ctor public AnimatedStateListDrawableCompat();
+    method public void addState(int[], android.graphics.drawable.Drawable, int);
+    method public <T extends android.graphics.drawable.Drawable & android.graphics.drawable.Animatable> void addTransition(int, int, T, boolean);
+    method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat? create(android.content.Context, @DrawableRes int, android.content.res.Resources.Theme?);
+    method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat createFromXmlInner(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+  }
+
+  public class DrawableContainerCompat extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+    ctor public DrawableContainerCompat();
+    method public void draw(android.graphics.Canvas);
+    method public final android.graphics.drawable.Drawable.ConstantState! getConstantState();
+    method public int getOpacity();
+    method public void invalidateDrawable(android.graphics.drawable.Drawable);
+    method public void scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long);
+    method public void setAlpha(int);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setDither(boolean);
+    method public void setEnterFadeDuration(int);
+    method public void setExitFadeDuration(int);
+    method public void unscheduleDrawable(android.graphics.drawable.Drawable, Runnable);
+  }
+
+  public class DrawableWrapperCompat extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+    ctor public DrawableWrapperCompat(android.graphics.drawable.Drawable!);
+    method public void draw(android.graphics.Canvas!);
+    method public android.graphics.drawable.Drawable? getDrawable();
+    method public int getOpacity();
+    method public void invalidateDrawable(android.graphics.drawable.Drawable!);
+    method public void scheduleDrawable(android.graphics.drawable.Drawable!, Runnable!, long);
+    method public void setAlpha(int);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setDither(boolean);
+    method public void setDrawable(android.graphics.drawable.Drawable?);
+    method public void unscheduleDrawable(android.graphics.drawable.Drawable!, Runnable!);
+  }
+
+  public class StateListDrawableCompat extends androidx.appcompat.graphics.drawable.DrawableContainerCompat {
+    ctor public StateListDrawableCompat();
+    method public void addState(int[]!, android.graphics.drawable.Drawable!);
+    method public void inflate(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+  }
+
+}
+
+package androidx.appcompat.widget {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DrawableUtils {
+    method public static boolean canSafelyMutateDrawable(android.graphics.drawable.Drawable);
+    method public static android.graphics.Rect getOpticalBounds(android.graphics.drawable.Drawable);
+    method public static android.graphics.PorterDuff.Mode! parseTintMode(int, android.graphics.PorterDuff.Mode!);
+    field public static final android.graphics.Rect! INSETS_NONE;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ResourceManagerInternal {
+    ctor public ResourceManagerInternal();
+    method public static androidx.appcompat.widget.ResourceManagerInternal! get();
+    method public android.graphics.drawable.Drawable! getDrawable(android.content.Context, @DrawableRes int);
+    method public static android.graphics.PorterDuffColorFilter! getPorterDuffColorFilter(int, android.graphics.PorterDuff.Mode!);
+    method public void onConfigurationChanged(android.content.Context);
+    method public void setHooks(androidx.appcompat.widget.ResourceManagerInternal.ResourceManagerHooks!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface ResourceManagerInternal.ResourceManagerHooks {
+    method public android.graphics.drawable.Drawable? createDrawableFor(androidx.appcompat.widget.ResourceManagerInternal, android.content.Context, @DrawableRes int);
+    method public android.content.res.ColorStateList? getTintListForDrawableRes(android.content.Context, @DrawableRes int);
+    method public android.graphics.PorterDuff.Mode? getTintModeForDrawableRes(int);
+    method public boolean tintDrawable(android.content.Context, @DrawableRes int, android.graphics.drawable.Drawable);
+    method public boolean tintDrawableUsingColorFilter(android.content.Context, @DrawableRes int, android.graphics.drawable.Drawable);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TintContextWrapper extends android.content.ContextWrapper {
+    method public static android.content.Context! wrap(android.content.Context);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TintInfo {
+    ctor public TintInfo();
+    field public boolean mHasTintList;
+    field public boolean mHasTintMode;
+    field public android.content.res.ColorStateList! mTintList;
+    field public android.graphics.PorterDuff.Mode! mTintMode;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class VectorEnabledTintResources extends android.content.res.Resources {
+    ctor public VectorEnabledTintResources(android.content.Context, android.content.res.Resources);
+    method public int getColor(int) throws android.content.res.Resources.NotFoundException;
+    method public android.content.res.ColorStateList! getColorStateList(int) throws android.content.res.Resources.NotFoundException;
+    method public android.graphics.drawable.Drawable! getDrawable(int) throws android.content.res.Resources.NotFoundException;
+    method @RequiresApi(15) public android.graphics.drawable.Drawable! getDrawableForDensity(int, int) throws android.content.res.Resources.NotFoundException;
+    method public android.graphics.Movie! getMovie(int) throws android.content.res.Resources.NotFoundException;
+    method public static boolean isCompatVectorFromResourcesEnabled();
+    method public static void setCompatVectorFromResourcesEnabled(boolean);
+    method public static boolean shouldBeUsed();
+    method public void updateConfiguration(android.content.res.Configuration!, android.util.DisplayMetrics!);
+    field public static final int MAX_SDK_WHERE_REQUIRED = 20; // 0x14
+  }
+
+}
+
diff --git a/appcompat/appcompat/api/1.6.0-beta02.txt b/appcompat/appcompat/api/1.6.0-beta02.txt
new file mode 100644
index 0000000..0219b45
--- /dev/null
+++ b/appcompat/appcompat/api/1.6.0-beta02.txt
@@ -0,0 +1,1063 @@
+// Signature format: 4.0
+package androidx.appcompat.app {
+
+  public abstract class ActionBar {
+    ctor public ActionBar();
+    method public abstract void addOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+    method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!);
+    method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, boolean);
+    method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int);
+    method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int, boolean);
+    method public abstract android.view.View! getCustomView();
+    method public abstract int getDisplayOptions();
+    method public float getElevation();
+    method public abstract int getHeight();
+    method public int getHideOffset();
+    method @Deprecated public abstract int getNavigationItemCount();
+    method @Deprecated public abstract int getNavigationMode();
+    method @Deprecated public abstract int getSelectedNavigationIndex();
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab? getSelectedTab();
+    method public abstract CharSequence? getSubtitle();
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! getTabAt(int);
+    method @Deprecated public abstract int getTabCount();
+    method public android.content.Context! getThemedContext();
+    method public abstract CharSequence? getTitle();
+    method public abstract void hide();
+    method public boolean isHideOnContentScrollEnabled();
+    method public abstract boolean isShowing();
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! newTab();
+    method @Deprecated public abstract void removeAllTabs();
+    method public abstract void removeOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+    method @Deprecated public abstract void removeTab(androidx.appcompat.app.ActionBar.Tab!);
+    method @Deprecated public abstract void removeTabAt(int);
+    method @Deprecated public abstract void selectTab(androidx.appcompat.app.ActionBar.Tab!);
+    method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public abstract void setCustomView(android.view.View!);
+    method public abstract void setCustomView(android.view.View!, androidx.appcompat.app.ActionBar.LayoutParams!);
+    method public abstract void setCustomView(int);
+    method public abstract void setDisplayHomeAsUpEnabled(boolean);
+    method public abstract void setDisplayOptions(int);
+    method public abstract void setDisplayOptions(int, int);
+    method public abstract void setDisplayShowCustomEnabled(boolean);
+    method public abstract void setDisplayShowHomeEnabled(boolean);
+    method public abstract void setDisplayShowTitleEnabled(boolean);
+    method public abstract void setDisplayUseLogoEnabled(boolean);
+    method public void setElevation(float);
+    method public void setHideOffset(int);
+    method public void setHideOnContentScrollEnabled(boolean);
+    method public void setHomeActionContentDescription(CharSequence?);
+    method public void setHomeActionContentDescription(@StringRes int);
+    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable?);
+    method public void setHomeAsUpIndicator(@DrawableRes int);
+    method public void setHomeButtonEnabled(boolean);
+    method public abstract void setIcon(@DrawableRes int);
+    method public abstract void setIcon(android.graphics.drawable.Drawable!);
+    method @Deprecated public abstract void setListNavigationCallbacks(android.widget.SpinnerAdapter!, androidx.appcompat.app.ActionBar.OnNavigationListener!);
+    method public abstract void setLogo(@DrawableRes int);
+    method public abstract void setLogo(android.graphics.drawable.Drawable!);
+    method @Deprecated public abstract void setNavigationMode(int);
+    method @Deprecated public abstract void setSelectedNavigationItem(int);
+    method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable!);
+    method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable!);
+    method public abstract void setSubtitle(CharSequence!);
+    method public abstract void setSubtitle(int);
+    method public abstract void setTitle(CharSequence!);
+    method public abstract void setTitle(@StringRes int);
+    method public abstract void show();
+    field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
+    field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
+    field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
+    field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
+    field public static final int DISPLAY_USE_LOGO = 1; // 0x1
+    field @Deprecated public static final int NAVIGATION_MODE_LIST = 1; // 0x1
+    field @Deprecated public static final int NAVIGATION_MODE_STANDARD = 0; // 0x0
+    field @Deprecated public static final int NAVIGATION_MODE_TABS = 2; // 0x2
+  }
+
+  public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+    ctor public ActionBar.LayoutParams(int, int);
+    ctor public ActionBar.LayoutParams(int, int, int);
+    ctor public ActionBar.LayoutParams(int);
+    ctor public ActionBar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+    ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    field public int gravity;
+  }
+
+  public static interface ActionBar.OnMenuVisibilityListener {
+    method public void onMenuVisibilityChanged(boolean);
+  }
+
+  @Deprecated public static interface ActionBar.OnNavigationListener {
+    method @Deprecated public boolean onNavigationItemSelected(int, long);
+  }
+
+  @Deprecated public abstract static class ActionBar.Tab {
+    ctor @Deprecated public ActionBar.Tab();
+    method @Deprecated public abstract CharSequence! getContentDescription();
+    method @Deprecated public abstract android.view.View! getCustomView();
+    method @Deprecated public abstract android.graphics.drawable.Drawable! getIcon();
+    method @Deprecated public abstract int getPosition();
+    method @Deprecated public abstract Object! getTag();
+    method @Deprecated public abstract CharSequence! getText();
+    method @Deprecated public abstract void select();
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(@StringRes int);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(CharSequence!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(android.view.View!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(int);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(android.graphics.drawable.Drawable!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(@DrawableRes int);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTabListener(androidx.appcompat.app.ActionBar.TabListener!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTag(Object!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(CharSequence!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(int);
+    field @Deprecated public static final int INVALID_POSITION = -1; // 0xffffffff
+  }
+
+  @Deprecated public static interface ActionBar.TabListener {
+    method @Deprecated public void onTabReselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+    method @Deprecated public void onTabSelected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+    method @Deprecated public void onTabUnselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+  }
+
+  public class ActionBarDrawerToggle implements androidx.drawerlayout.widget.DrawerLayout.DrawerListener {
+    ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, @StringRes int, @StringRes int);
+    ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, androidx.appcompat.widget.Toolbar!, @StringRes int, @StringRes int);
+    method public androidx.appcompat.graphics.drawable.DrawerArrowDrawable getDrawerArrowDrawable();
+    method public android.view.View.OnClickListener! getToolbarNavigationClickListener();
+    method public boolean isDrawerIndicatorEnabled();
+    method public boolean isDrawerSlideAnimationEnabled();
+    method public void onConfigurationChanged(android.content.res.Configuration!);
+    method public void onDrawerClosed(android.view.View!);
+    method public void onDrawerOpened(android.view.View!);
+    method public void onDrawerSlide(android.view.View!, float);
+    method public void onDrawerStateChanged(int);
+    method public boolean onOptionsItemSelected(android.view.MenuItem!);
+    method public void setDrawerArrowDrawable(androidx.appcompat.graphics.drawable.DrawerArrowDrawable);
+    method public void setDrawerIndicatorEnabled(boolean);
+    method public void setDrawerSlideAnimationEnabled(boolean);
+    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable!);
+    method public void setHomeAsUpIndicator(int);
+    method public void setToolbarNavigationClickListener(android.view.View.OnClickListener!);
+    method public void syncState();
+  }
+
+  public static interface ActionBarDrawerToggle.Delegate {
+    method public android.content.Context! getActionBarThemedContext();
+    method public android.graphics.drawable.Drawable! getThemeUpIndicator();
+    method public boolean isNavigationVisible();
+    method public void setActionBarDescription(@StringRes int);
+    method public void setActionBarUpIndicator(android.graphics.drawable.Drawable!, @StringRes int);
+  }
+
+  public static interface ActionBarDrawerToggle.DelegateProvider {
+    method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+  }
+
+  public class AlertDialog extends androidx.appcompat.app.AppCompatDialog implements android.content.DialogInterface {
+    ctor protected AlertDialog(android.content.Context);
+    ctor protected AlertDialog(android.content.Context, @StyleRes int);
+    ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener?);
+    method public android.widget.Button! getButton(int);
+    method public android.widget.ListView! getListView();
+    method public void setButton(int, CharSequence!, android.os.Message!);
+    method public void setButton(int, CharSequence!, android.content.DialogInterface.OnClickListener!);
+    method public void setButton(int, CharSequence!, android.graphics.drawable.Drawable!, android.content.DialogInterface.OnClickListener!);
+    method public void setCustomTitle(android.view.View!);
+    method public void setIcon(int);
+    method public void setIcon(android.graphics.drawable.Drawable!);
+    method public void setIconAttribute(int);
+    method public void setMessage(CharSequence!);
+    method public void setView(android.view.View!);
+    method public void setView(android.view.View!, int, int, int, int);
+  }
+
+  public static class AlertDialog.Builder {
+    ctor public AlertDialog.Builder(android.content.Context);
+    ctor public AlertDialog.Builder(android.content.Context, @StyleRes int);
+    method public androidx.appcompat.app.AlertDialog create();
+    method public android.content.Context getContext();
+    method public androidx.appcompat.app.AlertDialog.Builder! setAdapter(android.widget.ListAdapter!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setCancelable(boolean);
+    method public androidx.appcompat.app.AlertDialog.Builder! setCursor(android.database.Cursor!, android.content.DialogInterface.OnClickListener!, String!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setCustomTitle(android.view.View?);
+    method public androidx.appcompat.app.AlertDialog.Builder! setIcon(@DrawableRes int);
+    method public androidx.appcompat.app.AlertDialog.Builder! setIcon(android.graphics.drawable.Drawable?);
+    method public androidx.appcompat.app.AlertDialog.Builder! setIconAttribute(@AttrRes int);
+    method @Deprecated public androidx.appcompat.app.AlertDialog.Builder! setInverseBackgroundForced(boolean);
+    method public androidx.appcompat.app.AlertDialog.Builder! setItems(@ArrayRes int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setItems(CharSequence![]!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMessage(@StringRes int);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMessage(CharSequence?);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(@ArrayRes int, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(CharSequence![]!, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(android.database.Cursor!, String!, String!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButtonIcon(android.graphics.drawable.Drawable!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButtonIcon(android.graphics.drawable.Drawable!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setOnCancelListener(android.content.DialogInterface.OnCancelListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setOnDismissListener(android.content.DialogInterface.OnDismissListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setOnKeyListener(android.content.DialogInterface.OnKeyListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButtonIcon(android.graphics.drawable.Drawable!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(@ArrayRes int, int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.database.Cursor!, int, String!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(CharSequence![]!, int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.widget.ListAdapter!, int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setTitle(@StringRes int);
+    method public androidx.appcompat.app.AlertDialog.Builder! setTitle(CharSequence?);
+    method public androidx.appcompat.app.AlertDialog.Builder! setView(int);
+    method public androidx.appcompat.app.AlertDialog.Builder! setView(android.view.View!);
+    method public androidx.appcompat.app.AlertDialog! show();
+  }
+
+  public class AppCompatActivity extends androidx.fragment.app.FragmentActivity implements androidx.appcompat.app.ActionBarDrawerToggle.DelegateProvider androidx.appcompat.app.AppCompatCallback androidx.lifecycle.LifecycleOwner androidx.core.app.TaskStackBuilder.SupportParentable {
+    ctor public AppCompatActivity();
+    ctor @ContentView public AppCompatActivity(@LayoutRes int);
+    method public androidx.appcompat.app.AppCompatDelegate getDelegate();
+    method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+    method public androidx.appcompat.app.ActionBar? getSupportActionBar();
+    method public android.content.Intent? getSupportParentActivityIntent();
+    method public void onCreateSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+    method protected void onLocalesChanged(androidx.core.os.LocaleListCompat);
+    method public final boolean onMenuItemSelected(int, android.view.MenuItem);
+    method protected void onNightModeChanged(int);
+    method public void onPrepareSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+    method @CallSuper public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode);
+    method @CallSuper public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode);
+    method @Deprecated public void onSupportContentChanged();
+    method public boolean onSupportNavigateUp();
+    method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+    method public void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+    method @Deprecated public void setSupportProgress(int);
+    method @Deprecated public void setSupportProgressBarIndeterminate(boolean);
+    method @Deprecated public void setSupportProgressBarIndeterminateVisibility(boolean);
+    method @Deprecated public void setSupportProgressBarVisibility(boolean);
+    method public androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+    method public void supportInvalidateOptionsMenu();
+    method public void supportNavigateUpTo(android.content.Intent);
+    method public boolean supportRequestWindowFeature(int);
+    method public boolean supportShouldUpRecreateTask(android.content.Intent);
+  }
+
+  public interface AppCompatCallback {
+    method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+    method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+    method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+  }
+
+  public abstract class AppCompatDelegate {
+    method public abstract void addContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+    method public abstract boolean applyDayNight();
+    method @Deprecated public void attachBaseContext(android.content.Context!);
+    method @CallSuper public android.content.Context attachBaseContext2(android.content.Context);
+    method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+    method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Dialog, androidx.appcompat.app.AppCompatCallback?);
+    method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.view.Window, androidx.appcompat.app.AppCompatCallback?);
+    method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+    method public abstract android.view.View! createView(android.view.View?, String!, android.content.Context, android.util.AttributeSet);
+    method public abstract <T extends android.view.View> T! findViewById(@IdRes int);
+    method @AnyThread public static androidx.core.os.LocaleListCompat getApplicationLocales();
+    method public android.content.Context? getContextForDelegate();
+    method public static int getDefaultNightMode();
+    method public abstract androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+    method public int getLocalNightMode();
+    method public abstract android.view.MenuInflater! getMenuInflater();
+    method public abstract androidx.appcompat.app.ActionBar? getSupportActionBar();
+    method public abstract boolean hasWindowFeature(int);
+    method public abstract void installViewFactory();
+    method public abstract void invalidateOptionsMenu();
+    method public static boolean isCompatVectorFromResourcesEnabled();
+    method public abstract boolean isHandleNativeActionModesEnabled();
+    method public abstract void onConfigurationChanged(android.content.res.Configuration!);
+    method public abstract void onCreate(android.os.Bundle!);
+    method public abstract void onDestroy();
+    method public abstract void onPostCreate(android.os.Bundle!);
+    method public abstract void onPostResume();
+    method public abstract void onSaveInstanceState(android.os.Bundle!);
+    method public abstract void onStart();
+    method public abstract void onStop();
+    method public abstract boolean requestWindowFeature(int);
+    method public static void setApplicationLocales(androidx.core.os.LocaleListCompat);
+    method public static void setCompatVectorFromResourcesEnabled(boolean);
+    method public abstract void setContentView(android.view.View!);
+    method public abstract void setContentView(@LayoutRes int);
+    method public abstract void setContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+    method public static void setDefaultNightMode(int);
+    method public abstract void setHandleNativeActionModesEnabled(boolean);
+    method @RequiresApi(17) public abstract void setLocalNightMode(int);
+    method @CallSuper @RequiresApi(33) public void setOnBackInvokedDispatcher(android.window.OnBackInvokedDispatcher?);
+    method public abstract void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+    method public void setTheme(@StyleRes int);
+    method public abstract void setTitle(CharSequence?);
+    method public abstract androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+    field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
+    field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
+    field @Deprecated public static final int MODE_NIGHT_AUTO = 0; // 0x0
+    field public static final int MODE_NIGHT_AUTO_BATTERY = 3; // 0x3
+    field @Deprecated public static final int MODE_NIGHT_AUTO_TIME = 0; // 0x0
+    field public static final int MODE_NIGHT_FOLLOW_SYSTEM = -1; // 0xffffffff
+    field public static final int MODE_NIGHT_NO = 1; // 0x1
+    field public static final int MODE_NIGHT_UNSPECIFIED = -100; // 0xffffff9c
+    field public static final int MODE_NIGHT_YES = 2; // 0x2
+  }
+
+  public class AppCompatDialog extends androidx.activity.ComponentDialog implements androidx.appcompat.app.AppCompatCallback {
+    ctor public AppCompatDialog(android.content.Context);
+    ctor public AppCompatDialog(android.content.Context, int);
+    ctor protected AppCompatDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener?);
+    method public androidx.appcompat.app.AppCompatDelegate getDelegate();
+    method public androidx.appcompat.app.ActionBar! getSupportActionBar();
+    method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+    method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+    method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+    method public boolean supportRequestWindowFeature(int);
+  }
+
+  public class AppCompatDialogFragment extends androidx.fragment.app.DialogFragment {
+    ctor public AppCompatDialogFragment();
+    ctor public AppCompatDialogFragment(@LayoutRes int);
+  }
+
+  public class AppCompatViewInflater {
+    ctor public AppCompatViewInflater();
+    method protected androidx.appcompat.widget.AppCompatAutoCompleteTextView createAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatButton createButton(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatCheckBox createCheckBox(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatCheckedTextView createCheckedTextView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatEditText createEditText(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatImageButton createImageButton(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatImageView createImageView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatMultiAutoCompleteTextView createMultiAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatRadioButton createRadioButton(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatRatingBar createRatingBar(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatSeekBar createSeekBar(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatSpinner createSpinner(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatTextView createTextView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatToggleButton createToggleButton(android.content.Context!, android.util.AttributeSet!);
+    method public final android.view.View? createView(android.view.View?, String, android.content.Context, android.util.AttributeSet, boolean, boolean, boolean, boolean);
+    method protected android.view.View? createView(android.content.Context!, String!, android.util.AttributeSet!);
+  }
+
+  public final class AppLocalesMetadataHolderService extends android.app.Service {
+    ctor public AppLocalesMetadataHolderService();
+    method public static android.content.pm.ServiceInfo getServiceInfo(android.content.Context) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public android.os.IBinder onBind(android.content.Intent);
+  }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+  public class DrawerArrowDrawable extends android.graphics.drawable.Drawable {
+    ctor public DrawerArrowDrawable(android.content.Context!);
+    method public void draw(android.graphics.Canvas!);
+    method public float getArrowHeadLength();
+    method public float getArrowShaftLength();
+    method public float getBarLength();
+    method public float getBarThickness();
+    method @ColorInt public int getColor();
+    method public int getDirection();
+    method public float getGapSize();
+    method public int getOpacity();
+    method public final android.graphics.Paint! getPaint();
+    method @FloatRange(from=0.0, to=1.0) public float getProgress();
+    method public boolean isSpinEnabled();
+    method public void setAlpha(int);
+    method public void setArrowHeadLength(float);
+    method public void setArrowShaftLength(float);
+    method public void setBarLength(float);
+    method public void setBarThickness(float);
+    method public void setColor(@ColorInt int);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setDirection(int);
+    method public void setGapSize(float);
+    method public void setProgress(@FloatRange(from=0.0, to=1.0) float);
+    method public void setSpinEnabled(boolean);
+    method public void setVerticalMirror(boolean);
+    field public static final int ARROW_DIRECTION_END = 3; // 0x3
+    field public static final int ARROW_DIRECTION_LEFT = 0; // 0x0
+    field public static final int ARROW_DIRECTION_RIGHT = 1; // 0x1
+    field public static final int ARROW_DIRECTION_START = 2; // 0x2
+  }
+
+}
+
+package androidx.appcompat.view {
+
+  public abstract class ActionMode {
+    ctor public ActionMode();
+    method public abstract void finish();
+    method public abstract android.view.View! getCustomView();
+    method public abstract android.view.Menu! getMenu();
+    method public abstract android.view.MenuInflater! getMenuInflater();
+    method public abstract CharSequence! getSubtitle();
+    method public Object! getTag();
+    method public abstract CharSequence! getTitle();
+    method public boolean getTitleOptionalHint();
+    method public abstract void invalidate();
+    method public boolean isTitleOptional();
+    method public abstract void setCustomView(android.view.View!);
+    method public abstract void setSubtitle(CharSequence!);
+    method public abstract void setSubtitle(int);
+    method public void setTag(Object!);
+    method public abstract void setTitle(CharSequence!);
+    method public abstract void setTitle(int);
+    method public void setTitleOptionalHint(boolean);
+  }
+
+  public static interface ActionMode.Callback {
+    method public boolean onActionItemClicked(androidx.appcompat.view.ActionMode!, android.view.MenuItem!);
+    method public boolean onCreateActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+    method public void onDestroyActionMode(androidx.appcompat.view.ActionMode!);
+    method public boolean onPrepareActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+  }
+
+  @Deprecated public interface CollapsibleActionView {
+    method @Deprecated public void onActionViewCollapsed();
+    method @Deprecated public void onActionViewExpanded();
+  }
+
+  public class ContextThemeWrapper extends android.content.ContextWrapper {
+    ctor public ContextThemeWrapper();
+    ctor public ContextThemeWrapper(android.content.Context!, @StyleRes int);
+    ctor public ContextThemeWrapper(android.content.Context!, android.content.res.Resources.Theme!);
+    method public void applyOverrideConfiguration(android.content.res.Configuration!);
+    method public int getThemeResId();
+    method protected void onApplyThemeResource(android.content.res.Resources.Theme!, int, boolean);
+  }
+
+}
+
+package androidx.appcompat.widget {
+
+  public class ActionMenuView extends androidx.appcompat.widget.LinearLayoutCompat {
+    ctor public ActionMenuView(android.content.Context);
+    ctor public ActionMenuView(android.content.Context, android.util.AttributeSet?);
+    method public void dismissPopupMenus();
+    method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateDefaultLayoutParams();
+    method public androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+    method public android.view.Menu! getMenu();
+    method public android.graphics.drawable.Drawable? getOverflowIcon();
+    method public int getPopupTheme();
+    method public boolean hideOverflowMenu();
+    method public boolean isOverflowMenuShowing();
+    method public void onConfigurationChanged(android.content.res.Configuration!);
+    method public void onDetachedFromWindow();
+    method public void setOnMenuItemClickListener(androidx.appcompat.widget.ActionMenuView.OnMenuItemClickListener!);
+    method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+    method public void setPopupTheme(@StyleRes int);
+    method public boolean showOverflowMenu();
+  }
+
+  public static class ActionMenuView.LayoutParams extends androidx.appcompat.widget.LinearLayoutCompat.LayoutParams {
+    ctor public ActionMenuView.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public ActionMenuView.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public ActionMenuView.LayoutParams(androidx.appcompat.widget.ActionMenuView.LayoutParams!);
+    ctor public ActionMenuView.LayoutParams(int, int);
+    field public int cellsUsed;
+    field public boolean expandable;
+    field public int extraPixels;
+    field public boolean isOverflowButton;
+    field public boolean preventEdgeOffset;
+  }
+
+  public static interface ActionMenuView.OnMenuItemClickListener {
+    method public boolean onMenuItemClick(android.view.MenuItem!);
+  }
+
+  public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatAutoCompleteTextView(android.content.Context);
+    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+  }
+
+  public class AppCompatButton extends android.widget.Button implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatButton(android.content.Context);
+    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method public void setSupportAllCaps(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+  }
+
+  public class AppCompatCheckBox extends android.widget.CheckBox implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatCheckBox(android.content.Context);
+    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public class AppCompatCheckedTextView extends android.widget.CheckedTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatCheckedTextView(android.content.Context);
+    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context, int);
+  }
+
+  public class AppCompatEditText extends android.widget.EditText implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.OnReceiveContentViewBehavior androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatEditText(android.content.Context);
+    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+  }
+
+  public class AppCompatImageButton extends android.widget.ImageButton implements androidx.core.view.TintableBackgroundView {
+    ctor public AppCompatImageButton(android.content.Context);
+    ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public class AppCompatImageView extends android.widget.ImageView implements androidx.core.view.TintableBackgroundView {
+    ctor public AppCompatImageView(android.content.Context);
+    ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context);
+    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+  }
+
+  public class AppCompatRadioButton extends android.widget.RadioButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatRadioButton(android.content.Context!);
+    ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?);
+    ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public class AppCompatRatingBar extends android.widget.RatingBar {
+    ctor public AppCompatRatingBar(android.content.Context);
+    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+  public class AppCompatSeekBar extends android.widget.SeekBar {
+    ctor public AppCompatSeekBar(android.content.Context);
+    ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+  public class AppCompatSpinner extends android.widget.Spinner implements androidx.core.view.TintableBackgroundView {
+    ctor public AppCompatSpinner(android.content.Context);
+    ctor public AppCompatSpinner(android.content.Context, int);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int, android.content.res.Resources.Theme!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public class AppCompatTextView extends android.widget.TextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatTextView(android.content.Context);
+    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParamsCompat();
+    method public boolean isEmojiCompatEnabled();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method public void setPrecomputedText(androidx.core.text.PrecomputedTextCompat);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+    method public void setTextFuture(java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>?);
+    method public void setTextMetricsParamsCompat(androidx.core.text.PrecomputedTextCompat.Params);
+  }
+
+  public class AppCompatToggleButton extends android.widget.ToggleButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatToggleButton(android.content.Context);
+    ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface EmojiCompatConfigurationView {
+    method public boolean isEmojiCompatEnabled();
+    method public void setEmojiCompatEnabled(boolean);
+  }
+
+  public class LinearLayoutCompat extends android.view.ViewGroup {
+    ctor public LinearLayoutCompat(android.content.Context);
+    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?);
+    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?, int);
+    method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateDefaultLayoutParams();
+    method public androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+    method @androidx.resourceinspection.annotation.Attribute("android:baselineAlignedChildIndex") public int getBaselineAlignedChildIndex();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:divider") public android.graphics.drawable.Drawable! getDividerDrawable();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:dividerPadding") public int getDividerPadding();
+    method @GravityInt @androidx.resourceinspection.annotation.Attribute("android:gravity") public int getGravity();
+    method @androidx.resourceinspection.annotation.Attribute(value="android:orientation", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="horizontal", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="vertical", value=1)}) public int getOrientation();
+    method @androidx.resourceinspection.annotation.Attribute(value="androidx.appcompat:showDividers", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="none", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="beginning", value=1, mask=1), @androidx.resourceinspection.annotation.Attribute.IntMap(name="middle", value=2, mask=2), @androidx.resourceinspection.annotation.Attribute.IntMap(name="end", value=4, mask=4)}) public int getShowDividers();
+    method @androidx.resourceinspection.annotation.Attribute("android:weightSum") public float getWeightSum();
+    method @androidx.resourceinspection.annotation.Attribute("android:baselineAligned") public boolean isBaselineAligned();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:measureWithLargestChild") public boolean isMeasureWithLargestChildEnabled();
+    method public void setBaselineAligned(boolean);
+    method public void setBaselineAlignedChildIndex(int);
+    method public void setDividerDrawable(android.graphics.drawable.Drawable!);
+    method public void setDividerPadding(int);
+    method public void setGravity(@GravityInt int);
+    method public void setHorizontalGravity(int);
+    method public void setMeasureWithLargestChildEnabled(boolean);
+    method public void setOrientation(int);
+    method public void setShowDividers(int);
+    method public void setVerticalGravity(int);
+    method public void setWeightSum(float);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int SHOW_DIVIDER_BEGINNING = 1; // 0x1
+    field public static final int SHOW_DIVIDER_END = 4; // 0x4
+    field public static final int SHOW_DIVIDER_MIDDLE = 2; // 0x2
+    field public static final int SHOW_DIVIDER_NONE = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public static class LinearLayoutCompat.LayoutParams extends android.widget.LinearLayout.LayoutParams {
+    ctor public LinearLayoutCompat.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public LinearLayoutCompat.LayoutParams(int, int);
+    ctor public LinearLayoutCompat.LayoutParams(int, int, float);
+    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+  }
+
+  public class ListPopupWindow {
+    ctor public ListPopupWindow(android.content.Context);
+    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?);
+    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int);
+    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int, @StyleRes int);
+    method public void clearListSelection();
+    method public android.view.View.OnTouchListener! createDragToOpenListener(android.view.View!);
+    method public void dismiss();
+    method public android.view.View? getAnchorView();
+    method @StyleRes public int getAnimationStyle();
+    method public android.graphics.drawable.Drawable? getBackground();
+    method public android.graphics.Rect? getEpicenterBounds();
+    method public int getHeight();
+    method public int getHorizontalOffset();
+    method public int getInputMethodMode();
+    method public android.widget.ListView? getListView();
+    method public int getPromptPosition();
+    method public Object? getSelectedItem();
+    method public long getSelectedItemId();
+    method public int getSelectedItemPosition();
+    method public android.view.View? getSelectedView();
+    method public int getSoftInputMode();
+    method public int getVerticalOffset();
+    method public int getWidth();
+    method public boolean isInputMethodNotNeeded();
+    method public boolean isModal();
+    method public boolean isShowing();
+    method public boolean onKeyDown(int, android.view.KeyEvent);
+    method public boolean onKeyPreIme(int, android.view.KeyEvent);
+    method public boolean onKeyUp(int, android.view.KeyEvent);
+    method public boolean performItemClick(int);
+    method public void postShow();
+    method public void setAdapter(android.widget.ListAdapter?);
+    method public void setAnchorView(android.view.View?);
+    method public void setAnimationStyle(@StyleRes int);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setContentWidth(int);
+    method public void setDropDownGravity(int);
+    method public void setEpicenterBounds(android.graphics.Rect?);
+    method public void setHeight(int);
+    method public void setHorizontalOffset(int);
+    method public void setInputMethodMode(int);
+    method public void setListSelector(android.graphics.drawable.Drawable!);
+    method public void setModal(boolean);
+    method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener?);
+    method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener?);
+    method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener?);
+    method public void setPromptPosition(int);
+    method public void setPromptView(android.view.View?);
+    method public void setSelection(int);
+    method public void setSoftInputMode(int);
+    method public void setVerticalOffset(int);
+    method public void setWidth(int);
+    method public void setWindowLayoutType(int);
+    method public void show();
+    field public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; // 0x0
+    field public static final int INPUT_METHOD_NEEDED = 1; // 0x1
+    field public static final int INPUT_METHOD_NOT_NEEDED = 2; // 0x2
+    field public static final int MATCH_PARENT = -1; // 0xffffffff
+    field public static final int POSITION_PROMPT_ABOVE = 0; // 0x0
+    field public static final int POSITION_PROMPT_BELOW = 1; // 0x1
+    field public static final int WRAP_CONTENT = -2; // 0xfffffffe
+  }
+
+  public class PopupMenu {
+    ctor public PopupMenu(android.content.Context, android.view.View);
+    ctor public PopupMenu(android.content.Context, android.view.View, int);
+    ctor public PopupMenu(android.content.Context, android.view.View, int, @AttrRes int, @StyleRes int);
+    method public void dismiss();
+    method public android.view.View.OnTouchListener getDragToOpenListener();
+    method public int getGravity();
+    method public android.view.Menu getMenu();
+    method public android.view.MenuInflater getMenuInflater();
+    method public void inflate(@MenuRes int);
+    method public void setForceShowIcon(boolean);
+    method public void setGravity(int);
+    method public void setOnDismissListener(androidx.appcompat.widget.PopupMenu.OnDismissListener?);
+    method public void setOnMenuItemClickListener(androidx.appcompat.widget.PopupMenu.OnMenuItemClickListener?);
+    method public void show();
+  }
+
+  public static interface PopupMenu.OnDismissListener {
+    method public void onDismiss(androidx.appcompat.widget.PopupMenu!);
+  }
+
+  public static interface PopupMenu.OnMenuItemClickListener {
+    method public boolean onMenuItemClick(android.view.MenuItem!);
+  }
+
+  public class SearchView extends androidx.appcompat.widget.LinearLayoutCompat implements androidx.appcompat.view.CollapsibleActionView {
+    ctor public SearchView(android.content.Context);
+    ctor public SearchView(android.content.Context, android.util.AttributeSet?);
+    ctor public SearchView(android.content.Context, android.util.AttributeSet?, int);
+    method @androidx.resourceinspection.annotation.Attribute("android:imeOptions") public int getImeOptions();
+    method public int getInputType();
+    method @androidx.resourceinspection.annotation.Attribute("android:maxWidth") public int getMaxWidth();
+    method public CharSequence! getQuery();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:queryHint") public CharSequence? getQueryHint();
+    method public androidx.cursoradapter.widget.CursorAdapter! getSuggestionsAdapter();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:iconifiedByDefault") public boolean isIconfiedByDefault();
+    method public boolean isIconified();
+    method public boolean isQueryRefinementEnabled();
+    method public boolean isSubmitButtonEnabled();
+    method public void onActionViewCollapsed();
+    method public void onActionViewExpanded();
+    method protected void onQueryRefine(CharSequence?);
+    method public void setIconified(boolean);
+    method public void setIconifiedByDefault(boolean);
+    method public void setImeOptions(int);
+    method public void setInputType(int);
+    method public void setMaxWidth(int);
+    method public void setOnCloseListener(androidx.appcompat.widget.SearchView.OnCloseListener!);
+    method public void setOnQueryTextFocusChangeListener(android.view.View.OnFocusChangeListener!);
+    method public void setOnQueryTextListener(androidx.appcompat.widget.SearchView.OnQueryTextListener!);
+    method public void setOnSearchClickListener(android.view.View.OnClickListener!);
+    method public void setOnSuggestionListener(androidx.appcompat.widget.SearchView.OnSuggestionListener!);
+    method public void setQuery(CharSequence!, boolean);
+    method public void setQueryHint(CharSequence?);
+    method public void setQueryRefinementEnabled(boolean);
+    method public void setSearchableInfo(android.app.SearchableInfo!);
+    method public void setSubmitButtonEnabled(boolean);
+    method public void setSuggestionsAdapter(androidx.cursoradapter.widget.CursorAdapter!);
+  }
+
+  public static interface SearchView.OnCloseListener {
+    method public boolean onClose();
+  }
+
+  public static interface SearchView.OnQueryTextListener {
+    method public boolean onQueryTextChange(String!);
+    method public boolean onQueryTextSubmit(String!);
+  }
+
+  public static interface SearchView.OnSuggestionListener {
+    method public boolean onSuggestionClick(int);
+    method public boolean onSuggestionSelect(int);
+  }
+
+  public class ShareActionProvider extends androidx.core.view.ActionProvider {
+    ctor public ShareActionProvider(android.content.Context!);
+    method public android.view.View! onCreateActionView();
+    method public void setOnShareTargetSelectedListener(androidx.appcompat.widget.ShareActionProvider.OnShareTargetSelectedListener!);
+    method public void setShareHistoryFileName(String!);
+    method public void setShareIntent(android.content.Intent!);
+    field public static final String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
+  }
+
+  public static interface ShareActionProvider.OnShareTargetSelectedListener {
+    method public boolean onShareTargetSelected(androidx.appcompat.widget.ShareActionProvider!, android.content.Intent!);
+  }
+
+  public class SwitchCompat extends android.widget.CompoundButton implements androidx.appcompat.widget.EmojiCompatConfigurationView {
+    ctor public SwitchCompat(android.content.Context);
+    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?);
+    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?, int);
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:showText") public boolean getShowText();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:splitTrack") public boolean getSplitTrack();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchMinWidth") public int getSwitchMinWidth();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchPadding") public int getSwitchPadding();
+    method @androidx.resourceinspection.annotation.Attribute("android:textOff") public CharSequence! getTextOff();
+    method @androidx.resourceinspection.annotation.Attribute("android:textOn") public CharSequence! getTextOn();
+    method @androidx.resourceinspection.annotation.Attribute("android:thumb") public android.graphics.drawable.Drawable! getThumbDrawable();
+    method @FloatRange(from=0.0, to=1.0) protected final float getThumbPosition();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTextPadding") public int getThumbTextPadding();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTint") public android.content.res.ColorStateList? getThumbTintList();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTintMode") public android.graphics.PorterDuff.Mode? getThumbTintMode();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:track") public android.graphics.drawable.Drawable! getTrackDrawable();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTint") public android.content.res.ColorStateList? getTrackTintList();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTintMode") public android.graphics.PorterDuff.Mode? getTrackTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void onMeasure(int, int);
+    method public void setEmojiCompatEnabled(boolean);
+    method protected final void setEnforceSwitchWidth(boolean);
+    method public void setShowText(boolean);
+    method public void setSplitTrack(boolean);
+    method public void setSwitchMinWidth(int);
+    method public void setSwitchPadding(int);
+    method public void setSwitchTextAppearance(android.content.Context!, int);
+    method public void setSwitchTypeface(android.graphics.Typeface!, int);
+    method public void setSwitchTypeface(android.graphics.Typeface!);
+    method public void setTextOff(CharSequence!);
+    method public void setTextOn(CharSequence!);
+    method public void setThumbDrawable(android.graphics.drawable.Drawable!);
+    method public void setThumbResource(int);
+    method public void setThumbTextPadding(int);
+    method public void setThumbTintList(android.content.res.ColorStateList?);
+    method public void setThumbTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTrackDrawable(android.graphics.drawable.Drawable!);
+    method public void setTrackResource(int);
+    method public void setTrackTintList(android.content.res.ColorStateList?);
+    method public void setTrackTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface ThemedSpinnerAdapter extends android.widget.SpinnerAdapter {
+    method public android.content.res.Resources.Theme? getDropDownViewTheme();
+    method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+  }
+
+  public static final class ThemedSpinnerAdapter.Helper {
+    ctor public ThemedSpinnerAdapter.Helper(android.content.Context);
+    method public android.view.LayoutInflater getDropDownViewInflater();
+    method public android.content.res.Resources.Theme? getDropDownViewTheme();
+    method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+  }
+
+  public class Toolbar extends android.view.ViewGroup implements androidx.core.view.MenuHost {
+    ctor public Toolbar(android.content.Context);
+    ctor public Toolbar(android.content.Context, android.util.AttributeSet?);
+    ctor public Toolbar(android.content.Context, android.util.AttributeSet?, int);
+    method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider);
+    method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method public void collapseActionView();
+    method public void dismissPopupMenus();
+    method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateDefaultLayoutParams();
+    method public androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseContentDescription") public CharSequence? getCollapseContentDescription();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseIcon") public android.graphics.drawable.Drawable? getCollapseIcon();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEnd") public int getContentInsetEnd();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEndWithActions") public int getContentInsetEndWithActions();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetLeft") public int getContentInsetLeft();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetRight") public int getContentInsetRight();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStart") public int getContentInsetStart();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStartWithNavigation") public int getContentInsetStartWithNavigation();
+    method public int getCurrentContentInsetEnd();
+    method public int getCurrentContentInsetLeft();
+    method public int getCurrentContentInsetRight();
+    method public int getCurrentContentInsetStart();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logo") public android.graphics.drawable.Drawable! getLogo();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logoDescription") public CharSequence! getLogoDescription();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:menu") public android.view.Menu! getMenu();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationContentDescription") public CharSequence? getNavigationContentDescription();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationIcon") public android.graphics.drawable.Drawable? getNavigationIcon();
+    method public android.graphics.drawable.Drawable? getOverflowIcon();
+    method @StyleRes @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:popupTheme") public int getPopupTheme();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:subtitle") public CharSequence! getSubtitle();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:title") public CharSequence! getTitle();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginBottom") public int getTitleMarginBottom();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginEnd") public int getTitleMarginEnd();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginStart") public int getTitleMarginStart();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginTop") public int getTitleMarginTop();
+    method public boolean hasExpandedActionView();
+    method public boolean hideOverflowMenu();
+    method public void inflateMenu(@MenuRes int);
+    method @MainThread public void invalidateMenu();
+    method public boolean isBackInvokedCallbackEnabled();
+    method public boolean isOverflowMenuShowing();
+    method @MainThread public void removeMenuProvider(androidx.core.view.MenuProvider);
+    method public void setBackInvokedCallbackEnabled(boolean);
+    method public void setCollapseContentDescription(@StringRes int);
+    method public void setCollapseContentDescription(CharSequence?);
+    method public void setCollapseIcon(@DrawableRes int);
+    method public void setCollapseIcon(android.graphics.drawable.Drawable?);
+    method public void setContentInsetEndWithActions(int);
+    method public void setContentInsetStartWithNavigation(int);
+    method public void setContentInsetsAbsolute(int, int);
+    method public void setContentInsetsRelative(int, int);
+    method public void setLogo(@DrawableRes int);
+    method public void setLogo(android.graphics.drawable.Drawable!);
+    method public void setLogoDescription(@StringRes int);
+    method public void setLogoDescription(CharSequence!);
+    method public void setNavigationContentDescription(@StringRes int);
+    method public void setNavigationContentDescription(CharSequence?);
+    method public void setNavigationIcon(@DrawableRes int);
+    method public void setNavigationIcon(android.graphics.drawable.Drawable?);
+    method public void setNavigationOnClickListener(android.view.View.OnClickListener!);
+    method public void setOnMenuItemClickListener(androidx.appcompat.widget.Toolbar.OnMenuItemClickListener!);
+    method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+    method public void setPopupTheme(@StyleRes int);
+    method public void setSubtitle(@StringRes int);
+    method public void setSubtitle(CharSequence!);
+    method public void setSubtitleTextAppearance(android.content.Context!, @StyleRes int);
+    method public void setSubtitleTextColor(@ColorInt int);
+    method public void setSubtitleTextColor(android.content.res.ColorStateList);
+    method public void setTitle(@StringRes int);
+    method public void setTitle(CharSequence!);
+    method public void setTitleMargin(int, int, int, int);
+    method public void setTitleMarginBottom(int);
+    method public void setTitleMarginEnd(int);
+    method public void setTitleMarginStart(int);
+    method public void setTitleMarginTop(int);
+    method public void setTitleTextAppearance(android.content.Context!, @StyleRes int);
+    method public void setTitleTextColor(@ColorInt int);
+    method public void setTitleTextColor(android.content.res.ColorStateList);
+    method public boolean showOverflowMenu();
+  }
+
+  public static class Toolbar.LayoutParams extends androidx.appcompat.app.ActionBar.LayoutParams {
+    ctor public Toolbar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+    ctor public Toolbar.LayoutParams(int, int);
+    ctor public Toolbar.LayoutParams(int, int, int);
+    ctor public Toolbar.LayoutParams(int);
+    ctor public Toolbar.LayoutParams(androidx.appcompat.widget.Toolbar.LayoutParams!);
+    ctor public Toolbar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+    ctor public Toolbar.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+    ctor public Toolbar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+  }
+
+  public static interface Toolbar.OnMenuItemClickListener {
+    method public boolean onMenuItemClick(android.view.MenuItem!);
+  }
+
+  public static class Toolbar.SavedState extends androidx.customview.view.AbsSavedState {
+    ctor public Toolbar.SavedState(android.os.Parcel!);
+    ctor public Toolbar.SavedState(android.os.Parcel!, ClassLoader!);
+    ctor public Toolbar.SavedState(android.os.Parcelable!);
+    field public static final android.os.Parcelable.Creator<androidx.appcompat.widget.Toolbar.SavedState!>! CREATOR;
+  }
+
+  public class TooltipCompat {
+    method public static void setTooltipText(android.view.View, CharSequence?);
+  }
+
+}
+
diff --git a/appcompat/appcompat/api/public_plus_experimental_1.6.0-beta02.txt b/appcompat/appcompat/api/public_plus_experimental_1.6.0-beta02.txt
new file mode 100644
index 0000000..0219b45
--- /dev/null
+++ b/appcompat/appcompat/api/public_plus_experimental_1.6.0-beta02.txt
@@ -0,0 +1,1063 @@
+// Signature format: 4.0
+package androidx.appcompat.app {
+
+  public abstract class ActionBar {
+    ctor public ActionBar();
+    method public abstract void addOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+    method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!);
+    method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, boolean);
+    method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int);
+    method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int, boolean);
+    method public abstract android.view.View! getCustomView();
+    method public abstract int getDisplayOptions();
+    method public float getElevation();
+    method public abstract int getHeight();
+    method public int getHideOffset();
+    method @Deprecated public abstract int getNavigationItemCount();
+    method @Deprecated public abstract int getNavigationMode();
+    method @Deprecated public abstract int getSelectedNavigationIndex();
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab? getSelectedTab();
+    method public abstract CharSequence? getSubtitle();
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! getTabAt(int);
+    method @Deprecated public abstract int getTabCount();
+    method public android.content.Context! getThemedContext();
+    method public abstract CharSequence? getTitle();
+    method public abstract void hide();
+    method public boolean isHideOnContentScrollEnabled();
+    method public abstract boolean isShowing();
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! newTab();
+    method @Deprecated public abstract void removeAllTabs();
+    method public abstract void removeOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+    method @Deprecated public abstract void removeTab(androidx.appcompat.app.ActionBar.Tab!);
+    method @Deprecated public abstract void removeTabAt(int);
+    method @Deprecated public abstract void selectTab(androidx.appcompat.app.ActionBar.Tab!);
+    method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public abstract void setCustomView(android.view.View!);
+    method public abstract void setCustomView(android.view.View!, androidx.appcompat.app.ActionBar.LayoutParams!);
+    method public abstract void setCustomView(int);
+    method public abstract void setDisplayHomeAsUpEnabled(boolean);
+    method public abstract void setDisplayOptions(int);
+    method public abstract void setDisplayOptions(int, int);
+    method public abstract void setDisplayShowCustomEnabled(boolean);
+    method public abstract void setDisplayShowHomeEnabled(boolean);
+    method public abstract void setDisplayShowTitleEnabled(boolean);
+    method public abstract void setDisplayUseLogoEnabled(boolean);
+    method public void setElevation(float);
+    method public void setHideOffset(int);
+    method public void setHideOnContentScrollEnabled(boolean);
+    method public void setHomeActionContentDescription(CharSequence?);
+    method public void setHomeActionContentDescription(@StringRes int);
+    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable?);
+    method public void setHomeAsUpIndicator(@DrawableRes int);
+    method public void setHomeButtonEnabled(boolean);
+    method public abstract void setIcon(@DrawableRes int);
+    method public abstract void setIcon(android.graphics.drawable.Drawable!);
+    method @Deprecated public abstract void setListNavigationCallbacks(android.widget.SpinnerAdapter!, androidx.appcompat.app.ActionBar.OnNavigationListener!);
+    method public abstract void setLogo(@DrawableRes int);
+    method public abstract void setLogo(android.graphics.drawable.Drawable!);
+    method @Deprecated public abstract void setNavigationMode(int);
+    method @Deprecated public abstract void setSelectedNavigationItem(int);
+    method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable!);
+    method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable!);
+    method public abstract void setSubtitle(CharSequence!);
+    method public abstract void setSubtitle(int);
+    method public abstract void setTitle(CharSequence!);
+    method public abstract void setTitle(@StringRes int);
+    method public abstract void show();
+    field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
+    field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
+    field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
+    field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
+    field public static final int DISPLAY_USE_LOGO = 1; // 0x1
+    field @Deprecated public static final int NAVIGATION_MODE_LIST = 1; // 0x1
+    field @Deprecated public static final int NAVIGATION_MODE_STANDARD = 0; // 0x0
+    field @Deprecated public static final int NAVIGATION_MODE_TABS = 2; // 0x2
+  }
+
+  public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+    ctor public ActionBar.LayoutParams(int, int);
+    ctor public ActionBar.LayoutParams(int, int, int);
+    ctor public ActionBar.LayoutParams(int);
+    ctor public ActionBar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+    ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    field public int gravity;
+  }
+
+  public static interface ActionBar.OnMenuVisibilityListener {
+    method public void onMenuVisibilityChanged(boolean);
+  }
+
+  @Deprecated public static interface ActionBar.OnNavigationListener {
+    method @Deprecated public boolean onNavigationItemSelected(int, long);
+  }
+
+  @Deprecated public abstract static class ActionBar.Tab {
+    ctor @Deprecated public ActionBar.Tab();
+    method @Deprecated public abstract CharSequence! getContentDescription();
+    method @Deprecated public abstract android.view.View! getCustomView();
+    method @Deprecated public abstract android.graphics.drawable.Drawable! getIcon();
+    method @Deprecated public abstract int getPosition();
+    method @Deprecated public abstract Object! getTag();
+    method @Deprecated public abstract CharSequence! getText();
+    method @Deprecated public abstract void select();
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(@StringRes int);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(CharSequence!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(android.view.View!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(int);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(android.graphics.drawable.Drawable!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(@DrawableRes int);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTabListener(androidx.appcompat.app.ActionBar.TabListener!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTag(Object!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(CharSequence!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(int);
+    field @Deprecated public static final int INVALID_POSITION = -1; // 0xffffffff
+  }
+
+  @Deprecated public static interface ActionBar.TabListener {
+    method @Deprecated public void onTabReselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+    method @Deprecated public void onTabSelected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+    method @Deprecated public void onTabUnselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+  }
+
+  public class ActionBarDrawerToggle implements androidx.drawerlayout.widget.DrawerLayout.DrawerListener {
+    ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, @StringRes int, @StringRes int);
+    ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, androidx.appcompat.widget.Toolbar!, @StringRes int, @StringRes int);
+    method public androidx.appcompat.graphics.drawable.DrawerArrowDrawable getDrawerArrowDrawable();
+    method public android.view.View.OnClickListener! getToolbarNavigationClickListener();
+    method public boolean isDrawerIndicatorEnabled();
+    method public boolean isDrawerSlideAnimationEnabled();
+    method public void onConfigurationChanged(android.content.res.Configuration!);
+    method public void onDrawerClosed(android.view.View!);
+    method public void onDrawerOpened(android.view.View!);
+    method public void onDrawerSlide(android.view.View!, float);
+    method public void onDrawerStateChanged(int);
+    method public boolean onOptionsItemSelected(android.view.MenuItem!);
+    method public void setDrawerArrowDrawable(androidx.appcompat.graphics.drawable.DrawerArrowDrawable);
+    method public void setDrawerIndicatorEnabled(boolean);
+    method public void setDrawerSlideAnimationEnabled(boolean);
+    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable!);
+    method public void setHomeAsUpIndicator(int);
+    method public void setToolbarNavigationClickListener(android.view.View.OnClickListener!);
+    method public void syncState();
+  }
+
+  public static interface ActionBarDrawerToggle.Delegate {
+    method public android.content.Context! getActionBarThemedContext();
+    method public android.graphics.drawable.Drawable! getThemeUpIndicator();
+    method public boolean isNavigationVisible();
+    method public void setActionBarDescription(@StringRes int);
+    method public void setActionBarUpIndicator(android.graphics.drawable.Drawable!, @StringRes int);
+  }
+
+  public static interface ActionBarDrawerToggle.DelegateProvider {
+    method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+  }
+
+  public class AlertDialog extends androidx.appcompat.app.AppCompatDialog implements android.content.DialogInterface {
+    ctor protected AlertDialog(android.content.Context);
+    ctor protected AlertDialog(android.content.Context, @StyleRes int);
+    ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener?);
+    method public android.widget.Button! getButton(int);
+    method public android.widget.ListView! getListView();
+    method public void setButton(int, CharSequence!, android.os.Message!);
+    method public void setButton(int, CharSequence!, android.content.DialogInterface.OnClickListener!);
+    method public void setButton(int, CharSequence!, android.graphics.drawable.Drawable!, android.content.DialogInterface.OnClickListener!);
+    method public void setCustomTitle(android.view.View!);
+    method public void setIcon(int);
+    method public void setIcon(android.graphics.drawable.Drawable!);
+    method public void setIconAttribute(int);
+    method public void setMessage(CharSequence!);
+    method public void setView(android.view.View!);
+    method public void setView(android.view.View!, int, int, int, int);
+  }
+
+  public static class AlertDialog.Builder {
+    ctor public AlertDialog.Builder(android.content.Context);
+    ctor public AlertDialog.Builder(android.content.Context, @StyleRes int);
+    method public androidx.appcompat.app.AlertDialog create();
+    method public android.content.Context getContext();
+    method public androidx.appcompat.app.AlertDialog.Builder! setAdapter(android.widget.ListAdapter!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setCancelable(boolean);
+    method public androidx.appcompat.app.AlertDialog.Builder! setCursor(android.database.Cursor!, android.content.DialogInterface.OnClickListener!, String!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setCustomTitle(android.view.View?);
+    method public androidx.appcompat.app.AlertDialog.Builder! setIcon(@DrawableRes int);
+    method public androidx.appcompat.app.AlertDialog.Builder! setIcon(android.graphics.drawable.Drawable?);
+    method public androidx.appcompat.app.AlertDialog.Builder! setIconAttribute(@AttrRes int);
+    method @Deprecated public androidx.appcompat.app.AlertDialog.Builder! setInverseBackgroundForced(boolean);
+    method public androidx.appcompat.app.AlertDialog.Builder! setItems(@ArrayRes int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setItems(CharSequence![]!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMessage(@StringRes int);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMessage(CharSequence?);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(@ArrayRes int, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(CharSequence![]!, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(android.database.Cursor!, String!, String!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButtonIcon(android.graphics.drawable.Drawable!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButtonIcon(android.graphics.drawable.Drawable!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setOnCancelListener(android.content.DialogInterface.OnCancelListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setOnDismissListener(android.content.DialogInterface.OnDismissListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setOnKeyListener(android.content.DialogInterface.OnKeyListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButtonIcon(android.graphics.drawable.Drawable!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(@ArrayRes int, int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.database.Cursor!, int, String!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(CharSequence![]!, int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.widget.ListAdapter!, int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setTitle(@StringRes int);
+    method public androidx.appcompat.app.AlertDialog.Builder! setTitle(CharSequence?);
+    method public androidx.appcompat.app.AlertDialog.Builder! setView(int);
+    method public androidx.appcompat.app.AlertDialog.Builder! setView(android.view.View!);
+    method public androidx.appcompat.app.AlertDialog! show();
+  }
+
+  public class AppCompatActivity extends androidx.fragment.app.FragmentActivity implements androidx.appcompat.app.ActionBarDrawerToggle.DelegateProvider androidx.appcompat.app.AppCompatCallback androidx.lifecycle.LifecycleOwner androidx.core.app.TaskStackBuilder.SupportParentable {
+    ctor public AppCompatActivity();
+    ctor @ContentView public AppCompatActivity(@LayoutRes int);
+    method public androidx.appcompat.app.AppCompatDelegate getDelegate();
+    method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+    method public androidx.appcompat.app.ActionBar? getSupportActionBar();
+    method public android.content.Intent? getSupportParentActivityIntent();
+    method public void onCreateSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+    method protected void onLocalesChanged(androidx.core.os.LocaleListCompat);
+    method public final boolean onMenuItemSelected(int, android.view.MenuItem);
+    method protected void onNightModeChanged(int);
+    method public void onPrepareSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+    method @CallSuper public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode);
+    method @CallSuper public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode);
+    method @Deprecated public void onSupportContentChanged();
+    method public boolean onSupportNavigateUp();
+    method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+    method public void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+    method @Deprecated public void setSupportProgress(int);
+    method @Deprecated public void setSupportProgressBarIndeterminate(boolean);
+    method @Deprecated public void setSupportProgressBarIndeterminateVisibility(boolean);
+    method @Deprecated public void setSupportProgressBarVisibility(boolean);
+    method public androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+    method public void supportInvalidateOptionsMenu();
+    method public void supportNavigateUpTo(android.content.Intent);
+    method public boolean supportRequestWindowFeature(int);
+    method public boolean supportShouldUpRecreateTask(android.content.Intent);
+  }
+
+  public interface AppCompatCallback {
+    method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+    method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+    method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+  }
+
+  public abstract class AppCompatDelegate {
+    method public abstract void addContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+    method public abstract boolean applyDayNight();
+    method @Deprecated public void attachBaseContext(android.content.Context!);
+    method @CallSuper public android.content.Context attachBaseContext2(android.content.Context);
+    method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+    method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Dialog, androidx.appcompat.app.AppCompatCallback?);
+    method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.view.Window, androidx.appcompat.app.AppCompatCallback?);
+    method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+    method public abstract android.view.View! createView(android.view.View?, String!, android.content.Context, android.util.AttributeSet);
+    method public abstract <T extends android.view.View> T! findViewById(@IdRes int);
+    method @AnyThread public static androidx.core.os.LocaleListCompat getApplicationLocales();
+    method public android.content.Context? getContextForDelegate();
+    method public static int getDefaultNightMode();
+    method public abstract androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+    method public int getLocalNightMode();
+    method public abstract android.view.MenuInflater! getMenuInflater();
+    method public abstract androidx.appcompat.app.ActionBar? getSupportActionBar();
+    method public abstract boolean hasWindowFeature(int);
+    method public abstract void installViewFactory();
+    method public abstract void invalidateOptionsMenu();
+    method public static boolean isCompatVectorFromResourcesEnabled();
+    method public abstract boolean isHandleNativeActionModesEnabled();
+    method public abstract void onConfigurationChanged(android.content.res.Configuration!);
+    method public abstract void onCreate(android.os.Bundle!);
+    method public abstract void onDestroy();
+    method public abstract void onPostCreate(android.os.Bundle!);
+    method public abstract void onPostResume();
+    method public abstract void onSaveInstanceState(android.os.Bundle!);
+    method public abstract void onStart();
+    method public abstract void onStop();
+    method public abstract boolean requestWindowFeature(int);
+    method public static void setApplicationLocales(androidx.core.os.LocaleListCompat);
+    method public static void setCompatVectorFromResourcesEnabled(boolean);
+    method public abstract void setContentView(android.view.View!);
+    method public abstract void setContentView(@LayoutRes int);
+    method public abstract void setContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+    method public static void setDefaultNightMode(int);
+    method public abstract void setHandleNativeActionModesEnabled(boolean);
+    method @RequiresApi(17) public abstract void setLocalNightMode(int);
+    method @CallSuper @RequiresApi(33) public void setOnBackInvokedDispatcher(android.window.OnBackInvokedDispatcher?);
+    method public abstract void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+    method public void setTheme(@StyleRes int);
+    method public abstract void setTitle(CharSequence?);
+    method public abstract androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+    field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
+    field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
+    field @Deprecated public static final int MODE_NIGHT_AUTO = 0; // 0x0
+    field public static final int MODE_NIGHT_AUTO_BATTERY = 3; // 0x3
+    field @Deprecated public static final int MODE_NIGHT_AUTO_TIME = 0; // 0x0
+    field public static final int MODE_NIGHT_FOLLOW_SYSTEM = -1; // 0xffffffff
+    field public static final int MODE_NIGHT_NO = 1; // 0x1
+    field public static final int MODE_NIGHT_UNSPECIFIED = -100; // 0xffffff9c
+    field public static final int MODE_NIGHT_YES = 2; // 0x2
+  }
+
+  public class AppCompatDialog extends androidx.activity.ComponentDialog implements androidx.appcompat.app.AppCompatCallback {
+    ctor public AppCompatDialog(android.content.Context);
+    ctor public AppCompatDialog(android.content.Context, int);
+    ctor protected AppCompatDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener?);
+    method public androidx.appcompat.app.AppCompatDelegate getDelegate();
+    method public androidx.appcompat.app.ActionBar! getSupportActionBar();
+    method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+    method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+    method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+    method public boolean supportRequestWindowFeature(int);
+  }
+
+  public class AppCompatDialogFragment extends androidx.fragment.app.DialogFragment {
+    ctor public AppCompatDialogFragment();
+    ctor public AppCompatDialogFragment(@LayoutRes int);
+  }
+
+  public class AppCompatViewInflater {
+    ctor public AppCompatViewInflater();
+    method protected androidx.appcompat.widget.AppCompatAutoCompleteTextView createAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatButton createButton(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatCheckBox createCheckBox(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatCheckedTextView createCheckedTextView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatEditText createEditText(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatImageButton createImageButton(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatImageView createImageView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatMultiAutoCompleteTextView createMultiAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatRadioButton createRadioButton(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatRatingBar createRatingBar(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatSeekBar createSeekBar(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatSpinner createSpinner(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatTextView createTextView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatToggleButton createToggleButton(android.content.Context!, android.util.AttributeSet!);
+    method public final android.view.View? createView(android.view.View?, String, android.content.Context, android.util.AttributeSet, boolean, boolean, boolean, boolean);
+    method protected android.view.View? createView(android.content.Context!, String!, android.util.AttributeSet!);
+  }
+
+  public final class AppLocalesMetadataHolderService extends android.app.Service {
+    ctor public AppLocalesMetadataHolderService();
+    method public static android.content.pm.ServiceInfo getServiceInfo(android.content.Context) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public android.os.IBinder onBind(android.content.Intent);
+  }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+  public class DrawerArrowDrawable extends android.graphics.drawable.Drawable {
+    ctor public DrawerArrowDrawable(android.content.Context!);
+    method public void draw(android.graphics.Canvas!);
+    method public float getArrowHeadLength();
+    method public float getArrowShaftLength();
+    method public float getBarLength();
+    method public float getBarThickness();
+    method @ColorInt public int getColor();
+    method public int getDirection();
+    method public float getGapSize();
+    method public int getOpacity();
+    method public final android.graphics.Paint! getPaint();
+    method @FloatRange(from=0.0, to=1.0) public float getProgress();
+    method public boolean isSpinEnabled();
+    method public void setAlpha(int);
+    method public void setArrowHeadLength(float);
+    method public void setArrowShaftLength(float);
+    method public void setBarLength(float);
+    method public void setBarThickness(float);
+    method public void setColor(@ColorInt int);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setDirection(int);
+    method public void setGapSize(float);
+    method public void setProgress(@FloatRange(from=0.0, to=1.0) float);
+    method public void setSpinEnabled(boolean);
+    method public void setVerticalMirror(boolean);
+    field public static final int ARROW_DIRECTION_END = 3; // 0x3
+    field public static final int ARROW_DIRECTION_LEFT = 0; // 0x0
+    field public static final int ARROW_DIRECTION_RIGHT = 1; // 0x1
+    field public static final int ARROW_DIRECTION_START = 2; // 0x2
+  }
+
+}
+
+package androidx.appcompat.view {
+
+  public abstract class ActionMode {
+    ctor public ActionMode();
+    method public abstract void finish();
+    method public abstract android.view.View! getCustomView();
+    method public abstract android.view.Menu! getMenu();
+    method public abstract android.view.MenuInflater! getMenuInflater();
+    method public abstract CharSequence! getSubtitle();
+    method public Object! getTag();
+    method public abstract CharSequence! getTitle();
+    method public boolean getTitleOptionalHint();
+    method public abstract void invalidate();
+    method public boolean isTitleOptional();
+    method public abstract void setCustomView(android.view.View!);
+    method public abstract void setSubtitle(CharSequence!);
+    method public abstract void setSubtitle(int);
+    method public void setTag(Object!);
+    method public abstract void setTitle(CharSequence!);
+    method public abstract void setTitle(int);
+    method public void setTitleOptionalHint(boolean);
+  }
+
+  public static interface ActionMode.Callback {
+    method public boolean onActionItemClicked(androidx.appcompat.view.ActionMode!, android.view.MenuItem!);
+    method public boolean onCreateActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+    method public void onDestroyActionMode(androidx.appcompat.view.ActionMode!);
+    method public boolean onPrepareActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+  }
+
+  @Deprecated public interface CollapsibleActionView {
+    method @Deprecated public void onActionViewCollapsed();
+    method @Deprecated public void onActionViewExpanded();
+  }
+
+  public class ContextThemeWrapper extends android.content.ContextWrapper {
+    ctor public ContextThemeWrapper();
+    ctor public ContextThemeWrapper(android.content.Context!, @StyleRes int);
+    ctor public ContextThemeWrapper(android.content.Context!, android.content.res.Resources.Theme!);
+    method public void applyOverrideConfiguration(android.content.res.Configuration!);
+    method public int getThemeResId();
+    method protected void onApplyThemeResource(android.content.res.Resources.Theme!, int, boolean);
+  }
+
+}
+
+package androidx.appcompat.widget {
+
+  public class ActionMenuView extends androidx.appcompat.widget.LinearLayoutCompat {
+    ctor public ActionMenuView(android.content.Context);
+    ctor public ActionMenuView(android.content.Context, android.util.AttributeSet?);
+    method public void dismissPopupMenus();
+    method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateDefaultLayoutParams();
+    method public androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+    method public android.view.Menu! getMenu();
+    method public android.graphics.drawable.Drawable? getOverflowIcon();
+    method public int getPopupTheme();
+    method public boolean hideOverflowMenu();
+    method public boolean isOverflowMenuShowing();
+    method public void onConfigurationChanged(android.content.res.Configuration!);
+    method public void onDetachedFromWindow();
+    method public void setOnMenuItemClickListener(androidx.appcompat.widget.ActionMenuView.OnMenuItemClickListener!);
+    method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+    method public void setPopupTheme(@StyleRes int);
+    method public boolean showOverflowMenu();
+  }
+
+  public static class ActionMenuView.LayoutParams extends androidx.appcompat.widget.LinearLayoutCompat.LayoutParams {
+    ctor public ActionMenuView.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public ActionMenuView.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public ActionMenuView.LayoutParams(androidx.appcompat.widget.ActionMenuView.LayoutParams!);
+    ctor public ActionMenuView.LayoutParams(int, int);
+    field public int cellsUsed;
+    field public boolean expandable;
+    field public int extraPixels;
+    field public boolean isOverflowButton;
+    field public boolean preventEdgeOffset;
+  }
+
+  public static interface ActionMenuView.OnMenuItemClickListener {
+    method public boolean onMenuItemClick(android.view.MenuItem!);
+  }
+
+  public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatAutoCompleteTextView(android.content.Context);
+    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+  }
+
+  public class AppCompatButton extends android.widget.Button implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatButton(android.content.Context);
+    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method public void setSupportAllCaps(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+  }
+
+  public class AppCompatCheckBox extends android.widget.CheckBox implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatCheckBox(android.content.Context);
+    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public class AppCompatCheckedTextView extends android.widget.CheckedTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatCheckedTextView(android.content.Context);
+    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context, int);
+  }
+
+  public class AppCompatEditText extends android.widget.EditText implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.OnReceiveContentViewBehavior androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatEditText(android.content.Context);
+    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+  }
+
+  public class AppCompatImageButton extends android.widget.ImageButton implements androidx.core.view.TintableBackgroundView {
+    ctor public AppCompatImageButton(android.content.Context);
+    ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public class AppCompatImageView extends android.widget.ImageView implements androidx.core.view.TintableBackgroundView {
+    ctor public AppCompatImageView(android.content.Context);
+    ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context);
+    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+  }
+
+  public class AppCompatRadioButton extends android.widget.RadioButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatRadioButton(android.content.Context!);
+    ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?);
+    ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public class AppCompatRatingBar extends android.widget.RatingBar {
+    ctor public AppCompatRatingBar(android.content.Context);
+    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+  public class AppCompatSeekBar extends android.widget.SeekBar {
+    ctor public AppCompatSeekBar(android.content.Context);
+    ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+  public class AppCompatSpinner extends android.widget.Spinner implements androidx.core.view.TintableBackgroundView {
+    ctor public AppCompatSpinner(android.content.Context);
+    ctor public AppCompatSpinner(android.content.Context, int);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int, android.content.res.Resources.Theme!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public class AppCompatTextView extends android.widget.TextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatTextView(android.content.Context);
+    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParamsCompat();
+    method public boolean isEmojiCompatEnabled();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method public void setPrecomputedText(androidx.core.text.PrecomputedTextCompat);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+    method public void setTextFuture(java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>?);
+    method public void setTextMetricsParamsCompat(androidx.core.text.PrecomputedTextCompat.Params);
+  }
+
+  public class AppCompatToggleButton extends android.widget.ToggleButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatToggleButton(android.content.Context);
+    ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface EmojiCompatConfigurationView {
+    method public boolean isEmojiCompatEnabled();
+    method public void setEmojiCompatEnabled(boolean);
+  }
+
+  public class LinearLayoutCompat extends android.view.ViewGroup {
+    ctor public LinearLayoutCompat(android.content.Context);
+    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?);
+    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?, int);
+    method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateDefaultLayoutParams();
+    method public androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+    method @androidx.resourceinspection.annotation.Attribute("android:baselineAlignedChildIndex") public int getBaselineAlignedChildIndex();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:divider") public android.graphics.drawable.Drawable! getDividerDrawable();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:dividerPadding") public int getDividerPadding();
+    method @GravityInt @androidx.resourceinspection.annotation.Attribute("android:gravity") public int getGravity();
+    method @androidx.resourceinspection.annotation.Attribute(value="android:orientation", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="horizontal", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="vertical", value=1)}) public int getOrientation();
+    method @androidx.resourceinspection.annotation.Attribute(value="androidx.appcompat:showDividers", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="none", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="beginning", value=1, mask=1), @androidx.resourceinspection.annotation.Attribute.IntMap(name="middle", value=2, mask=2), @androidx.resourceinspection.annotation.Attribute.IntMap(name="end", value=4, mask=4)}) public int getShowDividers();
+    method @androidx.resourceinspection.annotation.Attribute("android:weightSum") public float getWeightSum();
+    method @androidx.resourceinspection.annotation.Attribute("android:baselineAligned") public boolean isBaselineAligned();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:measureWithLargestChild") public boolean isMeasureWithLargestChildEnabled();
+    method public void setBaselineAligned(boolean);
+    method public void setBaselineAlignedChildIndex(int);
+    method public void setDividerDrawable(android.graphics.drawable.Drawable!);
+    method public void setDividerPadding(int);
+    method public void setGravity(@GravityInt int);
+    method public void setHorizontalGravity(int);
+    method public void setMeasureWithLargestChildEnabled(boolean);
+    method public void setOrientation(int);
+    method public void setShowDividers(int);
+    method public void setVerticalGravity(int);
+    method public void setWeightSum(float);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int SHOW_DIVIDER_BEGINNING = 1; // 0x1
+    field public static final int SHOW_DIVIDER_END = 4; // 0x4
+    field public static final int SHOW_DIVIDER_MIDDLE = 2; // 0x2
+    field public static final int SHOW_DIVIDER_NONE = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public static class LinearLayoutCompat.LayoutParams extends android.widget.LinearLayout.LayoutParams {
+    ctor public LinearLayoutCompat.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public LinearLayoutCompat.LayoutParams(int, int);
+    ctor public LinearLayoutCompat.LayoutParams(int, int, float);
+    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+  }
+
+  public class ListPopupWindow {
+    ctor public ListPopupWindow(android.content.Context);
+    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?);
+    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int);
+    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int, @StyleRes int);
+    method public void clearListSelection();
+    method public android.view.View.OnTouchListener! createDragToOpenListener(android.view.View!);
+    method public void dismiss();
+    method public android.view.View? getAnchorView();
+    method @StyleRes public int getAnimationStyle();
+    method public android.graphics.drawable.Drawable? getBackground();
+    method public android.graphics.Rect? getEpicenterBounds();
+    method public int getHeight();
+    method public int getHorizontalOffset();
+    method public int getInputMethodMode();
+    method public android.widget.ListView? getListView();
+    method public int getPromptPosition();
+    method public Object? getSelectedItem();
+    method public long getSelectedItemId();
+    method public int getSelectedItemPosition();
+    method public android.view.View? getSelectedView();
+    method public int getSoftInputMode();
+    method public int getVerticalOffset();
+    method public int getWidth();
+    method public boolean isInputMethodNotNeeded();
+    method public boolean isModal();
+    method public boolean isShowing();
+    method public boolean onKeyDown(int, android.view.KeyEvent);
+    method public boolean onKeyPreIme(int, android.view.KeyEvent);
+    method public boolean onKeyUp(int, android.view.KeyEvent);
+    method public boolean performItemClick(int);
+    method public void postShow();
+    method public void setAdapter(android.widget.ListAdapter?);
+    method public void setAnchorView(android.view.View?);
+    method public void setAnimationStyle(@StyleRes int);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setContentWidth(int);
+    method public void setDropDownGravity(int);
+    method public void setEpicenterBounds(android.graphics.Rect?);
+    method public void setHeight(int);
+    method public void setHorizontalOffset(int);
+    method public void setInputMethodMode(int);
+    method public void setListSelector(android.graphics.drawable.Drawable!);
+    method public void setModal(boolean);
+    method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener?);
+    method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener?);
+    method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener?);
+    method public void setPromptPosition(int);
+    method public void setPromptView(android.view.View?);
+    method public void setSelection(int);
+    method public void setSoftInputMode(int);
+    method public void setVerticalOffset(int);
+    method public void setWidth(int);
+    method public void setWindowLayoutType(int);
+    method public void show();
+    field public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; // 0x0
+    field public static final int INPUT_METHOD_NEEDED = 1; // 0x1
+    field public static final int INPUT_METHOD_NOT_NEEDED = 2; // 0x2
+    field public static final int MATCH_PARENT = -1; // 0xffffffff
+    field public static final int POSITION_PROMPT_ABOVE = 0; // 0x0
+    field public static final int POSITION_PROMPT_BELOW = 1; // 0x1
+    field public static final int WRAP_CONTENT = -2; // 0xfffffffe
+  }
+
+  public class PopupMenu {
+    ctor public PopupMenu(android.content.Context, android.view.View);
+    ctor public PopupMenu(android.content.Context, android.view.View, int);
+    ctor public PopupMenu(android.content.Context, android.view.View, int, @AttrRes int, @StyleRes int);
+    method public void dismiss();
+    method public android.view.View.OnTouchListener getDragToOpenListener();
+    method public int getGravity();
+    method public android.view.Menu getMenu();
+    method public android.view.MenuInflater getMenuInflater();
+    method public void inflate(@MenuRes int);
+    method public void setForceShowIcon(boolean);
+    method public void setGravity(int);
+    method public void setOnDismissListener(androidx.appcompat.widget.PopupMenu.OnDismissListener?);
+    method public void setOnMenuItemClickListener(androidx.appcompat.widget.PopupMenu.OnMenuItemClickListener?);
+    method public void show();
+  }
+
+  public static interface PopupMenu.OnDismissListener {
+    method public void onDismiss(androidx.appcompat.widget.PopupMenu!);
+  }
+
+  public static interface PopupMenu.OnMenuItemClickListener {
+    method public boolean onMenuItemClick(android.view.MenuItem!);
+  }
+
+  public class SearchView extends androidx.appcompat.widget.LinearLayoutCompat implements androidx.appcompat.view.CollapsibleActionView {
+    ctor public SearchView(android.content.Context);
+    ctor public SearchView(android.content.Context, android.util.AttributeSet?);
+    ctor public SearchView(android.content.Context, android.util.AttributeSet?, int);
+    method @androidx.resourceinspection.annotation.Attribute("android:imeOptions") public int getImeOptions();
+    method public int getInputType();
+    method @androidx.resourceinspection.annotation.Attribute("android:maxWidth") public int getMaxWidth();
+    method public CharSequence! getQuery();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:queryHint") public CharSequence? getQueryHint();
+    method public androidx.cursoradapter.widget.CursorAdapter! getSuggestionsAdapter();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:iconifiedByDefault") public boolean isIconfiedByDefault();
+    method public boolean isIconified();
+    method public boolean isQueryRefinementEnabled();
+    method public boolean isSubmitButtonEnabled();
+    method public void onActionViewCollapsed();
+    method public void onActionViewExpanded();
+    method protected void onQueryRefine(CharSequence?);
+    method public void setIconified(boolean);
+    method public void setIconifiedByDefault(boolean);
+    method public void setImeOptions(int);
+    method public void setInputType(int);
+    method public void setMaxWidth(int);
+    method public void setOnCloseListener(androidx.appcompat.widget.SearchView.OnCloseListener!);
+    method public void setOnQueryTextFocusChangeListener(android.view.View.OnFocusChangeListener!);
+    method public void setOnQueryTextListener(androidx.appcompat.widget.SearchView.OnQueryTextListener!);
+    method public void setOnSearchClickListener(android.view.View.OnClickListener!);
+    method public void setOnSuggestionListener(androidx.appcompat.widget.SearchView.OnSuggestionListener!);
+    method public void setQuery(CharSequence!, boolean);
+    method public void setQueryHint(CharSequence?);
+    method public void setQueryRefinementEnabled(boolean);
+    method public void setSearchableInfo(android.app.SearchableInfo!);
+    method public void setSubmitButtonEnabled(boolean);
+    method public void setSuggestionsAdapter(androidx.cursoradapter.widget.CursorAdapter!);
+  }
+
+  public static interface SearchView.OnCloseListener {
+    method public boolean onClose();
+  }
+
+  public static interface SearchView.OnQueryTextListener {
+    method public boolean onQueryTextChange(String!);
+    method public boolean onQueryTextSubmit(String!);
+  }
+
+  public static interface SearchView.OnSuggestionListener {
+    method public boolean onSuggestionClick(int);
+    method public boolean onSuggestionSelect(int);
+  }
+
+  public class ShareActionProvider extends androidx.core.view.ActionProvider {
+    ctor public ShareActionProvider(android.content.Context!);
+    method public android.view.View! onCreateActionView();
+    method public void setOnShareTargetSelectedListener(androidx.appcompat.widget.ShareActionProvider.OnShareTargetSelectedListener!);
+    method public void setShareHistoryFileName(String!);
+    method public void setShareIntent(android.content.Intent!);
+    field public static final String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
+  }
+
+  public static interface ShareActionProvider.OnShareTargetSelectedListener {
+    method public boolean onShareTargetSelected(androidx.appcompat.widget.ShareActionProvider!, android.content.Intent!);
+  }
+
+  public class SwitchCompat extends android.widget.CompoundButton implements androidx.appcompat.widget.EmojiCompatConfigurationView {
+    ctor public SwitchCompat(android.content.Context);
+    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?);
+    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?, int);
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:showText") public boolean getShowText();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:splitTrack") public boolean getSplitTrack();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchMinWidth") public int getSwitchMinWidth();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchPadding") public int getSwitchPadding();
+    method @androidx.resourceinspection.annotation.Attribute("android:textOff") public CharSequence! getTextOff();
+    method @androidx.resourceinspection.annotation.Attribute("android:textOn") public CharSequence! getTextOn();
+    method @androidx.resourceinspection.annotation.Attribute("android:thumb") public android.graphics.drawable.Drawable! getThumbDrawable();
+    method @FloatRange(from=0.0, to=1.0) protected final float getThumbPosition();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTextPadding") public int getThumbTextPadding();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTint") public android.content.res.ColorStateList? getThumbTintList();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTintMode") public android.graphics.PorterDuff.Mode? getThumbTintMode();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:track") public android.graphics.drawable.Drawable! getTrackDrawable();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTint") public android.content.res.ColorStateList? getTrackTintList();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTintMode") public android.graphics.PorterDuff.Mode? getTrackTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void onMeasure(int, int);
+    method public void setEmojiCompatEnabled(boolean);
+    method protected final void setEnforceSwitchWidth(boolean);
+    method public void setShowText(boolean);
+    method public void setSplitTrack(boolean);
+    method public void setSwitchMinWidth(int);
+    method public void setSwitchPadding(int);
+    method public void setSwitchTextAppearance(android.content.Context!, int);
+    method public void setSwitchTypeface(android.graphics.Typeface!, int);
+    method public void setSwitchTypeface(android.graphics.Typeface!);
+    method public void setTextOff(CharSequence!);
+    method public void setTextOn(CharSequence!);
+    method public void setThumbDrawable(android.graphics.drawable.Drawable!);
+    method public void setThumbResource(int);
+    method public void setThumbTextPadding(int);
+    method public void setThumbTintList(android.content.res.ColorStateList?);
+    method public void setThumbTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTrackDrawable(android.graphics.drawable.Drawable!);
+    method public void setTrackResource(int);
+    method public void setTrackTintList(android.content.res.ColorStateList?);
+    method public void setTrackTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface ThemedSpinnerAdapter extends android.widget.SpinnerAdapter {
+    method public android.content.res.Resources.Theme? getDropDownViewTheme();
+    method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+  }
+
+  public static final class ThemedSpinnerAdapter.Helper {
+    ctor public ThemedSpinnerAdapter.Helper(android.content.Context);
+    method public android.view.LayoutInflater getDropDownViewInflater();
+    method public android.content.res.Resources.Theme? getDropDownViewTheme();
+    method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+  }
+
+  public class Toolbar extends android.view.ViewGroup implements androidx.core.view.MenuHost {
+    ctor public Toolbar(android.content.Context);
+    ctor public Toolbar(android.content.Context, android.util.AttributeSet?);
+    ctor public Toolbar(android.content.Context, android.util.AttributeSet?, int);
+    method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider);
+    method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method public void collapseActionView();
+    method public void dismissPopupMenus();
+    method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateDefaultLayoutParams();
+    method public androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseContentDescription") public CharSequence? getCollapseContentDescription();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseIcon") public android.graphics.drawable.Drawable? getCollapseIcon();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEnd") public int getContentInsetEnd();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEndWithActions") public int getContentInsetEndWithActions();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetLeft") public int getContentInsetLeft();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetRight") public int getContentInsetRight();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStart") public int getContentInsetStart();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStartWithNavigation") public int getContentInsetStartWithNavigation();
+    method public int getCurrentContentInsetEnd();
+    method public int getCurrentContentInsetLeft();
+    method public int getCurrentContentInsetRight();
+    method public int getCurrentContentInsetStart();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logo") public android.graphics.drawable.Drawable! getLogo();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logoDescription") public CharSequence! getLogoDescription();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:menu") public android.view.Menu! getMenu();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationContentDescription") public CharSequence? getNavigationContentDescription();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationIcon") public android.graphics.drawable.Drawable? getNavigationIcon();
+    method public android.graphics.drawable.Drawable? getOverflowIcon();
+    method @StyleRes @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:popupTheme") public int getPopupTheme();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:subtitle") public CharSequence! getSubtitle();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:title") public CharSequence! getTitle();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginBottom") public int getTitleMarginBottom();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginEnd") public int getTitleMarginEnd();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginStart") public int getTitleMarginStart();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginTop") public int getTitleMarginTop();
+    method public boolean hasExpandedActionView();
+    method public boolean hideOverflowMenu();
+    method public void inflateMenu(@MenuRes int);
+    method @MainThread public void invalidateMenu();
+    method public boolean isBackInvokedCallbackEnabled();
+    method public boolean isOverflowMenuShowing();
+    method @MainThread public void removeMenuProvider(androidx.core.view.MenuProvider);
+    method public void setBackInvokedCallbackEnabled(boolean);
+    method public void setCollapseContentDescription(@StringRes int);
+    method public void setCollapseContentDescription(CharSequence?);
+    method public void setCollapseIcon(@DrawableRes int);
+    method public void setCollapseIcon(android.graphics.drawable.Drawable?);
+    method public void setContentInsetEndWithActions(int);
+    method public void setContentInsetStartWithNavigation(int);
+    method public void setContentInsetsAbsolute(int, int);
+    method public void setContentInsetsRelative(int, int);
+    method public void setLogo(@DrawableRes int);
+    method public void setLogo(android.graphics.drawable.Drawable!);
+    method public void setLogoDescription(@StringRes int);
+    method public void setLogoDescription(CharSequence!);
+    method public void setNavigationContentDescription(@StringRes int);
+    method public void setNavigationContentDescription(CharSequence?);
+    method public void setNavigationIcon(@DrawableRes int);
+    method public void setNavigationIcon(android.graphics.drawable.Drawable?);
+    method public void setNavigationOnClickListener(android.view.View.OnClickListener!);
+    method public void setOnMenuItemClickListener(androidx.appcompat.widget.Toolbar.OnMenuItemClickListener!);
+    method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+    method public void setPopupTheme(@StyleRes int);
+    method public void setSubtitle(@StringRes int);
+    method public void setSubtitle(CharSequence!);
+    method public void setSubtitleTextAppearance(android.content.Context!, @StyleRes int);
+    method public void setSubtitleTextColor(@ColorInt int);
+    method public void setSubtitleTextColor(android.content.res.ColorStateList);
+    method public void setTitle(@StringRes int);
+    method public void setTitle(CharSequence!);
+    method public void setTitleMargin(int, int, int, int);
+    method public void setTitleMarginBottom(int);
+    method public void setTitleMarginEnd(int);
+    method public void setTitleMarginStart(int);
+    method public void setTitleMarginTop(int);
+    method public void setTitleTextAppearance(android.content.Context!, @StyleRes int);
+    method public void setTitleTextColor(@ColorInt int);
+    method public void setTitleTextColor(android.content.res.ColorStateList);
+    method public boolean showOverflowMenu();
+  }
+
+  public static class Toolbar.LayoutParams extends androidx.appcompat.app.ActionBar.LayoutParams {
+    ctor public Toolbar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+    ctor public Toolbar.LayoutParams(int, int);
+    ctor public Toolbar.LayoutParams(int, int, int);
+    ctor public Toolbar.LayoutParams(int);
+    ctor public Toolbar.LayoutParams(androidx.appcompat.widget.Toolbar.LayoutParams!);
+    ctor public Toolbar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+    ctor public Toolbar.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+    ctor public Toolbar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+  }
+
+  public static interface Toolbar.OnMenuItemClickListener {
+    method public boolean onMenuItemClick(android.view.MenuItem!);
+  }
+
+  public static class Toolbar.SavedState extends androidx.customview.view.AbsSavedState {
+    ctor public Toolbar.SavedState(android.os.Parcel!);
+    ctor public Toolbar.SavedState(android.os.Parcel!, ClassLoader!);
+    ctor public Toolbar.SavedState(android.os.Parcelable!);
+    field public static final android.os.Parcelable.Creator<androidx.appcompat.widget.Toolbar.SavedState!>! CREATOR;
+  }
+
+  public class TooltipCompat {
+    method public static void setTooltipText(android.view.View, CharSequence?);
+  }
+
+}
+
diff --git a/appcompat/appcompat/api/res-1.6.0-beta02.txt b/appcompat/appcompat/api/res-1.6.0-beta02.txt
new file mode 100644
index 0000000..b9f58a8
--- /dev/null
+++ b/appcompat/appcompat/api/res-1.6.0-beta02.txt
@@ -0,0 +1,369 @@
+attr actionBarDivider
+attr actionBarItemBackground
+attr actionBarPopupTheme
+attr actionBarSize
+attr actionBarSplitStyle
+attr actionBarStyle
+attr actionBarTabBarStyle
+attr actionBarTabStyle
+attr actionBarTabTextStyle
+attr actionBarTheme
+attr actionBarWidgetTheme
+attr actionButtonStyle
+attr actionDropDownStyle
+attr actionLayout
+attr actionMenuTextAppearance
+attr actionMenuTextColor
+attr actionModeBackground
+attr actionModeCloseButtonStyle
+attr actionModeCloseContentDescription
+attr actionModeCloseDrawable
+attr actionModeCopyDrawable
+attr actionModeCutDrawable
+attr actionModeFindDrawable
+attr actionModePasteDrawable
+attr actionModeSelectAllDrawable
+attr actionModeShareDrawable
+attr actionModeSplitBackground
+attr actionModeStyle
+attr actionModeTheme
+attr actionModeWebSearchDrawable
+attr actionOverflowButtonStyle
+attr actionOverflowMenuStyle
+attr actionProviderClass
+attr actionViewClass
+attr alertDialogStyle
+attr alertDialogTheme
+attr arrowHeadLength
+attr arrowShaftLength
+attr autoCompleteTextViewStyle
+attr autoSizeMaxTextSize
+attr autoSizeMinTextSize
+attr autoSizePresetSizes
+attr autoSizeStepGranularity
+attr autoSizeTextType
+attr background
+attr backgroundSplit
+attr backgroundStacked
+attr backgroundTint
+attr backgroundTintMode
+attr barLength
+attr borderlessButtonStyle
+attr buttonBarButtonStyle
+attr buttonBarNegativeButtonStyle
+attr buttonBarNeutralButtonStyle
+attr buttonBarPositiveButtonStyle
+attr buttonBarStyle
+attr buttonGravity
+attr buttonStyle
+attr buttonStyleSmall
+attr buttonTint
+attr buttonTintMode
+attr checkboxStyle
+attr checkedTextViewStyle
+attr closeIcon
+attr closeItemLayout
+attr collapseContentDescription
+attr collapseIcon
+attr color
+attr colorAccent
+attr colorBackgroundFloating
+attr colorButtonNormal
+attr colorControlActivated
+attr colorControlHighlight
+attr colorControlNormal
+attr colorError
+attr colorPrimary
+attr colorPrimaryDark
+attr commitIcon
+attr contentInsetEnd
+attr contentInsetEndWithActions
+attr contentInsetLeft
+attr contentInsetRight
+attr contentInsetStart
+attr contentInsetStartWithNavigation
+attr customNavigationLayout
+attr dialogCornerRadius
+attr dialogPreferredPadding
+attr dialogTheme
+attr displayOptions
+attr divider
+attr dividerHorizontal
+attr dividerPadding
+attr dividerVertical
+attr drawableSize
+attr drawerArrowStyle
+attr dropDownListViewStyle
+attr editTextBackground
+attr editTextColor
+attr editTextStyle
+attr elevation
+attr emojiCompatEnabled
+attr firstBaselineToTopHeight
+attr fontFamily
+attr fontVariationSettings
+attr gapBetweenBars
+attr goIcon
+attr height
+attr hideOnContentScroll
+attr homeAsUpIndicator
+attr homeLayout
+attr icon
+attr iconTint
+attr iconTintMode
+attr iconifiedByDefault
+attr imageButtonStyle
+attr indeterminateProgressStyle
+attr isLightTheme
+attr itemPadding
+attr lastBaselineToBottomHeight
+attr layout
+attr lineHeight
+attr listChoiceBackgroundIndicator
+attr listChoiceIndicatorMultipleAnimated
+attr listChoiceIndicatorSingleAnimated
+attr listDividerAlertDialog
+attr listPopupWindowStyle
+attr listPreferredItemHeight
+attr listPreferredItemHeightLarge
+attr listPreferredItemHeightSmall
+attr listPreferredItemPaddingEnd
+attr listPreferredItemPaddingLeft
+attr listPreferredItemPaddingRight
+attr listPreferredItemPaddingStart
+attr logo
+attr logoDescription
+attr maxButtonHeight
+attr measureWithLargestChild
+attr navigationContentDescription
+attr navigationIcon
+attr navigationMode
+attr overlapAnchor
+attr paddingEnd
+attr paddingStart
+attr panelBackground
+attr popupMenuStyle
+attr popupTheme
+attr popupWindowStyle
+attr preserveIconSpacing
+attr progressBarPadding
+attr progressBarStyle
+attr queryBackground
+attr queryHint
+attr radioButtonStyle
+attr ratingBarStyle
+attr ratingBarStyleIndicator
+attr ratingBarStyleSmall
+attr searchHintIcon
+attr searchIcon
+attr searchViewStyle
+attr seekBarStyle
+attr selectableItemBackground
+attr selectableItemBackgroundBorderless
+attr showAsAction
+attr showDividers
+attr showText
+attr spinBars
+attr spinnerDropDownItemStyle
+attr spinnerStyle
+attr splitTrack
+attr srcCompat
+attr state_above_anchor
+attr submitBackground
+attr subtitle
+attr subtitleTextAppearance
+attr subtitleTextColor
+attr subtitleTextStyle
+attr suggestionRowLayout
+attr switchMinWidth
+attr switchPadding
+attr switchStyle
+attr switchTextAppearance
+attr textAllCaps
+attr textAppearanceLargePopupMenu
+attr textAppearanceListItem
+attr textAppearanceListItemSecondary
+attr textAppearanceListItemSmall
+attr textAppearancePopupMenuHeader
+attr textAppearanceSearchResultSubtitle
+attr textAppearanceSearchResultTitle
+attr textAppearanceSmallPopupMenu
+attr textColorAlertDialogListItem
+attr textLocale
+attr theme
+attr thickness
+attr thumbTextPadding
+attr thumbTint
+attr thumbTintMode
+attr tickMark
+attr tickMarkTint
+attr tickMarkTintMode
+attr tint
+attr tintMode
+attr title
+attr titleMargin
+attr titleMarginBottom
+attr titleMarginEnd
+attr titleMarginStart
+attr titleMarginTop
+attr titleMargins
+attr titleTextAppearance
+attr titleTextColor
+attr titleTextStyle
+attr toolbarNavigationButtonStyle
+attr toolbarStyle
+attr track
+attr trackTint
+attr trackTintMode
+attr voiceIcon
+attr windowActionBar
+attr windowActionBarOverlay
+attr windowActionModeOverlay
+attr windowNoTitle
+layout support_simple_spinner_dropdown_item
+style TextAppearance_AppCompat
+style TextAppearance_AppCompat_Body1
+style TextAppearance_AppCompat_Body2
+style TextAppearance_AppCompat_Button
+style TextAppearance_AppCompat_Caption
+style TextAppearance_AppCompat_Display1
+style TextAppearance_AppCompat_Display2
+style TextAppearance_AppCompat_Display3
+style TextAppearance_AppCompat_Display4
+style TextAppearance_AppCompat_Headline
+style TextAppearance_AppCompat_Inverse
+style TextAppearance_AppCompat_Large
+style TextAppearance_AppCompat_Large_Inverse
+style TextAppearance_AppCompat_Light_SearchResult_Subtitle
+style TextAppearance_AppCompat_Light_SearchResult_Title
+style TextAppearance_AppCompat_Light_Widget_PopupMenu_Large
+style TextAppearance_AppCompat_Light_Widget_PopupMenu_Small
+style TextAppearance_AppCompat_Medium
+style TextAppearance_AppCompat_Medium_Inverse
+style TextAppearance_AppCompat_Menu
+style TextAppearance_AppCompat_SearchResult_Subtitle
+style TextAppearance_AppCompat_SearchResult_Title
+style TextAppearance_AppCompat_Small
+style TextAppearance_AppCompat_Small_Inverse
+style TextAppearance_AppCompat_Subhead
+style TextAppearance_AppCompat_Subhead_Inverse
+style TextAppearance_AppCompat_Title
+style TextAppearance_AppCompat_Title_Inverse
+style TextAppearance_AppCompat_Widget_ActionBar_Menu
+style TextAppearance_AppCompat_Widget_ActionBar_Subtitle
+style TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse
+style TextAppearance_AppCompat_Widget_ActionBar_Title
+style TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse
+style TextAppearance_AppCompat_Widget_ActionMode_Subtitle
+style TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse
+style TextAppearance_AppCompat_Widget_ActionMode_Title
+style TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse
+style TextAppearance_AppCompat_Widget_Button
+style TextAppearance_AppCompat_Widget_Button_Borderless_Colored
+style TextAppearance_AppCompat_Widget_Button_Colored
+style TextAppearance_AppCompat_Widget_Button_Inverse
+style TextAppearance_AppCompat_Widget_DropDownItem
+style TextAppearance_AppCompat_Widget_PopupMenu_Header
+style TextAppearance_AppCompat_Widget_PopupMenu_Large
+style TextAppearance_AppCompat_Widget_PopupMenu_Small
+style TextAppearance_AppCompat_Widget_Switch
+style TextAppearance_AppCompat_Widget_TextView_SpinnerItem
+style ThemeOverlay_AppCompat
+style ThemeOverlay_AppCompat_ActionBar
+style ThemeOverlay_AppCompat_Dark
+style ThemeOverlay_AppCompat_Dark_ActionBar
+style ThemeOverlay_AppCompat_DayNight
+style ThemeOverlay_AppCompat_DayNight_ActionBar
+style ThemeOverlay_AppCompat_Dialog
+style ThemeOverlay_AppCompat_Dialog_Alert
+style ThemeOverlay_AppCompat_Light
+style Theme_AppCompat
+style Theme_AppCompat_DayNight
+style Theme_AppCompat_DayNight_DarkActionBar
+style Theme_AppCompat_DayNight_Dialog
+style Theme_AppCompat_DayNight_DialogWhenLarge
+style Theme_AppCompat_DayNight_Dialog_Alert
+style Theme_AppCompat_DayNight_Dialog_MinWidth
+style Theme_AppCompat_DayNight_NoActionBar
+style Theme_AppCompat_Dialog
+style Theme_AppCompat_DialogWhenLarge
+style Theme_AppCompat_Dialog_Alert
+style Theme_AppCompat_Dialog_MinWidth
+style Theme_AppCompat_Light
+style Theme_AppCompat_Light_DarkActionBar
+style Theme_AppCompat_Light_Dialog
+style Theme_AppCompat_Light_DialogWhenLarge
+style Theme_AppCompat_Light_Dialog_Alert
+style Theme_AppCompat_Light_Dialog_MinWidth
+style Theme_AppCompat_Light_NoActionBar
+style Theme_AppCompat_NoActionBar
+style Widget_AppCompat_ActionBar
+style Widget_AppCompat_ActionBar_Solid
+style Widget_AppCompat_ActionBar_TabBar
+style Widget_AppCompat_ActionBar_TabText
+style Widget_AppCompat_ActionBar_TabView
+style Widget_AppCompat_ActionButton
+style Widget_AppCompat_ActionButton_CloseMode
+style Widget_AppCompat_ActionButton_Overflow
+style Widget_AppCompat_ActionMode
+style Widget_AppCompat_AutoCompleteTextView
+style Widget_AppCompat_Button
+style Widget_AppCompat_ButtonBar
+style Widget_AppCompat_ButtonBar_AlertDialog
+style Widget_AppCompat_Button_Borderless
+style Widget_AppCompat_Button_Borderless_Colored
+style Widget_AppCompat_Button_ButtonBar_AlertDialog
+style Widget_AppCompat_Button_Colored
+style Widget_AppCompat_Button_Small
+style Widget_AppCompat_CompoundButton_CheckBox
+style Widget_AppCompat_CompoundButton_RadioButton
+style Widget_AppCompat_CompoundButton_Switch
+style Widget_AppCompat_DrawerArrowToggle
+style Widget_AppCompat_DropDownItem_Spinner
+style Widget_AppCompat_EditText
+style Widget_AppCompat_ImageButton
+style Widget_AppCompat_Light_ActionBar
+style Widget_AppCompat_Light_ActionBar_Solid
+style Widget_AppCompat_Light_ActionBar_Solid_Inverse
+style Widget_AppCompat_Light_ActionBar_TabBar
+style Widget_AppCompat_Light_ActionBar_TabBar_Inverse
+style Widget_AppCompat_Light_ActionBar_TabText
+style Widget_AppCompat_Light_ActionBar_TabText_Inverse
+style Widget_AppCompat_Light_ActionBar_TabView
+style Widget_AppCompat_Light_ActionBar_TabView_Inverse
+style Widget_AppCompat_Light_ActionButton
+style Widget_AppCompat_Light_ActionButton_CloseMode
+style Widget_AppCompat_Light_ActionButton_Overflow
+style Widget_AppCompat_Light_ActionMode_Inverse
+style Widget_AppCompat_Light_AutoCompleteTextView
+style Widget_AppCompat_Light_DropDownItem_Spinner
+style Widget_AppCompat_Light_ListPopupWindow
+style Widget_AppCompat_Light_ListView_DropDown
+style Widget_AppCompat_Light_PopupMenu
+style Widget_AppCompat_Light_PopupMenu_Overflow
+style Widget_AppCompat_Light_SearchView
+style Widget_AppCompat_Light_Spinner_DropDown_ActionBar
+style Widget_AppCompat_ListPopupWindow
+style Widget_AppCompat_ListView
+style Widget_AppCompat_ListView_DropDown
+style Widget_AppCompat_ListView_Menu
+style Widget_AppCompat_PopupMenu
+style Widget_AppCompat_PopupMenu_Overflow
+style Widget_AppCompat_PopupWindow
+style Widget_AppCompat_ProgressBar
+style Widget_AppCompat_ProgressBar_Horizontal
+style Widget_AppCompat_RatingBar
+style Widget_AppCompat_RatingBar_Indicator
+style Widget_AppCompat_RatingBar_Small
+style Widget_AppCompat_SearchView
+style Widget_AppCompat_SearchView_ActionBar
+style Widget_AppCompat_SeekBar
+style Widget_AppCompat_SeekBar_Discrete
+style Widget_AppCompat_Spinner
+style Widget_AppCompat_Spinner_DropDown
+style Widget_AppCompat_Spinner_DropDown_ActionBar
+style Widget_AppCompat_Spinner_Underlined
+style Widget_AppCompat_TextView
+style Widget_AppCompat_TextView_SpinnerItem
+style Widget_AppCompat_Toolbar
+style Widget_AppCompat_Toolbar_Button_Navigation
diff --git a/appcompat/appcompat/api/restricted_1.6.0-beta02.txt b/appcompat/appcompat/api/restricted_1.6.0-beta02.txt
new file mode 100644
index 0000000..5454c84
--- /dev/null
+++ b/appcompat/appcompat/api/restricted_1.6.0-beta02.txt
@@ -0,0 +1,2287 @@
+// Signature format: 4.0
+package androidx.appcompat.app {
+
+  public abstract class ActionBar {
+    ctor public ActionBar();
+    method public abstract void addOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+    method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!);
+    method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, boolean);
+    method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int);
+    method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int, boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean closeOptionsMenu();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean collapseActionView();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void dispatchMenuVisibilityChanged(boolean);
+    method public abstract android.view.View! getCustomView();
+    method @androidx.appcompat.app.ActionBar.DisplayOptions public abstract int getDisplayOptions();
+    method public float getElevation();
+    method public abstract int getHeight();
+    method public int getHideOffset();
+    method @Deprecated public abstract int getNavigationItemCount();
+    method @Deprecated @androidx.appcompat.app.ActionBar.NavigationMode public abstract int getNavigationMode();
+    method @Deprecated public abstract int getSelectedNavigationIndex();
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab? getSelectedTab();
+    method public abstract CharSequence? getSubtitle();
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! getTabAt(int);
+    method @Deprecated public abstract int getTabCount();
+    method public android.content.Context! getThemedContext();
+    method public abstract CharSequence? getTitle();
+    method public abstract void hide();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean invalidateOptionsMenu();
+    method public boolean isHideOnContentScrollEnabled();
+    method public abstract boolean isShowing();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isTitleTruncated();
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! newTab();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void onConfigurationChanged(android.content.res.Configuration!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean onKeyShortcut(int, android.view.KeyEvent!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean onMenuKeyEvent(android.view.KeyEvent!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean openOptionsMenu();
+    method @Deprecated public abstract void removeAllTabs();
+    method public abstract void removeOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+    method @Deprecated public abstract void removeTab(androidx.appcompat.app.ActionBar.Tab!);
+    method @Deprecated public abstract void removeTabAt(int);
+    method @Deprecated public abstract void selectTab(androidx.appcompat.app.ActionBar.Tab!);
+    method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public abstract void setCustomView(android.view.View!);
+    method public abstract void setCustomView(android.view.View!, androidx.appcompat.app.ActionBar.LayoutParams!);
+    method public abstract void setCustomView(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setDefaultDisplayHomeAsUpEnabled(boolean);
+    method public abstract void setDisplayHomeAsUpEnabled(boolean);
+    method public abstract void setDisplayOptions(@androidx.appcompat.app.ActionBar.DisplayOptions int);
+    method public abstract void setDisplayOptions(@androidx.appcompat.app.ActionBar.DisplayOptions int, @androidx.appcompat.app.ActionBar.DisplayOptions int);
+    method public abstract void setDisplayShowCustomEnabled(boolean);
+    method public abstract void setDisplayShowHomeEnabled(boolean);
+    method public abstract void setDisplayShowTitleEnabled(boolean);
+    method public abstract void setDisplayUseLogoEnabled(boolean);
+    method public void setElevation(float);
+    method public void setHideOffset(int);
+    method public void setHideOnContentScrollEnabled(boolean);
+    method public void setHomeActionContentDescription(CharSequence?);
+    method public void setHomeActionContentDescription(@StringRes int);
+    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable?);
+    method public void setHomeAsUpIndicator(@DrawableRes int);
+    method public void setHomeButtonEnabled(boolean);
+    method public abstract void setIcon(@DrawableRes int);
+    method public abstract void setIcon(android.graphics.drawable.Drawable!);
+    method @Deprecated public abstract void setListNavigationCallbacks(android.widget.SpinnerAdapter!, androidx.appcompat.app.ActionBar.OnNavigationListener!);
+    method public abstract void setLogo(@DrawableRes int);
+    method public abstract void setLogo(android.graphics.drawable.Drawable!);
+    method @Deprecated public abstract void setNavigationMode(@androidx.appcompat.app.ActionBar.NavigationMode int);
+    method @Deprecated public abstract void setSelectedNavigationItem(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setShowHideAnimationEnabled(boolean);
+    method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable!);
+    method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable!);
+    method public abstract void setSubtitle(CharSequence!);
+    method public abstract void setSubtitle(int);
+    method public abstract void setTitle(CharSequence!);
+    method public abstract void setTitle(@StringRes int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setWindowTitle(CharSequence!);
+    method public abstract void show();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.view.ActionMode! startActionMode(androidx.appcompat.view.ActionMode.Callback!);
+    field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
+    field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
+    field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
+    field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
+    field public static final int DISPLAY_USE_LOGO = 1; // 0x1
+    field @Deprecated public static final int NAVIGATION_MODE_LIST = 1; // 0x1
+    field @Deprecated public static final int NAVIGATION_MODE_STANDARD = 0; // 0x0
+    field @Deprecated public static final int NAVIGATION_MODE_TABS = 2; // 0x2
+  }
+
+  @IntDef(flag=true, value={androidx.appcompat.app.ActionBar.DISPLAY_USE_LOGO, androidx.appcompat.app.ActionBar.DISPLAY_SHOW_HOME, androidx.appcompat.app.ActionBar.DISPLAY_HOME_AS_UP, androidx.appcompat.app.ActionBar.DISPLAY_SHOW_TITLE, androidx.appcompat.app.ActionBar.DISPLAY_SHOW_CUSTOM}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ActionBar.DisplayOptions {
+  }
+
+  public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+    ctor public ActionBar.LayoutParams(int, int);
+    ctor public ActionBar.LayoutParams(int, int, int);
+    ctor public ActionBar.LayoutParams(int);
+    ctor public ActionBar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+    ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    field public int gravity;
+  }
+
+  @IntDef({androidx.appcompat.app.ActionBar.NAVIGATION_MODE_STANDARD, androidx.appcompat.app.ActionBar.NAVIGATION_MODE_LIST, androidx.appcompat.app.ActionBar.NAVIGATION_MODE_TABS}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ActionBar.NavigationMode {
+  }
+
+  public static interface ActionBar.OnMenuVisibilityListener {
+    method public void onMenuVisibilityChanged(boolean);
+  }
+
+  @Deprecated public static interface ActionBar.OnNavigationListener {
+    method @Deprecated public boolean onNavigationItemSelected(int, long);
+  }
+
+  @Deprecated public abstract static class ActionBar.Tab {
+    ctor @Deprecated public ActionBar.Tab();
+    method @Deprecated public abstract CharSequence! getContentDescription();
+    method @Deprecated public abstract android.view.View! getCustomView();
+    method @Deprecated public abstract android.graphics.drawable.Drawable! getIcon();
+    method @Deprecated public abstract int getPosition();
+    method @Deprecated public abstract Object! getTag();
+    method @Deprecated public abstract CharSequence! getText();
+    method @Deprecated public abstract void select();
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(@StringRes int);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(CharSequence!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(android.view.View!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(int);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(android.graphics.drawable.Drawable!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(@DrawableRes int);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTabListener(androidx.appcompat.app.ActionBar.TabListener!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTag(Object!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(CharSequence!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(int);
+    field @Deprecated public static final int INVALID_POSITION = -1; // 0xffffffff
+  }
+
+  @Deprecated public static interface ActionBar.TabListener {
+    method @Deprecated public void onTabReselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+    method @Deprecated public void onTabSelected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+    method @Deprecated public void onTabUnselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+  }
+
+  public class ActionBarDrawerToggle implements androidx.drawerlayout.widget.DrawerLayout.DrawerListener {
+    ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, @StringRes int, @StringRes int);
+    ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, androidx.appcompat.widget.Toolbar!, @StringRes int, @StringRes int);
+    method public androidx.appcompat.graphics.drawable.DrawerArrowDrawable getDrawerArrowDrawable();
+    method public android.view.View.OnClickListener! getToolbarNavigationClickListener();
+    method public boolean isDrawerIndicatorEnabled();
+    method public boolean isDrawerSlideAnimationEnabled();
+    method public void onConfigurationChanged(android.content.res.Configuration!);
+    method public void onDrawerClosed(android.view.View!);
+    method public void onDrawerOpened(android.view.View!);
+    method public void onDrawerSlide(android.view.View!, float);
+    method public void onDrawerStateChanged(int);
+    method public boolean onOptionsItemSelected(android.view.MenuItem!);
+    method public void setDrawerArrowDrawable(androidx.appcompat.graphics.drawable.DrawerArrowDrawable);
+    method public void setDrawerIndicatorEnabled(boolean);
+    method public void setDrawerSlideAnimationEnabled(boolean);
+    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable!);
+    method public void setHomeAsUpIndicator(int);
+    method public void setToolbarNavigationClickListener(android.view.View.OnClickListener!);
+    method public void syncState();
+  }
+
+  public static interface ActionBarDrawerToggle.Delegate {
+    method public android.content.Context! getActionBarThemedContext();
+    method public android.graphics.drawable.Drawable! getThemeUpIndicator();
+    method public boolean isNavigationVisible();
+    method public void setActionBarDescription(@StringRes int);
+    method public void setActionBarUpIndicator(android.graphics.drawable.Drawable!, @StringRes int);
+  }
+
+  public static interface ActionBarDrawerToggle.DelegateProvider {
+    method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+  }
+
+  public class AlertDialog extends androidx.appcompat.app.AppCompatDialog implements android.content.DialogInterface {
+    ctor protected AlertDialog(android.content.Context);
+    ctor protected AlertDialog(android.content.Context, @StyleRes int);
+    ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener?);
+    method public android.widget.Button! getButton(int);
+    method public android.widget.ListView! getListView();
+    method public void setButton(int, CharSequence!, android.os.Message!);
+    method public void setButton(int, CharSequence!, android.content.DialogInterface.OnClickListener!);
+    method public void setButton(int, CharSequence!, android.graphics.drawable.Drawable!, android.content.DialogInterface.OnClickListener!);
+    method public void setCustomTitle(android.view.View!);
+    method public void setIcon(int);
+    method public void setIcon(android.graphics.drawable.Drawable!);
+    method public void setIconAttribute(int);
+    method public void setMessage(CharSequence!);
+    method public void setView(android.view.View!);
+    method public void setView(android.view.View!, int, int, int, int);
+  }
+
+  public static class AlertDialog.Builder {
+    ctor public AlertDialog.Builder(android.content.Context);
+    ctor public AlertDialog.Builder(android.content.Context, @StyleRes int);
+    method public androidx.appcompat.app.AlertDialog create();
+    method public android.content.Context getContext();
+    method public androidx.appcompat.app.AlertDialog.Builder! setAdapter(android.widget.ListAdapter!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setCancelable(boolean);
+    method public androidx.appcompat.app.AlertDialog.Builder! setCursor(android.database.Cursor!, android.content.DialogInterface.OnClickListener!, String!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setCustomTitle(android.view.View?);
+    method public androidx.appcompat.app.AlertDialog.Builder! setIcon(@DrawableRes int);
+    method public androidx.appcompat.app.AlertDialog.Builder! setIcon(android.graphics.drawable.Drawable?);
+    method public androidx.appcompat.app.AlertDialog.Builder! setIconAttribute(@AttrRes int);
+    method @Deprecated public androidx.appcompat.app.AlertDialog.Builder! setInverseBackgroundForced(boolean);
+    method public androidx.appcompat.app.AlertDialog.Builder! setItems(@ArrayRes int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setItems(CharSequence![]!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMessage(@StringRes int);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMessage(CharSequence?);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(@ArrayRes int, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(CharSequence![]!, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(android.database.Cursor!, String!, String!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButtonIcon(android.graphics.drawable.Drawable!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButtonIcon(android.graphics.drawable.Drawable!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setOnCancelListener(android.content.DialogInterface.OnCancelListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setOnDismissListener(android.content.DialogInterface.OnDismissListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setOnKeyListener(android.content.DialogInterface.OnKeyListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButtonIcon(android.graphics.drawable.Drawable!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.app.AlertDialog.Builder! setRecycleOnMeasureEnabled(boolean);
+    method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(@ArrayRes int, int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.database.Cursor!, int, String!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(CharSequence![]!, int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.widget.ListAdapter!, int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setTitle(@StringRes int);
+    method public androidx.appcompat.app.AlertDialog.Builder! setTitle(CharSequence?);
+    method public androidx.appcompat.app.AlertDialog.Builder! setView(int);
+    method public androidx.appcompat.app.AlertDialog.Builder! setView(android.view.View!);
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.app.AlertDialog.Builder! setView(android.view.View!, int, int, int, int);
+    method public androidx.appcompat.app.AlertDialog! show();
+  }
+
+  public class AppCompatActivity extends androidx.fragment.app.FragmentActivity implements androidx.appcompat.app.ActionBarDrawerToggle.DelegateProvider androidx.appcompat.app.AppCompatCallback androidx.core.app.TaskStackBuilder.SupportParentable {
+    ctor public AppCompatActivity();
+    ctor @ContentView public AppCompatActivity(@LayoutRes int);
+    method public androidx.appcompat.app.AppCompatDelegate getDelegate();
+    method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+    method public androidx.appcompat.app.ActionBar? getSupportActionBar();
+    method public android.content.Intent? getSupportParentActivityIntent();
+    method public void onCreateSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+    method protected void onLocalesChanged(androidx.core.os.LocaleListCompat);
+    method public final boolean onMenuItemSelected(int, android.view.MenuItem);
+    method protected void onNightModeChanged(@androidx.appcompat.app.AppCompatDelegate.NightMode int);
+    method public void onPrepareSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+    method @CallSuper public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode);
+    method @CallSuper public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode);
+    method @Deprecated public void onSupportContentChanged();
+    method public boolean onSupportNavigateUp();
+    method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+    method public void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+    method @Deprecated public void setSupportProgress(int);
+    method @Deprecated public void setSupportProgressBarIndeterminate(boolean);
+    method @Deprecated public void setSupportProgressBarIndeterminateVisibility(boolean);
+    method @Deprecated public void setSupportProgressBarVisibility(boolean);
+    method public androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+    method public void supportInvalidateOptionsMenu();
+    method public void supportNavigateUpTo(android.content.Intent);
+    method public boolean supportRequestWindowFeature(int);
+    method public boolean supportShouldUpRecreateTask(android.content.Intent);
+  }
+
+  public interface AppCompatCallback {
+    method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+    method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+    method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+  }
+
+  public abstract class AppCompatDelegate {
+    method public abstract void addContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+    method public abstract boolean applyDayNight();
+    method @Deprecated public void attachBaseContext(android.content.Context!);
+    method @CallSuper public android.content.Context attachBaseContext2(android.content.Context);
+    method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+    method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Dialog, androidx.appcompat.app.AppCompatCallback?);
+    method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.view.Window, androidx.appcompat.app.AppCompatCallback?);
+    method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+    method public abstract android.view.View! createView(android.view.View?, String!, android.content.Context, android.util.AttributeSet);
+    method public abstract <T extends android.view.View> T! findViewById(@IdRes int);
+    method @AnyThread public static androidx.core.os.LocaleListCompat getApplicationLocales();
+    method public android.content.Context? getContextForDelegate();
+    method @androidx.appcompat.app.AppCompatDelegate.NightMode public static int getDefaultNightMode();
+    method public abstract androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+    method @androidx.appcompat.app.AppCompatDelegate.NightMode public int getLocalNightMode();
+    method public abstract android.view.MenuInflater! getMenuInflater();
+    method public abstract androidx.appcompat.app.ActionBar? getSupportActionBar();
+    method public abstract boolean hasWindowFeature(int);
+    method public abstract void installViewFactory();
+    method public abstract void invalidateOptionsMenu();
+    method public static boolean isCompatVectorFromResourcesEnabled();
+    method public abstract boolean isHandleNativeActionModesEnabled();
+    method public abstract void onConfigurationChanged(android.content.res.Configuration!);
+    method public abstract void onCreate(android.os.Bundle!);
+    method public abstract void onDestroy();
+    method public abstract void onPostCreate(android.os.Bundle!);
+    method public abstract void onPostResume();
+    method public abstract void onSaveInstanceState(android.os.Bundle!);
+    method public abstract void onStart();
+    method public abstract void onStop();
+    method public abstract boolean requestWindowFeature(int);
+    method public static void setApplicationLocales(androidx.core.os.LocaleListCompat);
+    method public static void setCompatVectorFromResourcesEnabled(boolean);
+    method public abstract void setContentView(android.view.View!);
+    method public abstract void setContentView(@LayoutRes int);
+    method public abstract void setContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+    method public static void setDefaultNightMode(@androidx.appcompat.app.AppCompatDelegate.NightMode int);
+    method public abstract void setHandleNativeActionModesEnabled(boolean);
+    method @RequiresApi(17) public abstract void setLocalNightMode(@androidx.appcompat.app.AppCompatDelegate.NightMode int);
+    method @CallSuper @RequiresApi(33) public void setOnBackInvokedDispatcher(android.window.OnBackInvokedDispatcher?);
+    method public abstract void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+    method public void setTheme(@StyleRes int);
+    method public abstract void setTitle(CharSequence?);
+    method public abstract androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+    field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
+    field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
+    field @Deprecated public static final int MODE_NIGHT_AUTO = 0; // 0x0
+    field public static final int MODE_NIGHT_AUTO_BATTERY = 3; // 0x3
+    field @Deprecated public static final int MODE_NIGHT_AUTO_TIME = 0; // 0x0
+    field public static final int MODE_NIGHT_FOLLOW_SYSTEM = -1; // 0xffffffff
+    field public static final int MODE_NIGHT_NO = 1; // 0x1
+    field public static final int MODE_NIGHT_UNSPECIFIED = -100; // 0xffffff9c
+    field public static final int MODE_NIGHT_YES = 2; // 0x2
+  }
+
+  @IntDef({androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_NO, androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_YES, androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_AUTO_TIME, androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM, androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_UNSPECIFIED, androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface AppCompatDelegate.NightMode {
+  }
+
+  public class AppCompatDialog extends androidx.activity.ComponentDialog implements androidx.appcompat.app.AppCompatCallback {
+    ctor public AppCompatDialog(android.content.Context);
+    ctor public AppCompatDialog(android.content.Context, int);
+    ctor protected AppCompatDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener?);
+    method public androidx.appcompat.app.AppCompatDelegate getDelegate();
+    method public androidx.appcompat.app.ActionBar! getSupportActionBar();
+    method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+    method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+    method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+    method public boolean supportRequestWindowFeature(int);
+  }
+
+  public class AppCompatDialogFragment extends androidx.fragment.app.DialogFragment {
+    ctor public AppCompatDialogFragment();
+    ctor public AppCompatDialogFragment(@LayoutRes int);
+  }
+
+  public class AppCompatViewInflater {
+    ctor public AppCompatViewInflater();
+    method protected androidx.appcompat.widget.AppCompatAutoCompleteTextView createAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatButton createButton(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatCheckBox createCheckBox(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatCheckedTextView createCheckedTextView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatEditText createEditText(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatImageButton createImageButton(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatImageView createImageView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatMultiAutoCompleteTextView createMultiAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatRadioButton createRadioButton(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatRatingBar createRatingBar(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatSeekBar createSeekBar(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatSpinner createSpinner(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatTextView createTextView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatToggleButton createToggleButton(android.content.Context!, android.util.AttributeSet!);
+    method public final android.view.View? createView(android.view.View?, String, android.content.Context, android.util.AttributeSet, boolean, boolean, boolean, boolean);
+    method protected android.view.View? createView(android.content.Context!, String!, android.util.AttributeSet!);
+  }
+
+  public final class AppLocalesMetadataHolderService extends android.app.Service {
+    ctor public AppLocalesMetadataHolderService();
+    method public static android.content.pm.ServiceInfo getServiceInfo(android.content.Context) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public android.os.IBinder onBind(android.content.Intent);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class WindowDecorActionBar extends androidx.appcompat.app.ActionBar implements androidx.appcompat.widget.ActionBarOverlayLayout.ActionBarVisibilityCallback {
+    ctor public WindowDecorActionBar(android.app.Activity!, boolean);
+    ctor public WindowDecorActionBar(android.app.Dialog!);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public WindowDecorActionBar(android.view.View!);
+    method public void addOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+    method public void addTab(androidx.appcompat.app.ActionBar.Tab!);
+    method public void addTab(androidx.appcompat.app.ActionBar.Tab!, int);
+    method public void addTab(androidx.appcompat.app.ActionBar.Tab!, boolean);
+    method public void addTab(androidx.appcompat.app.ActionBar.Tab!, int, boolean);
+    method public void animateToMode(boolean);
+    method public void doHide(boolean);
+    method public void doShow(boolean);
+    method public void enableContentAnimations(boolean);
+    method public android.view.View! getCustomView();
+    method public int getDisplayOptions();
+    method public int getHeight();
+    method public int getNavigationItemCount();
+    method public int getNavigationMode();
+    method public int getSelectedNavigationIndex();
+    method public androidx.appcompat.app.ActionBar.Tab! getSelectedTab();
+    method public CharSequence! getSubtitle();
+    method public androidx.appcompat.app.ActionBar.Tab! getTabAt(int);
+    method public int getTabCount();
+    method public CharSequence! getTitle();
+    method public boolean hasIcon();
+    method public boolean hasLogo();
+    method public void hide();
+    method public void hideForSystem();
+    method public boolean isShowing();
+    method public androidx.appcompat.app.ActionBar.Tab! newTab();
+    method public void onContentScrollStarted();
+    method public void onContentScrollStopped();
+    method public void onWindowVisibilityChanged(int);
+    method public void removeAllTabs();
+    method public void removeOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+    method public void removeTab(androidx.appcompat.app.ActionBar.Tab!);
+    method public void removeTabAt(int);
+    method public boolean requestFocus();
+    method public void selectTab(androidx.appcompat.app.ActionBar.Tab!);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+    method public void setCustomView(int);
+    method public void setCustomView(android.view.View!);
+    method public void setCustomView(android.view.View!, androidx.appcompat.app.ActionBar.LayoutParams!);
+    method public void setDisplayHomeAsUpEnabled(boolean);
+    method public void setDisplayOptions(int);
+    method public void setDisplayOptions(int, int);
+    method public void setDisplayShowCustomEnabled(boolean);
+    method public void setDisplayShowHomeEnabled(boolean);
+    method public void setDisplayShowTitleEnabled(boolean);
+    method public void setDisplayUseLogoEnabled(boolean);
+    method public void setIcon(int);
+    method public void setIcon(android.graphics.drawable.Drawable!);
+    method public void setListNavigationCallbacks(android.widget.SpinnerAdapter!, androidx.appcompat.app.ActionBar.OnNavigationListener!);
+    method public void setLogo(int);
+    method public void setLogo(android.graphics.drawable.Drawable!);
+    method public void setNavigationMode(int);
+    method public void setSelectedNavigationItem(int);
+    method public void setSubtitle(int);
+    method public void setSubtitle(CharSequence!);
+    method public void setTitle(int);
+    method public void setTitle(CharSequence!);
+    method public void show();
+    method public void showForSystem();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class WindowDecorActionBar.ActionModeImpl extends androidx.appcompat.view.ActionMode implements androidx.appcompat.view.menu.MenuBuilder.Callback {
+    ctor public WindowDecorActionBar.ActionModeImpl(android.content.Context!, androidx.appcompat.view.ActionMode.Callback!);
+    method public boolean dispatchOnCreate();
+    method public void finish();
+    method public android.view.View! getCustomView();
+    method public android.view.Menu! getMenu();
+    method public android.view.MenuInflater! getMenuInflater();
+    method public CharSequence! getSubtitle();
+    method public CharSequence! getTitle();
+    method public void invalidate();
+    method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder!, boolean);
+    method public void onCloseSubMenu(androidx.appcompat.view.menu.SubMenuBuilder!);
+    method public boolean onMenuItemSelected(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+    method public void onMenuModeChange(androidx.appcompat.view.menu.MenuBuilder);
+    method public boolean onSubMenuSelected(androidx.appcompat.view.menu.SubMenuBuilder!);
+    method public void setCustomView(android.view.View!);
+    method public void setSubtitle(CharSequence!);
+    method public void setSubtitle(int);
+    method public void setTitle(CharSequence!);
+    method public void setTitle(int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class WindowDecorActionBar.TabImpl extends androidx.appcompat.app.ActionBar.Tab {
+    ctor public WindowDecorActionBar.TabImpl();
+    method public androidx.appcompat.app.ActionBar.TabListener! getCallback();
+    method public CharSequence! getContentDescription();
+    method public android.view.View! getCustomView();
+    method public android.graphics.drawable.Drawable! getIcon();
+    method public int getPosition();
+    method public Object! getTag();
+    method public CharSequence! getText();
+    method public void select();
+    method public androidx.appcompat.app.ActionBar.Tab! setContentDescription(int);
+    method public androidx.appcompat.app.ActionBar.Tab! setContentDescription(CharSequence!);
+    method public androidx.appcompat.app.ActionBar.Tab! setCustomView(android.view.View!);
+    method public androidx.appcompat.app.ActionBar.Tab! setCustomView(int);
+    method public androidx.appcompat.app.ActionBar.Tab! setIcon(android.graphics.drawable.Drawable!);
+    method public androidx.appcompat.app.ActionBar.Tab! setIcon(int);
+    method public void setPosition(int);
+    method public androidx.appcompat.app.ActionBar.Tab! setTabListener(androidx.appcompat.app.ActionBar.TabListener!);
+    method public androidx.appcompat.app.ActionBar.Tab! setTag(Object!);
+    method public androidx.appcompat.app.ActionBar.Tab! setText(CharSequence!);
+    method public androidx.appcompat.app.ActionBar.Tab! setText(int);
+  }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+  public class DrawerArrowDrawable extends android.graphics.drawable.Drawable {
+    ctor public DrawerArrowDrawable(android.content.Context!);
+    method public void draw(android.graphics.Canvas!);
+    method public float getArrowHeadLength();
+    method public float getArrowShaftLength();
+    method public float getBarLength();
+    method public float getBarThickness();
+    method @ColorInt public int getColor();
+    method @androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ArrowDirection public int getDirection();
+    method public float getGapSize();
+    method public int getOpacity();
+    method public final android.graphics.Paint! getPaint();
+    method @FloatRange(from=0.0, to=1.0) public float getProgress();
+    method public boolean isSpinEnabled();
+    method public void setAlpha(int);
+    method public void setArrowHeadLength(float);
+    method public void setArrowShaftLength(float);
+    method public void setBarLength(float);
+    method public void setBarThickness(float);
+    method public void setColor(@ColorInt int);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setDirection(@androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ArrowDirection int);
+    method public void setGapSize(float);
+    method public void setProgress(@FloatRange(from=0.0, to=1.0) float);
+    method public void setSpinEnabled(boolean);
+    method public void setVerticalMirror(boolean);
+    field public static final int ARROW_DIRECTION_END = 3; // 0x3
+    field public static final int ARROW_DIRECTION_LEFT = 0; // 0x0
+    field public static final int ARROW_DIRECTION_RIGHT = 1; // 0x1
+    field public static final int ARROW_DIRECTION_START = 2; // 0x2
+  }
+
+  @IntDef({androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ARROW_DIRECTION_LEFT, androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ARROW_DIRECTION_RIGHT, androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ARROW_DIRECTION_START, androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ARROW_DIRECTION_END}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface DrawerArrowDrawable.ArrowDirection {
+  }
+
+}
+
+package androidx.appcompat.text {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class AllCapsTransformationMethod implements android.text.method.TransformationMethod {
+    ctor public AllCapsTransformationMethod(android.content.Context!);
+    method public CharSequence! getTransformation(CharSequence!, android.view.View!);
+    method public void onFocusChanged(android.view.View!, CharSequence!, boolean, int, android.graphics.Rect!);
+  }
+
+}
+
+package androidx.appcompat.view {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionBarPolicy {
+    method public boolean enableHomeButtonByDefault();
+    method public static androidx.appcompat.view.ActionBarPolicy! get(android.content.Context!);
+    method public int getEmbeddedMenuWidthLimit();
+    method public int getMaxActionButtons();
+    method public int getStackedTabMaxWidth();
+    method public int getTabContainerHeight();
+    method public boolean hasEmbeddedTabs();
+    method public boolean showsOverflowMenuButton();
+  }
+
+  public abstract class ActionMode {
+    ctor public ActionMode();
+    method public abstract void finish();
+    method public abstract android.view.View! getCustomView();
+    method public abstract android.view.Menu! getMenu();
+    method public abstract android.view.MenuInflater! getMenuInflater();
+    method public abstract CharSequence! getSubtitle();
+    method public Object! getTag();
+    method public abstract CharSequence! getTitle();
+    method public boolean getTitleOptionalHint();
+    method public abstract void invalidate();
+    method public boolean isTitleOptional();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isUiFocusable();
+    method public abstract void setCustomView(android.view.View!);
+    method public abstract void setSubtitle(CharSequence!);
+    method public abstract void setSubtitle(int);
+    method public void setTag(Object!);
+    method public abstract void setTitle(CharSequence!);
+    method public abstract void setTitle(int);
+    method public void setTitleOptionalHint(boolean);
+  }
+
+  public static interface ActionMode.Callback {
+    method public boolean onActionItemClicked(androidx.appcompat.view.ActionMode!, android.view.MenuItem!);
+    method public boolean onCreateActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+    method public void onDestroyActionMode(androidx.appcompat.view.ActionMode!);
+    method public boolean onPrepareActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+  }
+
+  @Deprecated public interface CollapsibleActionView {
+    method @Deprecated public void onActionViewCollapsed();
+    method @Deprecated public void onActionViewExpanded();
+  }
+
+  public class ContextThemeWrapper extends android.content.ContextWrapper {
+    ctor public ContextThemeWrapper();
+    ctor public ContextThemeWrapper(android.content.Context!, @StyleRes int);
+    ctor public ContextThemeWrapper(android.content.Context!, android.content.res.Resources.Theme!);
+    method public void applyOverrideConfiguration(android.content.res.Configuration!);
+    method public int getThemeResId();
+    method protected void onApplyThemeResource(android.content.res.Resources.Theme!, int, boolean);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class StandaloneActionMode extends androidx.appcompat.view.ActionMode implements androidx.appcompat.view.menu.MenuBuilder.Callback {
+    ctor public StandaloneActionMode(android.content.Context!, androidx.appcompat.widget.ActionBarContextView!, androidx.appcompat.view.ActionMode.Callback!, boolean);
+    method public void finish();
+    method public android.view.View! getCustomView();
+    method public android.view.Menu! getMenu();
+    method public android.view.MenuInflater! getMenuInflater();
+    method public CharSequence! getSubtitle();
+    method public CharSequence! getTitle();
+    method public void invalidate();
+    method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder!, boolean);
+    method public void onCloseSubMenu(androidx.appcompat.view.menu.SubMenuBuilder!);
+    method public boolean onMenuItemSelected(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+    method public void onMenuModeChange(androidx.appcompat.view.menu.MenuBuilder);
+    method public boolean onSubMenuSelected(androidx.appcompat.view.menu.SubMenuBuilder!);
+    method public void setCustomView(android.view.View!);
+    method public void setSubtitle(CharSequence!);
+    method public void setSubtitle(int);
+    method public void setTitle(CharSequence!);
+    method public void setTitle(int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SupportActionModeWrapper extends android.view.ActionMode {
+    ctor public SupportActionModeWrapper(android.content.Context!, androidx.appcompat.view.ActionMode!);
+    method public void finish();
+    method public android.view.View! getCustomView();
+    method public android.view.Menu! getMenu();
+    method public android.view.MenuInflater! getMenuInflater();
+    method public CharSequence! getSubtitle();
+    method public CharSequence! getTitle();
+    method public void invalidate();
+    method public void setCustomView(android.view.View!);
+    method public void setSubtitle(CharSequence!);
+    method public void setSubtitle(int);
+    method public void setTitle(CharSequence!);
+    method public void setTitle(int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class SupportActionModeWrapper.CallbackWrapper implements androidx.appcompat.view.ActionMode.Callback {
+    ctor public SupportActionModeWrapper.CallbackWrapper(android.content.Context!, android.view.ActionMode.Callback!);
+    method public android.view.ActionMode! getActionModeWrapper(androidx.appcompat.view.ActionMode!);
+    method public boolean onActionItemClicked(androidx.appcompat.view.ActionMode!, android.view.MenuItem!);
+    method public boolean onCreateActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+    method public void onDestroyActionMode(androidx.appcompat.view.ActionMode!);
+    method public boolean onPrepareActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SupportMenuInflater extends android.view.MenuInflater {
+    ctor public SupportMenuInflater(android.content.Context!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ViewPropertyAnimatorCompatSet {
+    ctor public ViewPropertyAnimatorCompatSet();
+    method public void cancel();
+    method public androidx.appcompat.view.ViewPropertyAnimatorCompatSet! play(androidx.core.view.ViewPropertyAnimatorCompat!);
+    method public androidx.appcompat.view.ViewPropertyAnimatorCompatSet! playSequentially(androidx.core.view.ViewPropertyAnimatorCompat!, androidx.core.view.ViewPropertyAnimatorCompat!);
+    method public androidx.appcompat.view.ViewPropertyAnimatorCompatSet! setDuration(long);
+    method public androidx.appcompat.view.ViewPropertyAnimatorCompatSet! setInterpolator(android.view.animation.Interpolator!);
+    method public androidx.appcompat.view.ViewPropertyAnimatorCompatSet! setListener(androidx.core.view.ViewPropertyAnimatorListener!);
+    method public void start();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class WindowCallbackWrapper implements android.view.Window.Callback {
+    ctor public WindowCallbackWrapper(android.view.Window.Callback!);
+    method public boolean dispatchGenericMotionEvent(android.view.MotionEvent!);
+    method public boolean dispatchKeyEvent(android.view.KeyEvent!);
+    method public boolean dispatchKeyShortcutEvent(android.view.KeyEvent!);
+    method public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent!);
+    method public boolean dispatchTouchEvent(android.view.MotionEvent!);
+    method public boolean dispatchTrackballEvent(android.view.MotionEvent!);
+    method public final android.view.Window.Callback! getWrapped();
+    method public void onActionModeFinished(android.view.ActionMode!);
+    method public void onActionModeStarted(android.view.ActionMode!);
+    method public void onAttachedToWindow();
+    method public void onContentChanged();
+    method public boolean onCreatePanelMenu(int, android.view.Menu!);
+    method public android.view.View! onCreatePanelView(int);
+    method public void onDetachedFromWindow();
+    method public boolean onMenuItemSelected(int, android.view.MenuItem!);
+    method public boolean onMenuOpened(int, android.view.Menu!);
+    method public void onPanelClosed(int, android.view.Menu!);
+    method public boolean onPreparePanel(int, android.view.View!, android.view.Menu!);
+    method @RequiresApi(23) public boolean onSearchRequested(android.view.SearchEvent!);
+    method public boolean onSearchRequested();
+    method public void onWindowAttributesChanged(android.view.WindowManager.LayoutParams!);
+    method public void onWindowFocusChanged(boolean);
+    method public android.view.ActionMode! onWindowStartingActionMode(android.view.ActionMode.Callback!);
+    method @RequiresApi(23) public android.view.ActionMode! onWindowStartingActionMode(android.view.ActionMode.Callback!, int);
+  }
+
+}
+
+package androidx.appcompat.view.menu {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionMenuItem implements androidx.core.internal.view.SupportMenuItem {
+    ctor public ActionMenuItem(android.content.Context!, int, int, int, int, CharSequence!);
+    method public boolean collapseActionView();
+    method public boolean expandActionView();
+    method public android.view.ActionProvider! getActionProvider();
+    method public android.view.View! getActionView();
+    method public char getAlphabeticShortcut();
+    method public int getGroupId();
+    method public android.graphics.drawable.Drawable! getIcon();
+    method public android.content.Intent! getIntent();
+    method public int getItemId();
+    method public android.view.ContextMenu.ContextMenuInfo! getMenuInfo();
+    method public char getNumericShortcut();
+    method public int getOrder();
+    method public android.view.SubMenu! getSubMenu();
+    method public androidx.core.view.ActionProvider! getSupportActionProvider();
+    method public CharSequence! getTitle();
+    method public CharSequence! getTitleCondensed();
+    method public boolean hasSubMenu();
+    method public boolean invoke();
+    method public boolean isActionViewExpanded();
+    method public boolean isCheckable();
+    method public boolean isChecked();
+    method public boolean isEnabled();
+    method public boolean isVisible();
+    method public boolean requiresActionButton();
+    method public boolean requiresOverflow();
+    method public android.view.MenuItem! setActionProvider(android.view.ActionProvider!);
+    method public androidx.core.internal.view.SupportMenuItem setActionView(android.view.View!);
+    method public androidx.core.internal.view.SupportMenuItem setActionView(int);
+    method public android.view.MenuItem! setAlphabeticShortcut(char);
+    method public android.view.MenuItem! setCheckable(boolean);
+    method public android.view.MenuItem! setChecked(boolean);
+    method public androidx.core.internal.view.SupportMenuItem setContentDescription(CharSequence!);
+    method public android.view.MenuItem! setEnabled(boolean);
+    method public androidx.appcompat.view.menu.ActionMenuItem! setExclusiveCheckable(boolean);
+    method public android.view.MenuItem! setIcon(android.graphics.drawable.Drawable!);
+    method public android.view.MenuItem! setIcon(int);
+    method public android.view.MenuItem! setIntent(android.content.Intent!);
+    method public android.view.MenuItem! setNumericShortcut(char);
+    method public android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem.OnActionExpandListener!);
+    method public android.view.MenuItem! setOnMenuItemClickListener(android.view.MenuItem.OnMenuItemClickListener!);
+    method public android.view.MenuItem! setShortcut(char, char);
+    method public void setShowAsAction(int);
+    method public androidx.core.internal.view.SupportMenuItem setShowAsActionFlags(int);
+    method public androidx.core.internal.view.SupportMenuItem setSupportActionProvider(androidx.core.view.ActionProvider!);
+    method public android.view.MenuItem! setTitle(CharSequence!);
+    method public android.view.MenuItem! setTitle(int);
+    method public android.view.MenuItem! setTitleCondensed(CharSequence!);
+    method public androidx.core.internal.view.SupportMenuItem setTooltipText(CharSequence!);
+    method public android.view.MenuItem! setVisible(boolean);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionMenuItemView extends androidx.appcompat.widget.AppCompatTextView implements androidx.appcompat.widget.ActionMenuView.ActionMenuChildView androidx.appcompat.view.menu.MenuView.ItemView android.view.View.OnClickListener {
+    ctor public ActionMenuItemView(android.content.Context!);
+    ctor public ActionMenuItemView(android.content.Context!, android.util.AttributeSet!);
+    ctor public ActionMenuItemView(android.content.Context!, android.util.AttributeSet!, int);
+    method public androidx.appcompat.view.menu.MenuItemImpl! getItemData();
+    method public boolean hasText();
+    method public void initialize(androidx.appcompat.view.menu.MenuItemImpl!, int);
+    method public boolean needsDividerAfter();
+    method public boolean needsDividerBefore();
+    method public void onClick(android.view.View!);
+    method public void onConfigurationChanged(android.content.res.Configuration!);
+    method public boolean prefersCondensedTitle();
+    method public void setCheckable(boolean);
+    method public void setChecked(boolean);
+    method public void setExpandedFormat(boolean);
+    method public void setIcon(android.graphics.drawable.Drawable!);
+    method public void setItemInvoker(androidx.appcompat.view.menu.MenuBuilder.ItemInvoker!);
+    method public void setPopupCallback(androidx.appcompat.view.menu.ActionMenuItemView.PopupCallback!);
+    method public void setShortcut(boolean, char);
+    method public void setTitle(CharSequence!);
+    method public boolean showsIcon();
+  }
+
+  public abstract static class ActionMenuItemView.PopupCallback {
+    ctor public ActionMenuItemView.PopupCallback();
+    method public abstract androidx.appcompat.view.menu.ShowableListMenu! getPopup();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class BaseMenuPresenter implements androidx.appcompat.view.menu.MenuPresenter {
+    ctor public BaseMenuPresenter(android.content.Context!, int, int);
+    method protected void addItemView(android.view.View!, int);
+    method public abstract void bindItemView(androidx.appcompat.view.menu.MenuItemImpl!, androidx.appcompat.view.menu.MenuView.ItemView!);
+    method public boolean collapseItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+    method public androidx.appcompat.view.menu.MenuView.ItemView! createItemView(android.view.ViewGroup!);
+    method public boolean expandItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+    method protected boolean filterLeftoverView(android.view.ViewGroup!, int);
+    method public boolean flagActionItems();
+    method public androidx.appcompat.view.menu.MenuPresenter.Callback! getCallback();
+    method public int getId();
+    method public android.view.View! getItemView(androidx.appcompat.view.menu.MenuItemImpl!, android.view.View!, android.view.ViewGroup!);
+    method public androidx.appcompat.view.menu.MenuView! getMenuView(android.view.ViewGroup!);
+    method public void initForMenu(android.content.Context!, androidx.appcompat.view.menu.MenuBuilder!);
+    method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder!, boolean);
+    method public boolean onSubMenuSelected(androidx.appcompat.view.menu.SubMenuBuilder!);
+    method public void setCallback(androidx.appcompat.view.menu.MenuPresenter.Callback!);
+    method public void setId(int);
+    method public boolean shouldIncludeItem(int, androidx.appcompat.view.menu.MenuItemImpl!);
+    method public void updateMenuView(boolean);
+    field protected android.content.Context! mContext;
+    field protected android.view.LayoutInflater! mInflater;
+    field protected androidx.appcompat.view.menu.MenuBuilder! mMenu;
+    field protected androidx.appcompat.view.menu.MenuView! mMenuView;
+    field protected android.content.Context! mSystemContext;
+    field protected android.view.LayoutInflater! mSystemInflater;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ExpandedMenuView extends android.widget.ListView implements android.widget.AdapterView.OnItemClickListener androidx.appcompat.view.menu.MenuBuilder.ItemInvoker androidx.appcompat.view.menu.MenuView {
+    ctor public ExpandedMenuView(android.content.Context!, android.util.AttributeSet!);
+    ctor public ExpandedMenuView(android.content.Context!, android.util.AttributeSet!, int);
+    method public int getWindowAnimations();
+    method public void initialize(androidx.appcompat.view.menu.MenuBuilder!);
+    method public boolean invokeItem(androidx.appcompat.view.menu.MenuItemImpl!);
+    method public void onItemClick(android.widget.AdapterView!, android.view.View!, int, long);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ListMenuItemView extends android.widget.LinearLayout implements android.widget.AbsListView.SelectionBoundsAdjuster androidx.appcompat.view.menu.MenuView.ItemView {
+    ctor public ListMenuItemView(android.content.Context!, android.util.AttributeSet!);
+    ctor public ListMenuItemView(android.content.Context!, android.util.AttributeSet!, int);
+    method public void adjustListItemSelectionBounds(android.graphics.Rect!);
+    method public androidx.appcompat.view.menu.MenuItemImpl! getItemData();
+    method public void initialize(androidx.appcompat.view.menu.MenuItemImpl!, int);
+    method public boolean prefersCondensedTitle();
+    method public void setCheckable(boolean);
+    method public void setChecked(boolean);
+    method public void setForceShowIcon(boolean);
+    method public void setGroupDividerEnabled(boolean);
+    method public void setIcon(android.graphics.drawable.Drawable!);
+    method public void setShortcut(boolean, char);
+    method public void setTitle(CharSequence!);
+    method public boolean showsIcon();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ListMenuPresenter implements android.widget.AdapterView.OnItemClickListener androidx.appcompat.view.menu.MenuPresenter {
+    ctor public ListMenuPresenter(android.content.Context!, int);
+    ctor public ListMenuPresenter(int, int);
+    method public boolean collapseItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+    method public boolean expandItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+    method public boolean flagActionItems();
+    method public android.widget.ListAdapter! getAdapter();
+    method public int getId();
+    method public androidx.appcompat.view.menu.MenuView! getMenuView(android.view.ViewGroup!);
+    method public void initForMenu(android.content.Context!, androidx.appcompat.view.menu.MenuBuilder!);
+    method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder!, boolean);
+    method public void onItemClick(android.widget.AdapterView<?>!, android.view.View!, int, long);
+    method public void onRestoreInstanceState(android.os.Parcelable!);
+    method public android.os.Parcelable! onSaveInstanceState();
+    method public boolean onSubMenuSelected(androidx.appcompat.view.menu.SubMenuBuilder!);
+    method public void restoreHierarchyState(android.os.Bundle!);
+    method public void saveHierarchyState(android.os.Bundle!);
+    method public void setCallback(androidx.appcompat.view.menu.MenuPresenter.Callback!);
+    method public void setId(int);
+    method public void setItemIndexOffset(int);
+    method public void updateMenuView(boolean);
+    field public static final String VIEWS_TAG = "android:menu:list";
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuAdapter extends android.widget.BaseAdapter {
+    ctor public MenuAdapter(androidx.appcompat.view.menu.MenuBuilder!, android.view.LayoutInflater!, boolean, int);
+    method public androidx.appcompat.view.menu.MenuBuilder! getAdapterMenu();
+    method public int getCount();
+    method public boolean getForceShowIcon();
+    method public androidx.appcompat.view.menu.MenuItemImpl! getItem(int);
+    method public long getItemId(int);
+    method public android.view.View! getView(int, android.view.View!, android.view.ViewGroup!);
+    method public void setForceShowIcon(boolean);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuBuilder implements androidx.core.internal.view.SupportMenu {
+    ctor public MenuBuilder(android.content.Context!);
+    method public android.view.MenuItem! add(CharSequence!);
+    method public android.view.MenuItem! add(int);
+    method public android.view.MenuItem! add(int, int, int, CharSequence!);
+    method public android.view.MenuItem! add(int, int, int, int);
+    method public int addIntentOptions(int, int, int, android.content.ComponentName!, android.content.Intent![]!, android.content.Intent!, int, android.view.MenuItem![]!);
+    method protected android.view.MenuItem! addInternal(int, int, int, CharSequence!);
+    method public void addMenuPresenter(androidx.appcompat.view.menu.MenuPresenter!);
+    method public void addMenuPresenter(androidx.appcompat.view.menu.MenuPresenter!, android.content.Context!);
+    method public android.view.SubMenu! addSubMenu(CharSequence!);
+    method public android.view.SubMenu! addSubMenu(int);
+    method public android.view.SubMenu! addSubMenu(int, int, int, CharSequence!);
+    method public android.view.SubMenu! addSubMenu(int, int, int, int);
+    method public void changeMenuMode();
+    method public void clear();
+    method public void clearAll();
+    method public void clearHeader();
+    method public final void close(boolean);
+    method public void close();
+    method public boolean collapseItemActionView(androidx.appcompat.view.menu.MenuItemImpl!);
+    method public boolean expandItemActionView(androidx.appcompat.view.menu.MenuItemImpl!);
+    method public int findGroupIndex(int);
+    method public int findGroupIndex(int, int);
+    method public android.view.MenuItem! findItem(int);
+    method public int findItemIndex(int);
+    method public void flagActionItems();
+    method public java.util.ArrayList<androidx.appcompat.view.menu.MenuItemImpl!>! getActionItems();
+    method protected String! getActionViewStatesKey();
+    method public android.content.Context! getContext();
+    method public androidx.appcompat.view.menu.MenuItemImpl! getExpandedItem();
+    method public android.graphics.drawable.Drawable! getHeaderIcon();
+    method public CharSequence! getHeaderTitle();
+    method public android.view.View! getHeaderView();
+    method public android.view.MenuItem! getItem(int);
+    method public java.util.ArrayList<androidx.appcompat.view.menu.MenuItemImpl!>! getNonActionItems();
+    method public androidx.appcompat.view.menu.MenuBuilder! getRootMenu();
+    method public java.util.ArrayList<androidx.appcompat.view.menu.MenuItemImpl!> getVisibleItems();
+    method public boolean hasVisibleItems();
+    method public boolean isGroupDividerEnabled();
+    method public boolean isShortcutKey(int, android.view.KeyEvent!);
+    method public boolean isShortcutsVisible();
+    method public void onItemsChanged(boolean);
+    method public boolean performIdentifierAction(int, int);
+    method public boolean performItemAction(android.view.MenuItem!, int);
+    method public boolean performItemAction(android.view.MenuItem!, androidx.appcompat.view.menu.MenuPresenter!, int);
+    method public boolean performShortcut(int, android.view.KeyEvent!, int);
+    method public void removeGroup(int);
+    method public void removeItem(int);
+    method public void removeItemAt(int);
+    method public void removeMenuPresenter(androidx.appcompat.view.menu.MenuPresenter!);
+    method public void restoreActionViewStates(android.os.Bundle!);
+    method public void restorePresenterStates(android.os.Bundle!);
+    method public void saveActionViewStates(android.os.Bundle!);
+    method public void savePresenterStates(android.os.Bundle!);
+    method public void setCallback(androidx.appcompat.view.menu.MenuBuilder.Callback!);
+    method public void setCurrentMenuInfo(android.view.ContextMenu.ContextMenuInfo!);
+    method public androidx.appcompat.view.menu.MenuBuilder! setDefaultShowAsAction(int);
+    method public void setGroupCheckable(int, boolean, boolean);
+    method public void setGroupEnabled(int, boolean);
+    method public void setGroupVisible(int, boolean);
+    method protected androidx.appcompat.view.menu.MenuBuilder! setHeaderIconInt(android.graphics.drawable.Drawable!);
+    method protected androidx.appcompat.view.menu.MenuBuilder! setHeaderIconInt(int);
+    method protected androidx.appcompat.view.menu.MenuBuilder! setHeaderTitleInt(CharSequence!);
+    method protected androidx.appcompat.view.menu.MenuBuilder! setHeaderTitleInt(int);
+    method protected androidx.appcompat.view.menu.MenuBuilder! setHeaderViewInt(android.view.View!);
+    method public void setOptionalIconsVisible(boolean);
+    method public void setOverrideVisibleItems(boolean);
+    method public void setQwertyMode(boolean);
+    method public void setShortcutsVisible(boolean);
+    method public int size();
+    method public void startDispatchingItemsChanged();
+    method public void stopDispatchingItemsChanged();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface MenuBuilder.Callback {
+    method public boolean onMenuItemSelected(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+    method public void onMenuModeChange(androidx.appcompat.view.menu.MenuBuilder);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface MenuBuilder.ItemInvoker {
+    method public boolean invokeItem(androidx.appcompat.view.menu.MenuItemImpl!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class MenuItemImpl implements androidx.core.internal.view.SupportMenuItem {
+    method public void actionFormatChanged();
+    method public boolean collapseActionView();
+    method public boolean expandActionView();
+    method public android.view.ActionProvider! getActionProvider();
+    method public android.view.View! getActionView();
+    method public char getAlphabeticShortcut();
+    method public int getGroupId();
+    method public android.graphics.drawable.Drawable! getIcon();
+    method public android.content.Intent! getIntent();
+    method public int getItemId();
+    method public android.view.ContextMenu.ContextMenuInfo! getMenuInfo();
+    method public char getNumericShortcut();
+    method public int getOrder();
+    method public int getOrdering();
+    method public android.view.SubMenu! getSubMenu();
+    method public androidx.core.view.ActionProvider! getSupportActionProvider();
+    method public CharSequence! getTitle();
+    method public CharSequence! getTitleCondensed();
+    method public boolean hasCollapsibleActionView();
+    method public boolean hasSubMenu();
+    method public boolean invoke();
+    method public boolean isActionButton();
+    method public boolean isActionViewExpanded();
+    method public boolean isCheckable();
+    method public boolean isChecked();
+    method public boolean isEnabled();
+    method public boolean isExclusiveCheckable();
+    method public boolean isVisible();
+    method public boolean requestsActionButton();
+    method public boolean requiresActionButton();
+    method public boolean requiresOverflow();
+    method public android.view.MenuItem! setActionProvider(android.view.ActionProvider!);
+    method public androidx.core.internal.view.SupportMenuItem setActionView(android.view.View!);
+    method public androidx.core.internal.view.SupportMenuItem setActionView(int);
+    method public void setActionViewExpanded(boolean);
+    method public android.view.MenuItem! setAlphabeticShortcut(char);
+    method public android.view.MenuItem! setCallback(Runnable!);
+    method public android.view.MenuItem! setCheckable(boolean);
+    method public android.view.MenuItem! setChecked(boolean);
+    method public androidx.core.internal.view.SupportMenuItem setContentDescription(CharSequence!);
+    method public android.view.MenuItem! setEnabled(boolean);
+    method public void setExclusiveCheckable(boolean);
+    method public android.view.MenuItem! setIcon(android.graphics.drawable.Drawable!);
+    method public android.view.MenuItem! setIcon(int);
+    method public android.view.MenuItem! setIntent(android.content.Intent!);
+    method public void setIsActionButton(boolean);
+    method public android.view.MenuItem! setNumericShortcut(char);
+    method public android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem.OnActionExpandListener!);
+    method public android.view.MenuItem! setOnMenuItemClickListener(android.view.MenuItem.OnMenuItemClickListener!);
+    method public android.view.MenuItem! setShortcut(char, char);
+    method public void setShowAsAction(int);
+    method public androidx.core.internal.view.SupportMenuItem setShowAsActionFlags(int);
+    method public void setSubMenu(androidx.appcompat.view.menu.SubMenuBuilder!);
+    method public androidx.core.internal.view.SupportMenuItem setSupportActionProvider(androidx.core.view.ActionProvider!);
+    method public android.view.MenuItem! setTitle(CharSequence!);
+    method public android.view.MenuItem! setTitle(int);
+    method public android.view.MenuItem! setTitleCondensed(CharSequence!);
+    method public androidx.core.internal.view.SupportMenuItem setTooltipText(CharSequence!);
+    method public android.view.MenuItem! setVisible(boolean);
+    method public boolean shouldShowIcon();
+    method public boolean showsTextAsAction();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuItemWrapperICS implements android.view.MenuItem {
+    ctor public MenuItemWrapperICS(android.content.Context!, androidx.core.internal.view.SupportMenuItem!);
+    method public boolean collapseActionView();
+    method public boolean expandActionView();
+    method public android.view.ActionProvider! getActionProvider();
+    method public android.view.View! getActionView();
+    method public char getAlphabeticShortcut();
+    method public int getGroupId();
+    method public android.graphics.drawable.Drawable! getIcon();
+    method public android.content.Intent! getIntent();
+    method public int getItemId();
+    method public android.view.ContextMenu.ContextMenuInfo! getMenuInfo();
+    method public char getNumericShortcut();
+    method public int getOrder();
+    method public android.view.SubMenu! getSubMenu();
+    method public CharSequence! getTitle();
+    method public CharSequence! getTitleCondensed();
+    method public boolean hasSubMenu();
+    method public boolean isActionViewExpanded();
+    method public boolean isCheckable();
+    method public boolean isChecked();
+    method public boolean isEnabled();
+    method public boolean isVisible();
+    method public android.view.MenuItem! setActionProvider(android.view.ActionProvider!);
+    method public android.view.MenuItem! setActionView(android.view.View!);
+    method public android.view.MenuItem! setActionView(int);
+    method public android.view.MenuItem! setAlphabeticShortcut(char);
+    method public android.view.MenuItem! setCheckable(boolean);
+    method public android.view.MenuItem! setChecked(boolean);
+    method public android.view.MenuItem! setEnabled(boolean);
+    method public void setExclusiveCheckable(boolean);
+    method public android.view.MenuItem! setIcon(android.graphics.drawable.Drawable!);
+    method public android.view.MenuItem! setIcon(int);
+    method public android.view.MenuItem! setIntent(android.content.Intent!);
+    method public android.view.MenuItem! setNumericShortcut(char);
+    method public android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem.OnActionExpandListener!);
+    method public android.view.MenuItem! setOnMenuItemClickListener(android.view.MenuItem.OnMenuItemClickListener!);
+    method public android.view.MenuItem! setShortcut(char, char);
+    method public void setShowAsAction(int);
+    method public android.view.MenuItem! setShowAsActionFlags(int);
+    method public android.view.MenuItem! setTitle(CharSequence!);
+    method public android.view.MenuItem! setTitle(int);
+    method public android.view.MenuItem! setTitleCondensed(CharSequence!);
+    method public android.view.MenuItem! setVisible(boolean);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuPopupHelper {
+    ctor public MenuPopupHelper(android.content.Context, androidx.appcompat.view.menu.MenuBuilder);
+    ctor public MenuPopupHelper(android.content.Context, androidx.appcompat.view.menu.MenuBuilder, android.view.View);
+    ctor public MenuPopupHelper(android.content.Context, androidx.appcompat.view.menu.MenuBuilder, android.view.View, boolean, @AttrRes int);
+    ctor public MenuPopupHelper(android.content.Context, androidx.appcompat.view.menu.MenuBuilder, android.view.View, boolean, @AttrRes int, @StyleRes int);
+    method public void dismiss();
+    method public int getGravity();
+    method public android.widget.ListView! getListView();
+    method public boolean isShowing();
+    method protected void onDismiss();
+    method public void setAnchorView(android.view.View);
+    method public void setForceShowIcon(boolean);
+    method public void setGravity(int);
+    method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener?);
+    method public void setPresenterCallback(androidx.appcompat.view.menu.MenuPresenter.Callback?);
+    method public void show();
+    method public void show(int, int);
+    method public boolean tryShow();
+    method public boolean tryShow(int, int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface MenuPresenter {
+    method public boolean collapseItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+    method public boolean expandItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+    method public boolean flagActionItems();
+    method public int getId();
+    method public androidx.appcompat.view.menu.MenuView! getMenuView(android.view.ViewGroup!);
+    method public void initForMenu(android.content.Context!, androidx.appcompat.view.menu.MenuBuilder!);
+    method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder!, boolean);
+    method public void onRestoreInstanceState(android.os.Parcelable!);
+    method public android.os.Parcelable! onSaveInstanceState();
+    method public boolean onSubMenuSelected(androidx.appcompat.view.menu.SubMenuBuilder!);
+    method public void setCallback(androidx.appcompat.view.menu.MenuPresenter.Callback!);
+    method public void updateMenuView(boolean);
+  }
+
+  public static interface MenuPresenter.Callback {
+    method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder, boolean);
+    method public boolean onOpenSubMenu(androidx.appcompat.view.menu.MenuBuilder);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface MenuView {
+    method public int getWindowAnimations();
+    method public void initialize(androidx.appcompat.view.menu.MenuBuilder!);
+  }
+
+  public static interface MenuView.ItemView {
+    method public androidx.appcompat.view.menu.MenuItemImpl! getItemData();
+    method public void initialize(androidx.appcompat.view.menu.MenuItemImpl!, int);
+    method public boolean prefersCondensedTitle();
+    method public void setCheckable(boolean);
+    method public void setChecked(boolean);
+    method public void setEnabled(boolean);
+    method public void setIcon(android.graphics.drawable.Drawable!);
+    method public void setShortcut(boolean, char);
+    method public void setTitle(CharSequence!);
+    method public boolean showsIcon();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuWrapperICS implements android.view.Menu {
+    ctor public MenuWrapperICS(android.content.Context!, androidx.core.internal.view.SupportMenu!);
+    method public android.view.MenuItem! add(CharSequence!);
+    method public android.view.MenuItem! add(int);
+    method public android.view.MenuItem! add(int, int, int, CharSequence!);
+    method public android.view.MenuItem! add(int, int, int, int);
+    method public int addIntentOptions(int, int, int, android.content.ComponentName!, android.content.Intent![]!, android.content.Intent!, int, android.view.MenuItem![]!);
+    method public android.view.SubMenu! addSubMenu(CharSequence!);
+    method public android.view.SubMenu! addSubMenu(int);
+    method public android.view.SubMenu! addSubMenu(int, int, int, CharSequence!);
+    method public android.view.SubMenu! addSubMenu(int, int, int, int);
+    method public void clear();
+    method public void close();
+    method public android.view.MenuItem! findItem(int);
+    method public android.view.MenuItem! getItem(int);
+    method public boolean hasVisibleItems();
+    method public boolean isShortcutKey(int, android.view.KeyEvent!);
+    method public boolean performIdentifierAction(int, int);
+    method public boolean performShortcut(int, android.view.KeyEvent!, int);
+    method public void removeGroup(int);
+    method public void removeItem(int);
+    method public void setGroupCheckable(int, boolean, boolean);
+    method public void setGroupEnabled(int, boolean);
+    method public void setGroupVisible(int, boolean);
+    method public void setQwertyMode(boolean);
+    method public int size();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface ShowableListMenu {
+    method public void dismiss();
+    method public android.widget.ListView! getListView();
+    method public boolean isShowing();
+    method public void show();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SubMenuBuilder extends androidx.appcompat.view.menu.MenuBuilder implements android.view.SubMenu {
+    ctor public SubMenuBuilder(android.content.Context!, androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+    method public String! getActionViewStatesKey();
+    method public android.view.MenuItem! getItem();
+    method public android.view.Menu! getParentMenu();
+    method public boolean isQwertyMode();
+    method public android.view.SubMenu! setHeaderIcon(android.graphics.drawable.Drawable!);
+    method public android.view.SubMenu! setHeaderIcon(int);
+    method public android.view.SubMenu! setHeaderTitle(CharSequence!);
+    method public android.view.SubMenu! setHeaderTitle(int);
+    method public android.view.SubMenu! setHeaderView(android.view.View!);
+    method public android.view.SubMenu! setIcon(android.graphics.drawable.Drawable!);
+    method public android.view.SubMenu! setIcon(int);
+  }
+
+}
+
+package androidx.appcompat.widget {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionBarContainer extends android.widget.FrameLayout {
+    ctor public ActionBarContainer(android.content.Context!);
+    ctor public ActionBarContainer(android.content.Context!, android.util.AttributeSet!);
+    method public android.view.View! getTabContainer();
+    method public void onFinishInflate();
+    method public void onLayout(boolean, int, int, int, int);
+    method public void onMeasure(int, int);
+    method public void setPrimaryBackground(android.graphics.drawable.Drawable!);
+    method public void setSplitBackground(android.graphics.drawable.Drawable!);
+    method public void setStackedBackground(android.graphics.drawable.Drawable!);
+    method public void setTabContainer(androidx.appcompat.widget.ScrollingTabContainerView!);
+    method public void setTransitioning(boolean);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionBarContextView extends android.view.ViewGroup {
+    ctor public ActionBarContextView(android.content.Context);
+    ctor public ActionBarContextView(android.content.Context, android.util.AttributeSet?);
+    ctor public ActionBarContextView(android.content.Context, android.util.AttributeSet?, int);
+    method public void animateToVisibility(int);
+    method public boolean canShowOverflowMenu();
+    method public void closeMode();
+    method public void dismissPopupMenus();
+    method public int getAnimatedVisibility();
+    method public int getContentHeight();
+    method public CharSequence! getSubtitle();
+    method public CharSequence! getTitle();
+    method public boolean hideOverflowMenu();
+    method public void initForMode(androidx.appcompat.view.ActionMode!);
+    method public boolean isOverflowMenuShowPending();
+    method public boolean isOverflowMenuShowing();
+    method public boolean isOverflowReserved();
+    method public boolean isTitleOptional();
+    method public void killMode();
+    method public void onDetachedFromWindow();
+    method public void postShowOverflowMenu();
+    method public void setContentHeight(int);
+    method public void setCustomView(android.view.View!);
+    method public void setSubtitle(CharSequence!);
+    method public void setTitle(CharSequence!);
+    method public void setTitleOptional(boolean);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setupAnimatorToVisibility(int, long);
+    method public boolean showOverflowMenu();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionBarOverlayLayout extends android.view.ViewGroup implements androidx.appcompat.widget.DecorContentParent androidx.core.view.NestedScrollingParent androidx.core.view.NestedScrollingParent2 androidx.core.view.NestedScrollingParent3 {
+    ctor public ActionBarOverlayLayout(android.content.Context);
+    ctor public ActionBarOverlayLayout(android.content.Context, android.util.AttributeSet?);
+    method public boolean canShowOverflowMenu();
+    method public void dismissPopups();
+    method protected boolean fitSystemWindows(android.graphics.Rect!);
+    method protected androidx.appcompat.widget.ActionBarOverlayLayout.LayoutParams! generateDefaultLayoutParams();
+    method public androidx.appcompat.widget.ActionBarOverlayLayout.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+    method public int getActionBarHideOffset();
+    method public CharSequence! getTitle();
+    method public boolean hasIcon();
+    method public boolean hasLogo();
+    method public boolean hideOverflowMenu();
+    method public void initFeature(int);
+    method public boolean isHideOnContentScrollEnabled();
+    method public boolean isInOverlayMode();
+    method public boolean isOverflowMenuShowPending();
+    method public boolean isOverflowMenuShowing();
+    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 void restoreToolbarHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+    method public void saveToolbarHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+    method public void setActionBarHideOffset(int);
+    method public void setActionBarVisibilityCallback(androidx.appcompat.widget.ActionBarOverlayLayout.ActionBarVisibilityCallback!);
+    method public void setHasNonEmbeddedTabs(boolean);
+    method public void setHideOnContentScrollEnabled(boolean);
+    method public void setIcon(int);
+    method public void setIcon(android.graphics.drawable.Drawable!);
+    method public void setLogo(int);
+    method public void setMenu(android.view.Menu!, androidx.appcompat.view.menu.MenuPresenter.Callback!);
+    method public void setMenuPrepared();
+    method public void setOverlayMode(boolean);
+    method public void setShowingForActionMode(boolean);
+    method public void setUiOptions(int);
+    method public void setWindowCallback(android.view.Window.Callback!);
+    method public void setWindowTitle(CharSequence!);
+    method public boolean showOverflowMenu();
+  }
+
+  public static interface ActionBarOverlayLayout.ActionBarVisibilityCallback {
+    method public void enableContentAnimations(boolean);
+    method public void hideForSystem();
+    method public void onContentScrollStarted();
+    method public void onContentScrollStopped();
+    method public void onWindowVisibilityChanged(int);
+    method public void showForSystem();
+  }
+
+  public static class ActionBarOverlayLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public ActionBarOverlayLayout.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public ActionBarOverlayLayout.LayoutParams(int, int);
+    ctor public ActionBarOverlayLayout.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public ActionBarOverlayLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+  }
+
+  public class ActionMenuView extends androidx.appcompat.widget.LinearLayoutCompat implements androidx.appcompat.view.menu.MenuBuilder.ItemInvoker androidx.appcompat.view.menu.MenuView {
+    ctor public ActionMenuView(android.content.Context);
+    ctor public ActionMenuView(android.content.Context, android.util.AttributeSet?);
+    method public void dismissPopupMenus();
+    method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateDefaultLayoutParams();
+    method public androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.widget.ActionMenuView.LayoutParams! generateOverflowButtonLayoutParams();
+    method public android.view.Menu! getMenu();
+    method public android.graphics.drawable.Drawable? getOverflowIcon();
+    method public int getPopupTheme();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getWindowAnimations();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected boolean hasSupportDividerBeforeChildAt(int);
+    method public boolean hideOverflowMenu();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void initialize(androidx.appcompat.view.menu.MenuBuilder!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean invokeItem(androidx.appcompat.view.menu.MenuItemImpl!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isOverflowMenuShowPending();
+    method public boolean isOverflowMenuShowing();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isOverflowReserved();
+    method public void onConfigurationChanged(android.content.res.Configuration!);
+    method public void onDetachedFromWindow();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.view.menu.MenuBuilder! peekMenu();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setExpandedActionViewsExclusive(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setMenuCallbacks(androidx.appcompat.view.menu.MenuPresenter.Callback!, androidx.appcompat.view.menu.MenuBuilder.Callback!);
+    method public void setOnMenuItemClickListener(androidx.appcompat.widget.ActionMenuView.OnMenuItemClickListener!);
+    method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setOverflowReserved(boolean);
+    method public void setPopupTheme(@StyleRes int);
+    method public boolean showOverflowMenu();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface ActionMenuView.ActionMenuChildView {
+    method public boolean needsDividerAfter();
+    method public boolean needsDividerBefore();
+  }
+
+  public static class ActionMenuView.LayoutParams extends androidx.appcompat.widget.LinearLayoutCompat.LayoutParams {
+    ctor public ActionMenuView.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public ActionMenuView.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public ActionMenuView.LayoutParams(androidx.appcompat.widget.ActionMenuView.LayoutParams!);
+    ctor public ActionMenuView.LayoutParams(int, int);
+    field public int cellsUsed;
+    field public boolean expandable;
+    field public int extraPixels;
+    field public boolean isOverflowButton;
+    field public boolean preventEdgeOffset;
+  }
+
+  public static interface ActionMenuView.OnMenuItemClickListener {
+    method public boolean onMenuItemClick(android.view.MenuItem!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActivityChooserView extends android.view.ViewGroup {
+    ctor public ActivityChooserView(android.content.Context);
+    ctor public ActivityChooserView(android.content.Context, android.util.AttributeSet?);
+    ctor public ActivityChooserView(android.content.Context, android.util.AttributeSet?, int);
+    method public boolean dismissPopup();
+    method public boolean isShowingPopup();
+    method public void setDefaultActionButtonContentDescription(int);
+    method public void setExpandActivityOverflowButtonContentDescription(int);
+    method public void setExpandActivityOverflowButtonDrawable(android.graphics.drawable.Drawable!);
+    method public void setInitialActivityCount(int);
+    method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setProvider(androidx.core.view.ActionProvider!);
+    method public boolean showPopup();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class ActivityChooserView.InnerLayout extends android.widget.LinearLayout {
+    ctor public ActivityChooserView.InnerLayout(android.content.Context!, android.util.AttributeSet!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class AlertDialogLayout extends androidx.appcompat.widget.LinearLayoutCompat {
+    ctor public AlertDialogLayout(android.content.Context?);
+    ctor public AlertDialogLayout(android.content.Context?, android.util.AttributeSet?);
+  }
+
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatAutoCompleteTextView(android.content.Context);
+    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+  }
+
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatButton extends android.widget.Button implements androidx.core.widget.AutoSizeableTextView androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatButton(android.content.Context);
+    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method public void setSupportAllCaps(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+  }
+
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatCheckBox extends android.widget.CheckBox implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatCheckBox(android.content.Context);
+    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatCheckedTextView extends android.widget.CheckedTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCheckedTextView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatCheckedTextView(android.content.Context);
+    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCheckMarkTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCheckMarkTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCheckMarkTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCheckMarkTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context, int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class AppCompatDrawableManager {
+    ctor public AppCompatDrawableManager();
+    method public static androidx.appcompat.widget.AppCompatDrawableManager! get();
+    method public android.graphics.drawable.Drawable! getDrawable(android.content.Context, @DrawableRes int);
+    method public static android.graphics.PorterDuffColorFilter! getPorterDuffColorFilter(int, android.graphics.PorterDuff.Mode!);
+    method public void onConfigurationChanged(android.content.Context);
+    method public static void preload();
+  }
+
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatEditText extends android.widget.EditText implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.OnReceiveContentViewBehavior androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatEditText(android.content.Context);
+    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+  }
+
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatImageButton extends android.widget.ImageButton implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableImageSourceView {
+    ctor public AppCompatImageButton(android.content.Context);
+    ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportImageTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class AppCompatImageHelper {
+    ctor public AppCompatImageHelper(android.widget.ImageView);
+    method public void loadFromAttributes(android.util.AttributeSet!, int);
+    method public void setImageResource(int);
+  }
+
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatImageView extends android.widget.ImageView implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableImageSourceView {
+    ctor public AppCompatImageView(android.content.Context);
+    ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportImageTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context);
+    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+  }
+
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatRadioButton extends android.widget.RadioButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatRadioButton(android.content.Context!);
+    ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?);
+    ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public class AppCompatRatingBar extends android.widget.RatingBar {
+    ctor public AppCompatRatingBar(android.content.Context);
+    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+  public class AppCompatSeekBar extends android.widget.SeekBar {
+    ctor public AppCompatSeekBar(android.content.Context);
+    ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatSpinner extends android.widget.Spinner implements androidx.core.view.TintableBackgroundView {
+    ctor public AppCompatSpinner(android.content.Context);
+    ctor public AppCompatSpinner(android.content.Context, int);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int, android.content.res.Resources.Theme!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatTextView extends android.widget.TextView implements androidx.core.widget.AutoSizeableTextView androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatTextView(android.content.Context);
+    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParamsCompat();
+    method public boolean isEmojiCompatEnabled();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method public void setPrecomputedText(androidx.core.text.PrecomputedTextCompat);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+    method public void setTextFuture(java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>?);
+    method public void setTextMetricsParamsCompat(androidx.core.text.PrecomputedTextCompat.Params);
+  }
+
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatToggleButton extends android.widget.ToggleButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatToggleButton(android.content.Context);
+    ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ButtonBarLayout extends android.widget.LinearLayout {
+    ctor public ButtonBarLayout(android.content.Context, android.util.AttributeSet?);
+    method public void setAllowStacking(boolean);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface DecorContentParent {
+    method public boolean canShowOverflowMenu();
+    method public void dismissPopups();
+    method public CharSequence! getTitle();
+    method public boolean hasIcon();
+    method public boolean hasLogo();
+    method public boolean hideOverflowMenu();
+    method public void initFeature(int);
+    method public boolean isOverflowMenuShowPending();
+    method public boolean isOverflowMenuShowing();
+    method public void restoreToolbarHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+    method public void saveToolbarHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+    method public void setIcon(int);
+    method public void setIcon(android.graphics.drawable.Drawable!);
+    method public void setLogo(int);
+    method public void setMenu(android.view.Menu!, androidx.appcompat.view.menu.MenuPresenter.Callback!);
+    method public void setMenuPrepared();
+    method public void setUiOptions(int);
+    method public void setWindowCallback(android.view.Window.Callback!);
+    method public void setWindowTitle(CharSequence!);
+    method public boolean showOverflowMenu();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface DecorToolbar {
+    method public void animateToVisibility(int);
+    method public boolean canShowOverflowMenu();
+    method public void collapseActionView();
+    method public void dismissPopupMenus();
+    method public android.content.Context! getContext();
+    method public android.view.View! getCustomView();
+    method public int getDisplayOptions();
+    method public int getDropdownItemCount();
+    method public int getDropdownSelectedPosition();
+    method public int getHeight();
+    method public android.view.Menu! getMenu();
+    method public int getNavigationMode();
+    method public CharSequence! getSubtitle();
+    method public CharSequence! getTitle();
+    method public android.view.ViewGroup! getViewGroup();
+    method public int getVisibility();
+    method public boolean hasEmbeddedTabs();
+    method public boolean hasExpandedActionView();
+    method public boolean hasIcon();
+    method public boolean hasLogo();
+    method public boolean hideOverflowMenu();
+    method public void initIndeterminateProgress();
+    method public void initProgress();
+    method public boolean isOverflowMenuShowPending();
+    method public boolean isOverflowMenuShowing();
+    method public boolean isTitleTruncated();
+    method public void restoreHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+    method public void saveHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+    method public void setCollapsible(boolean);
+    method public void setCustomView(android.view.View!);
+    method public void setDefaultNavigationContentDescription(int);
+    method public void setDefaultNavigationIcon(android.graphics.drawable.Drawable!);
+    method public void setDisplayOptions(int);
+    method public void setDropdownParams(android.widget.SpinnerAdapter!, android.widget.AdapterView.OnItemSelectedListener!);
+    method public void setDropdownSelectedPosition(int);
+    method public void setEmbeddedTabView(androidx.appcompat.widget.ScrollingTabContainerView!);
+    method public void setHomeButtonEnabled(boolean);
+    method public void setIcon(int);
+    method public void setIcon(android.graphics.drawable.Drawable!);
+    method public void setLogo(int);
+    method public void setLogo(android.graphics.drawable.Drawable!);
+    method public void setMenu(android.view.Menu!, androidx.appcompat.view.menu.MenuPresenter.Callback!);
+    method public void setMenuCallbacks(androidx.appcompat.view.menu.MenuPresenter.Callback!, androidx.appcompat.view.menu.MenuBuilder.Callback!);
+    method public void setMenuPrepared();
+    method public void setNavigationContentDescription(CharSequence!);
+    method public void setNavigationContentDescription(int);
+    method public void setNavigationIcon(android.graphics.drawable.Drawable!);
+    method public void setNavigationIcon(int);
+    method public void setNavigationMode(int);
+    method public void setSubtitle(CharSequence!);
+    method public void setTitle(CharSequence!);
+    method public void setVisibility(int);
+    method public void setWindowCallback(android.view.Window.Callback!);
+    method public void setWindowTitle(CharSequence!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setupAnimatorToVisibility(int, long);
+    method public boolean showOverflowMenu();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DialogTitle extends androidx.appcompat.widget.AppCompatTextView {
+    ctor public DialogTitle(android.content.Context, android.util.AttributeSet?, int);
+    ctor public DialogTitle(android.content.Context, android.util.AttributeSet?);
+    ctor public DialogTitle(android.content.Context);
+  }
+
+  public interface EmojiCompatConfigurationView {
+    method public boolean isEmojiCompatEnabled();
+    method public void setEmojiCompatEnabled(boolean);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FitWindowsFrameLayout extends android.widget.FrameLayout implements androidx.appcompat.widget.FitWindowsViewGroup {
+    ctor public FitWindowsFrameLayout(android.content.Context);
+    ctor public FitWindowsFrameLayout(android.content.Context, android.util.AttributeSet?);
+    method protected boolean fitSystemWindows(android.graphics.Rect!);
+    method public void setOnFitSystemWindowsListener(androidx.appcompat.widget.FitWindowsViewGroup.OnFitSystemWindowsListener!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FitWindowsLinearLayout extends android.widget.LinearLayout implements androidx.appcompat.widget.FitWindowsViewGroup {
+    ctor public FitWindowsLinearLayout(android.content.Context);
+    ctor public FitWindowsLinearLayout(android.content.Context, android.util.AttributeSet?);
+    method protected boolean fitSystemWindows(android.graphics.Rect!);
+    method public void setOnFitSystemWindowsListener(androidx.appcompat.widget.FitWindowsViewGroup.OnFitSystemWindowsListener!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface FitWindowsViewGroup {
+    method public void setOnFitSystemWindowsListener(androidx.appcompat.widget.FitWindowsViewGroup.OnFitSystemWindowsListener!);
+  }
+
+  public static interface FitWindowsViewGroup.OnFitSystemWindowsListener {
+    method public void onFitSystemWindows(android.graphics.Rect!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class ForwardingListener implements android.view.View.OnAttachStateChangeListener android.view.View.OnTouchListener {
+    ctor public ForwardingListener(android.view.View!);
+    method public abstract androidx.appcompat.view.menu.ShowableListMenu! getPopup();
+    method protected boolean onForwardingStarted();
+    method protected boolean onForwardingStopped();
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+    method public void onViewAttachedToWindow(android.view.View!);
+    method public void onViewDetachedFromWindow(android.view.View!);
+  }
+
+  public class LinearLayoutCompat extends android.view.ViewGroup {
+    ctor public LinearLayoutCompat(android.content.Context);
+    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?);
+    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?, int);
+    method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateDefaultLayoutParams();
+    method public androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+    method @androidx.resourceinspection.annotation.Attribute("android:baselineAlignedChildIndex") public int getBaselineAlignedChildIndex();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:divider") public android.graphics.drawable.Drawable! getDividerDrawable();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:dividerPadding") public int getDividerPadding();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getDividerWidth();
+    method @GravityInt @androidx.resourceinspection.annotation.Attribute("android:gravity") public int getGravity();
+    method @androidx.appcompat.widget.LinearLayoutCompat.OrientationMode @androidx.resourceinspection.annotation.Attribute(value="android:orientation", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="horizontal", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="vertical", value=1)}) public int getOrientation();
+    method @androidx.appcompat.widget.LinearLayoutCompat.DividerMode @androidx.resourceinspection.annotation.Attribute(value="androidx.appcompat:showDividers", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="none", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="beginning", value=1, mask=1), @androidx.resourceinspection.annotation.Attribute.IntMap(name="middle", value=2, mask=2), @androidx.resourceinspection.annotation.Attribute.IntMap(name="end", value=4, mask=4)}) public int getShowDividers();
+    method @androidx.resourceinspection.annotation.Attribute("android:weightSum") public float getWeightSum();
+    method @androidx.resourceinspection.annotation.Attribute("android:baselineAligned") public boolean isBaselineAligned();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:measureWithLargestChild") public boolean isMeasureWithLargestChildEnabled();
+    method public void setBaselineAligned(boolean);
+    method public void setBaselineAlignedChildIndex(int);
+    method public void setDividerDrawable(android.graphics.drawable.Drawable!);
+    method public void setDividerPadding(int);
+    method public void setGravity(@GravityInt int);
+    method public void setHorizontalGravity(int);
+    method public void setMeasureWithLargestChildEnabled(boolean);
+    method public void setOrientation(@androidx.appcompat.widget.LinearLayoutCompat.OrientationMode int);
+    method public void setShowDividers(@androidx.appcompat.widget.LinearLayoutCompat.DividerMode int);
+    method public void setVerticalGravity(int);
+    method public void setWeightSum(float);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int SHOW_DIVIDER_BEGINNING = 1; // 0x1
+    field public static final int SHOW_DIVIDER_END = 4; // 0x4
+    field public static final int SHOW_DIVIDER_MIDDLE = 2; // 0x2
+    field public static final int SHOW_DIVIDER_NONE = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  @IntDef(flag=true, value={androidx.appcompat.widget.LinearLayoutCompat.SHOW_DIVIDER_NONE, androidx.appcompat.widget.LinearLayoutCompat.SHOW_DIVIDER_BEGINNING, androidx.appcompat.widget.LinearLayoutCompat.SHOW_DIVIDER_MIDDLE, androidx.appcompat.widget.LinearLayoutCompat.SHOW_DIVIDER_END}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface LinearLayoutCompat.DividerMode {
+  }
+
+  public static class LinearLayoutCompat.LayoutParams extends android.widget.LinearLayout.LayoutParams {
+    ctor public LinearLayoutCompat.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public LinearLayoutCompat.LayoutParams(int, int);
+    ctor public LinearLayoutCompat.LayoutParams(int, int, float);
+    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+  }
+
+  @IntDef({androidx.appcompat.widget.LinearLayoutCompat.HORIZONTAL, androidx.appcompat.widget.LinearLayoutCompat.VERTICAL}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface LinearLayoutCompat.OrientationMode {
+  }
+
+  public class ListPopupWindow implements androidx.appcompat.view.menu.ShowableListMenu {
+    ctor public ListPopupWindow(android.content.Context);
+    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?);
+    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int);
+    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int, @StyleRes int);
+    method public void clearListSelection();
+    method public android.view.View.OnTouchListener! createDragToOpenListener(android.view.View!);
+    method public void dismiss();
+    method public android.view.View? getAnchorView();
+    method @StyleRes public int getAnimationStyle();
+    method public android.graphics.drawable.Drawable? getBackground();
+    method public android.graphics.Rect? getEpicenterBounds();
+    method public int getHeight();
+    method public int getHorizontalOffset();
+    method public int getInputMethodMode();
+    method public android.widget.ListView? getListView();
+    method public int getPromptPosition();
+    method public Object? getSelectedItem();
+    method public long getSelectedItemId();
+    method public int getSelectedItemPosition();
+    method public android.view.View? getSelectedView();
+    method public int getSoftInputMode();
+    method public int getVerticalOffset();
+    method public int getWidth();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isDropDownAlwaysVisible();
+    method public boolean isInputMethodNotNeeded();
+    method public boolean isModal();
+    method public boolean isShowing();
+    method public boolean onKeyDown(int, android.view.KeyEvent);
+    method public boolean onKeyPreIme(int, android.view.KeyEvent);
+    method public boolean onKeyUp(int, android.view.KeyEvent);
+    method public boolean performItemClick(int);
+    method public void postShow();
+    method public void setAdapter(android.widget.ListAdapter?);
+    method public void setAnchorView(android.view.View?);
+    method public void setAnimationStyle(@StyleRes int);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setContentWidth(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setDropDownAlwaysVisible(boolean);
+    method public void setDropDownGravity(int);
+    method public void setEpicenterBounds(android.graphics.Rect?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setForceIgnoreOutsideTouch(boolean);
+    method public void setHeight(int);
+    method public void setHorizontalOffset(int);
+    method public void setInputMethodMode(int);
+    method public void setListSelector(android.graphics.drawable.Drawable!);
+    method public void setModal(boolean);
+    method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener?);
+    method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener?);
+    method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setOverlapAnchor(boolean);
+    method public void setPromptPosition(int);
+    method public void setPromptView(android.view.View?);
+    method public void setSelection(int);
+    method public void setSoftInputMode(int);
+    method public void setVerticalOffset(int);
+    method public void setWidth(int);
+    method public void setWindowLayoutType(int);
+    method public void show();
+    field public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; // 0x0
+    field public static final int INPUT_METHOD_NEEDED = 1; // 0x1
+    field public static final int INPUT_METHOD_NOT_NEEDED = 2; // 0x2
+    field public static final int MATCH_PARENT = -1; // 0xffffffff
+    field public static final int POSITION_PROMPT_ABOVE = 0; // 0x0
+    field public static final int POSITION_PROMPT_BELOW = 1; // 0x1
+    field public static final int WRAP_CONTENT = -2; // 0xfffffffe
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface MenuItemHoverListener {
+    method public void onItemHoverEnter(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+    method public void onItemHoverExit(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuPopupWindow extends androidx.appcompat.widget.ListPopupWindow implements androidx.appcompat.widget.MenuItemHoverListener {
+    ctor public MenuPopupWindow(android.content.Context, android.util.AttributeSet?, int, int);
+    method public void onItemHoverEnter(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+    method public void onItemHoverExit(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+    method public void setEnterTransition(Object!);
+    method public void setExitTransition(Object!);
+    method public void setHoverListener(androidx.appcompat.widget.MenuItemHoverListener!);
+    method public void setTouchModal(boolean);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class MenuPopupWindow.MenuDropDownListView extends android.widget.ListView {
+    ctor public MenuPopupWindow.MenuDropDownListView(android.content.Context!, boolean);
+    method public void clearSelection();
+    method public int lookForSelectablePosition(int, boolean);
+    method public int measureHeightOfChildrenCompat(int, int, int, int, int);
+    method public boolean onForwardedEvent(android.view.MotionEvent!, int);
+    method public void setHoverListener(androidx.appcompat.widget.MenuItemHoverListener!);
+    field public static final int INVALID_POSITION = -1; // 0xffffffff
+    field public static final int NO_POSITION = -1; // 0xffffffff
+  }
+
+  public class PopupMenu {
+    ctor public PopupMenu(android.content.Context, android.view.View);
+    ctor public PopupMenu(android.content.Context, android.view.View, int);
+    ctor public PopupMenu(android.content.Context, android.view.View, int, @AttrRes int, @StyleRes int);
+    method public void dismiss();
+    method public android.view.View.OnTouchListener getDragToOpenListener();
+    method public int getGravity();
+    method public android.view.Menu getMenu();
+    method public android.view.MenuInflater getMenuInflater();
+    method public void inflate(@MenuRes int);
+    method public void setForceShowIcon(boolean);
+    method public void setGravity(int);
+    method public void setOnDismissListener(androidx.appcompat.widget.PopupMenu.OnDismissListener?);
+    method public void setOnMenuItemClickListener(androidx.appcompat.widget.PopupMenu.OnMenuItemClickListener?);
+    method public void show();
+  }
+
+  public static interface PopupMenu.OnDismissListener {
+    method public void onDismiss(androidx.appcompat.widget.PopupMenu!);
+  }
+
+  public static interface PopupMenu.OnMenuItemClickListener {
+    method public boolean onMenuItemClick(android.view.MenuItem!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ScrollingTabContainerView extends android.widget.HorizontalScrollView implements android.widget.AdapterView.OnItemSelectedListener {
+    ctor public ScrollingTabContainerView(android.content.Context);
+    method public void addTab(androidx.appcompat.app.ActionBar.Tab!, boolean);
+    method public void addTab(androidx.appcompat.app.ActionBar.Tab!, int, boolean);
+    method public void animateToTab(int);
+    method public void animateToVisibility(int);
+    method public void onAttachedToWindow();
+    method public void onDetachedFromWindow();
+    method public void onItemSelected(android.widget.AdapterView<?>!, android.view.View!, int, long);
+    method public void onMeasure(int, int);
+    method public void onNothingSelected(android.widget.AdapterView<?>!);
+    method public void removeAllTabs();
+    method public void removeTabAt(int);
+    method public void setAllowCollapse(boolean);
+    method public void setContentHeight(int);
+    method public void setTabSelected(int);
+    method public void updateTab(int);
+    field protected final androidx.appcompat.widget.ScrollingTabContainerView.VisibilityAnimListener! mVisAnimListener;
+    field protected android.view.ViewPropertyAnimator! mVisibilityAnim;
+  }
+
+  protected class ScrollingTabContainerView.VisibilityAnimListener extends android.animation.AnimatorListenerAdapter {
+    ctor protected ScrollingTabContainerView.VisibilityAnimListener();
+    method public androidx.appcompat.widget.ScrollingTabContainerView.VisibilityAnimListener! withFinalVisibility(android.view.ViewPropertyAnimator!, int);
+  }
+
+  public class SearchView extends androidx.appcompat.widget.LinearLayoutCompat implements androidx.appcompat.view.CollapsibleActionView {
+    ctor public SearchView(android.content.Context);
+    ctor public SearchView(android.content.Context, android.util.AttributeSet?);
+    ctor public SearchView(android.content.Context, android.util.AttributeSet?, int);
+    method @androidx.resourceinspection.annotation.Attribute("android:imeOptions") public int getImeOptions();
+    method public int getInputType();
+    method @androidx.resourceinspection.annotation.Attribute("android:maxWidth") public int getMaxWidth();
+    method public CharSequence! getQuery();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:queryHint") public CharSequence? getQueryHint();
+    method public androidx.cursoradapter.widget.CursorAdapter! getSuggestionsAdapter();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:iconifiedByDefault") public boolean isIconfiedByDefault();
+    method public boolean isIconified();
+    method public boolean isQueryRefinementEnabled();
+    method public boolean isSubmitButtonEnabled();
+    method public void onActionViewCollapsed();
+    method public void onActionViewExpanded();
+    method protected void onQueryRefine(CharSequence?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAppSearchData(android.os.Bundle!);
+    method public void setIconified(boolean);
+    method public void setIconifiedByDefault(boolean);
+    method public void setImeOptions(int);
+    method public void setInputType(int);
+    method public void setMaxWidth(int);
+    method public void setOnCloseListener(androidx.appcompat.widget.SearchView.OnCloseListener!);
+    method public void setOnQueryTextFocusChangeListener(android.view.View.OnFocusChangeListener!);
+    method public void setOnQueryTextListener(androidx.appcompat.widget.SearchView.OnQueryTextListener!);
+    method public void setOnSearchClickListener(android.view.View.OnClickListener!);
+    method public void setOnSuggestionListener(androidx.appcompat.widget.SearchView.OnSuggestionListener!);
+    method public void setQuery(CharSequence!, boolean);
+    method public void setQueryHint(CharSequence?);
+    method public void setQueryRefinementEnabled(boolean);
+    method public void setSearchableInfo(android.app.SearchableInfo!);
+    method public void setSubmitButtonEnabled(boolean);
+    method public void setSuggestionsAdapter(androidx.cursoradapter.widget.CursorAdapter!);
+  }
+
+  public static interface SearchView.OnCloseListener {
+    method public boolean onClose();
+  }
+
+  public static interface SearchView.OnQueryTextListener {
+    method public boolean onQueryTextChange(String!);
+    method public boolean onQueryTextSubmit(String!);
+  }
+
+  public static interface SearchView.OnSuggestionListener {
+    method public boolean onSuggestionClick(int);
+    method public boolean onSuggestionSelect(int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class SearchView.SearchAutoComplete extends androidx.appcompat.widget.AppCompatAutoCompleteTextView {
+    ctor public SearchView.SearchAutoComplete(android.content.Context!);
+    ctor public SearchView.SearchAutoComplete(android.content.Context!, android.util.AttributeSet!);
+    ctor public SearchView.SearchAutoComplete(android.content.Context!, android.util.AttributeSet!, int);
+  }
+
+  public class ShareActionProvider extends androidx.core.view.ActionProvider {
+    ctor public ShareActionProvider(android.content.Context!);
+    method public android.view.View! onCreateActionView();
+    method public void setOnShareTargetSelectedListener(androidx.appcompat.widget.ShareActionProvider.OnShareTargetSelectedListener!);
+    method public void setShareHistoryFileName(String!);
+    method public void setShareIntent(android.content.Intent!);
+    field public static final String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
+  }
+
+  public static interface ShareActionProvider.OnShareTargetSelectedListener {
+    method public boolean onShareTargetSelected(androidx.appcompat.widget.ShareActionProvider!, android.content.Intent!);
+  }
+
+  public class SwitchCompat extends android.widget.CompoundButton implements androidx.appcompat.widget.EmojiCompatConfigurationView {
+    ctor public SwitchCompat(android.content.Context);
+    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?);
+    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?, int);
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:showText") public boolean getShowText();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:splitTrack") public boolean getSplitTrack();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchMinWidth") public int getSwitchMinWidth();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchPadding") public int getSwitchPadding();
+    method @androidx.resourceinspection.annotation.Attribute("android:textOff") public CharSequence! getTextOff();
+    method @androidx.resourceinspection.annotation.Attribute("android:textOn") public CharSequence! getTextOn();
+    method @androidx.resourceinspection.annotation.Attribute("android:thumb") public android.graphics.drawable.Drawable! getThumbDrawable();
+    method @FloatRange(from=0.0, to=1.0) protected final float getThumbPosition();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTextPadding") public int getThumbTextPadding();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTint") public android.content.res.ColorStateList? getThumbTintList();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTintMode") public android.graphics.PorterDuff.Mode? getThumbTintMode();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:track") public android.graphics.drawable.Drawable! getTrackDrawable();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTint") public android.content.res.ColorStateList? getTrackTintList();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTintMode") public android.graphics.PorterDuff.Mode? getTrackTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void onMeasure(int, int);
+    method public void setEmojiCompatEnabled(boolean);
+    method protected final void setEnforceSwitchWidth(boolean);
+    method public void setShowText(boolean);
+    method public void setSplitTrack(boolean);
+    method public void setSwitchMinWidth(int);
+    method public void setSwitchPadding(int);
+    method public void setSwitchTextAppearance(android.content.Context!, int);
+    method public void setSwitchTypeface(android.graphics.Typeface!, int);
+    method public void setSwitchTypeface(android.graphics.Typeface!);
+    method public void setTextOff(CharSequence!);
+    method public void setTextOn(CharSequence!);
+    method public void setThumbDrawable(android.graphics.drawable.Drawable!);
+    method public void setThumbResource(int);
+    method public void setThumbTextPadding(int);
+    method public void setThumbTintList(android.content.res.ColorStateList?);
+    method public void setThumbTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTrackDrawable(android.graphics.drawable.Drawable!);
+    method public void setTrackResource(int);
+    method public void setTrackTintList(android.content.res.ColorStateList?);
+    method public void setTrackTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface ThemedSpinnerAdapter extends android.widget.SpinnerAdapter {
+    method public android.content.res.Resources.Theme? getDropDownViewTheme();
+    method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+  }
+
+  public static final class ThemedSpinnerAdapter.Helper {
+    ctor public ThemedSpinnerAdapter.Helper(android.content.Context);
+    method public android.view.LayoutInflater getDropDownViewInflater();
+    method public android.content.res.Resources.Theme? getDropDownViewTheme();
+    method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TintTypedArray {
+    method public boolean getBoolean(int, boolean);
+    method @RequiresApi(21) public int getChangingConfigurations();
+    method public int getColor(int, int);
+    method public android.content.res.ColorStateList! getColorStateList(int);
+    method public float getDimension(int, float);
+    method public int getDimensionPixelOffset(int, int);
+    method public int getDimensionPixelSize(int, int);
+    method public android.graphics.drawable.Drawable! getDrawable(int);
+    method public android.graphics.drawable.Drawable! getDrawableIfKnown(int);
+    method public float getFloat(int, float);
+    method public android.graphics.Typeface? getFont(@StyleableRes int, int, androidx.core.content.res.ResourcesCompat.FontCallback?);
+    method public float getFraction(int, int, int, float);
+    method public int getIndex(int);
+    method public int getIndexCount();
+    method public int getInt(int, int);
+    method public int getInteger(int, int);
+    method public int getLayoutDimension(int, String!);
+    method public int getLayoutDimension(int, int);
+    method public String! getNonResourceString(int);
+    method public String! getPositionDescription();
+    method public int getResourceId(int, int);
+    method public android.content.res.Resources! getResources();
+    method public String! getString(int);
+    method public CharSequence! getText(int);
+    method public CharSequence![]! getTextArray(int);
+    method public int getType(int);
+    method public boolean getValue(int, android.util.TypedValue!);
+    method public android.content.res.TypedArray! getWrappedTypeArray();
+    method public boolean hasValue(int);
+    method public int length();
+    method public static androidx.appcompat.widget.TintTypedArray! obtainStyledAttributes(android.content.Context!, android.util.AttributeSet!, int[]!);
+    method public static androidx.appcompat.widget.TintTypedArray! obtainStyledAttributes(android.content.Context!, android.util.AttributeSet!, int[]!, int, int);
+    method public static androidx.appcompat.widget.TintTypedArray! obtainStyledAttributes(android.content.Context!, int, int[]!);
+    method public android.util.TypedValue! peekValue(int);
+    method public void recycle();
+  }
+
+  public class Toolbar extends android.view.ViewGroup implements androidx.core.view.MenuHost {
+    ctor public Toolbar(android.content.Context);
+    ctor public Toolbar(android.content.Context, android.util.AttributeSet?);
+    ctor public Toolbar(android.content.Context, android.util.AttributeSet?, int);
+    method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider);
+    method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean canShowOverflowMenu();
+    method public void collapseActionView();
+    method public void dismissPopupMenus();
+    method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateDefaultLayoutParams();
+    method public androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseContentDescription") public CharSequence? getCollapseContentDescription();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseIcon") public android.graphics.drawable.Drawable? getCollapseIcon();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEnd") public int getContentInsetEnd();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEndWithActions") public int getContentInsetEndWithActions();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetLeft") public int getContentInsetLeft();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetRight") public int getContentInsetRight();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStart") public int getContentInsetStart();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStartWithNavigation") public int getContentInsetStartWithNavigation();
+    method public int getCurrentContentInsetEnd();
+    method public int getCurrentContentInsetLeft();
+    method public int getCurrentContentInsetRight();
+    method public int getCurrentContentInsetStart();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logo") public android.graphics.drawable.Drawable! getLogo();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logoDescription") public CharSequence! getLogoDescription();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:menu") public android.view.Menu! getMenu();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationContentDescription") public CharSequence? getNavigationContentDescription();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationIcon") public android.graphics.drawable.Drawable? getNavigationIcon();
+    method public android.graphics.drawable.Drawable? getOverflowIcon();
+    method @StyleRes @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:popupTheme") public int getPopupTheme();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:subtitle") public CharSequence! getSubtitle();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:title") public CharSequence! getTitle();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginBottom") public int getTitleMarginBottom();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginEnd") public int getTitleMarginEnd();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginStart") public int getTitleMarginStart();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginTop") public int getTitleMarginTop();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.widget.DecorToolbar! getWrapper();
+    method public boolean hasExpandedActionView();
+    method public boolean hideOverflowMenu();
+    method public void inflateMenu(@MenuRes int);
+    method @MainThread public void invalidateMenu();
+    method public boolean isBackInvokedCallbackEnabled();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isOverflowMenuShowPending();
+    method public boolean isOverflowMenuShowing();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isTitleTruncated();
+    method @MainThread public void removeMenuProvider(androidx.core.view.MenuProvider);
+    method public void setBackInvokedCallbackEnabled(boolean);
+    method public void setCollapseContentDescription(@StringRes int);
+    method public void setCollapseContentDescription(CharSequence?);
+    method public void setCollapseIcon(@DrawableRes int);
+    method public void setCollapseIcon(android.graphics.drawable.Drawable?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setCollapsible(boolean);
+    method public void setContentInsetEndWithActions(int);
+    method public void setContentInsetStartWithNavigation(int);
+    method public void setContentInsetsAbsolute(int, int);
+    method public void setContentInsetsRelative(int, int);
+    method public void setLogo(@DrawableRes int);
+    method public void setLogo(android.graphics.drawable.Drawable!);
+    method public void setLogoDescription(@StringRes int);
+    method public void setLogoDescription(CharSequence!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setMenuCallbacks(androidx.appcompat.view.menu.MenuPresenter.Callback!, androidx.appcompat.view.menu.MenuBuilder.Callback!);
+    method public void setNavigationContentDescription(@StringRes int);
+    method public void setNavigationContentDescription(CharSequence?);
+    method public void setNavigationIcon(@DrawableRes int);
+    method public void setNavigationIcon(android.graphics.drawable.Drawable?);
+    method public void setNavigationOnClickListener(android.view.View.OnClickListener!);
+    method public void setOnMenuItemClickListener(androidx.appcompat.widget.Toolbar.OnMenuItemClickListener!);
+    method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+    method public void setPopupTheme(@StyleRes int);
+    method public void setSubtitle(@StringRes int);
+    method public void setSubtitle(CharSequence!);
+    method public void setSubtitleTextAppearance(android.content.Context!, @StyleRes int);
+    method public void setSubtitleTextColor(@ColorInt int);
+    method public void setSubtitleTextColor(android.content.res.ColorStateList);
+    method public void setTitle(@StringRes int);
+    method public void setTitle(CharSequence!);
+    method public void setTitleMargin(int, int, int, int);
+    method public void setTitleMarginBottom(int);
+    method public void setTitleMarginEnd(int);
+    method public void setTitleMarginStart(int);
+    method public void setTitleMarginTop(int);
+    method public void setTitleTextAppearance(android.content.Context!, @StyleRes int);
+    method public void setTitleTextColor(@ColorInt int);
+    method public void setTitleTextColor(android.content.res.ColorStateList);
+    method public boolean showOverflowMenu();
+  }
+
+  public static class Toolbar.LayoutParams extends androidx.appcompat.app.ActionBar.LayoutParams {
+    ctor public Toolbar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+    ctor public Toolbar.LayoutParams(int, int);
+    ctor public Toolbar.LayoutParams(int, int, int);
+    ctor public Toolbar.LayoutParams(int);
+    ctor public Toolbar.LayoutParams(androidx.appcompat.widget.Toolbar.LayoutParams!);
+    ctor public Toolbar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+    ctor public Toolbar.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+    ctor public Toolbar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+  }
+
+  public static interface Toolbar.OnMenuItemClickListener {
+    method public boolean onMenuItemClick(android.view.MenuItem!);
+  }
+
+  public static class Toolbar.SavedState extends androidx.customview.view.AbsSavedState {
+    ctor public Toolbar.SavedState(android.os.Parcel!);
+    ctor public Toolbar.SavedState(android.os.Parcel!, ClassLoader!);
+    ctor public Toolbar.SavedState(android.os.Parcelable!);
+    field public static final android.os.Parcelable.Creator<androidx.appcompat.widget.Toolbar.SavedState!>! CREATOR;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ToolbarWidgetWrapper implements androidx.appcompat.widget.DecorToolbar {
+    ctor public ToolbarWidgetWrapper(androidx.appcompat.widget.Toolbar!, boolean);
+    ctor public ToolbarWidgetWrapper(androidx.appcompat.widget.Toolbar!, boolean, int, int);
+    method public void animateToVisibility(int);
+    method public boolean canShowOverflowMenu();
+    method public void collapseActionView();
+    method public void dismissPopupMenus();
+    method public android.content.Context! getContext();
+    method public android.view.View! getCustomView();
+    method public int getDisplayOptions();
+    method public int getDropdownItemCount();
+    method public int getDropdownSelectedPosition();
+    method public int getHeight();
+    method public android.view.Menu! getMenu();
+    method public int getNavigationMode();
+    method public CharSequence! getSubtitle();
+    method public CharSequence! getTitle();
+    method public android.view.ViewGroup! getViewGroup();
+    method public int getVisibility();
+    method public boolean hasEmbeddedTabs();
+    method public boolean hasExpandedActionView();
+    method public boolean hasIcon();
+    method public boolean hasLogo();
+    method public boolean hideOverflowMenu();
+    method public void initIndeterminateProgress();
+    method public void initProgress();
+    method public boolean isOverflowMenuShowPending();
+    method public boolean isOverflowMenuShowing();
+    method public boolean isTitleTruncated();
+    method public void restoreHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+    method public void saveHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+    method public void setCollapsible(boolean);
+    method public void setCustomView(android.view.View!);
+    method public void setDefaultNavigationContentDescription(int);
+    method public void setDefaultNavigationIcon(android.graphics.drawable.Drawable!);
+    method public void setDisplayOptions(int);
+    method public void setDropdownParams(android.widget.SpinnerAdapter!, android.widget.AdapterView.OnItemSelectedListener!);
+    method public void setDropdownSelectedPosition(int);
+    method public void setEmbeddedTabView(androidx.appcompat.widget.ScrollingTabContainerView!);
+    method public void setHomeButtonEnabled(boolean);
+    method public void setIcon(int);
+    method public void setIcon(android.graphics.drawable.Drawable!);
+    method public void setLogo(int);
+    method public void setLogo(android.graphics.drawable.Drawable!);
+    method public void setMenu(android.view.Menu!, androidx.appcompat.view.menu.MenuPresenter.Callback!);
+    method public void setMenuCallbacks(androidx.appcompat.view.menu.MenuPresenter.Callback!, androidx.appcompat.view.menu.MenuBuilder.Callback!);
+    method public void setMenuPrepared();
+    method public void setNavigationContentDescription(CharSequence!);
+    method public void setNavigationContentDescription(int);
+    method public void setNavigationIcon(android.graphics.drawable.Drawable!);
+    method public void setNavigationIcon(int);
+    method public void setNavigationMode(int);
+    method public void setSubtitle(CharSequence!);
+    method public void setTitle(CharSequence!);
+    method public void setVisibility(int);
+    method public void setWindowCallback(android.view.Window.Callback!);
+    method public void setWindowTitle(CharSequence!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setupAnimatorToVisibility(int, long);
+    method public boolean showOverflowMenu();
+  }
+
+  public class TooltipCompat {
+    method public static void setTooltipText(android.view.View, CharSequence?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ViewStubCompat extends android.view.View {
+    ctor public ViewStubCompat(android.content.Context, android.util.AttributeSet?);
+    ctor public ViewStubCompat(android.content.Context, android.util.AttributeSet?, int);
+    method public int getInflatedId();
+    method public android.view.LayoutInflater! getLayoutInflater();
+    method public int getLayoutResource();
+    method public android.view.View! inflate();
+    method public void setInflatedId(int);
+    method public void setLayoutInflater(android.view.LayoutInflater!);
+    method public void setLayoutResource(int);
+    method public void setOnInflateListener(androidx.appcompat.widget.ViewStubCompat.OnInflateListener!);
+  }
+
+  public static interface ViewStubCompat.OnInflateListener {
+    method public void onInflate(androidx.appcompat.widget.ViewStubCompat!, android.view.View!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ViewUtils {
+    method public static void computeFitSystemWindows(android.view.View!, android.graphics.Rect!, android.graphics.Rect!);
+    method public static boolean isLayoutRtl(android.view.View!);
+    method public static void makeOptionalFitsSystemWindows(android.view.View!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface WithHint {
+    method public CharSequence? getHint();
+  }
+
+}
+
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 9a367b3..3d2edd4 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
@@ -725,10 +725,6 @@
         // handled by the application.
         applyApplicationSpecificConfig(false,
                 /* isLocalesApplicationRequired */ false);
-
-        // We may have just changed the resource configuration. Make sure that everyone after us
-        // sees the same configuration by modifying the parameter's internal state.
-        newConfig.updateFrom(mContext.getResources().getConfiguration());
     }
 
     @Override
diff --git a/appsearch/OWNERS b/appsearch/OWNERS
index ea56b2f..75fba46 100644
--- a/appsearch/OWNERS
+++ b/appsearch/OWNERS
@@ -1,4 +1,4 @@
-# Bug component: 1012737
+# Bug component: 754644
 adorokhine@google.com
 tjbarron@google.com
 sudheersai@google.com
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchImpl.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchImpl.java
index ec6723c..01cb197 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchImpl.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchImpl.java
@@ -600,7 +600,8 @@
             }
 
             boolean contentsChanged = true;
-            if (existBefore && existAfter && contentBefore.equals(contentAfter)) {
+            if (contentBefore != null
+                    && contentBefore.equals(contentAfter)) {
                 contentsChanged = false;
             }
 
@@ -993,7 +994,7 @@
         } finally {
             mReadWriteLock.writeLock().unlock();
 
-            if (logger != null) {
+            if (pStatsBuilder != null && logger != null) {
                 long totalEndTimeMillis = SystemClock.elapsedRealtime();
                 pStatsBuilder.setTotalLatencyMillis(
                         (int) (totalEndTimeMillis - totalStartTimeMillis));
@@ -1112,7 +1113,8 @@
             DocumentProto.Builder documentBuilder = documentProto.toBuilder();
             removePrefixesFromDocument(documentBuilder);
             String prefix = createPrefix(packageName, databaseName);
-            Map<String, SchemaTypeConfigProto> schemaTypeMap = mSchemaMapLocked.get(prefix);
+            Map<String, SchemaTypeConfigProto> schemaTypeMap =
+                    Preconditions.checkNotNull(mSchemaMapLocked.get(prefix));
             return GenericDocumentToProtoConverter.toGenericDocument(documentBuilder.build(),
                     prefix, schemaTypeMap);
         } finally {
@@ -1153,7 +1155,8 @@
             // The schema type map cannot be null at this point. It could only be null if no
             // schema had ever been set for that prefix. Given we have retrieved a document from
             // the index, we know a schema had to have been set.
-            Map<String, SchemaTypeConfigProto> schemaTypeMap = mSchemaMapLocked.get(prefix);
+            Map<String, SchemaTypeConfigProto> schemaTypeMap =
+                    Preconditions.checkNotNull(mSchemaMapLocked.get(prefix));
             return GenericDocumentToProtoConverter.toGenericDocument(documentBuilder.build(),
                     prefix, schemaTypeMap);
         } finally {
@@ -1250,7 +1253,7 @@
             if (!filterPackageNames.isEmpty() && !filterPackageNames.contains(packageName)) {
                 // Client wanted to query over some packages that weren't its own. This isn't
                 // allowed through local query so we can return early with no results.
-                if (logger != null) {
+                if (sStatsBuilder != null && logger != null) {
                     sStatsBuilder.setStatusCode(AppSearchResult.RESULT_SECURITY_ERROR);
                 }
                 return new SearchResultPage(Bundle.EMPTY);
@@ -1274,7 +1277,7 @@
             return searchResultPage;
         } finally {
             mReadWriteLock.readLock().unlock();
-            if (logger != null) {
+            if (sStatsBuilder != null && logger != null) {
                 sStatsBuilder.setTotalLatencyMillis(
                         (int) (SystemClock.elapsedRealtime() - totalLatencyStartMillis));
                 logger.logStats(sStatsBuilder.build());
@@ -1353,7 +1356,7 @@
         } finally {
             mReadWriteLock.readLock().unlock();
 
-            if (logger != null) {
+            if (sStatsBuilder != null && logger != null) {
                 sStatsBuilder.setTotalLatencyMillis(
                         (int) (SystemClock.elapsedRealtime() - totalLatencyStartMillis));
                 logger.logStats(sStatsBuilder.build());
@@ -1560,7 +1563,9 @@
                 // Since the new token is 0, this is the last page. We should remove the old token
                 // from our cache since it no longer refers to this query.
                 synchronized (mNextPageTokensLocked) {
-                    mNextPageTokensLocked.get(packageName).remove(nextPageToken);
+                    Set<Long> nextPageTokensForPackage =
+                            Preconditions.checkNotNull(mNextPageTokensLocked.get(packageName));
+                    nextPageTokensForPackage.remove(nextPageToken);
                 }
             }
             long rewriteSearchResultLatencyStartMillis = SystemClock.elapsedRealtime();
@@ -2196,8 +2201,11 @@
                     for (String databaseName : databaseNames) {
                         String removedPrefix = createPrefix(packageName, databaseName);
                         Map<String, SchemaTypeConfigProto> removedSchemas =
-                                mSchemaMapLocked.remove(removedPrefix);
-                        mVisibilityStoreLocked.removeVisibility(removedSchemas.keySet());
+                                Preconditions.checkNotNull(mSchemaMapLocked.remove(removedPrefix));
+                        if (mVisibilityStoreLocked != null) {
+                            mVisibilityStoreLocked.removeVisibility(removedSchemas.keySet());
+                        }
+
                         mNamespaceMapLocked.remove(removedPrefix);
                     }
                 }
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/converter/GenericDocumentToProtoConverter.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/converter/GenericDocumentToProtoConverter.java
index a139d3b..c6731d1 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/converter/GenericDocumentToProtoConverter.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/converter/GenericDocumentToProtoConverter.java
@@ -184,8 +184,9 @@
                 documentBuilder.setPropertyDocument(name, values);
             } else {
                 // TODO(b/184966497): Optimize by caching PropertyConfigProto
-                setEmptyProperty(name, documentBuilder,
-                        schemaTypeMap.get(prefixedSchemaType));
+                SchemaTypeConfigProto schema =
+                        Preconditions.checkNotNull(schemaTypeMap.get(prefixedSchemaType));
+                setEmptyProperty(name, documentBuilder, schema);
             }
         }
         return documentBuilder.build();
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/converter/SearchResultToProtoConverter.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/converter/SearchResultToProtoConverter.java
index de42623..e985c52 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/converter/SearchResultToProtoConverter.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/converter/SearchResultToProtoConverter.java
@@ -28,6 +28,7 @@
 import androidx.appsearch.app.SearchResult;
 import androidx.appsearch.app.SearchResultPage;
 import androidx.appsearch.exceptions.AppSearchException;
+import androidx.core.util.Preconditions;
 
 import com.google.android.icing.proto.DocumentProto;
 import com.google.android.icing.proto.SchemaTypeConfigProto;
@@ -88,7 +89,8 @@
 
         DocumentProto.Builder documentBuilder = proto.getDocument().toBuilder();
         String prefix = removePrefixesFromDocument(documentBuilder);
-        Map<String, SchemaTypeConfigProto> schemaTypeMap = schemaMap.get(prefix);
+        Map<String, SchemaTypeConfigProto> schemaTypeMap =
+                Preconditions.checkNotNull(schemaMap.get(prefix));
         GenericDocument document =
                 GenericDocumentToProtoConverter.toGenericDocument(documentBuilder, prefix,
                         schemaTypeMap);
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/visibilitystore/VisibilityDocumentV1.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/visibilitystore/VisibilityDocumentV1.java
index 537fd81..e3be791 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/visibilitystore/VisibilityDocumentV1.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/visibilitystore/VisibilityDocumentV1.java
@@ -95,7 +95,7 @@
      */
     @NonNull
     String[] getPackageNames() {
-        return getPropertyStringArray(PACKAGE_NAME_PROPERTY);
+        return Preconditions.checkNotNull(getPropertyStringArray(PACKAGE_NAME_PROPERTY));
     }
 
     /**
@@ -105,7 +105,7 @@
      */
     @NonNull
     byte[][] getSha256Certs() {
-        return getPropertyBytesArray(SHA_256_CERT_PROPERTY);
+        return Preconditions.checkNotNull(getPropertyBytesArray(SHA_256_CERT_PROPERTY));
     }
 
     /**
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/visibilitystore/VisibilityStoreMigrationHelperFromV0.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/visibilitystore/VisibilityStoreMigrationHelperFromV0.java
index edff437..bf1b987 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/visibilitystore/VisibilityStoreMigrationHelperFromV0.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/visibilitystore/VisibilityStoreMigrationHelperFromV0.java
@@ -29,6 +29,7 @@
 import androidx.appsearch.localstorage.AppSearchImpl;
 import androidx.appsearch.localstorage.util.PrefixUtil;
 import androidx.collection.ArrayMap;
+import androidx.core.util.Preconditions;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -203,15 +204,19 @@
                     .getPropertyDocumentArray(DEPRECATED_VISIBLE_TO_PACKAGES_PROPERTY);
             if (deprecatedPackageDocuments != null) {
                 for (GenericDocument deprecatedPackageDocument : deprecatedPackageDocuments) {
-                    String prefixedSchemaType = deprecatedPackageDocument
-                            .getPropertyString(DEPRECATED_ACCESSIBLE_SCHEMA_PROPERTY);
-                    VisibilityDocumentV1.Builder visibilityBuilder = getOrCreateBuilder(
-                            documentBuilderMap, prefixedSchemaType);
-                    visibilityBuilder.addVisibleToPackage(new PackageIdentifier(
+                    String prefixedSchemaType = Preconditions.checkNotNull(
                             deprecatedPackageDocument.getPropertyString(
-                                    DEPRECATED_PACKAGE_NAME_PROPERTY),
+                            DEPRECATED_ACCESSIBLE_SCHEMA_PROPERTY));
+                    VisibilityDocumentV1.Builder visibilityBuilder =
+                            getOrCreateBuilder(documentBuilderMap, prefixedSchemaType);
+                    String packageName = Preconditions.checkNotNull(
+                            deprecatedPackageDocument.getPropertyString(
+                                DEPRECATED_PACKAGE_NAME_PROPERTY));
+                    byte[] sha256Cert = Preconditions.checkNotNull(
                             deprecatedPackageDocument.getPropertyBytes(
-                                    DEPRECATED_SHA_256_CERT_PROPERTY)));
+                                DEPRECATED_SHA_256_CERT_PROPERTY));
+                    visibilityBuilder.addVisibleToPackage(
+                            new PackageIdentifier(packageName, sha256Cert));
                 }
             }
         }
diff --git a/appsearch/appsearch/api/current.txt b/appsearch/appsearch/api/current.txt
index 9818d8b..2ef699a 100644
--- a/appsearch/appsearch/api/current.txt
+++ b/appsearch/appsearch/api/current.txt
@@ -266,6 +266,7 @@
   public final class GetByDocumentIdRequest {
     method public java.util.Set<java.lang.String!> getIds();
     method public String getNamespace();
+    method public java.util.Map<java.lang.String!,java.util.List<androidx.appsearch.app.PropertyPath!>!> getProjectionPaths();
     method public java.util.Map<java.lang.String!,java.util.List<java.lang.String!>!> getProjections();
     field public static final String PROJECTION_SCHEMA_TYPE_WILDCARD = "*";
   }
@@ -275,6 +276,7 @@
     method public androidx.appsearch.app.GetByDocumentIdRequest.Builder addIds(java.lang.String!...);
     method public androidx.appsearch.app.GetByDocumentIdRequest.Builder addIds(java.util.Collection<java.lang.String!>);
     method public androidx.appsearch.app.GetByDocumentIdRequest.Builder addProjection(String, java.util.Collection<java.lang.String!>);
+    method public androidx.appsearch.app.GetByDocumentIdRequest.Builder addProjectionPaths(String, java.util.Collection<androidx.appsearch.app.PropertyPath!>);
     method public androidx.appsearch.app.GetByDocumentIdRequest build();
   }
 
@@ -445,6 +447,7 @@
     method public java.util.List<java.lang.String!> getFilterSchemas();
     method public int getMaxSnippetSize();
     method public int getOrder();
+    method public java.util.Map<java.lang.String!,java.util.List<androidx.appsearch.app.PropertyPath!>!> getProjectionPaths();
     method public java.util.Map<java.lang.String!,java.util.List<java.lang.String!>!> getProjections();
     method public int getRankingStrategy();
     method public int getResultCountPerPage();
@@ -481,6 +484,7 @@
     method public androidx.appsearch.app.SearchSpec.Builder addFilterSchemas(java.lang.String!...);
     method public androidx.appsearch.app.SearchSpec.Builder addFilterSchemas(java.util.Collection<java.lang.String!>);
     method public androidx.appsearch.app.SearchSpec.Builder addProjection(String, java.util.Collection<java.lang.String!>);
+    method public androidx.appsearch.app.SearchSpec.Builder addProjectionPaths(String, java.util.Collection<androidx.appsearch.app.PropertyPath!>);
     method public androidx.appsearch.app.SearchSpec build();
     method public androidx.appsearch.app.SearchSpec.Builder setMaxSnippetSize(@IntRange(from=0, to=0x2710) int);
     method public androidx.appsearch.app.SearchSpec.Builder setOrder(int);
diff --git a/appsearch/appsearch/api/public_plus_experimental_current.txt b/appsearch/appsearch/api/public_plus_experimental_current.txt
index 9818d8b..2ef699a 100644
--- a/appsearch/appsearch/api/public_plus_experimental_current.txt
+++ b/appsearch/appsearch/api/public_plus_experimental_current.txt
@@ -266,6 +266,7 @@
   public final class GetByDocumentIdRequest {
     method public java.util.Set<java.lang.String!> getIds();
     method public String getNamespace();
+    method public java.util.Map<java.lang.String!,java.util.List<androidx.appsearch.app.PropertyPath!>!> getProjectionPaths();
     method public java.util.Map<java.lang.String!,java.util.List<java.lang.String!>!> getProjections();
     field public static final String PROJECTION_SCHEMA_TYPE_WILDCARD = "*";
   }
@@ -275,6 +276,7 @@
     method public androidx.appsearch.app.GetByDocumentIdRequest.Builder addIds(java.lang.String!...);
     method public androidx.appsearch.app.GetByDocumentIdRequest.Builder addIds(java.util.Collection<java.lang.String!>);
     method public androidx.appsearch.app.GetByDocumentIdRequest.Builder addProjection(String, java.util.Collection<java.lang.String!>);
+    method public androidx.appsearch.app.GetByDocumentIdRequest.Builder addProjectionPaths(String, java.util.Collection<androidx.appsearch.app.PropertyPath!>);
     method public androidx.appsearch.app.GetByDocumentIdRequest build();
   }
 
@@ -445,6 +447,7 @@
     method public java.util.List<java.lang.String!> getFilterSchemas();
     method public int getMaxSnippetSize();
     method public int getOrder();
+    method public java.util.Map<java.lang.String!,java.util.List<androidx.appsearch.app.PropertyPath!>!> getProjectionPaths();
     method public java.util.Map<java.lang.String!,java.util.List<java.lang.String!>!> getProjections();
     method public int getRankingStrategy();
     method public int getResultCountPerPage();
@@ -481,6 +484,7 @@
     method public androidx.appsearch.app.SearchSpec.Builder addFilterSchemas(java.lang.String!...);
     method public androidx.appsearch.app.SearchSpec.Builder addFilterSchemas(java.util.Collection<java.lang.String!>);
     method public androidx.appsearch.app.SearchSpec.Builder addProjection(String, java.util.Collection<java.lang.String!>);
+    method public androidx.appsearch.app.SearchSpec.Builder addProjectionPaths(String, java.util.Collection<androidx.appsearch.app.PropertyPath!>);
     method public androidx.appsearch.app.SearchSpec build();
     method public androidx.appsearch.app.SearchSpec.Builder setMaxSnippetSize(@IntRange(from=0, to=0x2710) int);
     method public androidx.appsearch.app.SearchSpec.Builder setOrder(int);
diff --git a/appsearch/appsearch/api/restricted_current.txt b/appsearch/appsearch/api/restricted_current.txt
index 9818d8b..2ef699a 100644
--- a/appsearch/appsearch/api/restricted_current.txt
+++ b/appsearch/appsearch/api/restricted_current.txt
@@ -266,6 +266,7 @@
   public final class GetByDocumentIdRequest {
     method public java.util.Set<java.lang.String!> getIds();
     method public String getNamespace();
+    method public java.util.Map<java.lang.String!,java.util.List<androidx.appsearch.app.PropertyPath!>!> getProjectionPaths();
     method public java.util.Map<java.lang.String!,java.util.List<java.lang.String!>!> getProjections();
     field public static final String PROJECTION_SCHEMA_TYPE_WILDCARD = "*";
   }
@@ -275,6 +276,7 @@
     method public androidx.appsearch.app.GetByDocumentIdRequest.Builder addIds(java.lang.String!...);
     method public androidx.appsearch.app.GetByDocumentIdRequest.Builder addIds(java.util.Collection<java.lang.String!>);
     method public androidx.appsearch.app.GetByDocumentIdRequest.Builder addProjection(String, java.util.Collection<java.lang.String!>);
+    method public androidx.appsearch.app.GetByDocumentIdRequest.Builder addProjectionPaths(String, java.util.Collection<androidx.appsearch.app.PropertyPath!>);
     method public androidx.appsearch.app.GetByDocumentIdRequest build();
   }
 
@@ -445,6 +447,7 @@
     method public java.util.List<java.lang.String!> getFilterSchemas();
     method public int getMaxSnippetSize();
     method public int getOrder();
+    method public java.util.Map<java.lang.String!,java.util.List<androidx.appsearch.app.PropertyPath!>!> getProjectionPaths();
     method public java.util.Map<java.lang.String!,java.util.List<java.lang.String!>!> getProjections();
     method public int getRankingStrategy();
     method public int getResultCountPerPage();
@@ -481,6 +484,7 @@
     method public androidx.appsearch.app.SearchSpec.Builder addFilterSchemas(java.lang.String!...);
     method public androidx.appsearch.app.SearchSpec.Builder addFilterSchemas(java.util.Collection<java.lang.String!>);
     method public androidx.appsearch.app.SearchSpec.Builder addProjection(String, java.util.Collection<java.lang.String!>);
+    method public androidx.appsearch.app.SearchSpec.Builder addProjectionPaths(String, java.util.Collection<androidx.appsearch.app.PropertyPath!>);
     method public androidx.appsearch.app.SearchSpec build();
     method public androidx.appsearch.app.SearchSpec.Builder setMaxSnippetSize(@IntRange(from=0, to=0x2710) int);
     method public androidx.appsearch.app.SearchSpec.Builder setOrder(int);
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSchemaMigrationLocalCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSchemaMigrationLocalCtsTest.java
index b6821a0..75b3888 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSchemaMigrationLocalCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSchemaMigrationLocalCtsTest.java
@@ -22,9 +22,11 @@
 import androidx.appsearch.app.AppSearchSession;
 import androidx.appsearch.localstorage.LocalStorage;
 import androidx.test.core.app.ApplicationProvider;
+import androidx.test.filters.FlakyTest;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
+@FlakyTest(bugId = 242761389)
 public class AppSearchSchemaMigrationLocalCtsTest extends AppSearchSchemaMigrationCtsTestBase{
     @Override
     protected ListenableFuture<AppSearchSession> createSearchSessionAsync(@NonNull String dbName) {
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/GetByDocumentIdRequest.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/GetByDocumentIdRequest.java
index b2ebf3d..d7ff30b 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/GetByDocumentIdRequest.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/GetByDocumentIdRequest.java
@@ -89,6 +89,27 @@
      *
      * <p>If the map is empty, then all properties will be retrieved for all results.
      *
+     * <p>Calling this function repeatedly is inefficient. Prefer to retain the Map returned
+     * by this function, rather than calling it multiple times.
+     */
+    @NonNull
+    public Map<String, List<PropertyPath>> getProjectionPaths() {
+        Map<String, List<PropertyPath>> copy = new ArrayMap<>(mTypePropertyPathsMap.size());
+        for (Map.Entry<String, List<String>> entry : mTypePropertyPathsMap.entrySet()) {
+            List<PropertyPath> propertyPathList = new ArrayList<>(entry.getValue().size());
+            for (String p: entry.getValue()) {
+                propertyPathList.add(new PropertyPath(p));
+            }
+            copy.put(entry.getKey(), propertyPathList);
+        }
+        return copy;
+    }
+
+    /**
+     * Returns a map from schema type to property paths to be used for projection.
+     *
+     * <p>If the map is empty, then all properties will be retrieved for all results.
+     *
      * <p>A more efficient version of {@link #getProjections}, but it returns a modifiable map.
      * This is not meant to be unhidden and should only be used by internal classes.
      *
@@ -143,7 +164,7 @@
          * will apply to all results, excepting any types that have their own, specific property
          * paths set.
          *
-         * @see SearchSpec.Builder#addProjection
+         * @see SearchSpec.Builder#addProjectionPaths
          */
         @NonNull
         public Builder addProjection(
@@ -160,6 +181,34 @@
             return this;
         }
 
+        /**
+         * Adds property paths for the specified type to be used for projection. If property
+         * paths are added for a type, then only the properties referred to will be retrieved for
+         * results of that type. If a property path that is specified isn't present in a result,
+         * it will be ignored for that result. Property paths cannot be null.
+         *
+         * <p>If no property paths are added for a particular type, then all properties of
+         * results of that type will be retrieved.
+         *
+         * <p>If property path is added for the
+         * {@link GetByDocumentIdRequest#PROJECTION_SCHEMA_TYPE_WILDCARD}, then those property paths
+         * will apply to all results, excepting any types that have their own, specific property
+         * paths set.
+         *
+         * @see SearchSpec.Builder#addProjectionPaths
+         */
+        @NonNull
+        public Builder addProjectionPaths(
+                @NonNull String schemaType, @NonNull Collection<PropertyPath> propertyPaths) {
+            Preconditions.checkNotNull(schemaType);
+            Preconditions.checkNotNull(propertyPaths);
+            List<String> propertyPathsList = new ArrayList<>(propertyPaths.size());
+            for (PropertyPath propertyPath : propertyPaths) {
+                propertyPathsList.add(propertyPath.toString());
+            }
+            return addProjection(schemaType, propertyPathsList);
+        }
+
         /** Builds a new {@link GetByDocumentIdRequest}. */
         @NonNull
         public GetByDocumentIdRequest build() {
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/PropertyPath.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/PropertyPath.java
index c451624..b23e46e 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/PropertyPath.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/PropertyPath.java
@@ -251,7 +251,7 @@
          * @param propertyName the name of the property
          * @param propertyIndex the index into the property
          * @return A new PathSegment
-         * @throws an {@link IllegalArgumentException} if the property name or index is invalid.
+         * @throws IllegalArgumentException if the property name or index is invalid.
          */
         @NonNull
         public static PathSegment create(@NonNull String propertyName, int propertyIndex) {
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 0adbf62..d149fe5 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/SearchSpec.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/SearchSpec.java
@@ -308,6 +308,30 @@
     }
 
     /**
+     * Returns a map from schema type to property paths to be used for projection.
+     *
+     * <p>If the map is empty, then all properties will be retrieved for all results.
+     *
+     * <p>Calling this function repeatedly is inefficient. Prefer to retain the Map returned
+     * by this function, rather than calling it multiple times.
+     */
+    @NonNull
+    public Map<String, List<PropertyPath>> getProjectionPaths() {
+        Bundle typePropertyPathsBundle = mBundle.getBundle(PROJECTION_TYPE_PROPERTY_PATHS_FIELD);
+        Set<String> schemas = typePropertyPathsBundle.keySet();
+        Map<String, List<PropertyPath>> typePropertyPathsMap = new ArrayMap<>(schemas.size());
+        for (String schema : schemas) {
+            ArrayList<String> propertyPathList = typePropertyPathsBundle.getStringArrayList(schema);
+            List<PropertyPath> copy = new ArrayList<>(propertyPathList.size());
+            for (String p: propertyPathList) {
+                copy.add(new PropertyPath(p));
+            }
+            typePropertyPathsMap.put(schema, copy);
+        }
+        return typePropertyPathsMap;
+    }
+
+    /**
      * Get the type of grouping limit to apply, or 0 if {@link Builder#setResultGrouping} was not
      * called.
      */
@@ -599,6 +623,29 @@
          * results of that type. If a property path that is specified isn't present in a result,
          * it will be ignored for that result. Property paths cannot be null.
          *
+         * @see #addProjectionPaths
+         */
+        @NonNull
+        public SearchSpec.Builder addProjection(
+                @NonNull String schema, @NonNull Collection<String> propertyPaths) {
+            Preconditions.checkNotNull(schema);
+            Preconditions.checkNotNull(propertyPaths);
+            resetIfBuilt();
+            ArrayList<String> propertyPathsArrayList = new ArrayList<>(propertyPaths.size());
+            for (String propertyPath : propertyPaths) {
+                Preconditions.checkNotNull(propertyPath);
+                propertyPathsArrayList.add(propertyPath);
+            }
+            mProjectionTypePropertyMasks.putStringArrayList(schema, propertyPathsArrayList);
+            return this;
+        }
+
+        /**
+         * Adds property paths for the specified type to be used for projection. If property
+         * paths are added for a type, then only the properties referred to will be retrieved for
+         * results of that type. If a property path that is specified isn't present in a result,
+         * it will be ignored for that result. Property paths cannot be null.
+         *
          * <p>If no property paths are added for a particular type, then all properties of
          * results of that type will be retrieved.
          *
@@ -654,18 +701,15 @@
          * }</pre>
          */
         @NonNull
-        public SearchSpec.Builder addProjection(
-                @NonNull String schema, @NonNull Collection<String> propertyPaths) {
+        public SearchSpec.Builder addProjectionPaths(
+                @NonNull String schema, @NonNull Collection<PropertyPath> propertyPaths) {
             Preconditions.checkNotNull(schema);
             Preconditions.checkNotNull(propertyPaths);
-            resetIfBuilt();
             ArrayList<String> propertyPathsArrayList = new ArrayList<>(propertyPaths.size());
-            for (String propertyPath : propertyPaths) {
-                Preconditions.checkNotNull(propertyPath);
-                propertyPathsArrayList.add(propertyPath);
+            for (PropertyPath propertyPath : propertyPaths) {
+                propertyPathsArrayList.add(propertyPath.toString());
             }
-            mProjectionTypePropertyMasks.putStringArrayList(schema, propertyPathsArrayList);
-            return this;
+            return addProjection(schema, propertyPathsArrayList);
         }
 
         /**
diff --git a/appsearch/compiler/src/main/java/androidx/appsearch/compiler/SchemaCodeGenerator.java b/appsearch/compiler/src/main/java/androidx/appsearch/compiler/SchemaCodeGenerator.java
index 3693646..96b0f88 100644
--- a/appsearch/compiler/src/main/java/androidx/appsearch/compiler/SchemaCodeGenerator.java
+++ b/appsearch/compiler/src/main/java/androidx/appsearch/compiler/SchemaCodeGenerator.java
@@ -220,7 +220,12 @@
             codeBlock.add("\n.setIndexingType($T)", indexingEnum);
 
         } else if (isPropertyDocument) {
-            // TODO(b/177572431): Apply setIndexNestedProperties here
+            if (params.containsKey("indexNestedProperties")) {
+                boolean indexNestedProperties = Boolean.parseBoolean(
+                        params.get("indexNestedProperties").toString());
+
+                codeBlock.add("\n.setShouldIndexNestedProperties($L)", indexNestedProperties);
+            }
         }
 
         // Done!
diff --git a/appsearch/compiler/src/test/java/androidx/appsearch/compiler/AppSearchCompilerTest.java b/appsearch/compiler/src/test/java/androidx/appsearch/compiler/AppSearchCompilerTest.java
index 3d13c38..1339501 100644
--- a/appsearch/compiler/src/test/java/androidx/appsearch/compiler/AppSearchCompilerTest.java
+++ b/appsearch/compiler/src/test/java/androidx/appsearch/compiler/AppSearchCompilerTest.java
@@ -317,7 +317,7 @@
     public void testSuperClassPojoAncestor() throws Exception {
         // Try multiple levels of inheritance, nested, with properties, overriding properties
         Compilation compilation = compile(
-                        "class Ancestor {\n"
+                "class Ancestor {\n"
                         + "}\n"
                         + "@Document\n"
                         + "class Parent extends Ancestor {\n"
@@ -1280,6 +1280,39 @@
         checkEqualsGolden("Gift.java");
     }
 
+    @Test
+    public void testNestedDocumentsIndexing() throws Exception {
+        Compilation compilation = compile(
+                "import java.util.*;\n"
+                        + "@Document\n"
+                        + "public class Gift {\n"
+                        + "  @Document.Id String id;\n"
+                        + "  @Document.Namespace String namespace;\n"
+                        + "  @Document.DocumentProperty(indexNestedProperties = true) "
+                        + "Collection<GiftContent> giftContentsCollection;\n"
+                        + "  @Document.DocumentProperty(indexNestedProperties = true) GiftContent[]"
+                        + " giftContentsArray;\n"
+                        + "  @Document.DocumentProperty(indexNestedProperties = true) GiftContent "
+                        + "giftContent;\n"
+                        + "  @Document.DocumentProperty() Collection<GiftContent> "
+                        + "giftContentsCollectionNotIndexed;\n"
+                        + "  @Document.DocumentProperty GiftContent[] "
+                        + "giftContentsArrayNotIndexed;\n"
+                        + "  @Document.DocumentProperty GiftContent giftContentNotIndexed;\n"
+                        + "}\n"
+                        + "\n"
+                        + "@Document\n"
+                        + "class GiftContent {\n"
+                        + "  @Document.Id String id;\n"
+                        + "  @Document.Namespace String namespace;\n"
+                        + "  @Document.StringProperty String[] contentsArray;\n"
+                        + "  @Document.StringProperty String contents;\n"
+                        + "}\n");
+
+        assertThat(compilation).succeededWithoutWarnings();
+        checkEqualsGolden("Gift.java");
+    }
+
     private Compilation compile(String classBody) {
         return compile("Gift", classBody);
     }
diff --git a/appsearch/compiler/src/test/resources/androidx/appsearch/compiler/goldens/testNestedDocumentsIndexing.JAVA b/appsearch/compiler/src/test/resources/androidx/appsearch/compiler/goldens/testNestedDocumentsIndexing.JAVA
new file mode 100644
index 0000000..c31f620
--- /dev/null
+++ b/appsearch/compiler/src/test/resources/androidx/appsearch/compiler/goldens/testNestedDocumentsIndexing.JAVA
@@ -0,0 +1,161 @@
+package com.example.appsearch;
+
+import androidx.appsearch.app.AppSearchSchema;
+import androidx.appsearch.app.DocumentClassFactory;
+import androidx.appsearch.app.GenericDocument;
+import androidx.appsearch.exceptions.AppSearchException;
+import java.lang.Override;
+import java.lang.String;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import javax.annotation.processing.Generated;
+
+@Generated("androidx.appsearch.compiler.AppSearchCompiler")
+public final class $$__AppSearch__Gift implements DocumentClassFactory<Gift> {
+  public static final String SCHEMA_NAME = "Gift";
+
+  @Override
+  public String getSchemaName() {
+    return SCHEMA_NAME;
+  }
+
+  @Override
+  public AppSearchSchema getSchema() throws AppSearchException {
+    return new AppSearchSchema.Builder(SCHEMA_NAME)
+          .addProperty(new AppSearchSchema.DocumentPropertyConfig.Builder("giftContentsCollection", $$__AppSearch__GiftContent.SCHEMA_NAME)
+            .setCardinality(AppSearchSchema.PropertyConfig.CARDINALITY_REPEATED)
+            .setShouldIndexNestedProperties(true)
+            .build())
+          .addProperty(new AppSearchSchema.DocumentPropertyConfig.Builder("giftContentsArray", $$__AppSearch__GiftContent.SCHEMA_NAME)
+            .setCardinality(AppSearchSchema.PropertyConfig.CARDINALITY_REPEATED)
+            .setShouldIndexNestedProperties(true)
+            .build())
+          .addProperty(new AppSearchSchema.DocumentPropertyConfig.Builder("giftContent", $$__AppSearch__GiftContent.SCHEMA_NAME)
+            .setCardinality(AppSearchSchema.PropertyConfig.CARDINALITY_OPTIONAL)
+            .setShouldIndexNestedProperties(true)
+            .build())
+          .addProperty(new AppSearchSchema.DocumentPropertyConfig.Builder("giftContentsCollectionNotIndexed", $$__AppSearch__GiftContent.SCHEMA_NAME)
+            .setCardinality(AppSearchSchema.PropertyConfig.CARDINALITY_REPEATED)
+            .setShouldIndexNestedProperties(false)
+            .build())
+          .addProperty(new AppSearchSchema.DocumentPropertyConfig.Builder("giftContentsArrayNotIndexed", $$__AppSearch__GiftContent.SCHEMA_NAME)
+            .setCardinality(AppSearchSchema.PropertyConfig.CARDINALITY_REPEATED)
+            .setShouldIndexNestedProperties(false)
+            .build())
+          .addProperty(new AppSearchSchema.DocumentPropertyConfig.Builder("giftContentNotIndexed", $$__AppSearch__GiftContent.SCHEMA_NAME)
+            .setCardinality(AppSearchSchema.PropertyConfig.CARDINALITY_OPTIONAL)
+            .setShouldIndexNestedProperties(false)
+            .build())
+          .build();
+  }
+
+  @Override
+  public GenericDocument toGenericDocument(Gift document) throws AppSearchException {
+    GenericDocument.Builder<?> builder =
+        new GenericDocument.Builder<>(document.namespace, document.id, SCHEMA_NAME);
+    Collection<GiftContent> giftContentsCollectionCopy = document.giftContentsCollection;
+    if (giftContentsCollectionCopy != null) {
+      GenericDocument[] giftContentsCollectionConv = new GenericDocument[giftContentsCollectionCopy.size()];
+      int i = 0;
+      for (GiftContent item : giftContentsCollectionCopy) {
+        giftContentsCollectionConv[i++] = GenericDocument.fromDocumentClass(item);
+      }
+      builder.setPropertyDocument("giftContentsCollection", giftContentsCollectionConv);
+    }
+    GiftContent[] giftContentsArrayCopy = document.giftContentsArray;
+    if (giftContentsArrayCopy != null) {
+      GenericDocument[] giftContentsArrayConv = new GenericDocument[giftContentsArrayCopy.length];
+      for (int i = 0; i < giftContentsArrayConv.length; i++) {
+        giftContentsArrayConv[i] = GenericDocument.fromDocumentClass(giftContentsArrayCopy[i]);
+      }
+      builder.setPropertyDocument("giftContentsArray", giftContentsArrayConv);
+    }
+    GiftContent giftContentCopy = document.giftContent;
+    if (giftContentCopy != null) {
+      GenericDocument giftContentConv = GenericDocument.fromDocumentClass(giftContentCopy);
+      builder.setPropertyDocument("giftContent", giftContentConv);
+    }
+    Collection<GiftContent> giftContentsCollectionNotIndexedCopy = document.giftContentsCollectionNotIndexed;
+    if (giftContentsCollectionNotIndexedCopy != null) {
+      GenericDocument[] giftContentsCollectionNotIndexedConv = new GenericDocument[giftContentsCollectionNotIndexedCopy.size()];
+      int i = 0;
+      for (GiftContent item : giftContentsCollectionNotIndexedCopy) {
+        giftContentsCollectionNotIndexedConv[i++] = GenericDocument.fromDocumentClass(item);
+      }
+      builder.setPropertyDocument("giftContentsCollectionNotIndexed", giftContentsCollectionNotIndexedConv);
+    }
+    GiftContent[] giftContentsArrayNotIndexedCopy = document.giftContentsArrayNotIndexed;
+    if (giftContentsArrayNotIndexedCopy != null) {
+      GenericDocument[] giftContentsArrayNotIndexedConv = new GenericDocument[giftContentsArrayNotIndexedCopy.length];
+      for (int i = 0; i < giftContentsArrayNotIndexedConv.length; i++) {
+        giftContentsArrayNotIndexedConv[i] = GenericDocument.fromDocumentClass(giftContentsArrayNotIndexedCopy[i]);
+      }
+      builder.setPropertyDocument("giftContentsArrayNotIndexed", giftContentsArrayNotIndexedConv);
+    }
+    GiftContent giftContentNotIndexedCopy = document.giftContentNotIndexed;
+    if (giftContentNotIndexedCopy != null) {
+      GenericDocument giftContentNotIndexedConv = GenericDocument.fromDocumentClass(giftContentNotIndexedCopy);
+      builder.setPropertyDocument("giftContentNotIndexed", giftContentNotIndexedConv);
+    }
+    return builder.build();
+  }
+
+  @Override
+  public Gift fromGenericDocument(GenericDocument genericDoc) throws AppSearchException {
+    String idConv = genericDoc.getId();
+    String namespaceConv = genericDoc.getNamespace();
+    GenericDocument[] giftContentsCollectionCopy = genericDoc.getPropertyDocumentArray("giftContentsCollection");
+    List<GiftContent> giftContentsCollectionConv = null;
+    if (giftContentsCollectionCopy != null) {
+      giftContentsCollectionConv = new ArrayList<>(giftContentsCollectionCopy.length);
+      for (int i = 0; i < giftContentsCollectionCopy.length; i++) {
+        giftContentsCollectionConv.add(giftContentsCollectionCopy[i].toDocumentClass(GiftContent.class));
+      }
+    }
+    GenericDocument[] giftContentsArrayCopy = genericDoc.getPropertyDocumentArray("giftContentsArray");
+    GiftContent[] giftContentsArrayConv = null;
+    if (giftContentsArrayCopy != null) {
+      giftContentsArrayConv = new GiftContent[giftContentsArrayCopy.length];
+      for (int i = 0; i < giftContentsArrayCopy.length; i++) {
+        giftContentsArrayConv[i] = giftContentsArrayCopy[i].toDocumentClass(GiftContent.class);
+      }
+    }
+    GenericDocument giftContentCopy = genericDoc.getPropertyDocument("giftContent");
+    GiftContent giftContentConv = null;
+    if (giftContentCopy != null) {
+      giftContentConv = giftContentCopy.toDocumentClass(GiftContent.class);
+    }
+    GenericDocument[] giftContentsCollectionNotIndexedCopy = genericDoc.getPropertyDocumentArray("giftContentsCollectionNotIndexed");
+    List<GiftContent> giftContentsCollectionNotIndexedConv = null;
+    if (giftContentsCollectionNotIndexedCopy != null) {
+      giftContentsCollectionNotIndexedConv = new ArrayList<>(giftContentsCollectionNotIndexedCopy.length);
+      for (int i = 0; i < giftContentsCollectionNotIndexedCopy.length; i++) {
+        giftContentsCollectionNotIndexedConv.add(giftContentsCollectionNotIndexedCopy[i].toDocumentClass(GiftContent.class));
+      }
+    }
+    GenericDocument[] giftContentsArrayNotIndexedCopy = genericDoc.getPropertyDocumentArray("giftContentsArrayNotIndexed");
+    GiftContent[] giftContentsArrayNotIndexedConv = null;
+    if (giftContentsArrayNotIndexedCopy != null) {
+      giftContentsArrayNotIndexedConv = new GiftContent[giftContentsArrayNotIndexedCopy.length];
+      for (int i = 0; i < giftContentsArrayNotIndexedCopy.length; i++) {
+        giftContentsArrayNotIndexedConv[i] = giftContentsArrayNotIndexedCopy[i].toDocumentClass(GiftContent.class);
+      }
+    }
+    GenericDocument giftContentNotIndexedCopy = genericDoc.getPropertyDocument("giftContentNotIndexed");
+    GiftContent giftContentNotIndexedConv = null;
+    if (giftContentNotIndexedCopy != null) {
+      giftContentNotIndexedConv = giftContentNotIndexedCopy.toDocumentClass(GiftContent.class);
+    }
+    Gift document = new Gift();
+    document.id = idConv;
+    document.namespace = namespaceConv;
+    document.giftContentsCollection = giftContentsCollectionConv;
+    document.giftContentsArray = giftContentsArrayConv;
+    document.giftContent = giftContentConv;
+    document.giftContentsCollectionNotIndexed = giftContentsCollectionNotIndexedConv;
+    document.giftContentsArrayNotIndexed = giftContentsArrayNotIndexedConv;
+    document.giftContentNotIndexed = giftContentNotIndexedConv;
+    return document;
+  }
+}
diff --git a/appsearch/compiler/src/test/resources/androidx/appsearch/compiler/goldens/testToGenericDocument_allSupportedTypes.JAVA b/appsearch/compiler/src/test/resources/androidx/appsearch/compiler/goldens/testToGenericDocument_allSupportedTypes.JAVA
index a3dc0a5..0cad076 100644
--- a/appsearch/compiler/src/test/resources/androidx/appsearch/compiler/goldens/testToGenericDocument_allSupportedTypes.JAVA
+++ b/appsearch/compiler/src/test/resources/androidx/appsearch/compiler/goldens/testToGenericDocument_allSupportedTypes.JAVA
@@ -55,6 +55,7 @@
             .build())
           .addProperty(new AppSearchSchema.DocumentPropertyConfig.Builder("collectGift", $$__AppSearch__Gift.SCHEMA_NAME)
             .setCardinality(AppSearchSchema.PropertyConfig.CARDINALITY_REPEATED)
+            .setShouldIndexNestedProperties(false)
             .build())
           .addProperty(new AppSearchSchema.LongPropertyConfig.Builder("arrBoxLong")
             .setCardinality(AppSearchSchema.PropertyConfig.CARDINALITY_REPEATED)
@@ -99,6 +100,7 @@
             .build())
           .addProperty(new AppSearchSchema.DocumentPropertyConfig.Builder("arrGift", $$__AppSearch__Gift.SCHEMA_NAME)
             .setCardinality(AppSearchSchema.PropertyConfig.CARDINALITY_REPEATED)
+            .setShouldIndexNestedProperties(false)
             .build())
           .addProperty(new AppSearchSchema.StringPropertyConfig.Builder("string")
             .setCardinality(AppSearchSchema.PropertyConfig.CARDINALITY_OPTIONAL)
@@ -140,6 +142,7 @@
             .build())
           .addProperty(new AppSearchSchema.DocumentPropertyConfig.Builder("gift", $$__AppSearch__Gift.SCHEMA_NAME)
             .setCardinality(AppSearchSchema.PropertyConfig.CARDINALITY_OPTIONAL)
+            .setShouldIndexNestedProperties(false)
             .build())
           .build();
   }
diff --git a/benchmark/benchmark-common/api/public_plus_experimental_current.txt b/benchmark/benchmark-common/api/public_plus_experimental_current.txt
index 6420caa..281c6e7 100644
--- a/benchmark/benchmark-common/api/public_plus_experimental_current.txt
+++ b/benchmark/benchmark-common/api/public_plus_experimental_current.txt
@@ -17,6 +17,8 @@
   }
 
   public final class BenchmarkState {
+    ctor @androidx.benchmark.ExperimentalBenchmarkStateApi public BenchmarkState(optional Integer? warmupCount, optional Integer? repeatCount);
+    method @androidx.benchmark.ExperimentalBenchmarkStateApi public java.util.List<java.lang.Double> getMeasurementTimeNs();
     method public boolean keepRunning();
     method public void pauseTiming();
     method @androidx.benchmark.BenchmarkState.Companion.ExperimentalExternalReport public static void reportData(String className, String testName, @IntRange(from=0L) long totalRunTimeNs, java.util.List<java.lang.Long> dataNs, @IntRange(from=0L) int warmupIterations, @IntRange(from=0L) long thermalThrottleSleepSeconds, @IntRange(from=1L) int repeatIterations);
@@ -34,6 +36,9 @@
   public final class ConfigurationErrorKt {
   }
 
+  @kotlin.RequiresOptIn public @interface ExperimentalBenchmarkStateApi {
+  }
+
   public final class MetricNameUtilsKt {
   }
 
diff --git a/benchmark/benchmark-common/src/androidTest/java/androidx/benchmark/BenchmarkStateTest.kt b/benchmark/benchmark-common/src/androidTest/java/androidx/benchmark/BenchmarkStateTest.kt
index 15c6484..3164fcc 100644
--- a/benchmark/benchmark-common/src/androidTest/java/androidx/benchmark/BenchmarkStateTest.kt
+++ b/benchmark/benchmark-common/src/androidTest/java/androidx/benchmark/BenchmarkStateTest.kt
@@ -38,11 +38,11 @@
 
 @LargeTest
 @RunWith(AndroidJUnit4::class)
-public class BenchmarkStateTest {
+class BenchmarkStateTest {
     private fun us2ns(ms: Long): Long = TimeUnit.MICROSECONDS.toNanos(ms)
 
     @get:Rule
-    public val writePermissionRule: GrantPermissionRule =
+    val writePermissionRule: GrantPermissionRule =
         GrantPermissionRule.grant(Manifest.permission.WRITE_EXTERNAL_STORAGE)!!
 
     /**
@@ -61,7 +61,7 @@
 
     @Test
     @FlakyTest(bugId = 187711141)
-    public fun validateMetrics() {
+    fun validateMetrics() {
         val state = BenchmarkState()
         while (state.keepRunning()) {
             runAndSpin(durationUs = 300) {
@@ -91,7 +91,7 @@
     }
 
     @Test
-    public fun keepRunningMissingResume() {
+    fun keepRunningMissingResume() {
         val state = BenchmarkState()
 
         assertEquals(true, state.keepRunning())
@@ -100,7 +100,7 @@
     }
 
     @Test
-    public fun pauseCalledTwice() {
+    fun pauseCalledTwice() {
         val state = BenchmarkState()
 
         assertEquals(true, state.keepRunning())
@@ -110,7 +110,7 @@
 
     @SdkSuppress(minSdkVersion = 24)
     @Test
-    public fun priorityJitThread() {
+    fun priorityJitThread() {
         assertEquals(
             "JIT priority should not yet be modified",
             ThreadPriority.JIT_INITIAL_PRIORITY,
@@ -131,7 +131,7 @@
     }
 
     @Test
-    public fun priorityBenchThread() {
+    fun priorityBenchThread() {
         val initialPriority = ThreadPriority.get()
         assertNotEquals(
             "Priority should not be max",
@@ -161,7 +161,7 @@
         }
 
         val report = state.getReport()
-        val expectedRepeatCount = BenchmarkState.REPEAT_COUNT_TIME +
+        val expectedRepeatCount = state.repeatCountTime +
             if (!checkingForThermalThrottling) BenchmarkState.REPEAT_COUNT_ALLOCATION else 0
         val expectedCount = report.warmupIterations + report.repeatIterations * expectedRepeatCount
         assertEquals(expectedCount, total)
@@ -174,16 +174,16 @@
         assertTrue(report.warmupIterations > 0)
         assertTrue(report.repeatIterations > 1)
         // verify we're not running in a special mode that affects repeat count (dry run, profiling)
-        assertEquals(50, BenchmarkState.REPEAT_COUNT_TIME)
+        assertEquals(50, state.repeatCountTime)
     }
 
     @Test
-    public fun iterationCheck_simple() {
+    fun iterationCheck_simple() {
         iterationCheck(checkingForThermalThrottling = true)
     }
 
     @Test
-    public fun iterationCheck_withAllocations() {
+    fun iterationCheck_withAllocations() {
         // In any of these conditions, it's known that throttling won't happen, so it's safe
         // to check for allocation count, by setting checkingForThermalThrottling = false
         assumeTrue(
@@ -196,7 +196,7 @@
 
     @Test
     @Suppress("DEPRECATION")
-    public fun bundle() {
+    fun bundle() {
         val bundle = BenchmarkState().apply {
             while (keepRunning()) {
                 // nothing, we're ignoring numbers
@@ -230,7 +230,7 @@
     }
 
     @Test
-    public fun notStarted() {
+    fun notStarted() {
         val initialPriority = ThreadPriority.get()
         try {
             BenchmarkState().getReport().getMetricResult("timeNs").median
@@ -242,7 +242,7 @@
     }
 
     @Test
-    public fun notFinished() {
+    fun notFinished() {
         val initialPriority = ThreadPriority.get()
         try {
             BenchmarkState().run {
@@ -260,7 +260,7 @@
     @Suppress("DEPRECATION")
     @OptIn(ExperimentalExternalReport::class)
     @Test
-    public fun reportResult() {
+    fun reportResult() {
         BenchmarkState.reportData(
             className = "className",
             testName = "testName",
@@ -292,7 +292,7 @@
             profilerOverride = StackSamplingLegacy
 
             val benchmarkState = if (simplifiedTimingOnlyMode != null) {
-                BenchmarkState(simplifiedTimingOnlyMode)
+                BenchmarkState(simplifiedTimingOnlyMode = simplifiedTimingOnlyMode)
             } else {
                 BenchmarkState()
             }
@@ -330,7 +330,68 @@
         }
     }
 
-    @Test public fun profiler_default() = validateProfilerUsage(null)
-    @Test public fun profiler_false() = validateProfilerUsage(false)
-    @Test public fun profiler_true() = validateProfilerUsage(true)
+    @Test fun profiler_default() = validateProfilerUsage(null)
+    @Test fun profiler_false() = validateProfilerUsage(false)
+    @Test fun profiler_true() = validateProfilerUsage(true)
+
+    @OptIn(ExperimentalBenchmarkStateApi::class)
+    @Test
+    fun experimentalConstructor() {
+        // min values that don't fail
+        BenchmarkState(
+            warmupCount = null,
+            measurementCount = 1
+        )
+
+        // test failures
+        assertFailsWith<IllegalArgumentException> {
+            BenchmarkState(warmupCount = 0)
+        }
+        assertFailsWith<IllegalArgumentException> {
+            BenchmarkState(measurementCount = 0)
+        }
+    }
+
+    @OptIn(ExperimentalBenchmarkStateApi::class)
+    private fun validateIters(
+        warmupCount: Int?,
+        measurementCount: Int
+    ) {
+        val state = BenchmarkState(
+            warmupCount = warmupCount,
+            measurementCount = measurementCount
+        )
+        var count = 0
+        while (state.keepRunning()) {
+            count++
+        }
+        if (warmupCount != null) {
+            assertEquals(
+                warmupCount + // warmup
+                    measurementCount * state.iterationsPerRepeat + // timing
+                    BenchmarkState.REPEAT_COUNT_ALLOCATION * state.iterationsPerRepeat, // allocs
+                count
+            )
+        }
+        assertEquals(
+            measurementCount,
+            state.getMeasurementTimeNs().size
+        )
+    }
+
+    @Test
+    fun experimentalIters() {
+        validateIters(
+            warmupCount = 1,
+            measurementCount = 1
+        )
+        validateIters(
+            warmupCount = 3,
+            measurementCount = 5
+        )
+        validateIters(
+            warmupCount = 10000,
+            measurementCount = 1
+        )
+    }
 }
diff --git a/benchmark/benchmark-common/src/main/java/androidx/benchmark/Arguments.kt b/benchmark/benchmark-common/src/main/java/androidx/benchmark/Arguments.kt
index 126f4f7..ad8695f 100644
--- a/benchmark/benchmark-common/src/main/java/androidx/benchmark/Arguments.kt
+++ b/benchmark/benchmark-common/src/main/java/androidx/benchmark/Arguments.kt
@@ -45,6 +45,7 @@
     public val suppressedErrors: Set<String>
 
     val enabledRules: Set<RuleType>
+
     enum class RuleType {
         Microbenchmark,
         Macrobenchmark,
@@ -52,6 +53,9 @@
     }
 
     val enableCompilation: Boolean
+    val killProcessDelayMillis: Long
+    val enableStartupProfiles: Boolean
+    val strictStartupProfiles: Boolean
 
     // internal properties are microbenchmark only
     internal val outputEnable: Boolean
@@ -134,12 +138,12 @@
         _profiler = arguments.getProfiler(outputEnable)
         profilerSampleFrequency =
             arguments.getBenchmarkArgument("profiling.sampleFrequency")?.ifBlank { null }
-            ?.toInt()
-            ?: 1000
+                ?.toInt()
+                ?: 1000
         profilerSampleDurationSeconds =
             arguments.getBenchmarkArgument("profiling.sampleDurationSeconds")?.ifBlank { null }
-            ?.toLong()
-            ?: 5
+                ?.toLong()
+                ?: 5
         if (_profiler != null) {
             Log.d(
                 BenchmarkState.TAG,
@@ -148,5 +152,14 @@
             )
         }
         additionalTestOutputDir = arguments.getString("additionalTestOutputDir")
+
+        killProcessDelayMillis =
+            arguments.getBenchmarkArgument("killProcessDelayMillis")?.toLong() ?: 0L
+
+        enableStartupProfiles =
+            arguments.getBenchmarkArgument("startupProfiles.enable")?.toBoolean() ?: false
+
+        strictStartupProfiles =
+            arguments.getBenchmarkArgument("startupProfiles.strict")?.toBoolean() ?: false
     }
 }
diff --git a/benchmark/benchmark-common/src/main/java/androidx/benchmark/BenchmarkState.kt b/benchmark/benchmark-common/src/main/java/androidx/benchmark/BenchmarkState.kt
index 23fa9ba..b0dc302 100644
--- a/benchmark/benchmark-common/src/main/java/androidx/benchmark/BenchmarkState.kt
+++ b/benchmark/benchmark-common/src/main/java/androidx/benchmark/BenchmarkState.kt
@@ -51,22 +51,76 @@
  *
  * @see androidx.benchmark.junit4.BenchmarkRule#getState()
  */
-public class BenchmarkState {
-    internal constructor(simplifiedTimingOnlyMode: Boolean) {
-        this.simplifiedTimingOnlyMode = simplifiedTimingOnlyMode
-        profiler = if (simplifiedTimingOnlyMode) null else Arguments.profiler
+public class BenchmarkState internal constructor(
+    private val warmupCount: Int? = null,
+    private val measurementCount: Int? = null,
+    /**
+     * Set this to true to run a simplified timing loop - no allocation tracking, and no global
+     * state set/reset (such as thread priorities)
+     *
+     * This var is used in one of two cases, either set to true by [ThrottleDetector.measureWorkNs]
+     * when device performance testing for thermal throttling in between benchmarks, or in
+     * correctness tests of this library.
+     *
+     * When set to true, indicates that this BenchmarkState **should not**:
+     * - touch thread priorities
+     * - perform allocation counting (only timing results matter)
+     * - call [ThrottleDetector], since it would infinitely recurse
+     */
+    private val simplifiedTimingOnlyMode: Boolean = false
+) {
+    init {
+        require(warmupCount == null || warmupCount > 0) {
+            "warmupCount ($warmupCount) must null or positive"
+        }
+        require(measurementCount == null || measurementCount >= 1) {
+            "measurementCount ($measurementCount) must be null or positive"
+        }
+    }
+
+    @VisibleForTesting
+    internal val repeatCountTime = when {
+        measurementCount != null -> measurementCount
+        Arguments.dryRunMode -> 1
+        Arguments.profiler?.requiresSingleMeasurementIteration == true -> 1
+        Arguments.startupMode -> 10
+        else -> 50 // Value determined empirically.
+    }
+
+    private val repeatDurationTargetNs = when (Arguments.profiler?.requiresExtraRuntime) {
+        // longer measurements while profiling to ensure we have enough data
+        true -> TimeUnit.MILLISECONDS.toNanos(50)
+        else ->
+            TimeUnit.SECONDS.toNanos(Arguments.profilerSampleDurationSeconds) /
+                repeatCountTime
     }
 
     /** @suppress */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    constructor() {
+    constructor() : this(warmupCount = null, simplifiedTimingOnlyMode = false)
+
+    /**
+     * Create a BenchmarkState for custom measurement behavior.
+     *
+     * @param warmupCount Number of non-measured warmup iterations to perform, leave null
+     * to determine automatically
+     * @param repeatCount Number of measurements to perform, leave null for default behavior
+     */
+    @ExperimentalBenchmarkStateApi
+    constructor(
+        @SuppressWarnings("AutoBoxing") // allocations for tests not relevant, not in critical path
+        warmupCount: Int? = null,
+        @SuppressWarnings("AutoBoxing") // allocations for tests not relevant, not in critical path
+        repeatCount: Int? = null
+    ) : this(
+        warmupCount = warmupCount,
+        measurementCount = repeatCount,
         simplifiedTimingOnlyMode = false
-        profiler = Arguments.profiler
-    }
+    )
 
     private var stages = listOf(
         MetricsContainer(arrayOf(TimeCapture()), 1),
-        MetricsContainer(arrayOf(TimeCapture()), REPEAT_COUNT_TIME),
+        MetricsContainer(arrayOf(TimeCapture()), repeatCountTime),
         MetricsContainer(arrayOf(AllocationCountCapture()), REPEAT_COUNT_ALLOCATION)
     )
 
@@ -74,7 +128,7 @@
 
     /** @suppress */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public var traceUniqueName: String = "benchmark"
+    var traceUniqueName: String = "benchmark"
 
     private var warmupRepeats = 0 // number of warmup repeats that occurred
 
@@ -92,11 +146,12 @@
      * This value is overridden by the end of the warmup stage. The default value defines
      * behavior for modes that bypass warmup (dryRun and startup).
      */
-    private var iterationsPerRepeat = 1
+    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    internal var iterationsPerRepeat = 1
 
     private var state = NOT_STARTED // Current benchmark state.
 
-    private val warmupManager = WarmupManager()
+    private val warmupManager = WarmupManager(overrideCount = warmupCount)
 
     private var paused = false
     private var thermalThrottleSleepSeconds: Long =
@@ -106,20 +161,6 @@
 
     private var repeatCount = 0
 
-    /**
-     * Set this to true to run a simplified timing loop - no allocation tracking, and no global
-     * state set/reset (such as thread priorities)
-     *
-     * This var is used in one of two cases, either set to true by [ThrottleDetector.measureWorkNs]
-     * when device performance testing for thermal throttling in between benchmarks, or in
-     * correctness tests of this library.
-     *
-     * When set to true, indicates that this BenchmarkState **should not**:
-     * - touch thread priorities
-     * - perform allocation counting (only timing results matter)
-     * - call [ThrottleDetector], since it would infinitely recurse
-     */
-    private val simplifiedTimingOnlyMode: Boolean
     private var throttleRemainingRetries = THROTTLE_MAX_RETRIES
 
     private var metricResults = mutableListOf<MetricResult>()
@@ -127,7 +168,7 @@
     /**
      * Profiler reference which is null when [simplifiedTimingOnlyMode] = true
      */
-    private val profiler: Profiler?
+    private val profiler: Profiler? = if (simplifiedTimingOnlyMode) null else Arguments.profiler
     private var profilerResult: Profiler.ResultFile? = null
 
     /** @suppress */
@@ -305,7 +346,7 @@
                 endRunningStage()
                 beginRunningStage()
             }
-        } else if (state == RUNNING_TIME_STAGE && repeatCount >= REPEAT_COUNT_TIME ||
+        } else if (state == RUNNING_TIME_STAGE && repeatCount >= repeatCountTime ||
             state == RUNNING_ALLOCATION_STAGE && repeatCount >= REPEAT_COUNT_ALLOCATION
         ) {
             if (endRunningStage()) {
@@ -428,7 +469,9 @@
 
         totalRunTimeStartNs = System.nanoTime() // Record this time to find total duration
         state = RUNNING_WARMUP_STAGE // begin benchmarking
-        if (Arguments.dryRunMode || Arguments.startupMode) state = RUNNING_TIME_STAGE
+        if (Arguments.dryRunMode || Arguments.startupMode || warmupCount == 0) {
+            state = RUNNING_TIME_STAGE
+        }
     }
 
     private fun afterBenchmark() {
@@ -450,7 +493,7 @@
 
     private fun computeMaxIterations(): Int {
         return OVERRIDE_ITERATIONS
-            ?: (REPEAT_DURATION_TARGET_NS / warmupManager.estimatedIterationTimeNs).toInt()
+            ?: (repeatDurationTargetNs / warmupManager.estimatedIterationTimeNs).toInt()
                 .coerceIn(MIN_TEST_ITERATIONS, MAX_TEST_ITERATIONS)
     }
 
@@ -469,6 +512,10 @@
         warmupIterations = warmupRepeats
     )
 
+    @ExperimentalBenchmarkStateApi
+    fun getMeasurementTimeNs(): List<Double> =
+        metricResults.first { it.name == "timeNs" }.data
+
     internal fun getReport() = checkState().run { getReport("", "") }
 
     /**
@@ -560,15 +607,6 @@
         private const val RUNNING_ALLOCATION_STAGE = 2 // The alloc benchmarking stage is running.
         private const val FINISHED = 3 // The benchmark has stopped; all stages are finished.
 
-        // Values determined empirically.
-        @VisibleForTesting
-        internal val REPEAT_COUNT_TIME = when {
-            Arguments.dryRunMode -> 1
-            Arguments.profiler?.requiresSingleMeasurementIteration == true -> 1
-            Arguments.startupMode -> 10
-            else -> 50
-        }
-
         internal const val REPEAT_COUNT_ALLOCATION = 5
 
         private val OVERRIDE_ITERATIONS = when {
@@ -579,13 +617,6 @@
             else -> null
         }
 
-        internal val REPEAT_DURATION_TARGET_NS = when (Arguments.profiler?.requiresExtraRuntime) {
-            // longer measurements while profiling to ensure we have enough data
-            true -> TimeUnit.MILLISECONDS.toNanos(50)
-            else ->
-                TimeUnit.SECONDS.toNanos(Arguments.profilerSampleDurationSeconds) /
-                    REPEAT_COUNT_TIME
-        }
         internal const val MAX_TEST_ITERATIONS = 1_000_000
         internal const val MIN_TEST_ITERATIONS = 1
 
diff --git a/benchmark/benchmark-common/src/main/java/androidx/benchmark/ExperimentalBenchmarkStateApi.kt b/benchmark/benchmark-common/src/main/java/androidx/benchmark/ExperimentalBenchmarkStateApi.kt
new file mode 100644
index 0000000..283a472
--- /dev/null
+++ b/benchmark/benchmark-common/src/main/java/androidx/benchmark/ExperimentalBenchmarkStateApi.kt
@@ -0,0 +1,24 @@
+/*
+ * 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.benchmark
+
+/**
+ * Annotation indicating experimental API primarily intended to allow microbenchmarks independent
+ * of the BenchmarkRule JUnit4 API.
+ */
+@RequiresOptIn
+public annotation class ExperimentalBenchmarkStateApi
\ No newline at end of file
diff --git a/benchmark/benchmark-common/src/main/java/androidx/benchmark/WarmupManager.kt b/benchmark/benchmark-common/src/main/java/androidx/benchmark/WarmupManager.kt
index 3cabb52..798b268 100644
--- a/benchmark/benchmark-common/src/main/java/androidx/benchmark/WarmupManager.kt
+++ b/benchmark/benchmark-common/src/main/java/androidx/benchmark/WarmupManager.kt
@@ -27,7 +27,12 @@
  *
  * Tuned to do minimal amount of intrusive work in onNextIteration to avoid polluting the benchmark.
  */
-internal class WarmupManager {
+internal class WarmupManager(
+    /**
+     * If non-null, defines number of iterations to perform
+     */
+    val overrideCount: Int? = null
+) {
     private var fastMovingAvg: Float = 0f
     private var slowMovingAvg: Float = 0f
     private var similarIterationCount: Int = 0
@@ -57,7 +62,7 @@
         if (iteration == 1) {
             fastMovingAvg = durationNs.toFloat()
             slowMovingAvg = durationNs.toFloat()
-            return false
+            return iteration == overrideCount
         }
 
         fastMovingAvg = FAST_RATIO * durationNs + (1 - FAST_RATIO) * fastMovingAvg
@@ -71,6 +76,13 @@
             similarIterationCount = 0
         }
 
+        if (overrideCount != null) {
+            check(iteration <= overrideCount) {
+                "Too many warmups, iter $iteration, target $overrideCount"
+            }
+            return iteration == overrideCount
+        }
+
         if (iteration >= MIN_ITERATIONS && totalDurationNs >= MIN_DURATION_NS) {
             if (similarIterationCount > MIN_SIMILAR_ITERATIONS ||
                 totalDurationNs >= MAX_DURATION_NS
diff --git a/benchmark/benchmark-darwin-core/build.gradle b/benchmark/benchmark-darwin-core/build.gradle
new file mode 100644
index 0000000..b322e4b
--- /dev/null
+++ b/benchmark/benchmark-darwin-core/build.gradle
@@ -0,0 +1,36 @@
+import org.jetbrains.kotlin.gradle.plugin.mpp.BitcodeEmbeddingMode
+
+plugins {
+    id("AndroidXPlugin")
+}
+
+androidXMultiplatform {
+  sourceSets {
+  }
+
+  /// b/243154573
+  jvm()
+
+  ios {
+    compilations.main {
+      cinterops {
+        xcTestInterop {
+          defFile project.file("src/nativeInterop/cinterop/xcTestInterop.def")
+          // https://youtrack.jetbrains.com/issue/KT-48807#focus=Comments-27-5210791.0-0
+          compilerOpts("-DNS_FORMAT_ARGUMENT(A)=")
+        }
+      }
+    }
+    binaries.framework {
+      baseName = "AndroidXBenchmarkXCTest"
+      embedBitcode = BitcodeEmbeddingMode.DISABLE
+    }
+  }
+}
+
+androidx {
+    name = "Android Benchmark - Darwin Core"
+    mavenGroup = LibraryGroups.BENCHMARK
+    inceptionYear = "2022"
+    description = "Android Benchmark - Darwin Core"
+}
diff --git a/benchmark/benchmark-darwin-core/src/commonMain/Placeholder.kt b/benchmark/benchmark-darwin-core/src/commonMain/Placeholder.kt
new file mode 100644
index 0000000..5afbba8
--- /dev/null
+++ b/benchmark/benchmark-darwin-core/src/commonMain/Placeholder.kt
@@ -0,0 +1,3 @@
+@file:RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+
+// Defining a placeholder here to work around b/243154573
diff --git a/benchmark/benchmark-darwin-core/src/nativeInterop/cinterop/xcTestInterop.def b/benchmark/benchmark-darwin-core/src/nativeInterop/cinterop/xcTestInterop.def
new file mode 100644
index 0000000..d6c09a6
--- /dev/null
+++ b/benchmark/benchmark-darwin-core/src/nativeInterop/cinterop/xcTestInterop.def
@@ -0,0 +1,19 @@
+# A useful reference
+# https://github.com/JetBrains/kotlin/tree/master/kotlin-native/platformLibs/src/platform/ios
+
+language = Objective-C
+package = platform.XCTest
+depends = UIKit
+modules = XCTest
+# Specify the framework we want to link explicitly
+linkerOpts = -framework XCTest
+# Specify locations `-F` is a way to specify the search path.
+# For more information on linker arguments
+# https://www.manpagez.com/man/1/ld/
+linkerOpts.ios_x64 = -F/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks
+# The IDE might be showing red-squiggles here, but, this is a necessary parameter.
+# Otherwise you will run into linker errors that look something like:
+# ld: framework not found XCTest
+linkerOpts.ios_simulator_arm64 = -F/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks
+linkerOpts.ios_arm64 = -F/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks/
+compilerOpts= -framework XCTest -F/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks/
diff --git a/benchmark/benchmark-macro-junit4/api/public_plus_experimental_current.txt b/benchmark/benchmark-macro-junit4/api/public_plus_experimental_current.txt
index 0e381a6..d639d55 100644
--- a/benchmark/benchmark-macro-junit4/api/public_plus_experimental_current.txt
+++ b/benchmark/benchmark-macro-junit4/api/public_plus_experimental_current.txt
@@ -4,7 +4,8 @@
   @RequiresApi(28) @androidx.benchmark.macro.ExperimentalBaselineProfilesApi public final class BaselineProfileRule implements org.junit.rules.TestRule {
     ctor public BaselineProfileRule();
     method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
-    method public void collectBaselineProfile(String packageName, optional java.util.List<java.lang.String> packageFilters, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> profileBlock);
+    method public void collectBaselineProfile(String packageName, optional int iterations, optional java.util.List<java.lang.String> packageFilters, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> profileBlock);
+    method public void collectBaselineProfile(String packageName, optional int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> profileBlock);
     method public void collectBaselineProfile(String packageName, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> profileBlock);
   }
 
diff --git a/benchmark/benchmark-macro-junit4/src/main/java/androidx/benchmark/macro/junit4/BaselineProfileRule.kt b/benchmark/benchmark-macro-junit4/src/main/java/androidx/benchmark/macro/junit4/BaselineProfileRule.kt
index a65f294..1eb48e2 100644
--- a/benchmark/benchmark-macro-junit4/src/main/java/androidx/benchmark/macro/junit4/BaselineProfileRule.kt
+++ b/benchmark/benchmark-macro-junit4/src/main/java/androidx/benchmark/macro/junit4/BaselineProfileRule.kt
@@ -87,12 +87,14 @@
     @JvmOverloads
     public fun collectBaselineProfile(
         packageName: String,
+        iterations: Int = 3,
         packageFilters: List<String> = emptyList(),
         profileBlock: MacrobenchmarkScope.() -> Unit
     ) {
         collectBaselineProfile(
             uniqueName = currentDescription.toUniqueName(),
             packageName = packageName,
+            iterations = iterations,
             packageFilters = packageFilters,
             profileBlock = profileBlock
         )
diff --git a/benchmark/benchmark-macro/api/restricted_current.txt b/benchmark/benchmark-macro/api/restricted_current.txt
index c548035..be73ac8 100644
--- a/benchmark/benchmark-macro/api/restricted_current.txt
+++ b/benchmark/benchmark-macro/api/restricted_current.txt
@@ -13,7 +13,8 @@
   }
 
   public final class BaselineProfilesKt {
-    method @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void collectBaselineProfile(String uniqueName, String packageName, optional java.util.List<java.lang.String> packageFilters, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> profileBlock);
+    method @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void collectBaselineProfile(String uniqueName, String packageName, optional int iterations, optional java.util.List<java.lang.String> packageFilters, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> profileBlock);
+    method @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void collectBaselineProfile(String uniqueName, String packageName, optional int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> profileBlock);
     method @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void collectBaselineProfile(String uniqueName, String packageName, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> profileBlock);
   }
 
diff --git a/benchmark/benchmark-macro/build.gradle b/benchmark/benchmark-macro/build.gradle
index b367562..fc0fd01 100644
--- a/benchmark/benchmark-macro/build.gradle
+++ b/benchmark/benchmark-macro/build.gradle
@@ -39,7 +39,8 @@
         )
         androidTest.assets.srcDirs += new File(
                 SupportConfigKt.getPrebuiltsRoot(project),
-                "androidx/internal/androidx/tracing/tracing-perfetto-binary"
+                "androidx/internal/androidx/tracing/tracing-perfetto-binary/" +
+                        "${androidx.LibraryVersions.TRACING_PERFETTO}"
         )
     }
 
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 476ac59..7da4d03 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
@@ -41,14 +41,40 @@
 
     @Test
     fun hasMetrics_false() {
-        assumeTrue(Build.VERSION.SDK_INT < 29)
+        // The test is using a mocked output of `dumpsys powerstats`
+        val output = """
+                kernel_uid_readers_throttle_time=1000
+                external_stats_collection_rate_limit_ms=600000
+                battery_level_collection_delay_ms=300000
+                procstate_change_collection_delay_ms=60000
+                max_history_files=32
+                max_history_buffer_kb=128
+                battery_charged_delay_ms=900000
+
+            On battery measured charge stats (microcoulombs)
+                Not supported on this device.
+        """.trimIndent()
 
         assertFailsWith<UnsupportedOperationException> {
-            PowerRail.hasMetrics(throwOnMissingMetrics = true)
+            PowerRail.hasMetrics(output, throwOnMissingMetrics = true)
         }
 
-        assertFalse(
-            PowerRail.hasMetrics(throwOnMissingMetrics = false)
-        )
+        assertFalse(PowerRail.hasMetrics(output, throwOnMissingMetrics = false))
+    }
+
+    @Test
+    fun hasMetrics() {
+        // The test is using a mocked output of `dumpsys powerstats`
+        val output = """
+            ChannelId: 10, ChannelName: S9S_VDD_AOC, ChannelSubsystem: AOC
+            PowerStatsService dumpsys: available Channels
+            ChannelId: 0, ChannelName: S10M_VDD_TPU, ChannelSubsystem: TPU
+            ChannelId: 1, ChannelName: VSYS_PWR_MODEM, ChannelSubsystem: Modem
+            ChannelId: 2, ChannelName: VSYS_PWR_RFFE, ChannelSubsystem: Cellular
+            ChannelId: 3, ChannelName: S2M_VDD_CPUCL2, ChannelSubsystem: CPU(BIG)
+            ChannelId: 4, ChannelName: S3M_VDD_CPUCL1, ChannelSubsystem: CPU(MID)
+        """.trimIndent()
+
+        assertTrue(PowerRail.hasMetrics(output, throwOnMissingMetrics = false))
     }
 }
diff --git a/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/StartupProfilesTest.kt b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/StartupProfilesTest.kt
new file mode 100644
index 0000000..9d5eced
--- /dev/null
+++ b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/StartupProfilesTest.kt
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.benchmark.macro
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class StartupProfilesTest {
+    @Test
+    fun startupProfiles() {
+        // https://youtrack.jetbrains.com/issue/KT-2425
+        val dollar = "$"
+        val profile = """
+            Landroidx/Foo/Bar;
+            Lfoo/bar/Baz$dollar<Suffix>;
+            HSPLjava/io/DataOutputStream;->writeByte(I)V+]Ljava/io/OutputStream;missing_types
+        """.trimIndent()
+
+        val startupRules = startupProfile(profile, includeStartupOnly = false)
+        val expectedRules = """
+            SLandroidx/Foo/Bar;
+            SLfoo/bar/Baz;
+            SLjava/io/DataOutputStream;
+        """.trimIndent()
+        assertEquals(expectedRules, startupRules)
+    }
+
+    @Test
+    fun startupProfiles_includeStartupOnly() {
+        // https://youtrack.jetbrains.com/issue/KT-2425
+        val dollar = "$"
+        val profile = """
+            Landroidx/Foo/Bar;
+            Lfoo/bar/Baz$dollar<Suffix>;
+            HSPLjava/io/DataOutputStream;->writeByte(I)V+]Ljava/io/OutputStream;missing_types
+        """.trimIndent()
+
+        val startupRules = startupProfile(profile, includeStartupOnly = true)
+        val expectedRules = """
+            SLjava/io/DataOutputStream;
+        """.trimIndent()
+        assertEquals(expectedRules, startupRules)
+    }
+}
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 c3e83b6..cb13b1d 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-alpha01" // TODO(224510255): get by 'reflection'
+private const val tracingPerfettoVersion = "1.0.0-alpha02" // TODO(224510255): get by 'reflection'
 private const val minSupportedSdk = Build.VERSION_CODES.R // TODO(234351579): Support API < 30
 
 @RunWith(Parameterized::class)
@@ -178,7 +178,7 @@
                 // find tracing-perfetto-binary AAR in test assets
                 val libraryZipPath: String? = run {
                     val rx =
-                        Regex(".*/tracing-perfetto-binary-[^/]+\\.aar", RegexOption.IGNORE_CASE)
+                        Regex("tracing-perfetto-binary-[^/]+\\.aar", RegexOption.IGNORE_CASE)
                     val queue = ArrayDeque(context.assets.list("")?.asList() ?: emptyList())
                     while (queue.isNotEmpty()) {
                         val curr = queue.removeFirst()
diff --git a/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PowerQueryTest.kt b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PowerQueryTest.kt
index d3ffbb7..dfd591f 100644
--- a/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PowerQueryTest.kt
+++ b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PowerQueryTest.kt
@@ -49,17 +49,17 @@
                     powerUw = 80.940907,
                     components = listOf(
                         PowerQuery.ComponentMeasurement(
-                            name = "RailsCpuBig",
+                            name = "CpuBig",
                             energyUws = 31935.0,
                             powerUw = 6.621397
                         ),
                         PowerQuery.ComponentMeasurement(
-                            name = "RailsCpuLittle",
+                            name = "CpuLittle",
                             energyUws = 303264.0,
                             powerUw = 62.878706
                         ),
                         PowerQuery.ComponentMeasurement(
-                            name = "RailsCpuMid",
+                            name = "CpuMid",
                             energyUws = 55179.0,
                             powerUw = 11.440804
                         )
@@ -70,7 +70,7 @@
                     powerUw = 208.777524,
                     components = listOf(
                         PowerQuery.ComponentMeasurement(
-                            name = "RailsDisplay",
+                            name = "Display",
                             energyUws = 1006934.0,
                             powerUw = 208.777524
                         )
@@ -81,7 +81,7 @@
                     powerUw = 13.799502,
                     components = listOf(
                         PowerQuery.ComponentMeasurement(
-                            name = "RailsGpu",
+                            name = "Gpu",
                             energyUws = 66555.0,
                             powerUw = 13.799502
                         )
@@ -92,21 +92,21 @@
                     powerUw = 73.69686899999999,
                     components = listOf(
                         PowerQuery.ComponentMeasurement(
-                            name = "RailsDdrA",
+                            name = "DdrA",
                             energyUws = 48458.0,
                             powerUw = 10.047273
                         ),
                         PowerQuery.ComponentMeasurement(
-                            name = "RailsDdrB",
+                            name = "DdrB",
                             energyUws = 54988.0,
                             powerUw = 11.401203
                         ),
                         PowerQuery.ComponentMeasurement(
-                            name = "RailsDdrC",
+                            name = "DdrC",
                             energyUws = 100082.0,
                             powerUw = 20.750985),
                         PowerQuery.ComponentMeasurement(
-                            name = "RailsMemoryInterface",
+                            name = "MemoryInterface",
                             energyUws = 151912.0,
                             powerUw = 31.497408
                         ),
@@ -117,7 +117,7 @@
                     powerUw = 10.52768,
                     components = listOf(
                         PowerQuery.ComponentMeasurement(
-                            name = "RailsTpu",
+                            name = "Tpu",
                             energyUws = 50775.0,
                             powerUw = 10.52768
                         )
@@ -128,26 +128,26 @@
                     powerUw = 123.74248399999999,
                     components = listOf(
                         PowerQuery.ComponentMeasurement(
-                            name = "RailsAocLogic",
+                            name = "AocLogic",
                             energyUws = 74972.0,
                             powerUw = 15.544682),
                         PowerQuery.ComponentMeasurement(
-                            name = "RailsAocMemory",
+                            name = "AocMemory",
                             energyUws = 19601.0,
                             powerUw = 4.064068
                         ),
                         PowerQuery.ComponentMeasurement(
-                            name = "RailsModem",
+                            name = "Modem",
                             energyUws = 8369.0,
                             powerUw = 1.735227
                         ),
                         PowerQuery.ComponentMeasurement(
-                            name = "RailsRadioFrontend",
+                            name = "RadioFrontend",
                             energyUws = 0.0,
                             powerUw = 0.0
                         ),
                         PowerQuery.ComponentMeasurement(
-                            name = "RailsWifiBt",
+                            name = "WifiBt",
                             energyUws = 493868.0,
                             powerUw = 102.398507
                         )
@@ -158,7 +158,7 @@
                     powerUw = 25.454282,
                     components = listOf(
                         PowerQuery.ComponentMeasurement(
-                            name = "RailsSystemFabric",
+                            name = "SystemFabric",
                             energyUws = 122766.0,
                             powerUw = 25.454282
                         )
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 82d069e..7466d0f 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
@@ -21,6 +21,7 @@
 import androidx.annotation.RequiresApi
 import androidx.annotation.RestrictTo
 import androidx.annotation.VisibleForTesting
+import androidx.benchmark.Arguments
 import androidx.benchmark.InstrumentationResults
 import androidx.benchmark.Outputs
 import androidx.benchmark.Shell
@@ -37,8 +38,9 @@
 fun collectBaselineProfile(
     uniqueName: String,
     packageName: String,
+    iterations: Int = 3,
     packageFilters: List<String> = emptyList(),
-    profileBlock: MacrobenchmarkScope.() -> Unit
+    profileBlock: MacrobenchmarkScope.() -> Unit,
 ) {
     require(Build.VERSION.SDK_INT >= 28) {
         "Baseline Profile Collection requires API 28 or higher."
@@ -55,21 +57,24 @@
     // Disable because we're *creating* a baseline profile, not using it yet
     val compilationMode = CompilationMode.Partial(
         baselineProfileMode = BaselineProfileMode.Disable,
-        warmupIterations = 3
+        warmupIterations = iterations
     )
 
+    val killProcessBlock = {
+        // When generating baseline profiles we want to default to using
+        // killProcess if the session is rooted. This is so we can collect
+        // baseline profiles for System Apps.
+        scope.killProcess(useKillAll = Shell.isSessionRooted())
+        Thread.sleep(Arguments.killProcessDelayMillis)
+    }
+
     // always kill the process at beginning of a collection.
-    scope.killProcess(useKillAll = Shell.isSessionRooted())
+    killProcessBlock.invoke()
     try {
         userspaceTrace("compile $packageName") {
             compilationMode.resetAndCompile(
                 packageName = packageName,
-                killProcessBlock = {
-                    // When generating baseline profiles we want to default to using
-                    // killProcess if the session is rooted. This is so we can collect
-                    // baseline profiles for System Apps.
-                    scope.killProcess(useKillAll = Shell.isSessionRooted())
-                }
+                killProcessBlock = killProcessBlock
             ) {
                 profileBlock(scope)
             }
@@ -87,40 +92,59 @@
         Log.d(TAG, "Converting to human readable profile format")
         // Look at reference profile first, and then fallback to current profile
         val profile = profile(apkPath, listOf(referenceProfile, currentProfile))
-
-        // Filters the profile output with the given set or rules.
-        // Note that the filter rules are package name but the profile file lines contain
-        // jvm method signature, ex: `HSPLandroidx/room/RoomDatabase;-><init>()V`.
-        // In order to simplify this for developers we transform the filters from regular package names.
-        val filteredProfile = if (packageFilters.isEmpty()) profile else {
-            // Ensure that the package name ends with `/`
-            val fixedPackageFilters = packageFilters
-                .map { "${it.replace(".", "/")}${if (it.endsWith(".")) "" else "/"}" }
-            profile
-                .lines()
-                .filter { line -> fixedPackageFilters.any { line.contains(it) } }
-                .joinToString(System.lineSeparator())
+        // Build a startup profile
+        var startupProfile: String? = null
+        if (Arguments.enableStartupProfiles) {
+            startupProfile =
+                startupProfile(profile, includeStartupOnly = Arguments.strictStartupProfiles)
         }
 
+        // Filter profile if necessary based on filters
+        val filteredProfile = applyPackageFilters(profile, packageFilters)
+
+        // Write a file with a timestamp to be able to disambiguate between runs with the same
+        // unique name.
+
+        val fileName = "$uniqueName-baseline-prof.txt"
+        val absolutePath = Outputs.writeFile(fileName, "baseline-profile") {
+            it.writeText(filteredProfile)
+        }
+        var startupProfilePath: String? = null
+        if (startupProfile != null) {
+            val startupProfileFileName = "$uniqueName-startup-prof.txt"
+            startupProfilePath = Outputs.writeFile(startupProfileFileName, "startup-profile") {
+                it.writeText(startupProfile)
+            }
+        }
+        val tsFileName = "$uniqueName-baseline-prof-${Outputs.dateToFileName()}.txt"
+        val tsAbsolutePath = Outputs.writeFile(tsFileName, "baseline-profile-ts") {
+            Log.d(TAG, "Pull Baseline Profile with: `adb pull \"${it.absolutePath}\" .`")
+            it.writeText(filteredProfile)
+        }
+        var tsStartupAbsolutePath: String? = null
+        if (startupProfile != null) {
+            val tsStartupFileName = "$uniqueName-startup-prof-${Outputs.dateToFileName()}.txt"
+            tsStartupAbsolutePath = Outputs.writeFile(tsStartupFileName, "startup-profile-ts") {
+                Log.d(TAG, "Pull Startup Profile with: `adb pull \"${it.absolutePath}\" .`")
+                it.writeText(startupProfile)
+            }
+        }
+
+        val totalRunTime = System.nanoTime() - startTime
+        val results = Summary(
+            totalRunTime = totalRunTime,
+            profilePath = absolutePath,
+            profileTsPath = tsAbsolutePath,
+            startupProfilePath = startupProfilePath,
+            startupTsProfilePath = tsStartupAbsolutePath
+        )
         InstrumentationResults.instrumentationReport {
-            val fileName = "$uniqueName-baseline-prof.txt"
-            val absolutePath = Outputs.writeFile(fileName, "baseline-profile") {
-                it.writeText(filteredProfile)
-            }
-            // Write a file with a timestamp to be able to disambiguate between runs with the same
-            // unique name.
-            val tsFileName = "$uniqueName-baseline-prof-${Outputs.dateToFileName()}.txt"
-            val tsAbsolutePath = Outputs.writeFile(tsFileName, "baseline-profile-ts") {
-                Log.d(TAG, "Pull Baseline Profile with: `adb pull \"${it.absolutePath}\" .`")
-                it.writeText(filteredProfile)
-            }
-            val totalRunTime = System.nanoTime() - startTime
-            val summary = summaryRecord(totalRunTime, absolutePath, tsAbsolutePath)
+            val summary = summaryRecord(results)
             ideSummaryRecord(summaryV1 = summary, summaryV2 = summary)
             Log.d(TAG, "Total Run Time Ns: $totalRunTime")
         }
     } finally {
-        scope.killProcess(useKillAll = Shell.isSessionRooted())
+        killProcessBlock.invoke()
     }
 }
 
@@ -153,21 +177,89 @@
     return filteredRules.joinToString(separator = "\n")
 }
 
-private fun summaryRecord(
-    totalRunTime: Long,
-    absolutePath: String,
-    tsAbsolutePath: String
-): String {
+private fun applyPackageFilters(profile: String, packageFilters: List<String>): String {
+    // Filters the profile output with the given set or rules.
+    // Note that the filter rules are package name but the profile file lines contain
+    // jvm method signature, ex: `HSPLandroidx/room/RoomDatabase;-><init>()V`.
+    // In order to simplify this for developers we transform the filters from regular package names.
+    return if (packageFilters.isEmpty()) profile else {
+        // Ensure that the package name ends with `/`
+        val fixedPackageFilters = packageFilters
+            .map { "${it.replace(".", "/")}${if (it.endsWith(".")) "" else "/"}" }
+        profile
+            .lines()
+            .filter { line -> fixedPackageFilters.any { line.contains(it) } }
+            .joinToString(System.lineSeparator())
+    }
+}
+
+private fun summaryRecord(record: Summary): String {
+    val summary = StringBuilder()
+
+    // Links
+
     // Link to a path with timestamp to prevent studio from caching the file
-    val relativePath = Outputs.relativePathFor(tsAbsolutePath)
+    val relativePath = Outputs.relativePathFor(record.profileTsPath)
         .replace("(", "\\(")
         .replace(")", "\\)")
 
-    return """
-        Total run time Ns: $totalRunTime.
-        Baseline profile [results](file://$relativePath)
+    summary.append(
+        """
+            Total run time Ns: ${record.totalRunTime}.
+            Baseline profile [results](file://$relativePath)
+        """.trimIndent()
+    )
 
-        To copy the profile use:
-        adb pull "$absolutePath" .
-    """.trimIndent()
+    // Link to a path with timestamp to prevent studio from caching the file
+    val startupTsProfilePath = record.startupTsProfilePath
+    if (!startupTsProfilePath.isNullOrBlank()) {
+        val startupRelativePath = Outputs.relativePathFor(startupTsProfilePath)
+            .replace("(", "\\(")
+            .replace(")", "\\)")
+        summary.append("\n").append(
+            """
+                Startup profile [results](file://$startupRelativePath)
+            """.trimIndent()
+        )
+    }
+
+    // Add commands that can be used to pull these files.
+
+    summary.append("\n")
+        .append("\n")
+        .append(
+            """
+                To copy the profile use:
+                adb pull "${record.profilePath}" .
+            """.trimIndent()
+        )
+
+    val startupProfilePath = record.startupProfilePath
+    if (!startupProfilePath.isNullOrBlank()) {
+        summary.append("\n")
+            .append("\n")
+            .append(
+                """
+                    To copy the startup profile use:
+                    adb pull "${record.startupProfilePath}" .
+                """.trimIndent()
+            )
+    }
+    return summary.toString()
+}
+
+private data class Summary(
+    val totalRunTime: Long,
+    val profilePath: String,
+    val profileTsPath: String,
+    val startupProfilePath: String? = null,
+    val startupTsProfilePath: String? = null
+) {
+    init {
+        if (startupProfilePath.isNullOrBlank()) {
+            require(startupTsProfilePath.isNullOrBlank())
+        } else {
+            require(!startupTsProfilePath.isNullOrBlank())
+        }
+    }
 }
diff --git a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/MacrobenchmarkScope.kt b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/MacrobenchmarkScope.kt
index f0d8b34..a322e19 100644
--- a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/MacrobenchmarkScope.kt
+++ b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/MacrobenchmarkScope.kt
@@ -82,6 +82,7 @@
         block: (Intent) -> Unit = {}
     ) {
         val intent = context.packageManager.getLaunchIntentForPackage(packageName)
+            ?: context.packageManager.getLeanbackLaunchIntentForPackage(packageName)
             ?: throw IllegalStateException("Unable to acquire intent for package $packageName")
 
         block(intent)
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 4a18f72..864fa2a 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
@@ -22,13 +22,20 @@
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 object PowerRail {
 
-    private const val commandHal2 = "dumpsys android.hardware.power.stats.IPowerStats/default delta"
-    private const val commandHal1 =
-        "lshal debug android.hardware.power.stats@1.0::IPowerStats/default delta"
+    private const val DUMPSYS_POWERSTATS = "dumpsys powerstats"
 
-    private const val hal2Header = "============= PowerStats HAL 2.0 energy meter =============="
-    private const val hal1Header =
-        "============= PowerStats HAL 1.0 rail energy data =============="
+    /**
+     * Looking for something like this:
+     *
+     * ChannelId: 10, ChannelName: S9S_VDD_AOC, ChannelSubsystem: AOC
+     * PowerStatsService dumpsys: available Channels
+     * ChannelId: 0, ChannelName: S10M_VDD_TPU, ChannelSubsystem: TPU
+     * ChannelId: 1, ChannelName: VSYS_PWR_MODEM, ChannelSubsystem: Modem
+     * ChannelId: 2, ChannelName: VSYS_PWR_RFFE, ChannelSubsystem: Cellular
+     * ChannelId: 3, ChannelName: S2M_VDD_CPUCL2, ChannelSubsystem: CPU(BIG)
+     * ChannelId: 4, ChannelName: S3M_VDD_CPUCL1, ChannelSubsystem: CPU(MID)
+     */
+    private val CHANNEL_ID_REGEX = "ChannelId:(.*)".toRegex()
 
     /**
      * Checks if rail metrics are generated on specified device.
@@ -36,21 +43,25 @@
      * @Throws UnsupportedOperationException if `hasException == true` and no rail metrics are found.
      */
     fun hasMetrics(throwOnMissingMetrics: Boolean = false): Boolean {
-        val resultHal2 = Shell.executeCommand(commandHal2)
-        val resultHal1 = Shell.executeCommand(commandHal1)
+        val output = Shell.executeCommand(DUMPSYS_POWERSTATS)
+        return hasMetrics(output, throwOnMissingMetrics)
+    }
 
-        if ((resultHal2.contains(hal2Header)) || (resultHal1.contains(hal1Header))) {
+    internal fun hasMetrics(output: String, throwOnMissingMetrics: Boolean = false): Boolean {
+        val line = output.splitToSequence("\r?\n".toRegex()).find {
+            it.contains(CHANNEL_ID_REGEX)
+        }
+        if (!line.isNullOrBlank()) {
             return true
         }
         if (throwOnMissingMetrics) {
             throw UnsupportedOperationException(
                 """
                 Rail metrics are not available on this device.
-                To check a device for power/energy measurement support, it must output rail metrics
-                for one of the following commands:
+                To check a device for power/energy measurement support, the following command's
+                output must contain rows underneath the "available Channels" section:
 
-                adb shell $commandHal2
-                adb shell $commandHal1
+                adb shell $DUMPSYS_POWERSTATS
 
                 To check at runtime for this, use PowerRail.hasMetrics()
 
@@ -59,4 +70,4 @@
         }
         return false
     }
-}
\ No newline at end of file
+}
diff --git a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/StartupProfiles.kt b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/StartupProfiles.kt
new file mode 100644
index 0000000..527791a
--- /dev/null
+++ b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/StartupProfiles.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.
+ */
+
+@file:RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+
+package androidx.benchmark.macro
+
+import androidx.annotation.RestrictTo
+
+private val PROFILE_RULE_REGEX = "(H?S?P?)L([^$;]*)(.*)".toRegex()
+
+/**
+ * Builds a startup profile for a given baseline profile.
+ *
+ * This startup profile can be used for dex layout optimizations.
+ */
+fun startupProfile(profile: String, includeStartupOnly: Boolean = false): String {
+    val rules = profile.lines().mapNotNull { rule ->
+        when (val result = PROFILE_RULE_REGEX.find(rule)) {
+            null -> null
+            else -> {
+                val (flags, classPrefix, _) = result.destructured
+                if (includeStartupOnly && !flags.contains("S")) {
+                    null
+                } else {
+                    "SL$classPrefix;"
+                }
+            }
+        }
+    }
+    val ruleSet = mutableSetOf<String>()
+    val startupRules = mutableListOf<String>()
+    // Try and keep the same order
+    rules.forEach { rule ->
+        if (!ruleSet.contains(rule)) {
+            ruleSet += rule
+            startupRules += rule
+        }
+    }
+    return startupRules.joinToString(separator = "\n")
+}
diff --git a/benchmark/benchmark/build.gradle b/benchmark/benchmark/build.gradle
index ab4c3cf..79ff352 100644
--- a/benchmark/benchmark/build.gradle
+++ b/benchmark/benchmark/build.gradle
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -35,3 +37,10 @@
 android {
     namespace "androidx.benchmark.benchmark"
 }
+
+// Allow usage of Kotlin's @OptIn.
+tasks.withType(KotlinCompile).configureEach {
+    kotlinOptions {
+        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
+    }
+}
\ No newline at end of file
diff --git a/benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/BenchmarkStateBenchmark.kt b/benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/BenchmarkStateBenchmark.kt
new file mode 100644
index 0000000..6e7d87b
--- /dev/null
+++ b/benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/BenchmarkStateBenchmark.kt
@@ -0,0 +1,41 @@
+/*
+ * 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.benchmark.benchmark
+
+import androidx.benchmark.BenchmarkState
+import androidx.benchmark.ExperimentalBenchmarkStateApi
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+class BenchmarkStateBenchmark {
+    @OptIn(ExperimentalBenchmarkStateApi::class)
+    @Test
+    fun nothing() {
+        val state = BenchmarkState(
+            warmupCount = 10,
+            repeatCount = 10
+        )
+        while (state.keepRunning()) {
+           // do nothing
+        }
+        state.getMeasurementTimeNs()
+    }
+}
diff --git a/benchmark/gradle-plugin/build.gradle b/benchmark/gradle-plugin/build.gradle
index f668861..2ef57d1 100644
--- a/benchmark/gradle-plugin/build.gradle
+++ b/benchmark/gradle-plugin/build.gradle
@@ -39,7 +39,7 @@
 
 SdkResourceGenerator.generateForHostTest(project)
 
-def buildOnServer = tasks.register("buildOnServer", SingleFileCopy.class) {
+def copyLockClocks = tasks.register("copyLockClocks", SingleFileCopy.class) {
     def source = project.file("src/main/resources/scripts/lockClocks.sh")
     if (!source.exists()) {
         throw new GradleException(source.toString() + " does not exist")
@@ -47,6 +47,7 @@
     it.sourceFile = source
     it.destinationFile = new File(BuildServerConfigurationKt.getDistributionDirectory(rootProject), "lockClocks.sh")
 }
+BuildOnServerKt.addToBuildOnServer(project, copyLockClocks)
 
 gradlePlugin {
     plugins {
diff --git a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialListScrollBaselineProfile.kt b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialListScrollBaselineProfile.kt
index 6ca84d83..21b846c 100644
--- a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialListScrollBaselineProfile.kt
+++ b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialListScrollBaselineProfile.kt
@@ -49,6 +49,7 @@
     fun baselineProfiles() {
         baselineRule.collectBaselineProfile(
             packageName = "androidx.benchmark.integration.macrobenchmark.target",
+            iterations = 5,
             profileBlock = {
                 val intent = Intent()
                 intent.action = ACTION
@@ -78,6 +79,7 @@
         private const val ACTION =
             "androidx.benchmark.integration.macrobenchmark.target.RECYCLER_VIEW"
         private const val RESOURCE_ID = "recycler"
+
         // The timeout
         private const val TIMEOUT = 2000L
     }
diff --git a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialStartupBaselineProfile.kt b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialStartupBaselineProfile.kt
new file mode 100644
index 0000000..a9ff6aa
--- /dev/null
+++ b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialStartupBaselineProfile.kt
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.benchmark.integration.macrobenchmark
+
+import android.content.Intent
+import androidx.benchmark.macro.ExperimentalBaselineProfilesApi
+import androidx.benchmark.macro.junit4.BaselineProfileRule
+import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.uiautomator.UiDevice
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+
+@LargeTest
+@SdkSuppress(minSdkVersion = 29)
+@OptIn(ExperimentalBaselineProfilesApi::class)
+class TrivialStartupBaselineProfile {
+    @get:Rule
+    val baselineRule = BaselineProfileRule()
+
+    private lateinit var device: UiDevice
+
+    @Before
+    fun setUp() {
+        val instrumentation = InstrumentationRegistry.getInstrumentation()
+        device = UiDevice.getInstance(instrumentation)
+    }
+
+    @Test
+    fun baselineProfiles() {
+        baselineRule.collectBaselineProfile(
+            packageName = PACKAGE_NAME,
+            iterations = 5
+        ) {
+            device.pressHome()
+            val intent = Intent()
+            intent.action = ACTION
+            startActivityAndWait(intent)
+            device.waitForIdle()
+        }
+    }
+
+    companion object {
+        private const val PACKAGE_NAME = "androidx.benchmark.integration.macrobenchmark.target"
+        private const val ACTION =
+            "androidx.benchmark.integration.macrobenchmark.target.TRIVIAL_STARTUP_ACTIVITY"
+    }
+}
diff --git a/bluetooth/bluetooth-core/build.gradle b/bluetooth/bluetooth-core/build.gradle
index 863beca..9fb1714 100644
--- a/bluetooth/bluetooth-core/build.gradle
+++ b/bluetooth/bluetooth-core/build.gradle
@@ -24,8 +24,11 @@
 
 dependencies {
     implementation(libs.kotlinStdlib)
-
     implementation "androidx.annotation:annotation:1.4.0"
+
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testExtTruth)
+    androidTestImplementation(libs.testRunner)
 }
 
 androidx {
diff --git a/bluetooth/bluetooth-core/src/androidTest/java/androidx/bluetooth/core/ScanFilterTest.kt b/bluetooth/bluetooth-core/src/androidTest/java/androidx/bluetooth/core/ScanFilterTest.kt
new file mode 100644
index 0000000..1c4ab30
--- /dev/null
+++ b/bluetooth/bluetooth-core/src/androidTest/java/androidx/bluetooth/core/ScanFilterTest.kt
@@ -0,0 +1,86 @@
+package androidx.bluetooth.core
+
+import android.bluetooth.le.ScanFilter as FwkScanFilter
+import android.os.ParcelUuid
+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 ScanFilterTest {
+
+    companion object {
+        val TEST_DEVICE_NAME = "test_device_name"
+        val TEST_DEVICE_ADDRESS = "11:22:33:44:55:66"
+        val TEST_SERVICE_UUID = ParcelUuid.fromString("FFFFFFF0-FFFF-FFFF-FFFF-FFFFFFFFFFFF")
+        val TEST_SERVICE_DATA_UUID = ParcelUuid.fromString("DDDDDDD0-DDDD-DDDD-DDDD-DDDDDDDDDDDD")
+        val TEST_SERVICE_DATA = "SERVICE-DATA".toByteArray()
+        val TEST_MANUFACTURER_ID = 1000
+        val TEST_MANUFACTURER_DATA = "MANUFACTURER-DATA".toByteArray()
+    }
+
+    @Test
+    fun constructorWithValues_createsFrameworkInstanceCorrectly() {
+        val scanFilter = ScanFilter(
+            deviceName = TEST_DEVICE_NAME,
+            deviceAddress = TEST_DEVICE_ADDRESS,
+            serviceUuid = TEST_SERVICE_UUID,
+            serviceDataUuid = TEST_SERVICE_DATA_UUID,
+            serviceData = TEST_SERVICE_DATA,
+            manufacturerId = TEST_MANUFACTURER_ID,
+            manufacturerData = TEST_MANUFACTURER_DATA,
+        )
+        val fwkScanFilter = scanFilter.fwkInstance
+        assertThat(fwkScanFilter.deviceName).isEqualTo(TEST_DEVICE_NAME)
+        assertThat(fwkScanFilter.deviceAddress).isEqualTo(TEST_DEVICE_ADDRESS)
+        assertThat(fwkScanFilter.serviceUuid).isEqualTo(TEST_SERVICE_UUID)
+        assertThat(fwkScanFilter.serviceDataUuid).isEqualTo(TEST_SERVICE_DATA_UUID)
+        assertThat(fwkScanFilter.serviceData).isEqualTo(TEST_SERVICE_DATA)
+        assertThat(fwkScanFilter.manufacturerId).isEqualTo(TEST_MANUFACTURER_ID)
+        assertThat(fwkScanFilter.manufacturerData).isEqualTo(TEST_MANUFACTURER_DATA)
+    }
+
+    @Test
+    fun constructorWithFwkInstance_createsScanFilterCorrectly() {
+        val fwkScanFilter = FwkScanFilter.Builder()
+            .setDeviceName(TEST_DEVICE_NAME)
+            .setDeviceAddress(TEST_DEVICE_ADDRESS)
+            .setServiceUuid(TEST_SERVICE_UUID)
+            .setServiceData(TEST_SERVICE_DATA_UUID, TEST_SERVICE_DATA)
+            .setManufacturerData(TEST_MANUFACTURER_ID, TEST_MANUFACTURER_DATA)
+            .build()
+        val scanFilter = ScanFilter(fwkScanFilter)
+
+        assertThat(scanFilter.deviceName).isEqualTo(TEST_DEVICE_NAME)
+        assertThat(scanFilter.deviceAddress).isEqualTo(TEST_DEVICE_ADDRESS)
+        assertThat(scanFilter.serviceUuid).isEqualTo(TEST_SERVICE_UUID)
+        assertThat(scanFilter.serviceDataUuid).isEqualTo(TEST_SERVICE_DATA_UUID)
+        assertThat(scanFilter.serviceData).isEqualTo(TEST_SERVICE_DATA)
+        assertThat(scanFilter.manufacturerId).isEqualTo(TEST_MANUFACTURER_ID)
+        assertThat(scanFilter.manufacturerData).isEqualTo(TEST_MANUFACTURER_DATA)
+    }
+
+    @Test
+    fun scanFilterBundleable() {
+        val scanFilter = ScanFilter(
+            deviceName = TEST_DEVICE_NAME,
+            deviceAddress = TEST_DEVICE_ADDRESS,
+            serviceUuid = TEST_SERVICE_UUID,
+            serviceDataUuid = TEST_SERVICE_DATA_UUID,
+            serviceData = TEST_SERVICE_DATA,
+            manufacturerId = TEST_MANUFACTURER_ID,
+            manufacturerData = TEST_MANUFACTURER_DATA,
+        )
+        val bundle = scanFilter.toBundle()
+
+        val scanFilterFromBundle = ScanFilter.CREATOR.fromBundle(bundle)
+        assertThat(scanFilterFromBundle.deviceName).isEqualTo(TEST_DEVICE_NAME)
+        assertThat(scanFilterFromBundle.deviceAddress).isEqualTo(TEST_DEVICE_ADDRESS)
+        assertThat(scanFilterFromBundle.serviceUuid).isEqualTo(TEST_SERVICE_UUID)
+        assertThat(scanFilterFromBundle.serviceDataUuid).isEqualTo(TEST_SERVICE_DATA_UUID)
+        assertThat(scanFilterFromBundle.serviceData).isEqualTo(TEST_SERVICE_DATA)
+        assertThat(scanFilterFromBundle.manufacturerId).isEqualTo(TEST_MANUFACTURER_ID)
+        assertThat(scanFilterFromBundle.manufacturerData).isEqualTo(TEST_MANUFACTURER_DATA)
+    }
+}
diff --git a/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/AdvertiseSettings.kt b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/AdvertiseSettings.kt
new file mode 100644
index 0000000..39855e5
--- /dev/null
+++ b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/AdvertiseSettings.kt
@@ -0,0 +1,76 @@
+/*
+ * 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.bluetooth.core
+import android.bluetooth.le.AdvertiseSettings as FwkAdvertiseSettings
+
+// TODO: Add constructor that removes Builder pattern
+// TODO: Implement Bundleable instead of Parcelable
+// TODO: Add all functions
+/**
+ * The {@link AdvertiseSettings} provide a way to adjust advertising preferences for each
+ * Bluetooth LE advertisement instance.
+ * @hide
+ */
+class AdvertiseSettings internal constructor() {
+
+    companion object {
+        /**
+        * Perform Bluetooth LE advertising in low power mode. This is the default and preferred
+        * advertising mode as it consumes the least power.
+        */
+        const val ADVERTISE_MODE_LOW_POWER = FwkAdvertiseSettings.ADVERTISE_MODE_LOW_POWER
+
+        /**
+         * Perform Bluetooth LE advertising in balanced power mode. This is balanced between
+         * advertising frequency and power consumption.
+         */
+        const val ADVERTISE_MODE_BALANCED = FwkAdvertiseSettings.ADVERTISE_MODE_BALANCED
+
+        /**
+         * Perform Bluetooth LE advertising in low latency, high power mode. This has the highest
+         * power consumption and should not be used for continuous background advertising.
+         */
+        const val ADVERTISE_MODE_LOW_LATENCY = FwkAdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY
+
+        /**
+         * Advertise using the lowest transmission (TX) power level. Low transmission power can be
+         * used to restrict the visibility range of advertising packets.
+         */
+        const val ADVERTISE_TX_POWER_ULTRA_LOW = FwkAdvertiseSettings.ADVERTISE_TX_POWER_ULTRA_LOW
+
+        /**
+         * Advertise using low TX power level.
+         */
+        const val ADVERTISE_TX_POWER_LOW = FwkAdvertiseSettings.ADVERTISE_TX_POWER_LOW
+
+        /**
+         * Advertise using medium TX power level.
+         */
+        const val ADVERTISE_TX_POWER_MEDIUM = FwkAdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM
+
+        /**
+         * Advertise using high TX power level. This corresponds to largest visibility range of the
+         * advertising packet.
+         */
+        const val ADVERTISE_TX_POWER_HIGH = FwkAdvertiseSettings.ADVERTISE_TX_POWER_HIGH
+
+        /**
+         * The maximum limited advertisement duration as specified by the Bluetooth SIG
+         */
+        const val LIMITED_ADVERTISING_MAX_MILLIS = 180_000
+    }
+}
\ No newline at end of file
diff --git a/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/ScanFilter.kt b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/ScanFilter.kt
new file mode 100644
index 0000000..98fbd7f
--- /dev/null
+++ b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/ScanFilter.kt
@@ -0,0 +1,143 @@
+/*
+ * 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.bluetooth.core
+
+import android.bluetooth.le.ScanFilter as FwkScanFilter
+import android.os.Bundle
+import android.os.ParcelUuid
+import androidx.bluetooth.core.utils.Bundleable
+import androidx.bluetooth.core.utils.Utils
+
+/**
+ * TODO: Copy docs
+ * TODO: Implement ScanFilterImplXxx
+ * TODO: Implement APIs added in API 29
+ *       getters: getServiceSolicitationUuid, getServiceSolicitationUuidMask
+ *       setters: setServiceSolicitationUuid
+ * TODO: Implement APIs added in API 33
+ *       getters: getAdvertisingData, getAdvertisingDataMask, getAdvertisingDataType
+ *       setters: setAdvertisingDataTypeWithData, setAdvertisingDataType,
+ * @hide
+ */
+class ScanFilter internal constructor(internal val fwkInstance: FwkScanFilter) : Bundleable {
+
+    companion object {
+        internal const val FIELD_FWK_SCAN_FILTER = 0
+
+        val CREATOR: Bundleable.Creator<ScanFilter> =
+            object : Bundleable.Creator<ScanFilter> {
+                override fun fromBundle(bundle: Bundle): ScanFilter {
+                    val fwkScanFilter =
+                        Utils.getParcelableFromBundle(
+                            bundle,
+                            keyForField(FIELD_FWK_SCAN_FILTER),
+                            android.bluetooth.le.ScanFilter::class.java
+                        ) ?: throw IllegalArgumentException(
+                            "Bundle doesn't include a framework scan filter"
+                        )
+                    return ScanFilter(fwkScanFilter)
+                }
+            }
+
+        internal fun keyForField(field: Int): String {
+            return field.toString(Character.MAX_RADIX)
+        }
+
+        internal fun buildFwkScanFilter(
+            deviceName: String? = null,
+            deviceAddress: String? = null,
+            serviceUuid: ParcelUuid? = null,
+            serviceDataUuid: ParcelUuid? = null,
+            serviceData: ByteArray? = null,
+            serviceDataMask: ByteArray? = null,
+            manufacturerId: Int = -1,
+            manufacturerData: ByteArray? = null,
+            manufacturerDataMask: ByteArray? = null
+        ): FwkScanFilter {
+            var builder = FwkScanFilter.Builder()
+                .setDeviceName(deviceName)
+                .setDeviceAddress(deviceAddress)
+                .setServiceUuid(serviceUuid)
+
+            if (serviceDataUuid != null) {
+                if (serviceDataMask == null) {
+                    builder.setServiceData(serviceDataUuid, serviceData)
+                } else {
+                    builder.setServiceData(serviceDataUuid, serviceData, serviceDataMask)
+                }
+            }
+            if (manufacturerId >= 0) {
+                if (manufacturerDataMask == null) {
+                    builder.setManufacturerData(manufacturerId, manufacturerData)
+                } else {
+                    builder.setManufacturerData(
+                        manufacturerId, manufacturerData, manufacturerDataMask)
+                }
+            }
+
+            return builder.build()
+        }
+    }
+
+    val deviceName: String?
+        get() = fwkInstance.deviceName
+    val deviceAddress: String?
+        get() = fwkInstance.deviceAddress
+    val serviceUuid: ParcelUuid?
+        get() = fwkInstance.serviceUuid
+    val serviceUuidMask: ParcelUuid?
+        get() = fwkInstance.serviceUuidMask
+    val serviceDataUuid: ParcelUuid?
+        get() = fwkInstance.serviceDataUuid
+    val serviceData: ByteArray?
+        get() = fwkInstance.serviceData
+    val serviceDataMask: ByteArray?
+        get() = fwkInstance.serviceDataMask
+    val manufacturerId: Int
+        get() = fwkInstance.manufacturerId
+    val manufacturerData: ByteArray?
+        get() = fwkInstance.manufacturerData
+    val manufacturerDataMask: ByteArray?
+        get() = fwkInstance.manufacturerDataMask
+
+    constructor(
+        deviceName: String? = null,
+        deviceAddress: String? = null,
+        serviceUuid: ParcelUuid? = null,
+        serviceDataUuid: ParcelUuid? = null,
+        serviceData: ByteArray? = null,
+        serviceDataMask: ByteArray? = null,
+        manufacturerId: Int = -1,
+        manufacturerData: ByteArray? = null,
+        manufacturerDataMask: ByteArray? = null
+    ) : this(buildFwkScanFilter(
+        deviceName,
+        deviceAddress,
+        serviceUuid,
+        serviceDataUuid,
+        serviceData,
+        serviceDataMask,
+        manufacturerId,
+        manufacturerData,
+        manufacturerDataMask
+    ))
+    override fun toBundle(): Bundle {
+        val bundle = Bundle()
+        bundle.putParcelable(keyForField(FIELD_FWK_SCAN_FILTER), fwkInstance)
+        return bundle
+    }
+}
diff --git a/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/utils/Utils.kt b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/utils/Utils.kt
index 9c1b2f9..1887469 100644
--- a/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/utils/Utils.kt
+++ b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/utils/Utils.kt
@@ -16,6 +16,7 @@
 
 package androidx.bluetooth.core.utils
 
+import android.annotation.SuppressLint
 import android.os.Build
 import android.os.Bundle
 import android.os.Parcelable
@@ -29,26 +30,25 @@
     companion object {
 
         // TODO: Migrate to BundleCompat when available
-        @Suppress("DEPRECATION")
+        @SuppressLint("ClassVerificationFailure") // bundle.getParcelable(key, clazz)
+        @Suppress("DEPRECATION") // bundle.getParcelable(key)
         fun <T : Parcelable> getParcelableFromBundle(
             bundle: Bundle,
             key: String,
             clazz: Class<T>
         ): T? {
+            val parcelable: T?
             bundle.classLoader = clazz.classLoader
-            if (Build.VERSION.SDK_INT >= 33) {
-                // TODO: Return framework's getParcelable when SDK 33 is available
-                // return bundle.getParcelable(key, clazz)
-                TODO()
-            } else {
-                val parcelable: T?
-                try {
+            try {
+                if (Build.VERSION.SDK_INT >= 33) {
+                    parcelable = bundle.getParcelable(key, clazz)
+                } else {
                     parcelable = bundle.getParcelable(key)
-                } catch (e: Exception) {
-                    return null
                 }
-                return parcelable
+            } catch (e: Exception) {
+                return null
             }
+            return parcelable
         }
 
         @Suppress("DEPRECATION")
diff --git a/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXPluginTest.kt b/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXPluginTest.kt
index b7195a6..dbb04ec 100644
--- a/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXPluginTest.kt
+++ b/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXPluginTest.kt
@@ -21,10 +21,8 @@
 import androidx.build.AndroidXSelfTestProject.Companion.cubaneProject
 import net.saff.checkmark.Checkmark
 import net.saff.checkmark.Checkmark.Companion.check
-import org.junit.Ignore
 import org.junit.Test
 
-@Ignore("b/240981832")
 class AndroidXPluginTest {
     @Test
     fun createZipForSimpleProject() = pluginTest {
@@ -59,7 +57,7 @@
     @Test
     fun androidLibraryAndKotlinAndroid() = pluginTest {
         val project = cubaneProject.copy(
-            buildGradleText = cubaneBuildGradleText(
+            buildGradleTextTemplate = cubaneBuildGradleText(
                 listOf("com.android.library", "kotlin-android", "AndroidXPlugin")
             )
         )
@@ -70,7 +68,7 @@
     @Test
     fun kotlinAndroidAndAndroidLibrary() = pluginTest {
         val project = cubaneProject.copy(
-            buildGradleText = cubaneBuildGradleText(
+            buildGradleTextTemplate = cubaneBuildGradleText(
                 plugins = listOf("kotlin-android", "com.android.library", "AndroidXPlugin")
             )
         )
@@ -81,7 +79,7 @@
     @Test
     fun androidSampleApplicationWithoutVersion() = pluginTest {
         val project = cubaneProject.copy(
-            buildGradleText = cubaneBuildGradleText(
+            buildGradleTextTemplate = cubaneBuildGradleText(
                 plugins = listOf(
                     "com.android.application",
                     "org.jetbrains.kotlin.android",
diff --git a/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXPluginTestContext.kt b/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXPluginTestContext.kt
index aab0030..7d4532d 100644
--- a/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXPluginTestContext.kt
+++ b/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXPluginTestContext.kt
@@ -18,12 +18,12 @@
 
 import androidx.testutils.gradle.ProjectSetupRule
 import java.io.File
-import java.lang.AssertionError
 import java.util.zip.ZipInputStream
 import net.saff.checkmark.Checkmark.Companion.check
-import net.saff.checkmark.Checkmark.Companion.checks
 import org.gradle.testkit.runner.BuildResult
 import org.gradle.testkit.runner.GradleRunner
+import org.gradle.testkit.runner.UnexpectedBuildFailure
+import org.junit.AssumptionViolatedException
 import org.junit.rules.TemporaryFolder
 
 /**
@@ -36,11 +36,7 @@
 fun pluginTest(action: AndroidXPluginTestContext.() -> Unit) {
     TemporaryFolder().wrap { tmpFolder ->
         ProjectSetupRule().wrap { setup ->
-            val context = AndroidXPluginTestContext(tmpFolder, setup)
-            // checks: automatically capture context on failure
-            checks {
-                context.action()
-            }
+            AndroidXPluginTestContext(tmpFolder, setup).action()
         }
     }
 }
@@ -74,19 +70,26 @@
         env: Map<String, String> = defaultEnv,
         buildAction: GradleRunAction = defaultBuildAction
     ): BuildResult {
-        return GradleRunner.create().withProjectDir(supportRoot)
-            .withArguments(
-                "-Dmaven.repo.local=$mavenLocalDir",
-                "-P$ALLOW_MISSING_LINT_CHECKS_PROJECT=true",
-                *args
-            )
-            .withEnvironment(env).withEnvironment(env).let { buildAction(it) }.also {
-                checkNoClassloaderErrors(it)
-            }
+        try {
+            return GradleRunner.create().withProjectDir(supportRoot)
+                .withArguments(
+                    "-Dmaven.repo.local=$mavenLocalDir",
+                    "-P$ALLOW_MISSING_LINT_CHECKS_PROJECT=true",
+                    *args
+                )
+                .withEnvironment(env).withEnvironment(env).let { buildAction(it) }.also {
+                    assumeNoClassloaderErrors(it)
+                }
+        } catch (e: UnexpectedBuildFailure) {
+            assumeNoClassloaderErrors(e.buildResult)
+            throw e
+        }
     }
 
-    private fun checkNoClassloaderErrors(result: BuildResult) {
-        // We're seeing b/237103195 flakily.  When we do, let's grab additional debugging info.
+    private fun assumeNoClassloaderErrors(result: BuildResult) {
+        // We're seeing b/237103195 flakily.  When we do, let's grab additional debugging info, and
+        // then throw an AssumptionViolatedException, because this is a bug in our test-running
+        // infrastructure, not a bug in the underlying plugins.
         val className = "androidx.build.gradle.ExtensionsKt"
         val classNotFound = "java.lang.ClassNotFoundException: $className"
 
@@ -107,7 +110,13 @@
                         }
                     }
                 }
-            }.let { throw AssertionError(it) }
+            }.let {
+                // Log to stderr, which we can find in the test output XML in host-test-reports,
+                // so we can manually debug an instance.
+                val ave = AssumptionViolatedException(it)
+                ave.printStackTrace()
+                throw ave
+            }
         }
     }
 
diff --git a/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXPluginTestContextTest.kt b/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXPluginTestContextTest.kt
index a7405bc..9d87a38 100644
--- a/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXPluginTestContextTest.kt
+++ b/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXPluginTestContextTest.kt
@@ -17,7 +17,9 @@
 package androidx.build
 
 import net.saff.checkmark.Checkmark.Companion.check
+import org.gradle.testkit.runner.UnexpectedBuildFailure
 import org.gradle.testkit.runner.internal.DefaultBuildResult
+import org.junit.AssumptionViolatedException
 import org.junit.Test
 
 class AndroidXPluginTestContextTest {
@@ -32,8 +34,27 @@
     fun betterDebuggingForClasspathIssues() = pluginTest {
         thrown {
             runGradle("") {
-                val className = "androidx.build.gradle.ExtensionsKt"
-                buildResult("java.lang.ClassNotFoundException: $className")
+                extensionNotFoundResult()
+            }
+        }!!.check {
+            // Since we're faking this error, we expect that the class is actually there in the jar
+            it.message!!.contains("androidx/build/gradle/ExtensionsKt.class")
+        }.check {
+            // AssumptionViolatedException, so test will be marked skipped, not failing.
+            it is AssumptionViolatedException
+        }
+    }
+
+    private fun extensionNotFoundResult(): DefaultBuildResult {
+        val className = "androidx.build.gradle.ExtensionsKt"
+        return buildResult("java.lang.ClassNotFoundException: $className")
+    }
+
+    @Test
+    fun betterDebuggingForClasspathIssuesWhenThrowing() = pluginTest {
+        thrown {
+            runGradle("") {
+                throw UnexpectedBuildFailure("failure", extensionNotFoundResult())
             }
         }!!.check {
             // Since we're faking this error, we expect that the class is actually there in the jar
diff --git a/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXRootPluginTest.kt b/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXRootPluginTest.kt
index ffd77e8..851aba2 100644
--- a/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXRootPluginTest.kt
+++ b/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXRootPluginTest.kt
@@ -20,10 +20,8 @@
 import androidx.build.AndroidXSelfTestProject.Companion.cubaneProject
 import net.saff.checkmark.Checkmark.Companion.check
 import org.junit.Assert
-import org.junit.Ignore
 import org.junit.Test
 
-@Ignore("b/240981832")
 class AndroidXRootPluginTest {
     @Test
     fun rootProjectConfigurationHasAndroidXTasks() = pluginTest {
@@ -135,13 +133,13 @@
             groupId = "docs-public",
             artifactId = null,
             version = null,
-            buildGradleText = docsPublicBuildGradle
+            buildGradleTextTemplate = docsPublicBuildGradle
         )
         val fakeAnnotations = AndroidXSelfTestProject(
             groupId = "fakeannotations",
             artifactId = null,
             version = null,
-            buildGradleText = ""
+            buildGradleTextTemplate = ""
         )
         writeBuildFiles(projects.toList() + listOf(docsPublicProject, fakeAnnotations))
     }
diff --git a/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXSelfTestProject.kt b/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXSelfTestProject.kt
index 1a243cc..a54b533 100644
--- a/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXSelfTestProject.kt
+++ b/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXSelfTestProject.kt
@@ -20,11 +20,12 @@
     val groupId: String,
     val artifactId: String?,
     val version: String?,
-    val buildGradleText: String
+    private val buildGradleTextTemplate: String
 ) {
     val relativePath = artifactId?.let { "$groupId/$artifactId" } ?: groupId
     val gradlePath = ":$groupId:$artifactId"
     val sourceCoordinate get() = "$groupId:$artifactId:${version!!}"
+    val buildGradleText = buildGradleTextTemplate.replace("%GROUP_ID%", groupId)
 
     companion object {
         fun cubaneBuildGradleText(
@@ -54,7 +55,7 @@
                       |androidx {
                       |  publish = Publish.SNAPSHOT_AND_RELEASE
                       |$mavenVersionLine
-                      |  mavenGroup = new LibraryGroup("cubane", null)
+                      |  mavenGroup = new LibraryGroup("%GROUP_ID%", null)
                       |}
                       |""".trimMargin()
         }
@@ -69,10 +70,13 @@
                 groupId = "cubane",
                 artifactId = "cubane",
                 version = "1.2.3",
-                buildGradleText = cubaneBuildGradleText()
+                buildGradleTextTemplate = cubaneBuildGradleText()
             )
 
-        fun buildGradleForKmp(withJava: Boolean = true, addJvmDependency: Boolean = false): String {
+        fun buildGradleForKmp(
+            withJava: Boolean = true,
+            addJvmDependency: Boolean = false
+        ): String {
             val jvmDependency = if (addJvmDependency) {
                 "jvmImplementation(\"androidx.jvmgroup:jvmdep:6.2.9\")"
             } else {
@@ -100,7 +104,7 @@
                       |androidx {
                       |  type = LibraryType.KMP_LIBRARY
                       |  mavenVersion = new Version("1.2.3")
-                      |  mavenGroup = new LibraryGroup("cubane", null)
+                      |  mavenGroup = new LibraryGroup("%GROUP_ID%", null)
                       |}
                       |""".trimMargin()
         }
@@ -112,7 +116,7 @@
             groupId = "cubane",
             artifactId = "cubanekmp",
             version = "1.2.3",
-            buildGradleText = buildGradleForKmp(withJava = true)
+            buildGradleTextTemplate = buildGradleForKmp(withJava = true)
         )
 
         /**
@@ -123,7 +127,7 @@
             groupId = "cubane",
             artifactId = "cubaneNoJava",
             version = "1.2.3",
-            buildGradleText = buildGradleForKmp(withJava = false)
+            buildGradleTextTemplate = buildGradleForKmp(withJava = false)
         )
     }
 }
\ No newline at end of file
diff --git a/buildSrc-tests/src/test/kotlin/androidx/build/dackka/MetadataEntryTest.kt b/buildSrc-tests/src/test/kotlin/androidx/build/dackka/MetadataEntryTest.kt
deleted file mode 100644
index a96ab93..0000000
--- a/buildSrc-tests/src/test/kotlin/androidx/build/dackka/MetadataEntryTest.kt
+++ /dev/null
@@ -1,57 +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.dackka
-
-import com.google.common.truth.Truth.assertThat
-import org.junit.Test
-
-class MetadataEntryTest {
-
-    @Test
-    fun `toMap() with groupId containing a single period`() {
-        val entry = MetadataEntry(
-            groupId = "androidx.groupId",
-            artifactId = "artifactId",
-            sourceDir = "androidx/"
-        )
-        val map = entry.toMap()
-
-        /* ktlint-disable max-line-length */
-        assertThat(map["groupId"]).isEqualTo("androidx.groupId")
-        assertThat(map["artifactId"]).isEqualTo("artifactId")
-        assertThat(map["releaseNotesUrl"]).isEqualTo("https://developer.android.com/jetpack/androidx/releases/groupId")
-        assertThat(map["sourceDir"]).isEqualTo("androidx/")
-        /* ktlint-enable max-line-length */
-    }
-
-    @Test
-    fun `toMap() with groupId containing multiple periods`() {
-        val entry = MetadataEntry(
-            groupId = "androidx.arch.core",
-            artifactId = "artifactId",
-            sourceDir = "androidx/"
-        )
-        val map = entry.toMap()
-
-        /* ktlint-disable max-line-length */
-        assertThat(map["groupId"]).isEqualTo("androidx.arch.core")
-        assertThat(map["artifactId"]).isEqualTo("artifactId")
-        assertThat(map["releaseNotesUrl"]).isEqualTo("https://developer.android.com/jetpack/androidx/releases/arch-core")
-        assertThat(map["sourceDir"]).isEqualTo("androidx/")
-        /* ktlint-enable max-line-length */
-    }
-}
\ No newline at end of file
diff --git a/buildSrc-tests/src/test/kotlin/androidx/build/integrationtests/BuildInfoTest.kt b/buildSrc-tests/src/test/kotlin/androidx/build/integrationtests/BuildInfoTest.kt
index 1e5ae2d..be9ff70 100644
--- a/buildSrc-tests/src/test/kotlin/androidx/build/integrationtests/BuildInfoTest.kt
+++ b/buildSrc-tests/src/test/kotlin/androidx/build/integrationtests/BuildInfoTest.kt
@@ -16,16 +16,14 @@
 
 package androidx.build.integrationtests
 
-import androidx.build.AndroidXPluginTestContext
 import androidx.build.AndroidXSelfTestProject
 import androidx.build.assertExists
 import androidx.build.pluginTest
 import androidx.build.writeBuildFiles
+import environmentForExplicitChangeInfo
 import net.saff.checkmark.Checkmark.Companion.check
-import org.junit.Ignore
 import org.junit.Test
 
-@Ignore("b/240981832")
 class BuildInfoTest {
     @Test
     fun kmpBuildInfoTasks() = pluginTest {
@@ -33,7 +31,8 @@
 
         writeBuildFiles(
             AndroidXSelfTestProject.cubaneKmpProject.copy(
-                buildGradleText = AndroidXSelfTestProject.buildGradleForKmp(
+                groupId = "androidx.cubane",
+                buildGradleTextTemplate = AndroidXSelfTestProject.buildGradleForKmp(
                     withJava = true,
                     addJvmDependency = true
                 )
@@ -41,16 +40,37 @@
         )
 
         // Run to generate build_info file to examine.
-        runGradle(":cubane:cubanekmp:createLibraryBuildInfoFilesJvm", "--stacktrace", env = env)
+        runGradle(
+            ":androidx.cubane:cubanekmp:createLibraryBuildInfoFilesJvm",
+            "--stacktrace",
+            env = env
+        )
 
         // Generated by command above.  See CreateLibraryBuildInfoFileTask doc for derivation
         // of filename
-        val buildInfoPath = "dist/build-info/cubane_cubanekmp-jvm_build_info.txt"
-        outDir.resolve(buildInfoPath).readText().check {
+        val buildInfoPath = "dist/build-info/androidx.cubane_cubanekmp-jvm_build_info.txt"
+        outDir.resolve(buildInfoPath).assertExists().readText().check {
             it.contains("\"artifactId\": \"cubanekmp-jvm\"")
         }.check {
             it.contains("jvmdep")
         }
+
+        val output = runGradle(
+            ":androidx.cubane:cubanekmp:createLibraryBuildInfoFiles",
+            "--stacktrace",
+            env = env
+        ).output
+
+        // Make sure root artifact depends on jvm
+        outDir.resolve("dist/build-info/androidx.cubane_cubanekmp_build_info.txt").assertExists()
+            .readText()
+            .check {
+                mark(output)
+                it.contains("cubanekmp-jvm")
+            }.check {
+                // should be a tip-of-tree dependency
+                it.contains("\"isTipOfTree\": true")
+            }
     }
 
     @Test
@@ -59,7 +79,7 @@
 
         writeBuildFiles(
             AndroidXSelfTestProject.cubaneProject.copy(
-                buildGradleText = AndroidXSelfTestProject.cubaneBuildGradleText(
+                buildGradleTextTemplate = AndroidXSelfTestProject.cubaneBuildGradleText(
                     plugins = listOf("com.android.library", "AndroidXPlugin")
                 )
             )
@@ -82,7 +102,7 @@
 
         writeBuildFiles(
             AndroidXSelfTestProject.cubaneProject.copy(
-                buildGradleText = AndroidXSelfTestProject.cubaneBuildGradleText(
+                buildGradleTextTemplate = AndroidXSelfTestProject.cubaneBuildGradleText(
                     plugins = listOf(
                         "AndroidXPlugin",
                         "com.android.library",
@@ -108,7 +128,7 @@
                 groupId = "compose",
                 artifactId = "compiler:compiler",
                 version = null,
-                buildGradleText = ""
+                buildGradleTextTemplate = ""
             )
         )
 
@@ -134,7 +154,7 @@
 
         writeBuildFiles(
             AndroidXSelfTestProject.cubaneProject.copy(
-                buildGradleText = AndroidXSelfTestProject.cubaneBuildGradleText(
+                buildGradleTextTemplate = AndroidXSelfTestProject.cubaneBuildGradleText(
                     plugins = listOf("AndroidXPlugin", "kotlin", "java-gradle-plugin"),
                     moreConfig =
                     """|gradlePlugin {
@@ -160,23 +180,4 @@
             it.contains("\"artifactId\": \"cubane\"")
         }
     }
-
-    /**
-     * Avoid calling git in tests by taking advantage of environment variables with changelist info
-     * and manifest of changed files.  (These are usually set by busytown and detected in our
-     * builds, cf b/203692753)
-     */
-    private fun AndroidXPluginTestContext.environmentForExplicitChangeInfo(): Map<String, String> {
-        val gitChangeFilesDir = tmpFolder.newFolder()
-        val gitChangeInfoFilename = gitChangeFilesDir.resolve("CHANGE_INFO").apply {
-            writeText("{}")
-        }
-        val gitManifestFilename = gitChangeFilesDir.resolve("MANIFEST").apply {
-            writeText("path=\"frameworks/support\" revision=\"testRev\" ")
-        }
-        return mapOf(
-            "CHANGE_INFO" to gitChangeInfoFilename.path,
-            "MANIFEST" to gitManifestFilename.path
-        )
-    }
 }
\ No newline at end of file
diff --git a/buildSrc-tests/src/test/kotlin/androidx/build/integrationtests/changeInfo.kt b/buildSrc-tests/src/test/kotlin/androidx/build/integrationtests/changeInfo.kt
new file mode 100644
index 0000000..2b5fcd9
--- /dev/null
+++ b/buildSrc-tests/src/test/kotlin/androidx/build/integrationtests/changeInfo.kt
@@ -0,0 +1,36 @@
+import androidx.build.AndroidXPluginTestContext
+
+/*
+ * 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.
+ */
+
+/**
+ * Avoid calling git in tests by taking advantage of environment variables with changelist info
+ * and manifest of changed files.  (These are usually set by busytown and detected in our
+ * builds, cf b/203692753)
+ */
+fun AndroidXPluginTestContext.environmentForExplicitChangeInfo(): Map<String, String> {
+    val gitChangeFilesDir = tmpFolder.newFolder()
+    val gitChangeInfoFilename = gitChangeFilesDir.resolve("CHANGE_INFO").apply {
+        writeText("{}")
+    }
+    val gitManifestFilename = gitChangeFilesDir.resolve("MANIFEST").apply {
+        writeText("path=\"frameworks/support\" revision=\"testRev\" ")
+    }
+    return mapOf(
+        "CHANGE_INFO" to gitChangeInfoFilename.path,
+        "MANIFEST" to gitManifestFilename.path
+    )
+}
\ No newline at end of file
diff --git a/buildSrc/apply/applyAndroidXPaparazziImplPlugin.gradle b/buildSrc/apply/applyAndroidXPaparazziImplPlugin.gradle
new file mode 100644
index 0000000..ece0f79
--- /dev/null
+++ b/buildSrc/apply/applyAndroidXPaparazziImplPlugin.gradle
@@ -0,0 +1,9 @@
+import androidx.build.paparazzi.AndroidXPaparazziImplPlugin
+
+buildscript {
+    dependencies {
+        classpath(project.files("${project.rootProject.ext["buildSrcOut"]}/private/build/libs/private.jar"))
+    }
+}
+
+apply plugin: AndroidXPaparazziImplPlugin
diff --git a/buildSrc/plugins/src/main/kotlin/androidx/build/paparazzi/AndroidXPaparazziPlugin.kt b/buildSrc/plugins/src/main/kotlin/androidx/build/paparazzi/AndroidXPaparazziPlugin.kt
new file mode 100644
index 0000000..98fc29f
--- /dev/null
+++ b/buildSrc/plugins/src/main/kotlin/androidx/build/paparazzi/AndroidXPaparazziPlugin.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.build.paparazzi
+
+import androidx.build.getSupportRootFolder
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+
+/**
+ * Configures screenshot testing using Paparazzi for AndroidX projects.
+ *
+ * The actual implementation is in AndroidXPaparazziImplPlugin.
+ */
+class AndroidXPaparazziPlugin : Plugin<Project> {
+    override fun apply(project: Project) {
+        val supportRoot = project.getSupportRootFolder()
+        project.apply(
+            mapOf(
+                "from" to "$supportRoot/buildSrc/apply/applyAndroidXPaparazziImplPlugin.gradle"
+            )
+        )
+    }
+}
\ No newline at end of file
diff --git a/buildSrc/plugins/src/main/resources/META-INF/gradle-plugins/AndroidXPaparazziPlugin.properties b/buildSrc/plugins/src/main/resources/META-INF/gradle-plugins/AndroidXPaparazziPlugin.properties
new file mode 100644
index 0000000..b95a130
--- /dev/null
+++ b/buildSrc/plugins/src/main/resources/META-INF/gradle-plugins/AndroidXPaparazziPlugin.properties
@@ -0,0 +1,17 @@
+#
+# 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.
+#
+
+implementation-class=androidx.build.paparazzi.AndroidXPaparazziPlugin
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXComposeImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXComposeImplPlugin.kt
index 376419d..846372f 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXComposeImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXComposeImplPlugin.kt
@@ -163,6 +163,7 @@
                     error.add("FrequentlyChangedStateReadInComposition")
                     error.add("ReturnFromAwaitPointerEventScope")
                     error.add("UseOfNonLambdaOffsetOverload")
+                    error.add("MultipleAwaitPointerEventScopes")
 
                     // Paths we want to enable ListIterator checks for - for higher level
                     // libraries it won't have a noticeable performance impact, and we don't want
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
index 373b053..a64d17c 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
@@ -59,6 +59,7 @@
 import java.util.Locale
 import java.util.concurrent.ConcurrentHashMap
 import javax.inject.Inject
+import org.gradle.api.DefaultTask
 import org.gradle.api.GradleException
 import org.gradle.api.JavaVersion.VERSION_11
 import org.gradle.api.JavaVersion.VERSION_1_8
@@ -110,6 +111,7 @@
             AndroidXMultiplatformExtension.EXTENSION_NAME,
             project
         )
+        project.tasks.register(BUILD_ON_SERVER_TASK, DefaultTask::class.java)
         // Perform different actions based on which plugins have been applied to the project.
         // Many of the actions overlap, ex. API tracking.
         project.plugins.all { plugin ->
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXRootImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXRootImplPlugin.kt
index b298c5b..6343b01 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXRootImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXRootImplPlugin.kt
@@ -40,6 +40,7 @@
 import org.gradle.api.Project
 import org.gradle.api.artifacts.component.ModuleComponentSelector
 import org.gradle.api.plugins.JavaPlugin
+import org.gradle.api.plugins.JvmEcosystemPlugin
 import org.gradle.api.tasks.bundling.Zip
 import org.gradle.api.tasks.bundling.ZipEntryCompression
 import org.gradle.build.event.BuildEventsListenerRegistry
@@ -54,6 +55,10 @@
         if (!project.isRoot) {
             throw Exception("This plugin should only be applied to root project")
         }
+        // workaround for https://github.com/gradle/gradle/issues/20145
+        // note that a future KMP plugin(1.8+) will apply this and then we can remove the following
+        // line.
+        project.plugins.apply(JvmEcosystemPlugin::class.java)
         project.configureRootProject()
     }
 
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt b/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt
index 2cb6b2c..0a33d69 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt
@@ -23,6 +23,7 @@
 import java.util.Locale
 import org.gradle.api.GradleException
 import org.gradle.api.Project
+import org.gradle.api.file.RegularFileProperty
 import org.gradle.api.services.BuildService
 import org.gradle.api.services.BuildServiceParameters
 import org.gradle.kotlin.dsl.getByType
@@ -255,6 +256,11 @@
         // Broken in 7.0.0-alpha15 due to b/187343720
         disable.add("UnusedResources")
 
+        // Disable NullAnnotationGroup check for :compose:ui:ui-text (b/233788571)
+        if (isLibrary && project.group == "androidx.compose.ui" && project.name == "ui-text") {
+            disable.add("NullAnnotationGroup")
+        }
+
         if (extension.type == LibraryType.SAMPLES) {
             // TODO: b/190833328 remove if / when AGP will analyze dependencies by default
             //  This is needed because SampledAnnotationDetector uses partial analysis, and
@@ -283,5 +289,5 @@
     }
 }
 
-val Project.lintBaseline get() =
+val Project.lintBaseline: RegularFileProperty get() =
     project.objects.fileProperty().fileValue(File(projectDir, "/lint-baseline.xml"))
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/MavenUploadHelper.kt b/buildSrc/private/src/main/kotlin/androidx/build/MavenUploadHelper.kt
index 8702293..5513c74 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/MavenUploadHelper.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/MavenUploadHelper.kt
@@ -335,6 +335,12 @@
         configure<PublishingExtension> {
             publications { pubs ->
                 pubs.create<MavenPublication>("androidxKmp") {
+                    // Duplicate behavior from KMP plugin
+                    // (https://cs.github.com/JetBrains/kotlin/blob/0c001cc9939a2ab11815263ed825c1096b3ce087/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/Publishing.kt#L42)
+                    // Should be able to remove internal API usage once
+                    // https://youtrack.jetbrains.com/issue/KT-36943 is fixed
+                    (this as MavenPublicationInternal).publishWithOriginalFileName()
+
                     from(object : ComponentWithVariants, SoftwareComponentInternal {
                         override fun getName(): String {
                             return "androidxKmp"
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/buildInfo/CreateLibraryBuildInfoFileTask.kt b/buildSrc/private/src/main/kotlin/androidx/build/buildInfo/CreateLibraryBuildInfoFileTask.kt
index 486ee23..113705b 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/buildInfo/CreateLibraryBuildInfoFileTask.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/buildInfo/CreateLibraryBuildInfoFileTask.kt
@@ -33,8 +33,13 @@
 import org.gradle.api.DefaultTask
 import org.gradle.api.Project
 import org.gradle.api.artifacts.Dependency
+import org.gradle.api.artifacts.ModuleVersionIdentifier
 import org.gradle.api.artifacts.ProjectDependency
+import org.gradle.api.component.ComponentWithCoordinates
+import org.gradle.api.component.ComponentWithVariants
+import org.gradle.api.internal.artifacts.dependencies.DefaultExternalModuleDependency
 import org.gradle.api.internal.artifacts.ivyservice.projectmodule.ProjectComponentPublication
+import org.gradle.api.internal.component.SoftwareComponentInternal
 import org.gradle.api.provider.ListProperty
 import org.gradle.api.provider.Property
 import org.gradle.api.provider.Provider
@@ -220,7 +225,7 @@
                     this.artifactId = it.name.toString()
                     this.groupId = it.group.toString()
                     this.version = it.version.toString()
-                    this.isTipOfTree = it is ProjectDependency
+                    this.isTipOfTree = it is ProjectDependency || it is BuildInfoVariantDependency
                 }
             }.toHashSet().sortedWith(
                 compareBy({ it.groupId }, { it.artifactId }, { it.version })
@@ -293,9 +298,12 @@
                 artifactId = artifactId,
                 taskSuffix = computeTaskSuffix(artifactId),
                 dependencies = project.provider {
-                    pub.component?.usages?.flatMap { it.dependencies }.orEmpty()
-                }
-            ),
+                    pub.component?.let { component ->
+                        val usageDependencies =
+                            component.usages.orEmpty().flatMap { it.dependencies }
+                        usageDependencies + dependenciesOnKmpVariants(component)
+                    }.orEmpty()
+                }),
             shaProvider = project.provider {
                 project.getFrameworksSupportCommitShaAtHead()
             }
@@ -306,6 +314,16 @@
     addTaskToAggregateBuildInfoFileTask(task)
 }
 
+private fun dependenciesOnKmpVariants(component: SoftwareComponentInternal) =
+    (component as? ComponentWithVariants)?.variants.orEmpty()
+        .mapNotNull { (it as? ComponentWithCoordinates)?.coordinates?.asDependency() }
+
+private fun ModuleVersionIdentifier.asDependency() =
+    BuildInfoVariantDependency(group, name, version)
+
+class BuildInfoVariantDependency(group: String, name: String, version: String) :
+    DefaultExternalModuleDependency(group, name, version)
+
 // For examples, see CreateLibraryBuildInfoFileTaskTest
 @VisibleForTesting
 fun computeTaskSuffix(artifactId: String) = artifactId.split("-").drop(1)
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/dackka/GenerateMetadataTask.kt b/buildSrc/private/src/main/kotlin/androidx/build/dackka/GenerateMetadataTask.kt
index 99964bf..fcc5081 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/dackka/GenerateMetadataTask.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/dackka/GenerateMetadataTask.kt
@@ -17,17 +17,21 @@
 package androidx.build.dackka
 
 import com.google.gson.Gson
+import com.google.gson.GsonBuilder
 import java.io.FileWriter
+import java.util.zip.ZipFile
 import org.gradle.api.DefaultTask
 import org.gradle.api.artifacts.component.ComponentArtifactIdentifier
 import org.gradle.api.artifacts.component.ModuleComponentIdentifier
 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
 import org.gradle.api.tasks.OutputFile
 import org.gradle.api.tasks.TaskAction
 import org.gradle.internal.component.external.model.DefaultModuleComponentIdentifier
+import org.gradle.internal.component.local.model.ComponentFileArtifactIdentifier
 
 @CacheableTask
 abstract class GenerateMetadataTask : DefaultTask() {
@@ -44,9 +48,17 @@
     @get:OutputFile
     abstract val destinationFile: RegularFileProperty
 
+    /**
+     * Location of the prebuilts root directory
+     */
+    @get:Input
+    abstract val prebuiltsRoot: Property<String>
+
     @TaskAction
     fun generate() {
         val entries = arrayListOf<MetadataEntry>()
+        val androidXBasePath = "${prebuiltsRoot.get()}/androidx/internal"
+
         getArtifactIds().get().forEach { id ->
 
             // Only process artifact if it can be cast to ModuleComponentIdentifier.
@@ -58,26 +70,40 @@
             // Created https://github.com/gradle/gradle/issues/21415 to track surfacing
             // group / module / version in ComponentIdentifier
             val componentId = (id.componentIdentifier as ModuleComponentIdentifier)
+
+            // Locate the .jar file associated with this artifact and fetch the list of files
+            // contained in the .jar file
+            val jarFilename = (id as ComponentFileArtifactIdentifier).fileName
+            val componentIdPath = componentId.group.replace(".", "/")
+            val jarLocation = "$androidXBasePath/$componentIdPath/${componentId.module}/" +
+                "${componentId.version}/$jarFilename"
+            val fileList = ZipFile(jarLocation).entries().toList().map { it.name }
+
             val entry = MetadataEntry(
                 groupId = componentId.group,
                 artifactId = componentId.module,
-                sourceDir = "TBD/SOURCE/DIR" // TODO: fetch from JAR file
+                releaseNotesUrl = generateReleaseNotesUrl(componentId.group),
+                jarContents = fileList
             )
             entries.add(entry)
         }
 
-        val jsonMapping = generateJsonMapping(entries)
+        val gson = if (DEBUG) {
+            GsonBuilder().setPrettyPrinting().create()
+        } else {
+            Gson()
+        }
         val writer = FileWriter(destinationFile.get().toString())
-        Gson().toJson(jsonMapping, writer)
+        gson.toJson(entries, writer)
         writer.close()
     }
 
-    /**
-     * Converts a list of [MetadataEntry] objects into a list of maps.
-     */
-    private fun generateJsonMapping(
-        metadataEntries: List<MetadataEntry>
-    ): List<Map<String, String>> {
-        return metadataEntries.map { it.toMap() }
+    private fun generateReleaseNotesUrl(groupId: String): String {
+        val library = groupId.removePrefix("androidx.").replace(".", "-")
+        return "https://developer.android.com/jetpack/androidx/releases/$library"
+    }
+
+    companion object {
+        private const val DEBUG = false
     }
 }
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/dackka/MetadataEntry.kt b/buildSrc/private/src/main/kotlin/androidx/build/dackka/MetadataEntry.kt
index aa373fb..6950d6c 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/dackka/MetadataEntry.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/dackka/MetadataEntry.kt
@@ -16,33 +16,33 @@
 
 package androidx.build.dackka
 
-import java.io.Serializable
+import com.google.gson.annotations.SerializedName
 
 /**
  * Helper data class to store the metadata information for each library/path.
  */
 data class MetadataEntry(
+    @SerializedName("groupId")
     val groupId: String,
+
+    @SerializedName("artifactId")
     val artifactId: String,
-    val sourceDir: String,
-) : Serializable {
 
-    /**
-     * Transforms the contents of this data class into a [Map] for future conversion to JSON
-     *
-     * @return the contents of this data class as a [Map].
-     */
-    fun toMap(): Map<String, String> {
-        return mapOf(
-            "groupId" to groupId,
-            "artifactId" to artifactId,
-            "releaseNotesUrl" to generateReleaseNotesUrl(),
-            "sourceDir" to sourceDir
-        )
-    }
+    @SerializedName("releaseNotesUrl")
+    val releaseNotesUrl: String,
 
-    private fun generateReleaseNotesUrl(): String {
-        val library = groupId.removePrefix("androidx.").replace(".", "-")
-        return "https://developer.android.com/jetpack/androidx/releases/$library"
-    }
-}
\ No newline at end of file
+    // TODO (b/243175565): remove @Transient once bug is resolved
+    //
+    // Dackka currently fails if extra keys are present in the JSON file; temporarily omit this
+    // field in the JSON output
+    @Transient
+    @SerializedName("jarContents")
+    val jarContents: List<String>,
+
+    // TODO (b/241582234): Remove when bug is resolved.
+    //
+    // This will no longer be used once Dackka is updated, but is currently needed as Dackka
+    // expects this key to be present.
+    @SerializedName("sourceDir")
+    val sourceDir: String = "TBD/SOURCE/DIR",
+)
\ No newline at end of file
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt b/buildSrc/private/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt
index 581be6b..a4a255a 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt
@@ -630,6 +630,8 @@
             "development/",
             "playground-common/",
             ".github/",
+            // since we only used AMD for device tests, versions do not affect test outcomes.
+            "libraryversions.toml",
         )
     }
 }
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/docs/AndroidXDocsImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/docs/AndroidXDocsImplPlugin.kt
index 6d266cc..a28ac92 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/docs/AndroidXDocsImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/docs/AndroidXDocsImplPlugin.kt
@@ -379,6 +379,7 @@
                 artifacts.map { result -> result.map { it.id } }
             )
             task.destinationFile.set(getMetadataRegularFile(project))
+            task.prebuiltsRoot.set(File(project.getCheckoutRoot(), "prebuilts").absolutePath)
         }
 
         val dackkaTask = project.tasks.register("dackkaDocs", DackkaTask::class.java) { task ->
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/paparazzi/AndroidXPaparazziImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/paparazzi/AndroidXPaparazziImplPlugin.kt
new file mode 100644
index 0000000..64243ab
--- /dev/null
+++ b/buildSrc/private/src/main/kotlin/androidx/build/paparazzi/AndroidXPaparazziImplPlugin.kt
@@ -0,0 +1,135 @@
+/*
+ * 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.paparazzi
+
+import androidx.build.OperatingSystem
+import androidx.build.SupportConfig.COMPILE_SDK_VERSION
+import androidx.build.SupportConfig.TARGET_SDK_VERSION
+import androidx.build.getLibraryByName
+import androidx.build.getOperatingSystem
+import androidx.build.getSdkPath
+import androidx.build.getSupportRootFolder
+import com.android.build.gradle.BaseExtension
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+import org.gradle.api.artifacts.type.ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE
+import org.gradle.api.artifacts.type.ArtifactTypeDefinition.JAR_TYPE
+import org.gradle.api.file.FileCollection
+import org.gradle.api.tasks.PathSensitivity
+import org.gradle.api.tasks.testing.Test
+import org.gradle.kotlin.dsl.the
+import org.gradle.kotlin.dsl.withType
+import org.gradle.process.JavaForkOptions
+
+/**
+ * Configures screenshot testing using Paparazzi for AndroidX projects.
+ */
+class AndroidXPaparazziImplPlugin : Plugin<Project> {
+    override fun apply(project: Project) {
+        val paparazziNative = project.createUnzippedPaparazziNativeDependency()
+        project.afterEvaluate {
+            project.tasks.withType<Test>().configureEach { it.configureTestTask(paparazziNative) }
+        }
+    }
+
+    /**
+     * Add project's golden directory and the unzipped native Paparazzi location as task inputs,
+     * and set system properties for the test library to consume at runtime.
+     */
+    private fun Test.configureTestTask(paparazziNative: FileCollection) {
+        val platformDirectory = project.getSdkPath().resolve("platforms/$COMPILE_SDK_VERSION")
+        val goldenRootDirectory = project.getSupportRootFolder().resolve("../../golden")
+        val modulePath = project.path.replace(':', '/').trim('/')
+        val android = project.the<BaseExtension>()
+        val packageName = requireNotNull(android.namespace) {
+            "android.namespace must be set for Paparazzi"
+        }
+
+        // Attach unzipped Paparazzi native directory as a task input
+        inputs.files(paparazziNative)
+            .withPathSensitivity(PathSensitivity.NONE)
+            .withPropertyName("paparazziNative")
+
+        // Attach golden directory to task inputs to invalidate tests when updating goldens
+        inputs.dir(goldenRootDirectory.resolve(modulePath))
+            .withPathSensitivity(PathSensitivity.RELATIVE)
+            .withPropertyName("goldenDirectory")
+
+        // Set non-path system properties at configuration time, so that changes invalidate caching
+        prefixedSystemProperties(
+            "compileSdkVersion" to TARGET_SDK_VERSION,
+            "packageName" to packageName,
+            "resourcePackageNames" to packageName, // TODO: Transitive resource packages?
+            "modulePath" to modulePath
+        )
+
+        // Set the remaining system properties at execution time, after the snapshotting, so that
+        // the absolute paths don't affect caching
+        doFirst {
+            prefixedSystemProperties(
+                "platformDir" to platformDirectory.canonicalPath,
+                "platformDataDir" to paparazziNative.singleFile.canonicalPath,
+                "assetsDir" to ".", // TODO: Merged assets dirs? (needed for compose?)
+                "resDir" to ".", // TODO: Merged resource dirs? (needed for compose?)
+                "reportDir" to reports.junitXml.outputLocation.get().asFile.canonicalPath,
+                "goldenRootDir" to goldenRootDirectory.canonicalPath,
+            )
+        }
+    }
+
+    /**
+     * Configure [UnzipPaparazziNativeTransform] for the project, and add the platform-specific
+     * Paparazzi native layoutlib dependency, using the version in `libs.versions.toml`.
+     */
+    private fun Project.createUnzippedPaparazziNativeDependency(): FileCollection {
+        val platformSuffix = when (val os = getOperatingSystem()) {
+            OperatingSystem.LINUX -> "LinuxX64"
+            OperatingSystem.MAC -> {
+                val arch = System.getProperty("os.arch")
+                if (arch.startsWith("x86", ignoreCase = true)) "MacOsX64" else "MacOsArm64"
+            }
+            else -> error("Unsupported operating system $os for Paparazzi")
+        }
+
+        dependencies.registerTransform(UnzipPaparazziNativeTransform::class.java) { spec ->
+            spec.from.attribute(ARTIFACT_TYPE_ATTRIBUTE, JAR_TYPE)
+            spec.to.attribute(ARTIFACT_TYPE_ATTRIBUTE, UNZIPPED_PAPARAZZI_NATIVE)
+        }
+
+        val configuration = configurations.create("paparazziNative")
+        configuration.dependencies.add(
+            dependencies.create(getLibraryByName("paparazziNative$platformSuffix"))
+        )
+
+        return configuration.incoming.artifactView {
+            it.attributes.attribute(ARTIFACT_TYPE_ATTRIBUTE, UNZIPPED_PAPARAZZI_NATIVE)
+        }.files
+    }
+
+    private companion object {
+        /** Package name of the test library, used to namespace system properties */
+        const val PACKAGE_NAME = "androidx.test.screenshot.paparazzi"
+
+        /** Artifact type attribute for unzipped Paparazzi layoutlib unzipped artifacts */
+        const val UNZIPPED_PAPARAZZI_NATIVE = "unzipped-paparazzi-native"
+
+        /** Set system properties with keys prefixed with [PACKAGE_NAME] */
+        fun JavaForkOptions.prefixedSystemProperties(vararg properties: Pair<String, Any>) {
+            properties.forEach { (name, value) -> systemProperty("$PACKAGE_NAME.$name", value) }
+        }
+    }
+}
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/paparazzi/UnzipPaparazziNativeTransform.kt b/buildSrc/private/src/main/kotlin/androidx/build/paparazzi/UnzipPaparazziNativeTransform.kt
new file mode 100644
index 0000000..0af7ef7
--- /dev/null
+++ b/buildSrc/private/src/main/kotlin/androidx/build/paparazzi/UnzipPaparazziNativeTransform.kt
@@ -0,0 +1,60 @@
+/*
+ * 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.paparazzi
+
+import java.util.zip.ZipInputStream
+import org.gradle.api.artifacts.transform.CacheableTransform
+import org.gradle.api.artifacts.transform.InputArtifact
+import org.gradle.api.artifacts.transform.TransformAction
+import org.gradle.api.artifacts.transform.TransformOutputs
+import org.gradle.api.artifacts.transform.TransformParameters.None
+import org.gradle.api.file.FileSystemLocation
+import org.gradle.api.provider.Provider
+import org.gradle.api.tasks.PathSensitive
+import org.gradle.api.tasks.PathSensitivity
+
+/**
+ * Unzips one of Paparazzi's platform-specific layoutlib JAR artifacts so that Paparazzi can read
+ * its contents at run time. These contain a native dynamic library and supporting resources
+ * including ICU and fonts.
+ */
+@CacheableTransform
+abstract class UnzipPaparazziNativeTransform : TransformAction<None> {
+    @get:PathSensitive(PathSensitivity.NAME_ONLY)
+    @get:InputArtifact
+    abstract val primaryInput: Provider<FileSystemLocation>
+
+    override fun transform(outputs: TransformOutputs) {
+        val inputFile = primaryInput.get().asFile
+        val outputDir = outputs.dir(inputFile.nameWithoutExtension).also { it.mkdirs() }
+
+        ZipInputStream(inputFile.inputStream().buffered()).use { zipInputStream ->
+            while (true) {
+                val entry = zipInputStream.nextEntry ?: break
+                val outputFile = outputDir.resolve(entry.name)
+
+                if (entry.isDirectory) {
+                    outputFile.mkdir()
+                } else {
+                    // This works because ZipInputStream resizes itself to the contents of the
+                    // last-returned entry
+                    outputFile.outputStream().buffered().use { zipInputStream.copyTo(it) }
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/buildSrc/private/src/main/resources/META-INF/gradle-plugins/AndroidXPaparazziImplPlugin.properties b/buildSrc/private/src/main/resources/META-INF/gradle-plugins/AndroidXPaparazziImplPlugin.properties
new file mode 100644
index 0000000..0ea8b07
--- /dev/null
+++ b/buildSrc/private/src/main/resources/META-INF/gradle-plugins/AndroidXPaparazziImplPlugin.properties
@@ -0,0 +1,17 @@
+#
+# 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.
+#
+
+implementation-class=androidx.build.paparazzi.AndroidXPaparazziImplPlugin
diff --git a/buildSrc/public/src/main/kotlin/androidx/build/BuildOnServer.kt b/buildSrc/public/src/main/kotlin/androidx/build/BuildOnServer.kt
index b6a8938..666dfb8 100644
--- a/buildSrc/public/src/main/kotlin/androidx/build/BuildOnServer.kt
+++ b/buildSrc/public/src/main/kotlin/androidx/build/BuildOnServer.kt
@@ -26,7 +26,7 @@
  * Configures the root project's buildOnServer task to run the specified task.
  */
 fun <T : Task> Project.addToBuildOnServer(taskProvider: TaskProvider<T>) {
-    rootProject.tasks.named(BUILD_ON_SERVER_TASK).configure {
+    tasks.named(BUILD_ON_SERVER_TASK).configure {
         it.dependsOn(taskProvider)
     }
 }
@@ -35,7 +35,7 @@
  * Configures the root project's buildOnServer task to run the specified task.
  */
 fun <T : Task> Project.addToBuildOnServer(taskPath: String) {
-    rootProject.tasks.named(BUILD_ON_SERVER_TASK).configure {
+    tasks.named(BUILD_ON_SERVER_TASK).configure {
         it.dependsOn(taskPath)
     }
 }
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
new file mode 100644
index 0000000..b75b73d
--- /dev/null
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CamcorderProfileProviderAdapter.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.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/CameraInfoAdapter.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraInfoAdapter.kt
index 171c568e..35f2468 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
@@ -56,8 +56,9 @@
     private val cameraProperties: CameraProperties,
     private val cameraConfig: CameraConfig,
     private val cameraState: CameraStateAdapter,
-    private val cameraCallbackMap: CameraCallbackMap
+    private val cameraCallbackMap: CameraCallbackMap,
 ) : CameraInfoInternal {
+    private lateinit var camcorderProfileProviderAdapter: CamcorderProfileProviderAdapter
 
     override fun getCameraId(): String = cameraConfig.cameraId.value
     override fun getLensFacing(): Int? =
@@ -105,8 +106,10 @@
     override fun getImplementationType(): String = "CameraPipe"
 
     override fun getCamcorderProfileProvider(): CamcorderProfileProvider {
-        Log.warn { "TODO: CamcorderProfileProvider is not yet supported." }
-        return CamcorderProfileProvider.EMPTY
+        if (!::camcorderProfileProviderAdapter.isInitialized) {
+            camcorderProfileProviderAdapter = CamcorderProfileProviderAdapter(cameraId)
+        }
+        return camcorderProfileProviderAdapter
     }
 
     override fun toString(): String = "CameraInfoAdapter<$cameraConfig.cameraId>"
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseManager.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseManager.kt
index d7e6681..68252bd2 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseManager.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseManager.kt
@@ -83,6 +83,13 @@
         }
         Log.debug { "Attaching $useCases from $this" }
 
+        // Notify state attached to use cases
+        for (useCase in useCases) {
+            if (!attachedUseCases.contains(useCase)) {
+                useCase.onStateAttached()
+            }
+        }
+
         if (attachedUseCases.addAll(useCases)) {
             refreshAttachedUseCases(attachedUseCases)
         }
@@ -105,6 +112,13 @@
         // detaching the use cases should suffice here.
         activeUseCases.removeAll(useCases)
 
+        // Notify state detached to use cases
+        for (useCase in useCases) {
+            if (attachedUseCases.contains(useCase)) {
+                useCase.onStateDetached()
+            }
+        }
+
         // TODO: We might only want to tear down when the number of attached use cases goes to
         //  zero. If a single UseCase is removed, we could deactivate it?
         if (attachedUseCases.removeAll(useCases)) {
diff --git a/camera/camera-camera2/api/1.2.0-beta01.txt b/camera/camera-camera2/api/1.2.0-beta01.txt
new file mode 100644
index 0000000..1459b2c
--- /dev/null
+++ b/camera/camera-camera2/api/1.2.0-beta01.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.camera.camera2 {
+
+  @RequiresApi(21) public final class Camera2Config {
+    method public static androidx.camera.core.CameraXConfig defaultConfig();
+  }
+
+}
+
diff --git a/camera/camera-camera2/api/public_plus_experimental_1.2.0-beta01.txt b/camera/camera-camera2/api/public_plus_experimental_1.2.0-beta01.txt
new file mode 100644
index 0000000..ebebd4c
--- /dev/null
+++ b/camera/camera-camera2/api/public_plus_experimental_1.2.0-beta01.txt
@@ -0,0 +1,53 @@
+// Signature format: 4.0
+package androidx.camera.camera2 {
+
+  @RequiresApi(21) public final class Camera2Config {
+    method public static androidx.camera.core.CameraXConfig defaultConfig();
+  }
+
+}
+
+package androidx.camera.camera2.interop {
+
+  @RequiresApi(21) @androidx.camera.camera2.interop.ExperimentalCamera2Interop public final class Camera2CameraControl {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> addCaptureRequestOptions(androidx.camera.camera2.interop.CaptureRequestOptions);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> clearCaptureRequestOptions();
+    method public static androidx.camera.camera2.interop.Camera2CameraControl from(androidx.camera.core.CameraControl);
+    method public androidx.camera.camera2.interop.CaptureRequestOptions getCaptureRequestOptions();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setCaptureRequestOptions(androidx.camera.camera2.interop.CaptureRequestOptions);
+  }
+
+  @RequiresApi(21) @androidx.camera.camera2.interop.ExperimentalCamera2Interop public final class Camera2CameraInfo {
+    method public static androidx.camera.camera2.interop.Camera2CameraInfo from(androidx.camera.core.CameraInfo);
+    method public <T> T? getCameraCharacteristic(android.hardware.camera2.CameraCharacteristics.Key<T!>);
+    method public String getCameraId();
+  }
+
+  @RequiresApi(21) @androidx.camera.camera2.interop.ExperimentalCamera2Interop public final class Camera2Interop {
+  }
+
+  @RequiresApi(21) public static final class Camera2Interop.Extender<T> {
+    ctor public Camera2Interop.Extender(androidx.camera.core.ExtendableBuilder<T!>);
+    method public <ValueT> androidx.camera.camera2.interop.Camera2Interop.Extender<T!> setCaptureRequestOption(android.hardware.camera2.CaptureRequest.Key<ValueT!>, ValueT);
+    method public androidx.camera.camera2.interop.Camera2Interop.Extender<T!> setDeviceStateCallback(android.hardware.camera2.CameraDevice.StateCallback);
+    method @RequiresApi(28) public androidx.camera.camera2.interop.Camera2Interop.Extender<T!> setPhysicalCameraId(String);
+    method public androidx.camera.camera2.interop.Camera2Interop.Extender<T!> setSessionCaptureCallback(android.hardware.camera2.CameraCaptureSession.CaptureCallback);
+    method public androidx.camera.camera2.interop.Camera2Interop.Extender<T!> setSessionStateCallback(android.hardware.camera2.CameraCaptureSession.StateCallback);
+  }
+
+  @RequiresApi(21) @androidx.camera.camera2.interop.ExperimentalCamera2Interop public class CaptureRequestOptions {
+    method public <ValueT> ValueT? getCaptureRequestOption(android.hardware.camera2.CaptureRequest.Key<ValueT!>);
+  }
+
+  @RequiresApi(21) public static final class CaptureRequestOptions.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.camera2.interop.CaptureRequestOptions> {
+    ctor public CaptureRequestOptions.Builder();
+    method public androidx.camera.camera2.interop.CaptureRequestOptions build();
+    method public <ValueT> androidx.camera.camera2.interop.CaptureRequestOptions.Builder clearCaptureRequestOption(android.hardware.camera2.CaptureRequest.Key<ValueT!>);
+    method public <ValueT> androidx.camera.camera2.interop.CaptureRequestOptions.Builder setCaptureRequestOption(android.hardware.camera2.CaptureRequest.Key<ValueT!>, ValueT);
+  }
+
+  @RequiresOptIn @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ExperimentalCamera2Interop {
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/camera/camera-camera2/api/res-1.2.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to camera/camera-camera2/api/res-1.2.0-beta01.txt
diff --git a/camera/camera-camera2/api/restricted_1.2.0-beta01.txt b/camera/camera-camera2/api/restricted_1.2.0-beta01.txt
new file mode 100644
index 0000000..1459b2c
--- /dev/null
+++ b/camera/camera-camera2/api/restricted_1.2.0-beta01.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.camera.camera2 {
+
+  @RequiresApi(21) public final class Camera2Config {
+    method public static androidx.camera.core.CameraXConfig defaultConfig();
+  }
+
+}
+
diff --git a/camera/camera-camera2/build.gradle b/camera/camera-camera2/build.gradle
index d788991..190ef69 100644
--- a/camera/camera-camera2/build.gradle
+++ b/camera/camera-camera2/build.gradle
@@ -56,7 +56,6 @@
     androidTestImplementation(libs.testRules)
     androidTestImplementation(libs.truth)
     androidTestImplementation(libs.testUiautomator)
-    androidTestImplementation(libs.espressoCore)
     androidTestImplementation(libs.mockitoCore, excludes.bytebuddy) // DexMaker has it's own MockMaker
     androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy) // DexMaker has it's own MockMaker
     androidTestImplementation("androidx.appcompat:appcompat:1.1.0")
@@ -68,6 +67,7 @@
     androidTestImplementation("org.jetbrains.kotlinx:atomicfu:0.13.1")
     androidTestImplementation("androidx.exifinterface:exifinterface:1.0.0")
     androidTestImplementation("androidx.concurrent:concurrent-futures-ktx:1.1.0")
+    androidTestImplementation("androidx.test.espresso:espresso-core:3.3.0")
 }
 android {
     defaultConfig {
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/SurfaceOrientedMeteringPointFactoryTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/SurfaceOrientedMeteringPointFactoryTest.java
deleted file mode 100644
index 4576db2..0000000
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/SurfaceOrientedMeteringPointFactoryTest.java
+++ /dev/null
@@ -1,154 +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.camera.camera2;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.junit.Assume.assumeTrue;
-
-import android.content.Context;
-import android.util.Rational;
-import android.util.Size;
-
-import androidx.camera.core.AspectRatio;
-import androidx.camera.core.CameraSelector;
-import androidx.camera.core.CameraXConfig;
-import androidx.camera.core.ImageAnalysis;
-import androidx.camera.core.MeteringPoint;
-import androidx.camera.core.MeteringPointFactory;
-import androidx.camera.core.SurfaceOrientedMeteringPointFactory;
-import androidx.camera.core.internal.CameraUseCaseAdapter;
-import androidx.camera.testing.CameraUtil;
-import androidx.camera.testing.CameraXUtil;
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.filters.SdkSuppress;
-import androidx.test.platform.app.InstrumentationRegistry;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-@SdkSuppress(minSdkVersion = 21)
-public final class SurfaceOrientedMeteringPointFactoryTest {
-    private static final float WIDTH = 480;
-    private static final float HEIGHT = 640;
-    SurfaceOrientedMeteringPointFactory mPointFactory;
-    private Context mContext;
-
-    @Before
-    public void setUp() {
-        mContext = ApplicationProvider.getApplicationContext();
-        CameraXConfig config = Camera2Config.defaultConfig();
-
-        CameraXUtil.initialize(mContext, config);
-        mPointFactory = new SurfaceOrientedMeteringPointFactory(WIDTH, HEIGHT);
-    }
-
-    @After
-    public void tearDown() throws ExecutionException, InterruptedException, TimeoutException {
-        CameraXUtil.shutdown().get(10000, TimeUnit.MILLISECONDS);
-    }
-
-    @Test
-    public void defaultAreaSize() {
-        MeteringPoint point = mPointFactory.createPoint(0, 0);
-        assertThat(point.getSize()).isEqualTo(MeteringPointFactory.getDefaultPointSize());
-        assertThat(point.getSurfaceAspectRatio()).isNull();
-    }
-
-    @Test
-    public void createPointWithValidAreaSize() {
-        final float areaSize = 0.2f;
-        MeteringPoint point = mPointFactory.createPoint(0, 0, areaSize);
-        assertThat(point.getSize()).isEqualTo(areaSize);
-        assertThat(point.getSurfaceAspectRatio()).isNull();
-    }
-
-    @Test
-    public void createPointLeftTop_correctValueSet() {
-        MeteringPoint meteringPoint = mPointFactory.createPoint(0f, 0f);
-        assertThat(meteringPoint.getX()).isEqualTo(0f);
-        assertThat(meteringPoint.getY()).isEqualTo(0f);
-    }
-
-    @Test
-    public void createPointLeftBottom_correctValueSet() {
-        MeteringPoint meteringPoint2 = mPointFactory.createPoint(0f, HEIGHT);
-        assertThat(meteringPoint2.getX()).isEqualTo(0f);
-        assertThat(meteringPoint2.getY()).isEqualTo(1f);
-    }
-
-    @Test
-    public void createPointRightTop_correctValueSet() {
-        MeteringPoint meteringPoint3 = mPointFactory.createPoint(WIDTH, 0f);
-        assertThat(meteringPoint3.getX()).isEqualTo(1f);
-        assertThat(meteringPoint3.getY()).isEqualTo(0f);
-    }
-
-    @Test
-    public void createPointRightBottom_correctValueSet() {
-        MeteringPoint meteringPoint4 = mPointFactory.createPoint(WIDTH, HEIGHT);
-        assertThat(meteringPoint4.getX()).isEqualTo(1f);
-        assertThat(meteringPoint4.getY()).isEqualTo(1f);
-    }
-
-    @Test
-    public void createPointWithFoVUseCase_success() {
-        assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK));
-
-        ImageAnalysis imageAnalysis = new ImageAnalysis.Builder()
-                .setTargetName("ImageAnalysis")
-                .build();
-        CameraSelector cameraSelector =
-                new CameraSelector.Builder().requireLensFacing(
-                        CameraSelector.LENS_FACING_BACK).build();
-        CameraUseCaseAdapter camera = CameraUtil.createCameraAndAttachUseCase(mContext,
-                cameraSelector, imageAnalysis);
-
-        Size surfaceResolution = imageAnalysis.getAttachedSurfaceResolution();
-
-        SurfaceOrientedMeteringPointFactory factory = new SurfaceOrientedMeteringPointFactory(
-                WIDTH, HEIGHT, imageAnalysis);
-        MeteringPoint point = factory.createPoint(0f, 0f);
-        assertThat(point.getSurfaceAspectRatio()).isEqualTo(
-                new Rational(surfaceResolution.getWidth(), surfaceResolution.getHeight()));
-
-        InstrumentationRegistry.getInstrumentation().runOnMainSync(() ->
-                //TODO: The removeUseCases() call might be removed after clarifying the
-                // abortCaptures() issue in b/162314023.
-                camera.removeUseCases(camera.getUseCases())
-        );
-    }
-
-    @Test(expected = IllegalStateException.class)
-    public void createPointWithFoVUseCase_FailedNotBound() {
-        assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK));
-
-        ImageAnalysis imageAnalysis = new ImageAnalysis.Builder()
-                .setTargetAspectRatio(AspectRatio.RATIO_4_3)
-                .setTargetName("ImageAnalysis")
-                .build();
-
-        // This will throw IllegalStateException.
-        SurfaceOrientedMeteringPointFactory factory = new SurfaceOrientedMeteringPointFactory(
-                WIDTH, HEIGHT, imageAnalysis);
-    }
-}
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/JpegHalCorruptImageQuirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/JpegHalCorruptImageQuirk.java
index fbdd892..7e1211af 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/JpegHalCorruptImageQuirk.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/JpegHalCorruptImageQuirk.java
@@ -32,13 +32,18 @@
  * Quirk which denotes JPEGs produced directly from the HAL may sometimes be corrupted.
  *
  * <p>QuirkSummary
- *      Bug Id:      <a href="https://issuetracker.google.com/159831206">159831206</a>
+ *      Bug Id:      <a href="https://issuetracker.google.com/159831206">159831206</a>,
+ *                   <a href="https://issuetracker.google.com/242509463">242509463</a>
  *      Description: Corrupt images generally manifest as completely monochrome JPEGs, sometimes
  *                   solid green. On the affected devices, this is easier to reproduce
  *                   immediately after rebooting the device. If possible, it is preferred
  *                   that CameraX produce JPEGs from some other image format rather than
- *                   receiving JPEGs directly from the HAL.
- *      Device(s):   Samsung Galaxy S7 (SM-G930T and SM-G930V variants)
+ *                   receiving JPEGs directly from the HAL. This issue happens on Samsung Galaxy S7.
+ *                   The other issue is that the Exif metadata of the captured images might be
+ *                   incorrect to cause IOException when using ExifInterface to save the updated
+ *                   attributes. Capturing the images in YUV format and then compress it to JPEG
+ *                   output images can produce correct Exif metadata to workaround this issue.
+ *      Device(s):   Samsung Galaxy S7 (SM-G930T and SM-G930V variants), alps k61v1_basic_ref
  */
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class JpegHalCorruptImageQuirk implements SoftwareJpegEncodingPreferredQuirk {
@@ -46,7 +51,8 @@
     private static final Set<String> KNOWN_AFFECTED_DEVICES = new HashSet<>(
             Arrays.asList(
                     "heroqltevzw",
-                    "heroqltetmo"
+                    "heroqltetmo",
+                    "k61v1_basic_ref"
             ));
 
     static boolean load(@NonNull CameraCharacteristicsCompat characteristicsCompat) {
diff --git a/camera/camera-core/api/1.2.0-beta01.txt b/camera/camera-core/api/1.2.0-beta01.txt
new file mode 100644
index 0000000..9aaeb6b
--- /dev/null
+++ b/camera/camera-core/api/1.2.0-beta01.txt
@@ -0,0 +1,437 @@
+// Signature format: 4.0
+package androidx.camera.core {
+
+  @RequiresApi(21) public class AspectRatio {
+    field public static final int RATIO_16_9 = 1; // 0x1
+    field public static final int RATIO_4_3 = 0; // 0x0
+  }
+
+  @RequiresApi(21) public interface Camera {
+    method public androidx.camera.core.CameraControl getCameraControl();
+    method public androidx.camera.core.CameraInfo getCameraInfo();
+  }
+
+  @RequiresApi(21) public interface CameraControl {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelFocusAndMetering();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Integer!> setExposureCompensationIndex(int);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setLinearZoom(@FloatRange(from=0.0f, to=1.0f) float);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setZoomRatio(float);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.FocusMeteringResult!> startFocusAndMetering(androidx.camera.core.FocusMeteringAction);
+  }
+
+  public static final class CameraControl.OperationCanceledException extends java.lang.Exception {
+  }
+
+  @RequiresApi(21) public interface CameraFilter {
+    method public java.util.List<androidx.camera.core.CameraInfo!> filter(java.util.List<androidx.camera.core.CameraInfo!>);
+  }
+
+  @RequiresApi(21) public interface CameraInfo {
+    method public androidx.camera.core.CameraSelector getCameraSelector();
+    method public androidx.lifecycle.LiveData<androidx.camera.core.CameraState!> getCameraState();
+    method public androidx.camera.core.ExposureState getExposureState();
+    method public int getSensorRotationDegrees();
+    method public int getSensorRotationDegrees(int);
+    method public androidx.lifecycle.LiveData<java.lang.Integer!> getTorchState();
+    method public androidx.lifecycle.LiveData<androidx.camera.core.ZoomState!> getZoomState();
+    method public boolean hasFlashUnit();
+    method public default boolean isFocusMeteringSupported(androidx.camera.core.FocusMeteringAction);
+  }
+
+  @RequiresApi(21) public final class CameraInfoUnavailableException extends java.lang.Exception {
+  }
+
+  @RequiresApi(21) public interface CameraProvider {
+    method public java.util.List<androidx.camera.core.CameraInfo!> getAvailableCameraInfos();
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+  }
+
+  @RequiresApi(21) public final class CameraSelector {
+    method public java.util.List<androidx.camera.core.CameraInfo!> filter(java.util.List<androidx.camera.core.CameraInfo!>);
+    field public static final androidx.camera.core.CameraSelector DEFAULT_BACK_CAMERA;
+    field public static final androidx.camera.core.CameraSelector DEFAULT_FRONT_CAMERA;
+    field public static final int LENS_FACING_BACK = 1; // 0x1
+    field public static final int LENS_FACING_FRONT = 0; // 0x0
+  }
+
+  public static final class CameraSelector.Builder {
+    ctor public CameraSelector.Builder();
+    method public androidx.camera.core.CameraSelector.Builder addCameraFilter(androidx.camera.core.CameraFilter);
+    method public androidx.camera.core.CameraSelector build();
+    method public androidx.camera.core.CameraSelector.Builder requireLensFacing(int);
+  }
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class CameraState {
+    ctor public CameraState();
+    method public static androidx.camera.core.CameraState create(androidx.camera.core.CameraState.Type);
+    method public static androidx.camera.core.CameraState create(androidx.camera.core.CameraState.Type, androidx.camera.core.CameraState.StateError?);
+    method public abstract androidx.camera.core.CameraState.StateError? getError();
+    method public abstract androidx.camera.core.CameraState.Type getType();
+    field public static final int ERROR_CAMERA_DISABLED = 5; // 0x5
+    field public static final int ERROR_CAMERA_FATAL_ERROR = 6; // 0x6
+    field public static final int ERROR_CAMERA_IN_USE = 2; // 0x2
+    field public static final int ERROR_DO_NOT_DISTURB_MODE_ENABLED = 7; // 0x7
+    field public static final int ERROR_MAX_CAMERAS_IN_USE = 1; // 0x1
+    field public static final int ERROR_OTHER_RECOVERABLE_ERROR = 3; // 0x3
+    field public static final int ERROR_STREAM_CONFIG = 4; // 0x4
+  }
+
+  public enum CameraState.ErrorType {
+    enum_constant public static final androidx.camera.core.CameraState.ErrorType CRITICAL;
+    enum_constant public static final androidx.camera.core.CameraState.ErrorType RECOVERABLE;
+  }
+
+  @com.google.auto.value.AutoValue public abstract static class CameraState.StateError {
+    ctor public CameraState.StateError();
+    method public static androidx.camera.core.CameraState.StateError create(int);
+    method public static androidx.camera.core.CameraState.StateError create(int, Throwable?);
+    method public abstract Throwable? getCause();
+    method public abstract int getCode();
+    method public androidx.camera.core.CameraState.ErrorType getType();
+  }
+
+  public enum CameraState.Type {
+    enum_constant public static final androidx.camera.core.CameraState.Type CLOSED;
+    enum_constant public static final androidx.camera.core.CameraState.Type CLOSING;
+    enum_constant public static final androidx.camera.core.CameraState.Type OPEN;
+    enum_constant public static final androidx.camera.core.CameraState.Type OPENING;
+    enum_constant public static final androidx.camera.core.CameraState.Type PENDING_OPEN;
+  }
+
+  @RequiresApi(21) public class CameraUnavailableException extends java.lang.Exception {
+    ctor public CameraUnavailableException(int);
+    ctor public CameraUnavailableException(int, String?);
+    ctor public CameraUnavailableException(int, String?, Throwable?);
+    ctor public CameraUnavailableException(int, Throwable?);
+    method public int getReason();
+    field public static final int CAMERA_DISABLED = 1; // 0x1
+    field public static final int CAMERA_DISCONNECTED = 2; // 0x2
+    field public static final int CAMERA_ERROR = 3; // 0x3
+    field public static final int CAMERA_IN_USE = 4; // 0x4
+    field public static final int CAMERA_MAX_IN_USE = 5; // 0x5
+    field public static final int CAMERA_UNAVAILABLE_DO_NOT_DISTURB = 6; // 0x6
+    field public static final int CAMERA_UNKNOWN_ERROR = 0; // 0x0
+  }
+
+  @RequiresApi(21) public final class CameraXConfig {
+    method public androidx.camera.core.CameraSelector? getAvailableCamerasLimiter(androidx.camera.core.CameraSelector?);
+    method public java.util.concurrent.Executor? getCameraExecutor(java.util.concurrent.Executor?);
+    method public int getMinimumLoggingLevel();
+    method public android.os.Handler? getSchedulerHandler(android.os.Handler?);
+  }
+
+  public static final class CameraXConfig.Builder {
+    method public androidx.camera.core.CameraXConfig build();
+    method public static androidx.camera.core.CameraXConfig.Builder fromConfig(androidx.camera.core.CameraXConfig);
+    method public androidx.camera.core.CameraXConfig.Builder setAvailableCamerasLimiter(androidx.camera.core.CameraSelector);
+    method public androidx.camera.core.CameraXConfig.Builder setCameraExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.CameraXConfig.Builder setMinimumLoggingLevel(@IntRange(from=android.util.Log.DEBUG, to=android.util.Log.ERROR) int);
+    method public androidx.camera.core.CameraXConfig.Builder setSchedulerHandler(android.os.Handler);
+  }
+
+  public static interface CameraXConfig.Provider {
+    method public androidx.camera.core.CameraXConfig getCameraXConfig();
+  }
+
+  @RequiresApi(21) public final class DisplayOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public DisplayOrientedMeteringPointFactory(android.view.Display, androidx.camera.core.CameraInfo, float, float);
+  }
+
+  @RequiresApi(21) public interface ExposureState {
+    method public int getExposureCompensationIndex();
+    method public android.util.Range<java.lang.Integer!> getExposureCompensationRange();
+    method public android.util.Rational getExposureCompensationStep();
+    method public boolean isExposureCompensationSupported();
+  }
+
+  @RequiresApi(21) public interface ExtendableBuilder<T> {
+    method public T build();
+  }
+
+  @RequiresApi(21) public final class FocusMeteringAction {
+    method public long getAutoCancelDurationInMillis();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAe();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAf();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAwb();
+    method public boolean isAutoCancelEnabled();
+    field public static final int FLAG_AE = 2; // 0x2
+    field public static final int FLAG_AF = 1; // 0x1
+    field public static final int FLAG_AWB = 4; // 0x4
+  }
+
+  public static class FocusMeteringAction.Builder {
+    ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint);
+    ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction build();
+    method public androidx.camera.core.FocusMeteringAction.Builder disableAutoCancel();
+    method public androidx.camera.core.FocusMeteringAction.Builder setAutoCancelDuration(@IntRange(from=1) long, java.util.concurrent.TimeUnit);
+  }
+
+  @RequiresApi(21) public final class FocusMeteringResult {
+    method public boolean isFocusSuccessful();
+  }
+
+  @RequiresApi(21) public final class ImageAnalysis extends androidx.camera.core.UseCase {
+    method public void clearAnalyzer();
+    method public int getBackpressureStrategy();
+    method public int getImageQueueDepth();
+    method public int getOutputImageFormat();
+    method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
+    method public int getTargetRotation();
+    method public boolean isOutputImageRotationEnabled();
+    method public void setAnalyzer(java.util.concurrent.Executor, androidx.camera.core.ImageAnalysis.Analyzer);
+    method public void setTargetRotation(int);
+    field public static final int COORDINATE_SYSTEM_ORIGINAL = 0; // 0x0
+    field public static final int OUTPUT_IMAGE_FORMAT_RGBA_8888 = 2; // 0x2
+    field public static final int OUTPUT_IMAGE_FORMAT_YUV_420_888 = 1; // 0x1
+    field public static final int STRATEGY_BLOCK_PRODUCER = 1; // 0x1
+    field public static final int STRATEGY_KEEP_ONLY_LATEST = 0; // 0x0
+  }
+
+  public static interface ImageAnalysis.Analyzer {
+    method public void analyze(androidx.camera.core.ImageProxy);
+    method public default android.util.Size? getDefaultTargetResolution();
+    method public default int getTargetCoordinateSystem();
+    method public default void updateTransform(android.graphics.Matrix?);
+  }
+
+  public static final class ImageAnalysis.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageAnalysis> {
+    ctor public ImageAnalysis.Builder();
+    method public androidx.camera.core.ImageAnalysis build();
+    method public androidx.camera.core.ImageAnalysis.Builder setBackgroundExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageAnalysis.Builder setBackpressureStrategy(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setImageQueueDepth(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setOutputImageFormat(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setOutputImageRotationEnabled(boolean);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetName(String);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetRotation(int);
+  }
+
+  @RequiresApi(21) public final class ImageCapture extends androidx.camera.core.UseCase {
+    method public int getCaptureMode();
+    method public int getFlashMode();
+    method @IntRange(from=1, to=100) public int getJpegQuality();
+    method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
+    method public int getTargetRotation();
+    method public void setCropAspectRatio(android.util.Rational);
+    method public void setFlashMode(int);
+    method public void setTargetRotation(int);
+    method public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
+    method public void takePicture(androidx.camera.core.ImageCapture.OutputFileOptions, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    field public static final int CAPTURE_MODE_MAXIMIZE_QUALITY = 0; // 0x0
+    field public static final int CAPTURE_MODE_MINIMIZE_LATENCY = 1; // 0x1
+    field public static final int ERROR_CAMERA_CLOSED = 3; // 0x3
+    field public static final int ERROR_CAPTURE_FAILED = 2; // 0x2
+    field public static final int ERROR_FILE_IO = 1; // 0x1
+    field public static final int ERROR_INVALID_CAMERA = 4; // 0x4
+    field public static final int ERROR_UNKNOWN = 0; // 0x0
+    field public static final int FLASH_MODE_AUTO = 0; // 0x0
+    field public static final int FLASH_MODE_OFF = 2; // 0x2
+    field public static final int FLASH_MODE_ON = 1; // 0x1
+  }
+
+  public static final class ImageCapture.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageCapture> {
+    ctor public ImageCapture.Builder();
+    method public androidx.camera.core.ImageCapture build();
+    method public androidx.camera.core.ImageCapture.Builder setCaptureMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setFlashMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setIoExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageCapture.Builder setJpegQuality(@IntRange(from=1, to=100) int);
+    method public androidx.camera.core.ImageCapture.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageCapture.Builder setTargetName(String);
+    method public androidx.camera.core.ImageCapture.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageCapture.Builder setTargetRotation(int);
+  }
+
+  public static final class ImageCapture.Metadata {
+    ctor public ImageCapture.Metadata();
+    method public android.location.Location? getLocation();
+    method public boolean isReversedHorizontal();
+    method public boolean isReversedVertical();
+    method public void setLocation(android.location.Location?);
+    method public void setReversedHorizontal(boolean);
+    method public void setReversedVertical(boolean);
+  }
+
+  public abstract static class ImageCapture.OnImageCapturedCallback {
+    ctor public ImageCapture.OnImageCapturedCallback();
+    method public void onCaptureSuccess(androidx.camera.core.ImageProxy);
+    method public void onError(androidx.camera.core.ImageCaptureException);
+  }
+
+  public static interface ImageCapture.OnImageSavedCallback {
+    method public void onError(androidx.camera.core.ImageCaptureException);
+    method public void onImageSaved(androidx.camera.core.ImageCapture.OutputFileResults);
+  }
+
+  public static final class ImageCapture.OutputFileOptions {
+  }
+
+  public static final class ImageCapture.OutputFileOptions.Builder {
+    ctor public ImageCapture.OutputFileOptions.Builder(java.io.File);
+    ctor public ImageCapture.OutputFileOptions.Builder(android.content.ContentResolver, android.net.Uri, android.content.ContentValues);
+    ctor public ImageCapture.OutputFileOptions.Builder(java.io.OutputStream);
+    method public androidx.camera.core.ImageCapture.OutputFileOptions build();
+    method public androidx.camera.core.ImageCapture.OutputFileOptions.Builder setMetadata(androidx.camera.core.ImageCapture.Metadata);
+  }
+
+  public static class ImageCapture.OutputFileResults {
+    method public android.net.Uri? getSavedUri();
+  }
+
+  @RequiresApi(21) public class ImageCaptureException extends java.lang.Exception {
+    ctor public ImageCaptureException(int, String, Throwable?);
+    method public int getImageCaptureError();
+  }
+
+  @RequiresApi(21) public interface ImageInfo {
+    method public int getRotationDegrees();
+    method public default android.graphics.Matrix getSensorToBufferTransformMatrix();
+    method public long getTimestamp();
+  }
+
+  @RequiresApi(21) public interface ImageProxy extends java.lang.AutoCloseable {
+    method public void close();
+    method public android.graphics.Rect getCropRect();
+    method public int getFormat();
+    method public int getHeight();
+    method public androidx.camera.core.ImageInfo getImageInfo();
+    method public androidx.camera.core.ImageProxy.PlaneProxy![] getPlanes();
+    method public int getWidth();
+    method public void setCropRect(android.graphics.Rect?);
+  }
+
+  public static interface ImageProxy.PlaneProxy {
+    method public java.nio.ByteBuffer getBuffer();
+    method public int getPixelStride();
+    method public int getRowStride();
+  }
+
+  @RequiresApi(21) public class InitializationException extends java.lang.Exception {
+    ctor public InitializationException(String?);
+    ctor public InitializationException(String?, Throwable?);
+    ctor public InitializationException(Throwable?);
+  }
+
+  @RequiresApi(21) public class MeteringPoint {
+    method public float getSize();
+  }
+
+  @RequiresApi(21) public abstract class MeteringPointFactory {
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float);
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float, float);
+    method public static float getDefaultPointSize();
+  }
+
+  @RequiresApi(21) public final class Preview extends androidx.camera.core.UseCase {
+    method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
+    method public int getTargetRotation();
+    method @UiThread public void setSurfaceProvider(java.util.concurrent.Executor, androidx.camera.core.Preview.SurfaceProvider?);
+    method @UiThread public void setSurfaceProvider(androidx.camera.core.Preview.SurfaceProvider?);
+    method public void setTargetRotation(int);
+  }
+
+  public static final class Preview.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.Preview> {
+    ctor public Preview.Builder();
+    method public androidx.camera.core.Preview build();
+    method public androidx.camera.core.Preview.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.Preview.Builder setTargetName(String);
+    method public androidx.camera.core.Preview.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.Preview.Builder setTargetRotation(int);
+  }
+
+  public static interface Preview.SurfaceProvider {
+    method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+  }
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class ResolutionInfo {
+    method public abstract android.graphics.Rect getCropRect();
+    method public abstract android.util.Size getResolution();
+    method public abstract int getRotationDegrees();
+  }
+
+  @RequiresApi(21) public class SurfaceOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public SurfaceOrientedMeteringPointFactory(float, float);
+    ctor public SurfaceOrientedMeteringPointFactory(float, float, androidx.camera.core.UseCase);
+  }
+
+  @RequiresApi(21) public final class SurfaceRequest {
+    method public void addRequestCancellationListener(java.util.concurrent.Executor, Runnable);
+    method public void clearTransformationInfoListener();
+    method public android.util.Size getResolution();
+    method public void provideSurface(android.view.Surface, java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.camera.core.SurfaceRequest.Result!>);
+    method public void setTransformationInfoListener(java.util.concurrent.Executor, androidx.camera.core.SurfaceRequest.TransformationInfoListener);
+    method public boolean willNotProvideSurface();
+  }
+
+  @com.google.auto.value.AutoValue public abstract static class SurfaceRequest.Result {
+    method public abstract int getResultCode();
+    method public abstract android.view.Surface getSurface();
+    field public static final int RESULT_INVALID_SURFACE = 2; // 0x2
+    field public static final int RESULT_REQUEST_CANCELLED = 1; // 0x1
+    field public static final int RESULT_SURFACE_ALREADY_PROVIDED = 3; // 0x3
+    field public static final int RESULT_SURFACE_USED_SUCCESSFULLY = 0; // 0x0
+    field public static final int RESULT_WILL_NOT_PROVIDE_SURFACE = 4; // 0x4
+  }
+
+  @com.google.auto.value.AutoValue public abstract static class SurfaceRequest.TransformationInfo {
+    method public abstract android.graphics.Rect getCropRect();
+    method public abstract int getRotationDegrees();
+  }
+
+  public static interface SurfaceRequest.TransformationInfoListener {
+    method public void onTransformationInfoUpdate(androidx.camera.core.SurfaceRequest.TransformationInfo);
+  }
+
+  @RequiresApi(21) public class TorchState {
+    field public static final int OFF = 0; // 0x0
+    field public static final int ON = 1; // 0x1
+  }
+
+  @RequiresApi(21) public abstract class UseCase {
+  }
+
+  @RequiresApi(21) public final class UseCaseGroup {
+    method public java.util.List<androidx.camera.core.UseCase!> getUseCases();
+    method public androidx.camera.core.ViewPort? getViewPort();
+  }
+
+  public static final class UseCaseGroup.Builder {
+    ctor public UseCaseGroup.Builder();
+    method public androidx.camera.core.UseCaseGroup.Builder addUseCase(androidx.camera.core.UseCase);
+    method public androidx.camera.core.UseCaseGroup build();
+    method public androidx.camera.core.UseCaseGroup.Builder setViewPort(androidx.camera.core.ViewPort);
+  }
+
+  @RequiresApi(21) public final class ViewPort {
+    method public android.util.Rational getAspectRatio();
+    method public int getLayoutDirection();
+    method public int getRotation();
+    method public int getScaleType();
+    field public static final int FILL_CENTER = 1; // 0x1
+    field public static final int FILL_END = 2; // 0x2
+    field public static final int FILL_START = 0; // 0x0
+    field public static final int FIT = 3; // 0x3
+  }
+
+  public static final class ViewPort.Builder {
+    ctor public ViewPort.Builder(android.util.Rational, int);
+    method public androidx.camera.core.ViewPort build();
+    method public androidx.camera.core.ViewPort.Builder setLayoutDirection(int);
+    method public androidx.camera.core.ViewPort.Builder setScaleType(int);
+  }
+
+  @RequiresApi(21) public interface ZoomState {
+    method public float getLinearZoom();
+    method public float getMaxZoomRatio();
+    method public float getMinZoomRatio();
+    method public float getZoomRatio();
+  }
+
+}
+
diff --git a/camera/camera-core/api/public_plus_experimental_1.2.0-beta01.txt b/camera/camera-core/api/public_plus_experimental_1.2.0-beta01.txt
new file mode 100644
index 0000000..613a450
--- /dev/null
+++ b/camera/camera-core/api/public_plus_experimental_1.2.0-beta01.txt
@@ -0,0 +1,450 @@
+// Signature format: 4.0
+package androidx.camera.core {
+
+  @RequiresApi(21) public class AspectRatio {
+    field public static final int RATIO_16_9 = 1; // 0x1
+    field public static final int RATIO_4_3 = 0; // 0x0
+  }
+
+  @RequiresApi(21) public interface Camera {
+    method public androidx.camera.core.CameraControl getCameraControl();
+    method public androidx.camera.core.CameraInfo getCameraInfo();
+  }
+
+  @RequiresApi(21) public interface CameraControl {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelFocusAndMetering();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Integer!> setExposureCompensationIndex(int);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setLinearZoom(@FloatRange(from=0.0f, to=1.0f) float);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setZoomRatio(float);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.FocusMeteringResult!> startFocusAndMetering(androidx.camera.core.FocusMeteringAction);
+  }
+
+  public static final class CameraControl.OperationCanceledException extends java.lang.Exception {
+  }
+
+  @RequiresApi(21) public interface CameraFilter {
+    method public java.util.List<androidx.camera.core.CameraInfo!> filter(java.util.List<androidx.camera.core.CameraInfo!>);
+  }
+
+  @RequiresApi(21) public interface CameraInfo {
+    method public androidx.camera.core.CameraSelector getCameraSelector();
+    method public androidx.lifecycle.LiveData<androidx.camera.core.CameraState!> getCameraState();
+    method public androidx.camera.core.ExposureState getExposureState();
+    method public int getSensorRotationDegrees();
+    method public int getSensorRotationDegrees(int);
+    method public androidx.lifecycle.LiveData<java.lang.Integer!> getTorchState();
+    method public androidx.lifecycle.LiveData<androidx.camera.core.ZoomState!> getZoomState();
+    method public boolean hasFlashUnit();
+    method public default boolean isFocusMeteringSupported(androidx.camera.core.FocusMeteringAction);
+    method @androidx.camera.core.ExperimentalZeroShutterLag public default boolean isZslSupported();
+  }
+
+  @RequiresApi(21) public final class CameraInfoUnavailableException extends java.lang.Exception {
+  }
+
+  @RequiresApi(21) public interface CameraProvider {
+    method public java.util.List<androidx.camera.core.CameraInfo!> getAvailableCameraInfos();
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+  }
+
+  @RequiresApi(21) public final class CameraSelector {
+    method public java.util.List<androidx.camera.core.CameraInfo!> filter(java.util.List<androidx.camera.core.CameraInfo!>);
+    field public static final androidx.camera.core.CameraSelector DEFAULT_BACK_CAMERA;
+    field public static final androidx.camera.core.CameraSelector DEFAULT_FRONT_CAMERA;
+    field public static final int LENS_FACING_BACK = 1; // 0x1
+    field public static final int LENS_FACING_FRONT = 0; // 0x0
+  }
+
+  public static final class CameraSelector.Builder {
+    ctor public CameraSelector.Builder();
+    method public androidx.camera.core.CameraSelector.Builder addCameraFilter(androidx.camera.core.CameraFilter);
+    method public androidx.camera.core.CameraSelector build();
+    method public androidx.camera.core.CameraSelector.Builder requireLensFacing(int);
+  }
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class CameraState {
+    ctor public CameraState();
+    method public static androidx.camera.core.CameraState create(androidx.camera.core.CameraState.Type);
+    method public static androidx.camera.core.CameraState create(androidx.camera.core.CameraState.Type, androidx.camera.core.CameraState.StateError?);
+    method public abstract androidx.camera.core.CameraState.StateError? getError();
+    method public abstract androidx.camera.core.CameraState.Type getType();
+    field public static final int ERROR_CAMERA_DISABLED = 5; // 0x5
+    field public static final int ERROR_CAMERA_FATAL_ERROR = 6; // 0x6
+    field public static final int ERROR_CAMERA_IN_USE = 2; // 0x2
+    field public static final int ERROR_DO_NOT_DISTURB_MODE_ENABLED = 7; // 0x7
+    field public static final int ERROR_MAX_CAMERAS_IN_USE = 1; // 0x1
+    field public static final int ERROR_OTHER_RECOVERABLE_ERROR = 3; // 0x3
+    field public static final int ERROR_STREAM_CONFIG = 4; // 0x4
+  }
+
+  public enum CameraState.ErrorType {
+    enum_constant public static final androidx.camera.core.CameraState.ErrorType CRITICAL;
+    enum_constant public static final androidx.camera.core.CameraState.ErrorType RECOVERABLE;
+  }
+
+  @com.google.auto.value.AutoValue public abstract static class CameraState.StateError {
+    ctor public CameraState.StateError();
+    method public static androidx.camera.core.CameraState.StateError create(int);
+    method public static androidx.camera.core.CameraState.StateError create(int, Throwable?);
+    method public abstract Throwable? getCause();
+    method public abstract int getCode();
+    method public androidx.camera.core.CameraState.ErrorType getType();
+  }
+
+  public enum CameraState.Type {
+    enum_constant public static final androidx.camera.core.CameraState.Type CLOSED;
+    enum_constant public static final androidx.camera.core.CameraState.Type CLOSING;
+    enum_constant public static final androidx.camera.core.CameraState.Type OPEN;
+    enum_constant public static final androidx.camera.core.CameraState.Type OPENING;
+    enum_constant public static final androidx.camera.core.CameraState.Type PENDING_OPEN;
+  }
+
+  @RequiresApi(21) public class CameraUnavailableException extends java.lang.Exception {
+    ctor public CameraUnavailableException(int);
+    ctor public CameraUnavailableException(int, String?);
+    ctor public CameraUnavailableException(int, String?, Throwable?);
+    ctor public CameraUnavailableException(int, Throwable?);
+    method public int getReason();
+    field public static final int CAMERA_DISABLED = 1; // 0x1
+    field public static final int CAMERA_DISCONNECTED = 2; // 0x2
+    field public static final int CAMERA_ERROR = 3; // 0x3
+    field public static final int CAMERA_IN_USE = 4; // 0x4
+    field public static final int CAMERA_MAX_IN_USE = 5; // 0x5
+    field public static final int CAMERA_UNAVAILABLE_DO_NOT_DISTURB = 6; // 0x6
+    field public static final int CAMERA_UNKNOWN_ERROR = 0; // 0x0
+  }
+
+  @RequiresApi(21) public final class CameraXConfig {
+    method public androidx.camera.core.CameraSelector? getAvailableCamerasLimiter(androidx.camera.core.CameraSelector?);
+    method public java.util.concurrent.Executor? getCameraExecutor(java.util.concurrent.Executor?);
+    method public int getMinimumLoggingLevel();
+    method public android.os.Handler? getSchedulerHandler(android.os.Handler?);
+  }
+
+  public static final class CameraXConfig.Builder {
+    method public androidx.camera.core.CameraXConfig build();
+    method public static androidx.camera.core.CameraXConfig.Builder fromConfig(androidx.camera.core.CameraXConfig);
+    method public androidx.camera.core.CameraXConfig.Builder setAvailableCamerasLimiter(androidx.camera.core.CameraSelector);
+    method public androidx.camera.core.CameraXConfig.Builder setCameraExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.CameraXConfig.Builder setMinimumLoggingLevel(@IntRange(from=android.util.Log.DEBUG, to=android.util.Log.ERROR) int);
+    method public androidx.camera.core.CameraXConfig.Builder setSchedulerHandler(android.os.Handler);
+  }
+
+  public static interface CameraXConfig.Provider {
+    method public androidx.camera.core.CameraXConfig getCameraXConfig();
+  }
+
+  @RequiresApi(21) public final class DisplayOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public DisplayOrientedMeteringPointFactory(android.view.Display, androidx.camera.core.CameraInfo, float, float);
+  }
+
+  @RequiresApi(21) @RequiresOptIn @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ExperimentalGetImage {
+  }
+
+  @RequiresOptIn @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ExperimentalUseCaseApi {
+  }
+
+  @RequiresOptIn @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ExperimentalZeroShutterLag {
+  }
+
+  @RequiresApi(21) public interface ExposureState {
+    method public int getExposureCompensationIndex();
+    method public android.util.Range<java.lang.Integer!> getExposureCompensationRange();
+    method public android.util.Rational getExposureCompensationStep();
+    method public boolean isExposureCompensationSupported();
+  }
+
+  @RequiresApi(21) public interface ExtendableBuilder<T> {
+    method public T build();
+  }
+
+  @RequiresApi(21) public final class FocusMeteringAction {
+    method public long getAutoCancelDurationInMillis();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAe();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAf();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAwb();
+    method public boolean isAutoCancelEnabled();
+    field public static final int FLAG_AE = 2; // 0x2
+    field public static final int FLAG_AF = 1; // 0x1
+    field public static final int FLAG_AWB = 4; // 0x4
+  }
+
+  public static class FocusMeteringAction.Builder {
+    ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint);
+    ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction build();
+    method public androidx.camera.core.FocusMeteringAction.Builder disableAutoCancel();
+    method public androidx.camera.core.FocusMeteringAction.Builder setAutoCancelDuration(@IntRange(from=1) long, java.util.concurrent.TimeUnit);
+  }
+
+  @RequiresApi(21) public final class FocusMeteringResult {
+    method public boolean isFocusSuccessful();
+  }
+
+  @RequiresApi(21) public final class ImageAnalysis extends androidx.camera.core.UseCase {
+    method public void clearAnalyzer();
+    method @androidx.camera.core.ExperimentalUseCaseApi public java.util.concurrent.Executor? getBackgroundExecutor();
+    method public int getBackpressureStrategy();
+    method public int getImageQueueDepth();
+    method public int getOutputImageFormat();
+    method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
+    method public int getTargetRotation();
+    method public boolean isOutputImageRotationEnabled();
+    method public void setAnalyzer(java.util.concurrent.Executor, androidx.camera.core.ImageAnalysis.Analyzer);
+    method public void setTargetRotation(int);
+    field public static final int COORDINATE_SYSTEM_ORIGINAL = 0; // 0x0
+    field public static final int OUTPUT_IMAGE_FORMAT_RGBA_8888 = 2; // 0x2
+    field public static final int OUTPUT_IMAGE_FORMAT_YUV_420_888 = 1; // 0x1
+    field public static final int STRATEGY_BLOCK_PRODUCER = 1; // 0x1
+    field public static final int STRATEGY_KEEP_ONLY_LATEST = 0; // 0x0
+  }
+
+  public static interface ImageAnalysis.Analyzer {
+    method public void analyze(androidx.camera.core.ImageProxy);
+    method public default android.util.Size? getDefaultTargetResolution();
+    method public default int getTargetCoordinateSystem();
+    method public default void updateTransform(android.graphics.Matrix?);
+  }
+
+  public static final class ImageAnalysis.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageAnalysis> {
+    ctor public ImageAnalysis.Builder();
+    method public androidx.camera.core.ImageAnalysis build();
+    method public androidx.camera.core.ImageAnalysis.Builder setBackgroundExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageAnalysis.Builder setBackpressureStrategy(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setImageQueueDepth(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setOutputImageFormat(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setOutputImageRotationEnabled(boolean);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetName(String);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetRotation(int);
+  }
+
+  @RequiresApi(21) public final class ImageCapture extends androidx.camera.core.UseCase {
+    method public int getCaptureMode();
+    method public int getFlashMode();
+    method @IntRange(from=1, to=100) public int getJpegQuality();
+    method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
+    method public int getTargetRotation();
+    method public void setCropAspectRatio(android.util.Rational);
+    method public void setFlashMode(int);
+    method public void setTargetRotation(int);
+    method public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
+    method public void takePicture(androidx.camera.core.ImageCapture.OutputFileOptions, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    field public static final int CAPTURE_MODE_MAXIMIZE_QUALITY = 0; // 0x0
+    field public static final int CAPTURE_MODE_MINIMIZE_LATENCY = 1; // 0x1
+    field @androidx.camera.core.ExperimentalZeroShutterLag public static final int CAPTURE_MODE_ZERO_SHUTTER_LAG = 2; // 0x2
+    field public static final int ERROR_CAMERA_CLOSED = 3; // 0x3
+    field public static final int ERROR_CAPTURE_FAILED = 2; // 0x2
+    field public static final int ERROR_FILE_IO = 1; // 0x1
+    field public static final int ERROR_INVALID_CAMERA = 4; // 0x4
+    field public static final int ERROR_UNKNOWN = 0; // 0x0
+    field public static final int FLASH_MODE_AUTO = 0; // 0x0
+    field public static final int FLASH_MODE_OFF = 2; // 0x2
+    field public static final int FLASH_MODE_ON = 1; // 0x1
+  }
+
+  public static final class ImageCapture.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageCapture> {
+    ctor public ImageCapture.Builder();
+    method public androidx.camera.core.ImageCapture build();
+    method public androidx.camera.core.ImageCapture.Builder setCaptureMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setFlashMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setIoExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageCapture.Builder setJpegQuality(@IntRange(from=1, to=100) int);
+    method public androidx.camera.core.ImageCapture.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageCapture.Builder setTargetName(String);
+    method public androidx.camera.core.ImageCapture.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageCapture.Builder setTargetRotation(int);
+  }
+
+  public static final class ImageCapture.Metadata {
+    ctor public ImageCapture.Metadata();
+    method public android.location.Location? getLocation();
+    method public boolean isReversedHorizontal();
+    method public boolean isReversedVertical();
+    method public void setLocation(android.location.Location?);
+    method public void setReversedHorizontal(boolean);
+    method public void setReversedVertical(boolean);
+  }
+
+  public abstract static class ImageCapture.OnImageCapturedCallback {
+    ctor public ImageCapture.OnImageCapturedCallback();
+    method public void onCaptureSuccess(androidx.camera.core.ImageProxy);
+    method public void onError(androidx.camera.core.ImageCaptureException);
+  }
+
+  public static interface ImageCapture.OnImageSavedCallback {
+    method public void onError(androidx.camera.core.ImageCaptureException);
+    method public void onImageSaved(androidx.camera.core.ImageCapture.OutputFileResults);
+  }
+
+  public static final class ImageCapture.OutputFileOptions {
+  }
+
+  public static final class ImageCapture.OutputFileOptions.Builder {
+    ctor public ImageCapture.OutputFileOptions.Builder(java.io.File);
+    ctor public ImageCapture.OutputFileOptions.Builder(android.content.ContentResolver, android.net.Uri, android.content.ContentValues);
+    ctor public ImageCapture.OutputFileOptions.Builder(java.io.OutputStream);
+    method public androidx.camera.core.ImageCapture.OutputFileOptions build();
+    method public androidx.camera.core.ImageCapture.OutputFileOptions.Builder setMetadata(androidx.camera.core.ImageCapture.Metadata);
+  }
+
+  public static class ImageCapture.OutputFileResults {
+    method public android.net.Uri? getSavedUri();
+  }
+
+  @RequiresApi(21) public class ImageCaptureException extends java.lang.Exception {
+    ctor public ImageCaptureException(int, String, Throwable?);
+    method public int getImageCaptureError();
+  }
+
+  @RequiresApi(21) public interface ImageInfo {
+    method public int getRotationDegrees();
+    method public default android.graphics.Matrix getSensorToBufferTransformMatrix();
+    method public long getTimestamp();
+  }
+
+  @RequiresApi(21) public interface ImageProxy extends java.lang.AutoCloseable {
+    method public void close();
+    method public android.graphics.Rect getCropRect();
+    method public int getFormat();
+    method public int getHeight();
+    method @androidx.camera.core.ExperimentalGetImage public android.media.Image? getImage();
+    method public androidx.camera.core.ImageInfo getImageInfo();
+    method public androidx.camera.core.ImageProxy.PlaneProxy![] getPlanes();
+    method public int getWidth();
+    method public void setCropRect(android.graphics.Rect?);
+  }
+
+  public static interface ImageProxy.PlaneProxy {
+    method public java.nio.ByteBuffer getBuffer();
+    method public int getPixelStride();
+    method public int getRowStride();
+  }
+
+  @RequiresApi(21) public class InitializationException extends java.lang.Exception {
+    ctor public InitializationException(String?);
+    ctor public InitializationException(String?, Throwable?);
+    ctor public InitializationException(Throwable?);
+  }
+
+  @RequiresApi(21) public class MeteringPoint {
+    method public float getSize();
+  }
+
+  @RequiresApi(21) public abstract class MeteringPointFactory {
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float);
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float, float);
+    method public static float getDefaultPointSize();
+  }
+
+  @RequiresApi(21) public final class Preview extends androidx.camera.core.UseCase {
+    method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
+    method public int getTargetRotation();
+    method @UiThread public void setSurfaceProvider(java.util.concurrent.Executor, androidx.camera.core.Preview.SurfaceProvider?);
+    method @UiThread public void setSurfaceProvider(androidx.camera.core.Preview.SurfaceProvider?);
+    method public void setTargetRotation(int);
+  }
+
+  public static final class Preview.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.Preview> {
+    ctor public Preview.Builder();
+    method public androidx.camera.core.Preview build();
+    method public androidx.camera.core.Preview.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.Preview.Builder setTargetName(String);
+    method public androidx.camera.core.Preview.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.Preview.Builder setTargetRotation(int);
+  }
+
+  public static interface Preview.SurfaceProvider {
+    method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+  }
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class ResolutionInfo {
+    method public abstract android.graphics.Rect getCropRect();
+    method public abstract android.util.Size getResolution();
+    method public abstract int getRotationDegrees();
+  }
+
+  @RequiresApi(21) public class SurfaceOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public SurfaceOrientedMeteringPointFactory(float, float);
+    ctor public SurfaceOrientedMeteringPointFactory(float, float, androidx.camera.core.UseCase);
+  }
+
+  @RequiresApi(21) public final class SurfaceRequest {
+    method public void addRequestCancellationListener(java.util.concurrent.Executor, Runnable);
+    method public void clearTransformationInfoListener();
+    method public android.util.Size getResolution();
+    method public void provideSurface(android.view.Surface, java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.camera.core.SurfaceRequest.Result!>);
+    method public void setTransformationInfoListener(java.util.concurrent.Executor, androidx.camera.core.SurfaceRequest.TransformationInfoListener);
+    method public boolean willNotProvideSurface();
+  }
+
+  @com.google.auto.value.AutoValue public abstract static class SurfaceRequest.Result {
+    method public abstract int getResultCode();
+    method public abstract android.view.Surface getSurface();
+    field public static final int RESULT_INVALID_SURFACE = 2; // 0x2
+    field public static final int RESULT_REQUEST_CANCELLED = 1; // 0x1
+    field public static final int RESULT_SURFACE_ALREADY_PROVIDED = 3; // 0x3
+    field public static final int RESULT_SURFACE_USED_SUCCESSFULLY = 0; // 0x0
+    field public static final int RESULT_WILL_NOT_PROVIDE_SURFACE = 4; // 0x4
+  }
+
+  @com.google.auto.value.AutoValue public abstract static class SurfaceRequest.TransformationInfo {
+    method public abstract android.graphics.Rect getCropRect();
+    method public abstract int getRotationDegrees();
+  }
+
+  public static interface SurfaceRequest.TransformationInfoListener {
+    method public void onTransformationInfoUpdate(androidx.camera.core.SurfaceRequest.TransformationInfo);
+  }
+
+  @RequiresApi(21) public class TorchState {
+    field public static final int OFF = 0; // 0x0
+    field public static final int ON = 1; // 0x1
+  }
+
+  @RequiresApi(21) public abstract class UseCase {
+  }
+
+  @RequiresApi(21) public final class UseCaseGroup {
+    method public java.util.List<androidx.camera.core.UseCase!> getUseCases();
+    method public androidx.camera.core.ViewPort? getViewPort();
+  }
+
+  public static final class UseCaseGroup.Builder {
+    ctor public UseCaseGroup.Builder();
+    method public androidx.camera.core.UseCaseGroup.Builder addUseCase(androidx.camera.core.UseCase);
+    method public androidx.camera.core.UseCaseGroup build();
+    method public androidx.camera.core.UseCaseGroup.Builder setViewPort(androidx.camera.core.ViewPort);
+  }
+
+  @RequiresApi(21) public final class ViewPort {
+    method public android.util.Rational getAspectRatio();
+    method public int getLayoutDirection();
+    method public int getRotation();
+    method public int getScaleType();
+    field public static final int FILL_CENTER = 1; // 0x1
+    field public static final int FILL_END = 2; // 0x2
+    field public static final int FILL_START = 0; // 0x0
+    field public static final int FIT = 3; // 0x3
+  }
+
+  public static final class ViewPort.Builder {
+    ctor public ViewPort.Builder(android.util.Rational, int);
+    method public androidx.camera.core.ViewPort build();
+    method public androidx.camera.core.ViewPort.Builder setLayoutDirection(int);
+    method public androidx.camera.core.ViewPort.Builder setScaleType(int);
+  }
+
+  @RequiresApi(21) public interface ZoomState {
+    method public float getLinearZoom();
+    method public float getMaxZoomRatio();
+    method public float getMinZoomRatio();
+    method public float getZoomRatio();
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/camera/camera-core/api/res-1.2.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to camera/camera-core/api/res-1.2.0-beta01.txt
diff --git a/camera/camera-core/api/restricted_1.2.0-beta01.txt b/camera/camera-core/api/restricted_1.2.0-beta01.txt
new file mode 100644
index 0000000..9aaeb6b
--- /dev/null
+++ b/camera/camera-core/api/restricted_1.2.0-beta01.txt
@@ -0,0 +1,437 @@
+// Signature format: 4.0
+package androidx.camera.core {
+
+  @RequiresApi(21) public class AspectRatio {
+    field public static final int RATIO_16_9 = 1; // 0x1
+    field public static final int RATIO_4_3 = 0; // 0x0
+  }
+
+  @RequiresApi(21) public interface Camera {
+    method public androidx.camera.core.CameraControl getCameraControl();
+    method public androidx.camera.core.CameraInfo getCameraInfo();
+  }
+
+  @RequiresApi(21) public interface CameraControl {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelFocusAndMetering();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Integer!> setExposureCompensationIndex(int);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setLinearZoom(@FloatRange(from=0.0f, to=1.0f) float);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setZoomRatio(float);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.FocusMeteringResult!> startFocusAndMetering(androidx.camera.core.FocusMeteringAction);
+  }
+
+  public static final class CameraControl.OperationCanceledException extends java.lang.Exception {
+  }
+
+  @RequiresApi(21) public interface CameraFilter {
+    method public java.util.List<androidx.camera.core.CameraInfo!> filter(java.util.List<androidx.camera.core.CameraInfo!>);
+  }
+
+  @RequiresApi(21) public interface CameraInfo {
+    method public androidx.camera.core.CameraSelector getCameraSelector();
+    method public androidx.lifecycle.LiveData<androidx.camera.core.CameraState!> getCameraState();
+    method public androidx.camera.core.ExposureState getExposureState();
+    method public int getSensorRotationDegrees();
+    method public int getSensorRotationDegrees(int);
+    method public androidx.lifecycle.LiveData<java.lang.Integer!> getTorchState();
+    method public androidx.lifecycle.LiveData<androidx.camera.core.ZoomState!> getZoomState();
+    method public boolean hasFlashUnit();
+    method public default boolean isFocusMeteringSupported(androidx.camera.core.FocusMeteringAction);
+  }
+
+  @RequiresApi(21) public final class CameraInfoUnavailableException extends java.lang.Exception {
+  }
+
+  @RequiresApi(21) public interface CameraProvider {
+    method public java.util.List<androidx.camera.core.CameraInfo!> getAvailableCameraInfos();
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+  }
+
+  @RequiresApi(21) public final class CameraSelector {
+    method public java.util.List<androidx.camera.core.CameraInfo!> filter(java.util.List<androidx.camera.core.CameraInfo!>);
+    field public static final androidx.camera.core.CameraSelector DEFAULT_BACK_CAMERA;
+    field public static final androidx.camera.core.CameraSelector DEFAULT_FRONT_CAMERA;
+    field public static final int LENS_FACING_BACK = 1; // 0x1
+    field public static final int LENS_FACING_FRONT = 0; // 0x0
+  }
+
+  public static final class CameraSelector.Builder {
+    ctor public CameraSelector.Builder();
+    method public androidx.camera.core.CameraSelector.Builder addCameraFilter(androidx.camera.core.CameraFilter);
+    method public androidx.camera.core.CameraSelector build();
+    method public androidx.camera.core.CameraSelector.Builder requireLensFacing(int);
+  }
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class CameraState {
+    ctor public CameraState();
+    method public static androidx.camera.core.CameraState create(androidx.camera.core.CameraState.Type);
+    method public static androidx.camera.core.CameraState create(androidx.camera.core.CameraState.Type, androidx.camera.core.CameraState.StateError?);
+    method public abstract androidx.camera.core.CameraState.StateError? getError();
+    method public abstract androidx.camera.core.CameraState.Type getType();
+    field public static final int ERROR_CAMERA_DISABLED = 5; // 0x5
+    field public static final int ERROR_CAMERA_FATAL_ERROR = 6; // 0x6
+    field public static final int ERROR_CAMERA_IN_USE = 2; // 0x2
+    field public static final int ERROR_DO_NOT_DISTURB_MODE_ENABLED = 7; // 0x7
+    field public static final int ERROR_MAX_CAMERAS_IN_USE = 1; // 0x1
+    field public static final int ERROR_OTHER_RECOVERABLE_ERROR = 3; // 0x3
+    field public static final int ERROR_STREAM_CONFIG = 4; // 0x4
+  }
+
+  public enum CameraState.ErrorType {
+    enum_constant public static final androidx.camera.core.CameraState.ErrorType CRITICAL;
+    enum_constant public static final androidx.camera.core.CameraState.ErrorType RECOVERABLE;
+  }
+
+  @com.google.auto.value.AutoValue public abstract static class CameraState.StateError {
+    ctor public CameraState.StateError();
+    method public static androidx.camera.core.CameraState.StateError create(int);
+    method public static androidx.camera.core.CameraState.StateError create(int, Throwable?);
+    method public abstract Throwable? getCause();
+    method public abstract int getCode();
+    method public androidx.camera.core.CameraState.ErrorType getType();
+  }
+
+  public enum CameraState.Type {
+    enum_constant public static final androidx.camera.core.CameraState.Type CLOSED;
+    enum_constant public static final androidx.camera.core.CameraState.Type CLOSING;
+    enum_constant public static final androidx.camera.core.CameraState.Type OPEN;
+    enum_constant public static final androidx.camera.core.CameraState.Type OPENING;
+    enum_constant public static final androidx.camera.core.CameraState.Type PENDING_OPEN;
+  }
+
+  @RequiresApi(21) public class CameraUnavailableException extends java.lang.Exception {
+    ctor public CameraUnavailableException(int);
+    ctor public CameraUnavailableException(int, String?);
+    ctor public CameraUnavailableException(int, String?, Throwable?);
+    ctor public CameraUnavailableException(int, Throwable?);
+    method public int getReason();
+    field public static final int CAMERA_DISABLED = 1; // 0x1
+    field public static final int CAMERA_DISCONNECTED = 2; // 0x2
+    field public static final int CAMERA_ERROR = 3; // 0x3
+    field public static final int CAMERA_IN_USE = 4; // 0x4
+    field public static final int CAMERA_MAX_IN_USE = 5; // 0x5
+    field public static final int CAMERA_UNAVAILABLE_DO_NOT_DISTURB = 6; // 0x6
+    field public static final int CAMERA_UNKNOWN_ERROR = 0; // 0x0
+  }
+
+  @RequiresApi(21) public final class CameraXConfig {
+    method public androidx.camera.core.CameraSelector? getAvailableCamerasLimiter(androidx.camera.core.CameraSelector?);
+    method public java.util.concurrent.Executor? getCameraExecutor(java.util.concurrent.Executor?);
+    method public int getMinimumLoggingLevel();
+    method public android.os.Handler? getSchedulerHandler(android.os.Handler?);
+  }
+
+  public static final class CameraXConfig.Builder {
+    method public androidx.camera.core.CameraXConfig build();
+    method public static androidx.camera.core.CameraXConfig.Builder fromConfig(androidx.camera.core.CameraXConfig);
+    method public androidx.camera.core.CameraXConfig.Builder setAvailableCamerasLimiter(androidx.camera.core.CameraSelector);
+    method public androidx.camera.core.CameraXConfig.Builder setCameraExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.CameraXConfig.Builder setMinimumLoggingLevel(@IntRange(from=android.util.Log.DEBUG, to=android.util.Log.ERROR) int);
+    method public androidx.camera.core.CameraXConfig.Builder setSchedulerHandler(android.os.Handler);
+  }
+
+  public static interface CameraXConfig.Provider {
+    method public androidx.camera.core.CameraXConfig getCameraXConfig();
+  }
+
+  @RequiresApi(21) public final class DisplayOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public DisplayOrientedMeteringPointFactory(android.view.Display, androidx.camera.core.CameraInfo, float, float);
+  }
+
+  @RequiresApi(21) public interface ExposureState {
+    method public int getExposureCompensationIndex();
+    method public android.util.Range<java.lang.Integer!> getExposureCompensationRange();
+    method public android.util.Rational getExposureCompensationStep();
+    method public boolean isExposureCompensationSupported();
+  }
+
+  @RequiresApi(21) public interface ExtendableBuilder<T> {
+    method public T build();
+  }
+
+  @RequiresApi(21) public final class FocusMeteringAction {
+    method public long getAutoCancelDurationInMillis();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAe();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAf();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAwb();
+    method public boolean isAutoCancelEnabled();
+    field public static final int FLAG_AE = 2; // 0x2
+    field public static final int FLAG_AF = 1; // 0x1
+    field public static final int FLAG_AWB = 4; // 0x4
+  }
+
+  public static class FocusMeteringAction.Builder {
+    ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint);
+    ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction build();
+    method public androidx.camera.core.FocusMeteringAction.Builder disableAutoCancel();
+    method public androidx.camera.core.FocusMeteringAction.Builder setAutoCancelDuration(@IntRange(from=1) long, java.util.concurrent.TimeUnit);
+  }
+
+  @RequiresApi(21) public final class FocusMeteringResult {
+    method public boolean isFocusSuccessful();
+  }
+
+  @RequiresApi(21) public final class ImageAnalysis extends androidx.camera.core.UseCase {
+    method public void clearAnalyzer();
+    method public int getBackpressureStrategy();
+    method public int getImageQueueDepth();
+    method public int getOutputImageFormat();
+    method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
+    method public int getTargetRotation();
+    method public boolean isOutputImageRotationEnabled();
+    method public void setAnalyzer(java.util.concurrent.Executor, androidx.camera.core.ImageAnalysis.Analyzer);
+    method public void setTargetRotation(int);
+    field public static final int COORDINATE_SYSTEM_ORIGINAL = 0; // 0x0
+    field public static final int OUTPUT_IMAGE_FORMAT_RGBA_8888 = 2; // 0x2
+    field public static final int OUTPUT_IMAGE_FORMAT_YUV_420_888 = 1; // 0x1
+    field public static final int STRATEGY_BLOCK_PRODUCER = 1; // 0x1
+    field public static final int STRATEGY_KEEP_ONLY_LATEST = 0; // 0x0
+  }
+
+  public static interface ImageAnalysis.Analyzer {
+    method public void analyze(androidx.camera.core.ImageProxy);
+    method public default android.util.Size? getDefaultTargetResolution();
+    method public default int getTargetCoordinateSystem();
+    method public default void updateTransform(android.graphics.Matrix?);
+  }
+
+  public static final class ImageAnalysis.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageAnalysis> {
+    ctor public ImageAnalysis.Builder();
+    method public androidx.camera.core.ImageAnalysis build();
+    method public androidx.camera.core.ImageAnalysis.Builder setBackgroundExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageAnalysis.Builder setBackpressureStrategy(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setImageQueueDepth(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setOutputImageFormat(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setOutputImageRotationEnabled(boolean);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetName(String);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetRotation(int);
+  }
+
+  @RequiresApi(21) public final class ImageCapture extends androidx.camera.core.UseCase {
+    method public int getCaptureMode();
+    method public int getFlashMode();
+    method @IntRange(from=1, to=100) public int getJpegQuality();
+    method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
+    method public int getTargetRotation();
+    method public void setCropAspectRatio(android.util.Rational);
+    method public void setFlashMode(int);
+    method public void setTargetRotation(int);
+    method public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
+    method public void takePicture(androidx.camera.core.ImageCapture.OutputFileOptions, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    field public static final int CAPTURE_MODE_MAXIMIZE_QUALITY = 0; // 0x0
+    field public static final int CAPTURE_MODE_MINIMIZE_LATENCY = 1; // 0x1
+    field public static final int ERROR_CAMERA_CLOSED = 3; // 0x3
+    field public static final int ERROR_CAPTURE_FAILED = 2; // 0x2
+    field public static final int ERROR_FILE_IO = 1; // 0x1
+    field public static final int ERROR_INVALID_CAMERA = 4; // 0x4
+    field public static final int ERROR_UNKNOWN = 0; // 0x0
+    field public static final int FLASH_MODE_AUTO = 0; // 0x0
+    field public static final int FLASH_MODE_OFF = 2; // 0x2
+    field public static final int FLASH_MODE_ON = 1; // 0x1
+  }
+
+  public static final class ImageCapture.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageCapture> {
+    ctor public ImageCapture.Builder();
+    method public androidx.camera.core.ImageCapture build();
+    method public androidx.camera.core.ImageCapture.Builder setCaptureMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setFlashMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setIoExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageCapture.Builder setJpegQuality(@IntRange(from=1, to=100) int);
+    method public androidx.camera.core.ImageCapture.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageCapture.Builder setTargetName(String);
+    method public androidx.camera.core.ImageCapture.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageCapture.Builder setTargetRotation(int);
+  }
+
+  public static final class ImageCapture.Metadata {
+    ctor public ImageCapture.Metadata();
+    method public android.location.Location? getLocation();
+    method public boolean isReversedHorizontal();
+    method public boolean isReversedVertical();
+    method public void setLocation(android.location.Location?);
+    method public void setReversedHorizontal(boolean);
+    method public void setReversedVertical(boolean);
+  }
+
+  public abstract static class ImageCapture.OnImageCapturedCallback {
+    ctor public ImageCapture.OnImageCapturedCallback();
+    method public void onCaptureSuccess(androidx.camera.core.ImageProxy);
+    method public void onError(androidx.camera.core.ImageCaptureException);
+  }
+
+  public static interface ImageCapture.OnImageSavedCallback {
+    method public void onError(androidx.camera.core.ImageCaptureException);
+    method public void onImageSaved(androidx.camera.core.ImageCapture.OutputFileResults);
+  }
+
+  public static final class ImageCapture.OutputFileOptions {
+  }
+
+  public static final class ImageCapture.OutputFileOptions.Builder {
+    ctor public ImageCapture.OutputFileOptions.Builder(java.io.File);
+    ctor public ImageCapture.OutputFileOptions.Builder(android.content.ContentResolver, android.net.Uri, android.content.ContentValues);
+    ctor public ImageCapture.OutputFileOptions.Builder(java.io.OutputStream);
+    method public androidx.camera.core.ImageCapture.OutputFileOptions build();
+    method public androidx.camera.core.ImageCapture.OutputFileOptions.Builder setMetadata(androidx.camera.core.ImageCapture.Metadata);
+  }
+
+  public static class ImageCapture.OutputFileResults {
+    method public android.net.Uri? getSavedUri();
+  }
+
+  @RequiresApi(21) public class ImageCaptureException extends java.lang.Exception {
+    ctor public ImageCaptureException(int, String, Throwable?);
+    method public int getImageCaptureError();
+  }
+
+  @RequiresApi(21) public interface ImageInfo {
+    method public int getRotationDegrees();
+    method public default android.graphics.Matrix getSensorToBufferTransformMatrix();
+    method public long getTimestamp();
+  }
+
+  @RequiresApi(21) public interface ImageProxy extends java.lang.AutoCloseable {
+    method public void close();
+    method public android.graphics.Rect getCropRect();
+    method public int getFormat();
+    method public int getHeight();
+    method public androidx.camera.core.ImageInfo getImageInfo();
+    method public androidx.camera.core.ImageProxy.PlaneProxy![] getPlanes();
+    method public int getWidth();
+    method public void setCropRect(android.graphics.Rect?);
+  }
+
+  public static interface ImageProxy.PlaneProxy {
+    method public java.nio.ByteBuffer getBuffer();
+    method public int getPixelStride();
+    method public int getRowStride();
+  }
+
+  @RequiresApi(21) public class InitializationException extends java.lang.Exception {
+    ctor public InitializationException(String?);
+    ctor public InitializationException(String?, Throwable?);
+    ctor public InitializationException(Throwable?);
+  }
+
+  @RequiresApi(21) public class MeteringPoint {
+    method public float getSize();
+  }
+
+  @RequiresApi(21) public abstract class MeteringPointFactory {
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float);
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float, float);
+    method public static float getDefaultPointSize();
+  }
+
+  @RequiresApi(21) public final class Preview extends androidx.camera.core.UseCase {
+    method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
+    method public int getTargetRotation();
+    method @UiThread public void setSurfaceProvider(java.util.concurrent.Executor, androidx.camera.core.Preview.SurfaceProvider?);
+    method @UiThread public void setSurfaceProvider(androidx.camera.core.Preview.SurfaceProvider?);
+    method public void setTargetRotation(int);
+  }
+
+  public static final class Preview.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.Preview> {
+    ctor public Preview.Builder();
+    method public androidx.camera.core.Preview build();
+    method public androidx.camera.core.Preview.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.Preview.Builder setTargetName(String);
+    method public androidx.camera.core.Preview.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.Preview.Builder setTargetRotation(int);
+  }
+
+  public static interface Preview.SurfaceProvider {
+    method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+  }
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class ResolutionInfo {
+    method public abstract android.graphics.Rect getCropRect();
+    method public abstract android.util.Size getResolution();
+    method public abstract int getRotationDegrees();
+  }
+
+  @RequiresApi(21) public class SurfaceOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public SurfaceOrientedMeteringPointFactory(float, float);
+    ctor public SurfaceOrientedMeteringPointFactory(float, float, androidx.camera.core.UseCase);
+  }
+
+  @RequiresApi(21) public final class SurfaceRequest {
+    method public void addRequestCancellationListener(java.util.concurrent.Executor, Runnable);
+    method public void clearTransformationInfoListener();
+    method public android.util.Size getResolution();
+    method public void provideSurface(android.view.Surface, java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.camera.core.SurfaceRequest.Result!>);
+    method public void setTransformationInfoListener(java.util.concurrent.Executor, androidx.camera.core.SurfaceRequest.TransformationInfoListener);
+    method public boolean willNotProvideSurface();
+  }
+
+  @com.google.auto.value.AutoValue public abstract static class SurfaceRequest.Result {
+    method public abstract int getResultCode();
+    method public abstract android.view.Surface getSurface();
+    field public static final int RESULT_INVALID_SURFACE = 2; // 0x2
+    field public static final int RESULT_REQUEST_CANCELLED = 1; // 0x1
+    field public static final int RESULT_SURFACE_ALREADY_PROVIDED = 3; // 0x3
+    field public static final int RESULT_SURFACE_USED_SUCCESSFULLY = 0; // 0x0
+    field public static final int RESULT_WILL_NOT_PROVIDE_SURFACE = 4; // 0x4
+  }
+
+  @com.google.auto.value.AutoValue public abstract static class SurfaceRequest.TransformationInfo {
+    method public abstract android.graphics.Rect getCropRect();
+    method public abstract int getRotationDegrees();
+  }
+
+  public static interface SurfaceRequest.TransformationInfoListener {
+    method public void onTransformationInfoUpdate(androidx.camera.core.SurfaceRequest.TransformationInfo);
+  }
+
+  @RequiresApi(21) public class TorchState {
+    field public static final int OFF = 0; // 0x0
+    field public static final int ON = 1; // 0x1
+  }
+
+  @RequiresApi(21) public abstract class UseCase {
+  }
+
+  @RequiresApi(21) public final class UseCaseGroup {
+    method public java.util.List<androidx.camera.core.UseCase!> getUseCases();
+    method public androidx.camera.core.ViewPort? getViewPort();
+  }
+
+  public static final class UseCaseGroup.Builder {
+    ctor public UseCaseGroup.Builder();
+    method public androidx.camera.core.UseCaseGroup.Builder addUseCase(androidx.camera.core.UseCase);
+    method public androidx.camera.core.UseCaseGroup build();
+    method public androidx.camera.core.UseCaseGroup.Builder setViewPort(androidx.camera.core.ViewPort);
+  }
+
+  @RequiresApi(21) public final class ViewPort {
+    method public android.util.Rational getAspectRatio();
+    method public int getLayoutDirection();
+    method public int getRotation();
+    method public int getScaleType();
+    field public static final int FILL_CENTER = 1; // 0x1
+    field public static final int FILL_END = 2; // 0x2
+    field public static final int FILL_START = 0; // 0x0
+    field public static final int FIT = 3; // 0x3
+  }
+
+  public static final class ViewPort.Builder {
+    ctor public ViewPort.Builder(android.util.Rational, int);
+    method public androidx.camera.core.ViewPort build();
+    method public androidx.camera.core.ViewPort.Builder setLayoutDirection(int);
+    method public androidx.camera.core.ViewPort.Builder setScaleType(int);
+  }
+
+  @RequiresApi(21) public interface ZoomState {
+    method public float getLinearZoom();
+    method public float getMaxZoomRatio();
+    method public float getMinZoomRatio();
+    method public float getZoomRatio();
+  }
+
+}
+
diff --git a/camera/camera-core/build.gradle b/camera/camera-core/build.gradle
index a266a1e..de3bb7b 100644
--- a/camera/camera-core/build.gradle
+++ b/camera/camera-core/build.gradle
@@ -39,6 +39,7 @@
 
     annotationProcessor(libs.autoValue)
 
+    testImplementation(libs.kotlinCoroutinesAndroid)
     testImplementation(libs.kotlinStdlib)
     testImplementation(libs.testCore)
     testImplementation(libs.testRunner)
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/processing/DefaultSurfaceEffectTest.kt b/camera/camera-core/src/androidTest/java/androidx/camera/core/processing/DefaultSurfaceEffectTest.kt
index a7a5d44..d80c7b3 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/processing/DefaultSurfaceEffectTest.kt
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/processing/DefaultSurfaceEffectTest.kt
@@ -16,13 +16,12 @@
 
 package androidx.camera.core.processing
 
+import android.graphics.Rect
 import android.hardware.camera2.CameraDevice.TEMPLATE_PREVIEW
-import android.media.ImageReader
-import android.os.Handler
-import android.os.HandlerThread
 import android.util.Size
 import android.view.Surface
 import androidx.camera.core.SurfaceEffect
+import androidx.camera.core.SurfaceOutput.GlTransformOptions.USE_SURFACE_TEXTURE_TRANSFORM
 import androidx.camera.core.SurfaceRequest
 import androidx.camera.core.impl.DeferrableSurface
 import androidx.camera.core.impl.ImageFormatConstants
@@ -38,15 +37,7 @@
 import com.google.common.truth.Truth.assertThat
 import java.util.Locale
 import java.util.concurrent.ExecutionException
-import kotlinx.coroutines.CoroutineDispatcher
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.android.asCoroutineDispatcher
-import kotlinx.coroutines.cancel
-import kotlinx.coroutines.channels.awaitClose
 import kotlinx.coroutines.delay
-import kotlinx.coroutines.flow.callbackFlow
-import kotlinx.coroutines.flow.collectIndexed
-import kotlinx.coroutines.launch
 import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.withTimeoutOrNull
 import org.junit.After
@@ -65,7 +56,6 @@
     companion object {
         private const val WIDTH = 640
         private const val HEIGHT = 480
-        private val IDENTITY_MATRIX = createGlIdentityMatrix()
         private const val CUSTOM_SHADER_FORMAT = """
         #extension GL_OES_EGL_image_external : require
         precision mediump float;
@@ -80,9 +70,6 @@
         }
         """
 
-        private fun createGlIdentityMatrix() =
-            FloatArray(16).apply { android.opengl.Matrix.setIdentityM(this, 0) }
-
         @JvmStatic
         lateinit var testCameraRule: CameraUtil.PreTestCamera
 
@@ -103,9 +90,7 @@
 
     private lateinit var surfaceEffect: DefaultSurfaceEffect
     private lateinit var cameraDeviceHolder: CameraUtil.CameraDeviceHolder
-    private lateinit var handlerThread: HandlerThread
-    private lateinit var handler: Handler
-    private lateinit var dispatcher: CoroutineDispatcher
+    private lateinit var renderOutput: RenderOutput<*>
     private val inputSurfaceRequestsToClose = mutableListOf<SurfaceRequest>()
     private val fakeCamera = FakeCamera()
 
@@ -114,13 +99,13 @@
         if (::cameraDeviceHolder.isInitialized) {
             CameraUtil.releaseCameraDevice(cameraDeviceHolder)
         }
+        if (::renderOutput.isInitialized) {
+            renderOutput.release()
+        }
         if (::surfaceEffect.isInitialized) {
             surfaceEffect.release()
             surfaceEffect.awaitReleased(10_000L)
         }
-        if (::handlerThread.isInitialized) {
-            handlerThread.quitSafely()
-        }
         for (surfaceRequest in inputSurfaceRequestsToClose) {
             surfaceRequest.deferrableSurface.close()
         }
@@ -212,30 +197,33 @@
         assertThat(surfaceOutput.isClosed).isTrue()
     }
 
+    @SdkSuppress(minSdkVersion = 23)
     @Test
     fun render(): Unit = runBlocking {
-        testRenderFromCameraToImageReader()
+        testRender(OutputType.IMAGE_READER)
     }
 
+    @SdkSuppress(minSdkVersion = 21, maxSdkVersion = 22)
+    @Test
+    fun renderBelowApi23(): Unit = runBlocking {
+        testRender(OutputType.SURFACE_TEXTURE)
+    }
+
+    @SdkSuppress(minSdkVersion = 23)
     @Test
     fun renderByCustomShader(): Unit = runBlocking {
-        val shaderProvider = object : ShaderProvider {
-            override fun createFragmentShader(
-                samplerVarName: String,
-                fragCoordsVarName: String
-            ): String = getCustomFragmentShader(samplerVarName, fragCoordsVarName)
-        }
-        testRenderFromCameraToImageReader(shaderProvider)
+        testRender(OutputType.IMAGE_READER, createCustomShaderProvider())
+    }
+
+    @SdkSuppress(minSdkVersion = 21, maxSdkVersion = 22)
+    @Test
+    fun renderByCustomShaderBelowApi23(): Unit = runBlocking {
+        testRender(OutputType.SURFACE_TEXTURE, createCustomShaderProvider())
     }
 
     @Test
     fun createByInvalidShaderString_throwException() {
-        val shaderProvider = object : ShaderProvider {
-            override fun createFragmentShader(
-                samplerVarName: String,
-                fragCoordsVarName: String
-            ) = "Invalid shader"
-        }
+        val shaderProvider = createCustomShaderProvider(shaderString = "Invalid shader")
         assertThrows(IllegalArgumentException::class.java) {
             createSurfaceEffect(shaderProvider)
         }
@@ -243,12 +231,8 @@
 
     @Test
     fun createByFailedShaderProvider_throwException() {
-        val shaderProvider = object : ShaderProvider {
-            override fun createFragmentShader(
-                samplerVarName: String,
-                fragCoordsVarName: String
-            ) = throw RuntimeException("Failed Shader")
-        }
+        val shaderProvider =
+            createCustomShaderProvider(exceptionToThrow = RuntimeException("Failed Shader"))
         assertThrows(IllegalArgumentException::class.java) {
             createSurfaceEffect(shaderProvider)
         }
@@ -256,12 +240,7 @@
 
     @Test
     fun createByIncorrectSamplerName_throwException() {
-        val shaderProvider = object : ShaderProvider {
-            override fun createFragmentShader(
-                samplerVarName: String,
-                fragCoordsVarName: String
-            ) = getCustomFragmentShader("_mySampler_", fragCoordsVarName)
-        }
+        val shaderProvider = createCustomShaderProvider(samplerVarName = "_mySampler_")
         assertThrows(IllegalArgumentException::class.java) {
             createSurfaceEffect(shaderProvider)
         }
@@ -269,22 +248,17 @@
 
     @Test
     fun createByIncorrectFragCoordsName_throwException() {
-        val shaderProvider = object : ShaderProvider {
-            override fun createFragmentShader(
-                samplerVarName: String,
-                fragCoordsVarName: String
-            ) = getCustomFragmentShader(samplerVarName, "_myFragCoords_")
-        }
+        val shaderProvider = createCustomShaderProvider(fragCoordsVarName = "_myFragCoords_")
         assertThrows(IllegalArgumentException::class.java) {
             createSurfaceEffect(shaderProvider)
         }
     }
 
-    private suspend fun testRenderFromCameraToImageReader(
+    private suspend fun testRender(
+        outputType: OutputType,
         shaderProvider: ShaderProvider = ShaderProvider.DEFAULT
     ) {
         createSurfaceEffect(shaderProvider)
-        prepareHandlerThread()
         // Prepare input
         val inputSurfaceRequest = createInputSurfaceRequest()
         surfaceEffect.onInputSurface(inputSurfaceRequest)
@@ -296,42 +270,12 @@
         }, CameraXExecutors.directExecutor())
 
         // Prepare output
-        val imageReader = ImageReader.newInstance(
-            WIDTH,
-            HEIGHT,
-            ImageFormatConstants.INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE,
-            2
-        )
-        val scope = CoroutineScope(dispatcher)
-        val imageCollectJob = scope.launch {
-            callbackFlow {
-                val listener = ImageReader.OnImageAvailableListener {
-                    trySend(it.acquireLatestImage())
-                }
-                imageReader.setOnImageAvailableListener(listener, handler)
-                awaitClose { imageReader.close() }
-            }.collectIndexed { index, image ->
-                image.close()
-                if (index >= 4) {
-                    // stop the collect job
-                    scope.cancel()
-                }
-            }
-        }
-        val surfaceOutput = createSurfaceOutput(imageReader.surface)
+        renderOutput = RenderOutput.createRenderOutput(outputType)
+        val surfaceOutput = createSurfaceOutput(renderOutput.surface)
         surfaceEffect.onOutputSurface(surfaceOutput)
 
         // Assert.
-        withTimeoutOrNull(10_000L) {
-            imageCollectJob.join()
-            true
-        } ?: fail("Timed out to receive images")
-    }
-
-    private fun prepareHandlerThread() {
-        handlerThread = HandlerThread("Worker").apply { start() }
-        handler = Handler(handlerThread.looper)
-        dispatcher = handler.asCoroutineDispatcher()
+        assertThat(renderOutput.await(/*imageCount=*/5, /*timeoutInMs=*/10_000L)).isTrue()
     }
 
     private fun openCameraAndSetRepeating(surface: Surface) {
@@ -361,18 +305,34 @@
             SurfaceEffect.PREVIEW,
             ImageFormatConstants.INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE,
             Size(WIDTH, HEIGHT),
-            IDENTITY_MATRIX
+            USE_SURFACE_TEXTURE_TRANSFORM,
+            Size(WIDTH, HEIGHT),
+            Rect(0, 0, WIDTH, HEIGHT),
+            /*rotationDegrees=*/0,
+            /*mirroring=*/false
         )
 
-    private fun getCustomFragmentShader(samplerVarName: String, fragCoordsVarName: String) =
-        String.format(
-            Locale.US,
-            CUSTOM_SHADER_FORMAT,
-            samplerVarName,
-            fragCoordsVarName,
-            samplerVarName,
-            fragCoordsVarName
-        )
+    private fun createCustomShaderProvider(
+        samplerVarName: String? = null,
+        fragCoordsVarName: String? = null,
+        shaderString: String? = null,
+        exceptionToThrow: Exception? = null,
+    ) = object : ShaderProvider {
+        override fun createFragmentShader(
+            correctSamplerVarName: String,
+            correctFragCoordsVarName: String
+        ): String {
+            exceptionToThrow?.let { throw it }
+            return shaderString ?: String.format(
+                Locale.US,
+                CUSTOM_SHADER_FORMAT,
+                samplerVarName ?: correctSamplerVarName,
+                fragCoordsVarName ?: correctFragCoordsVarName,
+                samplerVarName ?: correctSamplerVarName,
+                fragCoordsVarName ?: correctFragCoordsVarName
+            )
+        }
+    }
 
     private fun DefaultSurfaceEffect.idle() {
         HandlerUtil.waitForLooperToIdle(mGlHandler)
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/processing/OpenGlRendererTest.kt b/camera/camera-core/src/androidTest/java/androidx/camera/core/processing/OpenGlRendererTest.kt
index 46a955c..1f6cfa1 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/processing/OpenGlRendererTest.kt
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/processing/OpenGlRendererTest.kt
@@ -16,11 +16,8 @@
 
 package androidx.camera.core.processing
 
-import android.graphics.ImageFormat
 import android.graphics.SurfaceTexture
 import android.hardware.camera2.CameraDevice
-import android.media.Image
-import android.media.ImageReader
 import android.opengl.Matrix
 import android.os.Handler
 import android.os.HandlerThread
@@ -31,22 +28,14 @@
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
 import androidx.testutils.assertThrows
-import androidx.testutils.fail
 import com.google.common.truth.Truth.assertThat
 import java.util.Locale
 import kotlin.coroutines.ContinuationInterceptor
 import kotlinx.coroutines.CoroutineDispatcher
-import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.android.asCoroutineDispatcher
-import kotlinx.coroutines.cancel
-import kotlinx.coroutines.channels.awaitClose
 import kotlinx.coroutines.currentCoroutineContext
-import kotlinx.coroutines.flow.callbackFlow
-import kotlinx.coroutines.flow.collectIndexed
-import kotlinx.coroutines.launch
 import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.withContext
-import kotlinx.coroutines.withTimeoutOrNull
 import org.junit.After
 import org.junit.Before
 import org.junit.BeforeClass
@@ -104,6 +93,7 @@
     private lateinit var glDispatcher: CoroutineDispatcher
     private lateinit var glRenderer: OpenGlRenderer
     private lateinit var cameraDeviceHolder: CameraUtil.CameraDeviceHolder
+    private lateinit var renderOutput: RenderOutput<*>
 
     @Before
     fun setUp() {
@@ -117,6 +107,9 @@
         if (::cameraDeviceHolder.isInitialized) {
             CameraUtil.releaseCameraDevice(cameraDeviceHolder)
         }
+        if (::renderOutput.isInitialized) {
+            renderOutput.release()
+        }
         if (::glRenderer.isInitialized) {
             withContext(glDispatcher) {
                 glRenderer.release()
@@ -191,12 +184,7 @@
 
     @Test
     fun initByInvalidShaderString_throwException() {
-        val shaderProvider = object : ShaderProvider {
-            override fun createFragmentShader(
-                samplerVarName: String,
-                fragCoordsVarName: String
-            ) = "Invalid shader"
-        }
+        val shaderProvider = createCustomShaderProvider(shaderString = "Invalid shader")
         assertThrows(IllegalArgumentException::class.java) {
             runBlocking(glDispatcher) {
                 createOpenGlRendererAndInit(shaderProvider)
@@ -206,12 +194,8 @@
 
     @Test
     fun initByFailedShaderProvider_throwException() {
-        val shaderProvider = object : ShaderProvider {
-            override fun createFragmentShader(
-                samplerVarName: String,
-                fragCoordsVarName: String
-            ) = throw RuntimeException("Failed Shader")
-        }
+        val shaderProvider =
+            createCustomShaderProvider(exceptionToThrow = RuntimeException("Failed Shader"))
         assertThrows(IllegalArgumentException::class.java) {
             runBlocking(glDispatcher) {
                 createOpenGlRendererAndInit(shaderProvider)
@@ -221,12 +205,7 @@
 
     @Test
     fun initByIncorrectSamplerName_throwException() {
-        val shaderProvider = object : ShaderProvider {
-            override fun createFragmentShader(
-                samplerVarName: String,
-                fragCoordsVarName: String
-            ) = getCustomFragmentShader("_mySampler_", fragCoordsVarName)
-        }
+        val shaderProvider = createCustomShaderProvider(samplerVarName = "_mySampler_")
         assertThrows(IllegalArgumentException::class.java) {
             runBlocking(glDispatcher) {
                 createOpenGlRendererAndInit(shaderProvider)
@@ -236,12 +215,7 @@
 
     @Test
     fun initByIncorrectFragCoordsName_throwException() {
-        val shaderProvider = object : ShaderProvider {
-            override fun createFragmentShader(
-                samplerVarName: String,
-                fragCoordsVarName: String
-            ) = getCustomFragmentShader(samplerVarName, "_myFragCoords_")
-        }
+        val shaderProvider = createCustomShaderProvider(fragCoordsVarName = "_myFragCoords_")
         assertThrows(IllegalArgumentException::class.java) {
             runBlocking(glDispatcher) {
                 createOpenGlRendererAndInit(shaderProvider)
@@ -257,23 +231,32 @@
         assertThat(glRenderer.textureName).isNotEqualTo(0L)
     }
 
+    @SdkSuppress(minSdkVersion = 23)
     @Test
     fun render(): Unit = runBlocking(glDispatcher) {
-        testRenderFromCameraToImageReader()
+        testRender(OutputType.IMAGE_READER)
     }
 
+    @SdkSuppress(minSdkVersion = 21, maxSdkVersion = 22)
+    @Test
+    fun renderBelowApi23(): Unit = runBlocking(glDispatcher) {
+        testRender(OutputType.SURFACE_TEXTURE)
+    }
+
+    @SdkSuppress(minSdkVersion = 23)
     @Test
     fun renderByCustomShader(): Unit = runBlocking(glDispatcher) {
-        val shaderProvider = object : ShaderProvider {
-            override fun createFragmentShader(
-                samplerVarName: String,
-                fragCoordsVarName: String
-            ): String = getCustomFragmentShader(samplerVarName, fragCoordsVarName)
-        }
-        testRenderFromCameraToImageReader(shaderProvider)
+        testRender(OutputType.IMAGE_READER, createCustomShaderProvider())
     }
 
-    private suspend fun testRenderFromCameraToImageReader(
+    @SdkSuppress(minSdkVersion = 21, maxSdkVersion = 22)
+    @Test
+    fun renderByCustomShaderBelowApi23(): Unit = runBlocking(glDispatcher) {
+        testRender(OutputType.SURFACE_TEXTURE, createCustomShaderProvider())
+    }
+
+    private suspend fun testRender(
+        outputType: OutputType,
         shaderProvider: ShaderProvider = ShaderProvider.DEFAULT
     ) {
         // Arrange.
@@ -291,38 +274,17 @@
         }, CameraXExecutors.directExecutor())
 
         // Prepare output
-        val imageReader =
-            ImageReader.newInstance(WIDTH, HEIGHT, ImageFormat.PRIVATE, 2)
-        val imageFlow = callbackFlow<Image> {
-            val listener = ImageReader.OnImageAvailableListener {
-                trySend(it.acquireLatestImage())
-            }
-            imageReader.setOnImageAvailableListener(listener, glHandler)
-            awaitClose { imageReader.close() }
-        }
+        renderOutput = RenderOutput.createRenderOutput(outputType)
 
         // Bridge input to output
         surfaceTexture.setOnFrameAvailableListener({
             it.updateTexImage()
-            glRenderer.setOutputSurface(imageReader.surface)
+            glRenderer.setOutputSurface(renderOutput.surface)
             glRenderer.render(0L, IDENTITY_MATRIX)
         }, glHandler)
 
-        val scope = CoroutineScope(glDispatcher)
-        val imageCollectJob = scope.launch {
-            imageFlow.collectIndexed { index, image ->
-                image.close()
-                if (index >= 4) {
-                    scope.cancel()
-                }
-            }
-        }
-
         // Assert.
-        withTimeoutOrNull(10_000L) {
-            imageCollectJob.join()
-            true
-        } ?: fail("Timed out to receive images")
+        assertThat(renderOutput.await(/*imageCount=*/5, /*timeoutInMs=*/10_000L)).isTrue()
     }
 
     private suspend fun createOpenGlRendererAndInit(
@@ -340,15 +302,27 @@
         }
     }
 
-    private fun getCustomFragmentShader(samplerVarName: String, fragCoordsVarName: String) =
-        String.format(
-            Locale.US,
-            CUSTOM_SHADER_FORMAT,
-            samplerVarName,
-            fragCoordsVarName,
-            samplerVarName,
-            fragCoordsVarName
-        )
+    private fun createCustomShaderProvider(
+        samplerVarName: String? = null,
+        fragCoordsVarName: String? = null,
+        shaderString: String? = null,
+        exceptionToThrow: Exception? = null,
+    ) = object : ShaderProvider {
+        override fun createFragmentShader(
+            correctSamplerVarName: String,
+            correctFragCoordsVarName: String
+        ): String {
+            exceptionToThrow?.let { throw it }
+            return shaderString ?: String.format(
+                Locale.US,
+                CUSTOM_SHADER_FORMAT,
+                samplerVarName ?: correctSamplerVarName,
+                fragCoordsVarName ?: correctFragCoordsVarName,
+                samplerVarName ?: correctSamplerVarName,
+                fragCoordsVarName ?: correctFragCoordsVarName
+            )
+        }
+    }
 
     private fun createOpenGlRenderer() {
         glRenderer = OpenGlRenderer()
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/processing/RenderOutput.kt b/camera/camera-core/src/androidTest/java/androidx/camera/core/processing/RenderOutput.kt
new file mode 100644
index 0000000..5368667
--- /dev/null
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/processing/RenderOutput.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.camera.core.processing
+
+import android.graphics.ImageFormat
+import android.graphics.SurfaceTexture
+import android.media.Image
+import android.media.ImageReader
+import android.os.Handler
+import android.os.HandlerThread
+import android.os.Looper
+import android.view.Surface
+import androidx.camera.testing.GLUtil
+import androidx.test.filters.SdkSuppress
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.android.asCoroutineDispatcher
+import kotlinx.coroutines.cancel
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.callbackFlow
+import kotlinx.coroutines.flow.collectIndexed
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.withTimeoutOrNull
+
+private const val WIDTH = 640
+private const val HEIGHT = 480
+
+@SdkSuppress(minSdkVersion = 21)
+abstract class RenderOutput<T> {
+    abstract val surface: Surface
+    protected abstract val imageFlow: Flow<T>
+    private val handlerThread: HandlerThread =
+        HandlerThread("RenderOutput Thread").apply { start() }
+    protected val handler: Handler = Handler(handlerThread.looper)
+
+    companion object {
+        @JvmStatic
+        fun createRenderOutput(outputType: OutputType): RenderOutput<*> {
+            return when (outputType) {
+                OutputType.IMAGE_READER -> ImageReaderOutput()
+                OutputType.SURFACE_TEXTURE -> SurfaceTextureOutput()
+            }
+        }
+    }
+
+    suspend fun await(imageCount: Int, timeoutInMs: Long): Boolean {
+        val scope = CoroutineScope(handler.asCoroutineDispatcher())
+        val imageCollectJob = scope.launch {
+            imageFlow.collectIndexed { index, image ->
+                releaseImage(image)
+                if (index >= imageCount) {
+                    scope.cancel()
+                }
+            }
+        }
+
+        return withTimeoutOrNull(timeoutInMs) {
+            imageCollectJob.join()
+            true
+        } ?: false
+    }
+
+    open fun releaseImage(image: T) {
+    }
+
+    open fun release() {
+        handlerThread.quitSafely()
+    }
+}
+
+enum class OutputType {
+    IMAGE_READER,
+    SURFACE_TEXTURE,
+}
+
+@SdkSuppress(minSdkVersion = 21)
+private class SurfaceTextureOutput : RenderOutput<Unit>() {
+    override val surface: Surface by ::outputSurface
+
+    override val imageFlow = callbackFlow {
+        outputSurfaceTexture.setOnFrameAvailableListener({
+            it.updateTexImage()
+            trySend(Unit)
+        }, handler)
+        awaitClose { outputSurfaceTexture.setOnFrameAvailableListener(null) }
+    }
+
+    override fun release() {
+        super.release()
+        outputSurfaceTexture.release()
+        outputSurface.release()
+    }
+
+    private var outputSurfaceTexture: SurfaceTexture
+    init {
+        runBlocking(handler.asCoroutineDispatcher()) {
+            outputSurfaceTexture = SurfaceTexture(GLUtil.getTexIdFromGLContext()).apply {
+                setDefaultBufferSize(WIDTH, HEIGHT)
+            }
+        }
+    }
+
+    private val outputSurface = Surface(outputSurfaceTexture)
+}
+
+@SdkSuppress(minSdkVersion = 21)
+private class ImageReaderOutput : RenderOutput<Image>() {
+    override val surface: Surface
+        get() = imageReader.surface
+
+    override val imageFlow = callbackFlow {
+        val listener = ImageReader.OnImageAvailableListener {
+            trySend(it.acquireLatestImage())
+        }
+        imageReader.setOnImageAvailableListener(listener, handler)
+        awaitClose { imageReader.setOnImageAvailableListener({}, Handler(Looper.getMainLooper())) }
+    }
+
+    override fun releaseImage(image: Image) {
+        image.close()
+    }
+
+    override fun release() {
+        super.release()
+        imageReader.close()
+    }
+
+    val imageReader = ImageReader.newInstance(WIDTH, HEIGHT, ImageFormat.PRIVATE, 2)
+}
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 f5c225f..b775ca9 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
@@ -43,6 +43,11 @@
 import static androidx.camera.core.impl.ImageInputConfig.OPTION_INPUT_FORMAT;
 import static androidx.camera.core.impl.UseCaseConfig.OPTION_CAMERA_SELECTOR;
 import static androidx.camera.core.impl.UseCaseConfig.OPTION_ZSL_DISABLED;
+import static androidx.camera.core.impl.utils.Threads.checkMainThread;
+import static androidx.core.util.Preconditions.checkNotNull;
+import static androidx.core.util.Preconditions.checkState;
+
+import static java.util.Objects.requireNonNull;
 
 import android.content.ContentResolver;
 import android.content.ContentValues;
@@ -66,6 +71,7 @@
 import androidx.annotation.GuardedBy;
 import androidx.annotation.IntDef;
 import androidx.annotation.IntRange;
+import androidx.annotation.MainThread;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
@@ -74,6 +80,10 @@
 import androidx.annotation.UiThread;
 import androidx.annotation.VisibleForTesting;
 import androidx.camera.core.ForwardingImageProxy.OnImageCloseListener;
+import androidx.camera.core.imagecapture.ImageCaptureControl;
+import androidx.camera.core.imagecapture.ImagePipeline;
+import androidx.camera.core.imagecapture.TakePictureManager;
+import androidx.camera.core.imagecapture.TakePictureRequest;
 import androidx.camera.core.impl.CameraCaptureCallback;
 import androidx.camera.core.impl.CameraConfig;
 import androidx.camera.core.impl.CameraInfoInternal;
@@ -99,7 +109,6 @@
 import androidx.camera.core.impl.UseCaseConfigFactory;
 import androidx.camera.core.impl.utils.CameraOrientationUtil;
 import androidx.camera.core.impl.utils.Exif;
-import androidx.camera.core.impl.utils.Threads;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.camera.core.impl.utils.futures.FutureCallback;
 import androidx.camera.core.impl.utils.futures.Futures;
@@ -128,7 +137,6 @@
 import java.util.Deque;
 import java.util.List;
 import java.util.Locale;
-import java.util.Objects;
 import java.util.UUID;
 import java.util.concurrent.CancellationException;
 import java.util.concurrent.Executor;
@@ -370,7 +378,7 @@
 
         mFlashType = useCaseConfig.getFlashType(FLASH_TYPE_ONE_SHOT_FLASH);
 
-        mIoExecutor = Preconditions.checkNotNull(
+        mIoExecutor = checkNotNull(
                 useCaseConfig.getIoExecutor(CameraXExecutors.ioExecutor()));
         mSequentialIoExecutor = CameraXExecutors.newSequentialExecutor(mIoExecutor);
 
@@ -380,7 +388,10 @@
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     SessionConfig.Builder createPipeline(@NonNull String cameraId,
             @NonNull ImageCaptureConfig config, @NonNull Size resolution) {
-        Threads.checkMainThread();
+        checkMainThread();
+        if (isNodeEnabled()) {
+            return createPipelineWithNode(cameraId, config, resolution);
+        }
         SessionConfig.Builder sessionConfigBuilder = SessionConfig.Builder.createFrom(config);
         YuvToJpegProcessor softwareJpegProcessor = null;
 
@@ -439,7 +450,8 @@
             } else {
                 throw new IllegalArgumentException("Unsupported image format:" + getImageFormat());
             }
-            mMetadataMatchingCaptureCallback = new CameraCaptureCallback() {};
+            mMetadataMatchingCaptureCallback = new CameraCaptureCallback() {
+            };
             mImageReader = new SafeCloseImageReaderProxy(imageReader);
         } else if (mCaptureProcessor != null || mUseSoftwareJpeg) {
             // Capture processor set from configuration takes precedence over software JPEG.
@@ -525,9 +537,9 @@
         }
 
         mDeferrableSurface = new ImmediateSurface(
-                Objects.requireNonNull(mImageReader.getSurface()),
+                requireNonNull(mImageReader.getSurface()),
                 new Size(mImageReader.getWidth(),
-                mImageReader.getHeight()),
+                        mImageReader.getHeight()),
                 /* get the surface image format using getImageFormat */
                 getImageFormat());
 
@@ -555,7 +567,7 @@
 
                 if (mImageCaptureRequestProcessor != null) {
                     // Restore the unfinished requests to the created pipeline
-                    for (ImageCaptureRequest request: pendingRequests) {
+                    for (ImageCaptureRequest request : pendingRequests) {
                         mImageCaptureRequestProcessor.sendRequest(request);
                     }
                 }
@@ -583,7 +595,11 @@
     @UiThread
     @SuppressWarnings("WeakerAccess")
     void clearPipeline() {
-        Threads.checkMainThread();
+        checkMainThread();
+        if (isNodeEnabled()) {
+            clearPipelineWithNode();
+            return;
+        }
         if (mImageCaptureRequestProcessor != null) {
             mImageCaptureRequestProcessor.cancelRequests(
                     new CancellationException("Request is canceled."));
@@ -704,7 +720,7 @@
 
         Integer maxCaptureStages =
                 builder.getMutableConfig().retrieveOption(OPTION_MAX_CAPTURE_STAGES, MAX_IMAGES);
-        Preconditions.checkNotNull(maxCaptureStages,
+        checkNotNull(maxCaptureStages,
                 "Maximum outstanding image count must be at least 1");
         Preconditions.checkArgument(maxCaptureStages >= 1,
                 "Maximum outstanding image count must be at least 1");
@@ -723,6 +739,7 @@
         }
         return false;
     }
+
     /**
      * Configures flash mode to CameraControlInternal once it is ready.
      *
@@ -939,7 +956,7 @@
      *
      * @return the resolution information if the use case has been bound by the
      * {@link androidx.camera.lifecycle.ProcessCameraProvider#bindToLifecycle(LifecycleOwner
-     * , CameraSelector, UseCase...)} API, or null if the use case is not bound yet.
+     *, CameraSelector, UseCase...)} API, or null if the use case is not bound yet.
      */
     @Nullable
     @Override
@@ -977,7 +994,7 @@
 
         int rotationDegrees = getRelativeRotation(camera);
 
-        return ResolutionInfo.create(resolution, Objects.requireNonNull(cropRect), rotationDegrees);
+        return ResolutionInfo.create(resolution, requireNonNull(cropRect), rotationDegrees);
     }
 
     /**
@@ -996,6 +1013,12 @@
             return;
         }
 
+        if (isNodeEnabled()) {
+            takePictureWithNode(executor, callback, /*onDiskCallback=*/null,
+                    /*outputFileOptions=*/null);
+            return;
+        }
+
         sendImageCaptureRequest(executor, callback, /*saveImage=*/false);
     }
 
@@ -1022,6 +1045,11 @@
                     () -> takePicture(outputFileOptions, executor, imageSavedCallback));
             return;
         }
+        if (isNodeEnabled()) {
+            takePictureWithNode(executor, /*inMemoryCallback=*/null, imageSavedCallback,
+                    outputFileOptions);
+            return;
+        }
 
         /*
          * We need to chain the following callbacks to save the image to disk:
@@ -1112,7 +1140,7 @@
                         /* invert the ratio denominator=*/ cropAspectRatio.getNumerator());
             }
             if (ImageUtil.isAspectRatioValid(dispatchResolution, aspectRatio)) {
-                return Objects.requireNonNull(
+                return requireNonNull(
                         ImageUtil.computeCropRectFromAspectRatio(dispatchResolution, aspectRatio));
             }
         }
@@ -1180,7 +1208,7 @@
         int jpegQuality;
         if (saveImage) {
             int rotationDegrees = getRelativeRotation(cameraInternal);
-            Size dispatchResolution = Objects.requireNonNull(getAttachedSurfaceResolution());
+            Size dispatchResolution = requireNonNull(getAttachedSurfaceResolution());
             // At this point, we can't know whether HAL will rotate the captured image or not. No
             // matter HAL will rotate the image byte array or not, it won't affect whether the final
             // image needs cropping or not. Therefore, we can still use the attached surface
@@ -1215,7 +1243,7 @@
         return jpegQuality;
     }
 
-    private void lockFlashMode() {
+    void lockFlashMode() {
         synchronized (mLockedFlashMode) {
             if (mLockedFlashMode.get() != null) {
                 // FlashMode is locked.
@@ -1489,7 +1517,7 @@
                     @Override
                     public void onSuccess(@Nullable ImageProxy image) {
                         synchronized (mLock) {
-                            Preconditions.checkNotNull(image);
+                            checkNotNull(image);
                             SingleCloseImageProxy wrappedImage = new SingleCloseImageProxy(image);
                             wrappedImage.addOnImageCloseListener(ImageCaptureRequestProcessor.this);
                             mOutstandingImages++;
@@ -1645,7 +1673,7 @@
         mUseSoftwareJpeg = useCaseConfig.isSoftwareJpegEncoderRequested();
 
         CameraInternal camera = getCamera();
-        Preconditions.checkNotNull(camera, "Attached camera cannot be null");
+        checkNotNull(camera, "Attached camera cannot be null");
 
         mExecutor =
                 Executors.newFixedThreadPool(
@@ -1790,9 +1818,7 @@
             captureConfigs.add(builder.build());
         }
 
-        return Futures.transform(getCameraControl().submitStillCaptureRequests(
-                captureConfigs, mCaptureMode, mFlashType),
-                input -> null, CameraXExecutors.directExecutor());
+        return submitStillCaptureRequest(captureConfigs);
     }
 
     private CaptureBundle getCaptureBundle(CaptureBundle defaultCaptureBundle) {
@@ -1805,6 +1831,142 @@
     }
 
     /**
+     * ===== New architecture start =====
+     *
+     * TODO(b/229629844): unit test the interactions between {@link ImageCapture} and
+     *  {@link ImagePipeline}/{@link TakePictureManager}.
+     */
+
+    private ImagePipeline mImagePipeline;
+    private TakePictureManager mTakePictureManager;
+
+    /**
+     * An {@link ImageCaptureControl} implementation to control this {@link ImageCapture} instance.
+     */
+    private final ImageCaptureControl mImageCaptureControl = new ImageCaptureControl() {
+
+        @MainThread
+        @Override
+        public void lockFlashMode() {
+            ImageCapture.this.lockFlashMode();
+        }
+
+        @MainThread
+        @Override
+        public void unlockFlashMode() {
+            ImageCapture.this.unlockFlashMode();
+        }
+
+        @MainThread
+        @NonNull
+        @Override
+        public ListenableFuture<Void> submitStillCaptureRequests(
+                @NonNull List<CaptureConfig> captureConfigs) {
+            return ImageCapture.this.submitStillCaptureRequest(captureConfigs);
+        }
+    };
+
+    /**
+     * Checks if the node is enabled given the current configuration.
+     *
+     * <p>This method checks if the new architecture can be enabled based on the current
+     * configuration.
+     *
+     * <p>DO NOT turn on the new architecture until the 1.3 alpha branch is cut. We don't want
+     * the quality of 1.2 beta to be affected by the refactoring.
+     */
+    @MainThread
+    private boolean isNodeEnabled() {
+        checkMainThread();
+        return false;
+    }
+
+    /**
+     * Creates the pipeline for both capture request configuration and image post-processing.
+     *
+     * <p> This is the new {@link #createPipeline}.
+     */
+    @MainThread
+    private SessionConfig.Builder createPipelineWithNode(@NonNull String cameraId,
+            @NonNull ImageCaptureConfig config, @NonNull Size resolution) {
+        checkMainThread();
+        Log.d(TAG, String.format("createPipelineWithNode(cameraId: %s, resolution: %s)",
+                cameraId, resolution));
+        checkState(mImagePipeline == null);
+        mImagePipeline = new ImagePipeline(config, resolution);
+        checkState(mTakePictureManager == null);
+        mTakePictureManager = new TakePictureManager(mImageCaptureControl, mImagePipeline);
+
+        SessionConfig.Builder sessionConfigBuilder = mImagePipeline.createSessionConfigBuilder();
+        sessionConfigBuilder.addErrorListener((sessionConfig, error) -> {
+            // TODO(b/143915543): Ensure this never gets called by a camera that is not attached
+            //  to this use case so we don't need to do this check.
+            if (isCurrentCamera(cameraId)) {
+                mTakePictureManager.pause();
+                // TODO: we might need to ask mImagePipeline to recreate camera Surface.
+                updateSessionConfig(mSessionConfigBuilder.build());
+                notifyReset();
+                mTakePictureManager.resume();
+            } else {
+                clearPipelineWithNode();
+            }
+        });
+
+        return sessionConfigBuilder;
+    }
+
+    /**
+     * Takes a picture with the new architecture.
+     */
+    @MainThread
+    private void takePictureWithNode(@NonNull Executor executor,
+            @Nullable OnImageCapturedCallback inMemoryCallback,
+            @Nullable ImageCapture.OnImageSavedCallback onDiskCallback,
+            @Nullable OutputFileOptions outputFileOptions) {
+        checkMainThread();
+        Log.d(TAG, "takePictureWithNode");
+        mTakePictureManager.offerRequest(TakePictureRequest.of(
+                executor,
+                inMemoryCallback,
+                onDiskCallback,
+                outputFileOptions,
+                requireNonNull(getViewPortCropRect()),
+                getSensorToBufferTransformMatrix(),
+                getRelativeRotation(requireNonNull(getCamera())),
+                getJpegQualityInternal()));
+    }
+
+    /**
+     * Clears the pipeline.
+     *
+     * <p>Similar to {@link #clearPipeline()}, this cancels unfinished requests and release
+     * resources.
+     */
+    @MainThread
+    private void clearPipelineWithNode() {
+        Log.d(TAG, "clearPipelineWithNode");
+        checkMainThread();
+        mImagePipeline.close();
+        mImagePipeline = null;
+        mTakePictureManager.cancelUnsentRequests();
+        mTakePictureManager = null;
+    }
+
+    /**
+     * Submits still capture requests with the current configurations.
+     */
+    @MainThread
+    ListenableFuture<Void> submitStillCaptureRequest(
+            @NonNull List<CaptureConfig> captureConfigs) {
+        checkMainThread();
+        return Futures.transform(getCameraControl().submitStillCaptureRequests(
+                        captureConfigs, mCaptureMode, mFlashType),
+                input -> null, CameraXExecutors.directExecutor());
+    }
+
+    // ===== New architecture end =====
+
+    /**
      * Describes the error that occurred during an image capture operation (such as {@link
      * ImageCapture#takePicture(Executor, OnImageCapturedCallback)}).
      *
@@ -2264,17 +2426,19 @@
         private final Matrix mSensorToBufferTransformMatrix;
 
         /**
-         *
-         * @param rotationDegrees The degrees to rotate the image buffer from sensor
-         *                        coordinates into the final output coordinate space.
-         * @param jpegQuality The requested output JPEG image compression quality. The value must
-         *                    be in range [1..100] which larger is higher quality.
-         * @param targetRatio The aspect ratio of the image in final output coordinate space.
-         *                    This must be a non-negative, non-zero value.
-         * @param viewPortCropRect The cropped rect of the field of view.
+         * @param rotationDegrees               The degrees to rotate the image buffer from sensor
+         *                                      coordinates into the final output coordinate space.
+         * @param jpegQuality                   The requested output JPEG image compression
+         *                                      quality. The value must
+         *                                      be in range [1..100] which larger is higher quality.
+         * @param targetRatio                   The aspect ratio of the image in final output
+         *                                      coordinate space.
+         *                                      This must be a non-negative, non-zero value.
+         * @param viewPortCropRect              The cropped rect of the field of view.
          * @param sensorToBufferTransformMatrix The sensor to buffer transform matrix.
-         * @param executor The {@link Executor} which will be used for the listener.
-         * @param callback The {@link OnImageCapturedCallback} for the quest.
+         * @param executor                      The {@link Executor} which will be used for the
+         *                                      listener.
+         * @param callback                      The {@link OnImageCapturedCallback} for the quest.
          * @throws IllegalArgumentException If targetRatio is not a valid value.
          */
         ImageCaptureRequest(
@@ -2510,12 +2674,12 @@
 
             Integer maxCaptureStages =
                     getMutableConfig().retrieveOption(OPTION_MAX_CAPTURE_STAGES, MAX_IMAGES);
-            Preconditions.checkNotNull(maxCaptureStages,
+            checkNotNull(maxCaptureStages,
                     "Maximum outstanding image count must be at least 1");
             Preconditions.checkArgument(maxCaptureStages >= 1,
                     "Maximum outstanding image count must be at least 1");
 
-            Preconditions.checkNotNull(getMutableConfig().retrieveOption(OPTION_IO_EXECUTOR,
+            checkNotNull(getMutableConfig().retrieveOption(OPTION_IO_EXECUTOR,
                     CameraXExecutors.ioExecutor()), "The IO executor can't be null");
 
             if (getMutableConfig().containsOption(OPTION_FLASH_MODE)) {
@@ -2837,7 +3001,7 @@
          * <p>If not set, the flash type will default to {@link #FLASH_TYPE_ONE_SHOT_FLASH}.
          *
          * @param flashType The requested flash mode. Value is {@link #FLASH_TYPE_ONE_SHOT_FLASH}
-         *                 or {@link #FLASH_TYPE_USE_TORCH_AS_FLASH}.
+         *                  or {@link #FLASH_TYPE_USE_TORCH_AS_FLASH}.
          * @return The current Builder.
          * @hide
          */
@@ -2863,7 +3027,7 @@
          * is used for {@link #CAPTURE_MODE_MAXIMIZE_QUALITY}.
          *
          * @param jpegQuality The requested output JPEG image compression quality. The value must
-         *                   be in range [1..100] which larger is higher quality.
+         *                    be in range [1..100] which larger is higher quality.
          * @return The current Builder.
          * @throws IllegalArgumentException if the input value is not in range [1..100].
          */
@@ -2962,6 +3126,7 @@
             getMutableConfig().insertOption(OPTION_USE_CASE_EVENT_CALLBACK, useCaseEventCallback);
             return this;
         }
+
         /**
          * {@inheritDoc}
          *
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 56318da..355c36a 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
@@ -16,6 +16,7 @@
 
 package androidx.camera.core;
 
+import static androidx.camera.core.SurfaceOutput.GlTransformOptions.USE_SURFACE_TEXTURE_TRANSFORM;
 import static androidx.camera.core.impl.ImageInputConfig.OPTION_INPUT_FORMAT;
 import static androidx.camera.core.impl.ImageOutputConfig.OPTION_APP_TARGET_ROTATION;
 import static androidx.camera.core.impl.PreviewConfig.IMAGE_INFO_PROCESSOR;
@@ -312,7 +313,7 @@
         clearPipeline();
 
         // Create nodes and edges.
-        mNode = new SurfaceEffectNode(camera, mSurfaceEffect);
+        mNode = new SurfaceEffectNode(camera, USE_SURFACE_TEXTURE_TRANSFORM, mSurfaceEffect);
         SettableSurface cameraSurface = new SettableSurface(
                 SurfaceEffect.PREVIEW,
                 resolution,
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/SurfaceOutput.java b/camera/camera-core/src/main/java/androidx/camera/core/SurfaceOutput.java
index 4424d82..5b3e314 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/SurfaceOutput.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/SurfaceOutput.java
@@ -172,4 +172,16 @@
             return new AutoValue_SurfaceOutput_Event(code, surfaceOutput);
         }
     }
+
+    /** OpenGL transformation options for SurfaceOutput. */
+    enum GlTransformOptions {
+        /** Apply only the value of {@link SurfaceTexture#getTransformMatrix(float[])}. */
+        USE_SURFACE_TEXTURE_TRANSFORM,
+
+        /**
+         * Discard the value of {@link SurfaceTexture#getTransformMatrix(float[])} and calculate
+         * the transform based on crop rect, rotation degrees and mirroring.
+         */
+        APPLY_CROP_ROTATE_AND_MIRRORING,
+    }
 }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/ImageCaptureControl.java b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/ImageCaptureControl.java
new file mode 100644
index 0000000..26c52a2
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/ImageCaptureControl.java
@@ -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.camera.core.imagecapture;
+
+import android.os.Build;
+
+import androidx.annotation.MainThread;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.ImageCapture;
+import androidx.camera.core.impl.CaptureConfig;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+import java.util.List;
+
+/**
+ * Interface for controlling {@link ImageCapture}.
+ */
+@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+public interface ImageCaptureControl {
+
+    /**
+     * Invokes {@link ImageCapture#lockFlashMode()}.
+     */
+    @MainThread
+    void lockFlashMode();
+
+    /**
+     * Invokes {@link ImageCapture#unlockFlashMode()}.
+     */
+    @MainThread
+    void unlockFlashMode();
+
+    /**
+     * Invokes {@link ImageCapture#submitStillCaptureRequest(List)}}
+     */
+    @MainThread
+    @NonNull
+    ListenableFuture<Void> submitStillCaptureRequests(@NonNull List<CaptureConfig> captureConfigs);
+}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/ImagePipeline.java b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/ImagePipeline.java
new file mode 100644
index 0000000..de72222
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/ImagePipeline.java
@@ -0,0 +1,92 @@
+/*
+ * 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.core.imagecapture;
+
+import static androidx.camera.core.impl.utils.Threads.checkMainThread;
+
+import android.media.ImageReader;
+import android.os.Build;
+import android.util.Size;
+
+import androidx.annotation.MainThread;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.ImageCapture;
+import androidx.camera.core.impl.CaptureConfig;
+import androidx.camera.core.impl.DeferrableSurface;
+import androidx.camera.core.impl.ImageCaptureConfig;
+import androidx.camera.core.impl.SessionConfig;
+
+/**
+ * The class that builds and maintains the {@link ImageCapture} pipeline.
+ *
+ * <p>This class is responsible for building the entire pipeline, from creating camera request to
+ * post-processing the output.
+ */
+@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+public class ImagePipeline {
+
+    @NonNull
+    private ImageCaptureConfig mConfig;
+    @SuppressWarnings("UnusedVariable")
+    @NonNull
+    private Size mCameraSurfaceSize;
+
+    @MainThread
+    public ImagePipeline(
+            @NonNull ImageCaptureConfig config,
+            @NonNull Size cameraSurfaceSize) {
+        checkMainThread();
+        mConfig = config;
+        mCameraSurfaceSize = cameraSurfaceSize;
+    }
+
+    /**
+     * Creates a {@link SessionConfig.Builder} for configuring camera2.
+     */
+    @NonNull
+    public SessionConfig.Builder createSessionConfigBuilder() {
+        SessionConfig.Builder builder = SessionConfig.Builder.createFrom(mConfig);
+        builder.addNonRepeatingSurface(getCameraSurface());
+        // TODO(b/242536140): enable ZSL.
+        return builder;
+    }
+
+    /**
+     * Closes the pipeline and release all resources.
+     *
+     * <p>Releases all the buffers and resources allocated by the pipeline. e.g. closing
+     * {@link ImageReader}s.
+     */
+    @MainThread
+    public void close() {
+        checkMainThread();
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Gets the {@link DeferrableSurface} sent to camera2.
+     *
+     * <p>This value is used to build {@link SessionConfig} and {@link CaptureConfig}.
+     */
+    @MainThread
+    @NonNull
+    private DeferrableSurface getCameraSurface() {
+        checkMainThread();
+        throw new UnsupportedOperationException();
+    }
+}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/TakePictureManager.java b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/TakePictureManager.java
new file mode 100644
index 0000000..1eb2496
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/TakePictureManager.java
@@ -0,0 +1,83 @@
+/*
+ * 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.core.imagecapture;
+
+import static androidx.camera.core.impl.utils.Threads.checkMainThread;
+
+import android.os.Build;
+
+import androidx.annotation.MainThread;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.ImageCapture;
+
+/**
+ * Manages {@link ImageCapture#takePicture} calls.
+ */
+@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+public class TakePictureManager {
+
+    /**
+     * @param imageCaptureControl for controlling {@link ImageCapture}
+     * @param imagePipeline       for building capture requests and post-processing camera output.
+     */
+    @MainThread
+    public TakePictureManager(
+            @NonNull ImageCaptureControl imageCaptureControl,
+            @NonNull ImagePipeline imagePipeline) {
+        checkMainThread();
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Adds requests to the queue.
+     *
+     * <p>The requests in the queue will be executed based on the order being added.
+     */
+    @MainThread
+    public void offerRequest(@NonNull TakePictureRequest takePictureRequest) {
+        checkMainThread();
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Pause sending request to camera2.
+     */
+    @MainThread
+    public void pause() {
+        checkMainThread();
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Resume sending request to camera2.
+     */
+    @MainThread
+    public void resume() {
+        checkMainThread();
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Clears the requests queue.
+     */
+    @MainThread
+    public void cancelUnsentRequests() {
+        checkMainThread();
+        throw new UnsupportedOperationException();
+    }
+}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/TakePictureRequest.java b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/TakePictureRequest.java
new file mode 100644
index 0000000..84249bc
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/TakePictureRequest.java
@@ -0,0 +1,114 @@
+/*
+ * 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.core.imagecapture;
+
+import static androidx.core.util.Preconditions.checkArgument;
+
+import android.graphics.Matrix;
+import android.graphics.Rect;
+
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.camera.core.ImageCapture;
+import androidx.camera.core.impl.ImageCaptureConfig;
+import androidx.camera.core.impl.ImageOutputConfig;
+
+import com.google.auto.value.AutoValue;
+
+import java.util.concurrent.Executor;
+
+/**
+ * A {@link ImageCapture#takePicture} request.
+ *
+ * <p> It contains app provided data and a snapshot of {@link ImageCapture} properties.
+ */
+@AutoValue
+public abstract class TakePictureRequest {
+
+    /**
+     * Gets the callback {@link Executor} provided by the app.
+     */
+    @NonNull
+    abstract Executor getAppExecutor();
+
+    /**
+     * Gets the app provided callback for in-memory capture.
+     */
+    @Nullable
+    abstract ImageCapture.OnImageCapturedCallback getInMemoryCallback();
+
+    /**
+     * Gets the app provided callback for on-disk capture.
+     */
+    @Nullable
+    abstract ImageCapture.OnImageSavedCallback getOnDiskCallback();
+
+    /**
+     * Gets the app provided options for on-disk capture.
+     */
+    @Nullable
+    abstract ImageCapture.OutputFileOptions getOutputFileOptions();
+
+    /**
+     * A snapshot of {@link ImageCapture#getViewPortCropRect()} when
+     * {@link ImageCapture#takePicture} is called.
+     */
+    @NonNull
+    abstract Rect getCropRect();
+
+    /**
+     * A snapshot of {@link ImageCapture#getSensorToBufferTransformMatrix()} when
+     * {@link ImageCapture#takePicture} is called.
+     */
+    @NonNull
+    abstract Matrix sensorToBufferTransform();
+
+    /**
+     * A snapshot of rotation degrees when {@link ImageCapture#takePicture} is called.
+     */
+    @ImageOutputConfig.RotationValue
+    abstract int getRotationDegrees();
+
+    /**
+     * A snapshot of {@link ImageCaptureConfig#getJpegQuality()} when
+     * {@link ImageCapture#takePicture} is called.
+     */
+    @IntRange(from = 1, to = 100)
+    abstract int getJpegQuality();
+
+    /**
+     * Creates a {@link TakePictureRequest} instance.
+     */
+    @NonNull
+    public static TakePictureRequest of(@NonNull Executor appExecutor,
+            @Nullable ImageCapture.OnImageCapturedCallback inMemoryCallback,
+            @Nullable ImageCapture.OnImageSavedCallback onDiskCallback,
+            @Nullable ImageCapture.OutputFileOptions outputFileOptions,
+            @NonNull Rect cropRect,
+            @NonNull Matrix sensorToBufferTransform,
+            int rotationDegrees,
+            int jpegQuality) {
+        checkArgument((onDiskCallback == null) == (outputFileOptions == null),
+                "onDiskCallback and outputFileOptions should be both null or both non-null.");
+        checkArgument((onDiskCallback == null) ^ (inMemoryCallback == null),
+                "One and only one on-disk or in-memory callback should be present.");
+        return new AutoValue_TakePictureRequest(appExecutor, inMemoryCallback,
+                onDiskCallback, outputFileOptions, cropRect, sensorToBufferTransform,
+                rotationDegrees, jpegQuality);
+    }
+}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/package-info.java b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/package-info.java
new file mode 100644
index 0000000..85ac9dc
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/package-info.java
@@ -0,0 +1,23 @@
+/*
+ * 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.
+ */
+
+/**
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+package androidx.camera.core.imagecapture;
+
+import androidx.annotation.RestrictTo;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/MatrixExt.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/MatrixExt.java
new file mode 100644
index 0000000..8020337
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/MatrixExt.java
@@ -0,0 +1,118 @@
+/*
+ * 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.core.impl.utils;
+
+import android.opengl.Matrix;
+
+import androidx.annotation.NonNull;
+
+import java.util.Locale;
+
+/**
+ * Utility class to extend the {@link Matrix}.
+ */
+public final class MatrixExt {
+    private static final float[] sTemp = new float[16];
+
+    // Prevent instantiation.
+    private MatrixExt() {
+    }
+
+    /**
+     * Set the matrix to rotate by the specified number of degrees, with a pivot point at
+     * (px, py).
+     *
+     * <p>The pivot point is the coordinate that should remain unchanged by the specified
+     * transformation.
+     *
+     * @param matrix the matrix to rotate
+     * @param degrees the rotation degrees
+     * @param px px of pivot point at (px, py)
+     * @param py py of pivot point at (px, py)
+     */
+    public static void setRotate(@NonNull float[] matrix, float degrees, float px, float py) {
+        Matrix.setIdentityM(matrix, 0);
+        preRotate(matrix, degrees, px, py);
+    }
+
+    /**
+     * Preconcats the matrix with the specified rotation. M' = M * R(degrees, px, py)
+     *
+     * <p>The pivot point is the coordinate that should remain unchanged by the specified
+     * transformation.
+     *
+     * @param matrix the matrix to rotate
+     * @param degrees the rotation degrees
+     * @param px px of pivot point at (px, py)
+     * @param py py of pivot point at (px, py)
+     */
+    public static void preRotate(@NonNull float[] matrix, float degrees, float px, float py) {
+        normalize(matrix, px, py);
+        Matrix.rotateM(matrix, 0, degrees, 0, 0, 1);
+        denormalize(matrix, px, py);
+    }
+
+    /**
+     * Postconcats the matrix with the specified rotation. M' = R(degrees, px, py) * M
+     *
+     * <p>The pivot point is the coordinate that should remain unchanged by the specified
+     * transformation.
+     *
+     * @param matrix the matrix to rotate
+     * @param degrees the rotation degrees
+     * @param px px of pivot point at (px, py)
+     * @param py py of pivot point at (px, py)
+     */
+    public static void postRotate(@NonNull float[] matrix, float degrees, float px, float py) {
+        synchronized (sTemp) {
+            Matrix.setIdentityM(sTemp, 0);
+            normalize(sTemp, px, py);
+            Matrix.rotateM(sTemp, 0, degrees, 0, 0, 1);
+            denormalize(sTemp, px, py);
+            Matrix.multiplyMM(matrix, 0, sTemp, 0, matrix, 0);
+        }
+    }
+
+    /**
+     * Converts to a well-formed matrix for debugging.
+     *
+     * <p>Get the first 16 floats from the offset.
+     *
+     * @param matrix the matrix to convert
+     * @param offset the offset of the matrix
+     */
+    @NonNull
+    public static String toString(@NonNull float[] matrix, int offset) {
+        return String.format(Locale.US, "Matrix:\n"
+                        + "%2.1f %2.1f %2.1f %2.1f\n"
+                        + "%2.1f %2.1f %2.1f %2.1f\n"
+                        + "%2.1f %2.1f %2.1f %2.1f\n"
+                        + "%2.1f %2.1f %2.1f %2.1f",
+                matrix[offset], matrix[offset + 4], matrix[offset + 8], matrix[offset + 12],
+                matrix[offset + 1], matrix[offset + 5], matrix[offset + 9], matrix[offset + 13],
+                matrix[offset + 2], matrix[offset + 6], matrix[offset + 10], matrix[offset + 14],
+                matrix[offset + 3], matrix[offset + 7], matrix[offset + 11], matrix[offset + 15]);
+    }
+
+    private static void normalize(float[] matrix, float px, float py) {
+        Matrix.translateM(matrix, 0, px, py, 0f);
+    }
+
+    private static void denormalize(float[] matrix, float px, float py) {
+        Matrix.translateM(matrix, 0, -px, -py, 0f);
+    }
+}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/TransformUtils.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/TransformUtils.java
index 60dc5d5..d6643c5 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/TransformUtils.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/TransformUtils.java
@@ -24,6 +24,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
+import androidx.core.util.Preconditions;
 
 /**
  * Utility class for transform.
@@ -52,6 +53,72 @@
         return new Size(rect.width(), rect.height());
     }
 
+
+    /**
+     * Transforms size to a {@link Rect} with zero left and top.
+     */
+    @NonNull
+    public static Rect sizeToRect(@NonNull Size size) {
+        return sizeToRect(size, 0, 0);
+    }
+
+    /**
+     * Transforms a size to a {@link Rect} with given left and top.
+     */
+    @NonNull
+    public static Rect sizeToRect(@NonNull Size size, int left, int top) {
+        return new Rect(left, top, left + size.getWidth(), top + size.getHeight());
+    }
+
+    /**
+     * Transforms size to a {@link RectF} with zero left and top.
+     */
+    @NonNull
+    public static RectF sizeToRectF(@NonNull Size size) {
+        return sizeToRectF(size, 0, 0);
+    }
+
+    /**
+     * Transforms a size to a {@link RectF} with given left and top.
+     */
+    @NonNull
+    public static RectF sizeToRectF(@NonNull Size size, int left, int top) {
+        return new RectF(left, top, left + size.getWidth(), top + size.getHeight());
+    }
+
+    /**
+     * Reverses width and height for a {@link Size}.
+     *
+     * @param size the size to reverse
+     * @return reversed size
+     */
+    @NonNull
+    public static Size reverseSize(@NonNull Size size) {
+        return new Size(size.getHeight(), size.getWidth());
+    }
+
+    /**
+     * Rotates a {@link Size} according to the rotation degrees.
+     *
+     * @param size the size to rotate
+     * @param rotationDegrees the rotation degrees
+     * @return rotated size
+     * @throws IllegalArgumentException if the rotation degrees is not a multiple of 90
+     */
+    @NonNull
+    public static Size rotateSize(@NonNull Size size, int rotationDegrees) {
+        Preconditions.checkArgument(rotationDegrees % 90 == 0,
+                "Invalid rotation degrees: " + rotationDegrees);
+        return is90or270(within360(rotationDegrees)) ? reverseSize(size) : size;
+    }
+
+    /**
+     * Converts the degrees to within 360 degrees [0 - 359].
+     */
+    public static int within360(int degrees) {
+        return (degrees % 360 + 360) % 360;
+    }
+
     /**
      * Converts an array of vertices to a {@link RectF}.
      */
@@ -156,7 +223,7 @@
     }
 
     /**
-     * Gets the transform from one {@link Rect} to another with rotation degrees.
+     * Gets the transform from one {@link RectF} to another with rotation degrees.
      *
      * <p> Following is how the source is mapped to the target with a 90° rotation. The rect
      * <a, b, c, d> is mapped to <a', b', c', d'>.
@@ -172,11 +239,34 @@
     @NonNull
     public static Matrix getRectToRect(
             @NonNull RectF source, @NonNull RectF target, int rotationDegrees) {
+        return getRectToRect(source, target, rotationDegrees, /*mirroring=*/false);
+    }
+
+    /**
+     * Gets the transform from one {@link RectF} to another with rotation degrees and mirroring.
+     *
+     * <p> Following is how the source is mapped to the target with a 90° rotation and a mirroring.
+     * The rect <a, b, c, d> is mapped to <a', b', c', d'>.
+     *
+     * <pre>
+     *  a----------b                           a'-----------d'
+     *  |  source  |    -90° + mirroring ->    |            |
+     *  d----------c                           |   target   |
+     *                                         |            |
+     *                                         b'-----------c'
+     * </pre>
+     */
+    @NonNull
+    public static Matrix getRectToRect(
+            @NonNull RectF source, @NonNull RectF target, int rotationDegrees, boolean mirroring) {
         // Map source to normalized space.
         Matrix matrix = new Matrix();
         matrix.setRectToRect(source, NORMALIZED_RECT, Matrix.ScaleToFit.FILL);
         // Add rotation.
         matrix.postRotate(rotationDegrees);
+        if (mirroring) {
+            matrix.postScale(-1, 1);
+        }
         // Restore the normalized space to target's coordinates.
         matrix.postConcat(getNormalizedToBuffer(target));
         return matrix;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/processing/Edge.java b/camera/camera-core/src/main/java/androidx/camera/core/processing/Edge.java
new file mode 100644
index 0000000..72973e188
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/processing/Edge.java
@@ -0,0 +1,51 @@
+/*
+ * 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.core.processing;
+
+import static kotlin.jvm.internal.Intrinsics.checkNotNull;
+
+import android.view.Surface;
+
+import androidx.annotation.NonNull;
+import androidx.core.util.Consumer;
+
+/**
+ * A {@link Consumer} that can be listened to by another {@link Consumer}.
+ *
+ * <p>This is a publisher/subscriber mechanism that follows the pattern of the {@link Surface}
+ * API, where the upstream pipeline publishes data to the class by calling {@link #accept}, which
+ * will be automatically sent to the downstream pipeline registered via {@link #setListener}.
+ *
+ * @param <T> the data type.
+ */
+public class Edge<T> implements Consumer<T> {
+
+    private Consumer<T> mListener;
+
+    @Override
+    public void accept(@NonNull T t) {
+        checkNotNull(mListener, "Listener is not set.");
+        mListener.accept(t);
+    }
+
+    /**
+     * Sets a listener that will get data updates.
+     */
+    public void setListener(@NonNull Consumer<T> listener) {
+        mListener = listener;
+    }
+}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/processing/Node.java b/camera/camera-core/src/main/java/androidx/camera/core/processing/Node.java
index 34a1f12..ae4f055 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/processing/Node.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/processing/Node.java
@@ -24,9 +24,7 @@
 import androidx.camera.core.impl.CameraCaptureResult;
 
 /**
- * Base unit for CameraX post-processing.
- *
- * <p>All CameraX post-processing should be wrapped by this interface to explicitly define the I/O.
+ * A pub/sub based unit for CameraX post-processing.
  *
  * <p>Both {@link I} and {@link O} should include handlers to buffers that
  * contain camera frames, as well as the callbacks to notify when the frames are updated. One
@@ -64,11 +62,6 @@
      *
      * <p>This method will be invoked in {@code UseCase#createPipeline}. For now, {@code
      * #createPipeline}s are called on the main thread.
-     *
-     * <p> Returns {@code null} if the input does not change the current state of the
-     * {@link Node}. This usually happens when the input specification can be handled by the
-     * previously allocated buffer, thus no new buffer needs to be allocated. The node will
-     * provide the existing buffer for the upstream node to write to.
      */
     @NonNull
     @MainThread
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/processing/Processor.java b/camera/camera-core/src/main/java/androidx/camera/core/processing/Processor.java
new file mode 100644
index 0000000..759708c
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/processing/Processor.java
@@ -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.camera.core.processing;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.WorkerThread;
+import androidx.camera.core.ImageCaptureException;
+import androidx.camera.core.impl.utils.executor.CameraXExecutors;
+
+/**
+ * Class for processing a single image frame.
+ *
+ * <p>Both {@link I} and {@link O} contain one or many camera frames and their metadata such as
+ * dimension, format and Exif.
+ *
+ * <p>This is a syntax sugar for the {@link Node} class. The purpose is for building a pipeline
+ * intuitively without using {@link Node}'s publisher/subscriber model.
+ *
+ * @param <I> input image frame
+ * @param <O> output image frame.
+ */
+public interface Processor<I, O> {
+
+    /**
+     * Processes an input frame and produces an output frame.
+     *
+     * <p>The implementation of method performs the image processing operations that usually
+     * blocks the current thread. It must be invoked on a non-blocking thread. e.g.
+     * {@link CameraXExecutors#ioExecutor()}.
+     */
+    @NonNull
+    @WorkerThread
+    O process(@NonNull I i) throws ImageCaptureException;
+}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/processing/SettableSurface.java b/camera/camera-core/src/main/java/androidx/camera/core/processing/SettableSurface.java
index 0c1564e..1086821 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/processing/SettableSurface.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/processing/SettableSurface.java
@@ -24,6 +24,7 @@
 import android.graphics.Rect;
 import android.media.ImageReader;
 import android.os.Build;
+import android.util.Range;
 import android.util.Size;
 import android.view.Surface;
 import android.view.SurfaceView;
@@ -36,6 +37,7 @@
 import androidx.camera.core.CameraEffect;
 import androidx.camera.core.SurfaceEffect;
 import androidx.camera.core.SurfaceOutput;
+import androidx.camera.core.SurfaceOutput.GlTransformOptions;
 import androidx.camera.core.SurfaceRequest;
 import androidx.camera.core.UseCase;
 import androidx.camera.core.impl.CameraInternal;
@@ -192,9 +194,31 @@
     @MainThread
     @NonNull
     public SurfaceRequest createSurfaceRequest(@NonNull CameraInternal cameraInternal) {
+        return createSurfaceRequest(cameraInternal, null);
+    }
+
+    /**
+     * Creates a {@link SurfaceRequest} that is linked to this {@link SettableSurface}.
+     *
+     * <p>The {@link SurfaceRequest} is for requesting a {@link Surface} from an external source
+     * such as {@code PreviewView} or {@code VideoCapture}. {@link SettableSurface} uses the
+     * {@link Surface} provided by {@link SurfaceRequest#provideSurface} as its source. For how
+     * the ref-counting works, please see the Javadoc of {@link #setProvider}.
+     *
+     * <p>It throws {@link IllegalStateException} if the current {@link SettableSurface}
+     * already has a provider.
+     *
+     * <p>This overload optionally allows allows specifying the expected frame rate range in which
+     * the surface should operate.
+     */
+    @MainThread
+    @NonNull
+    public SurfaceRequest createSurfaceRequest(@NonNull CameraInternal cameraInternal,
+            @Nullable Range<Integer> expectedFpsRange) {
         checkMainThread();
         // TODO(b/238230154) figure out how to support HDR.
-        SurfaceRequest surfaceRequest = new SurfaceRequest(getSize(), cameraInternal, true);
+        SurfaceRequest surfaceRequest = new SurfaceRequest(getSize(), cameraInternal, true,
+                expectedFpsRange);
         try {
             setProvider(surfaceRequest.getDeferrableSurface());
         } catch (SurfaceClosedException e) {
@@ -216,11 +240,18 @@
      *
      * <p>Do not provide the {@link SurfaceOutput} to external target if the
      * {@link ListenableFuture} fails.
+     *
+     * @param glTransformOptions OpenGL transformation options for SurfaceOutput
+     * @param resolution         resolution of input image buffer
+     * @param cropRect           crop rect of input image buffer
+     * @param rotationDegrees    expected rotation to the input image buffer
+     * @param mirroring          expected mirroring to the input image buffer
      */
     @MainThread
     @NonNull
     public ListenableFuture<SurfaceOutput> createSurfaceOutputFuture(
-            @NonNull float[] glTransformation) {
+            @NonNull GlTransformOptions glTransformOptions, @NonNull Size resolution,
+            @NonNull Rect cropRect, int rotationDegrees, boolean mirroring) {
         checkMainThread();
         Preconditions.checkState(!mHasConsumer, "Consumer can only be linked once.");
         mHasConsumer = true;
@@ -233,7 +264,8 @@
                         return Futures.immediateFailedFuture(e);
                     }
                     SurfaceOutputImpl surfaceOutputImpl = new SurfaceOutputImpl(
-                            surface, getTargets(), getFormat(), getSize(), glTransformation);
+                            surface, getTargets(), getFormat(), getSize(), glTransformOptions,
+                            resolution, cropRect, rotationDegrees, mirroring);
                     surfaceOutputImpl.getCloseFuture().addListener(this::decrementUseCount,
                             directExecutor());
                     mConsumerToNotify = surfaceOutputImpl;
@@ -244,15 +276,15 @@
     /**
      * Closes the {@link DeferrableSurface} and notifies linked objects for the closure.
      */
-    @MainThread
     @Override
     public final void close() {
-        checkMainThread();
         super.close();
-        if (mConsumerToNotify != null) {
-            mConsumerToNotify.requestClose();
-            mConsumerToNotify = null;
-        }
+        mainThreadExecutor().execute(() -> {
+            if (mConsumerToNotify != null) {
+                mConsumerToNotify.requestClose();
+                mConsumerToNotify = null;
+            }
+        });
     }
 
     /**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceEffectNode.java b/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceEffectNode.java
index 0d5670e..f29e566 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceEffectNode.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceEffectNode.java
@@ -16,12 +16,19 @@
 
 package androidx.camera.core.processing;
 
+import static androidx.camera.core.impl.utils.TransformUtils.getRectToRect;
+import static androidx.camera.core.impl.utils.TransformUtils.is90or270;
+import static androidx.camera.core.impl.utils.TransformUtils.rectToSize;
+import static androidx.camera.core.impl.utils.TransformUtils.sizeToRect;
+import static androidx.camera.core.impl.utils.TransformUtils.sizeToRectF;
 import static androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor;
 import static androidx.core.util.Preconditions.checkArgument;
 
 import static java.util.Collections.singletonList;
 
-import android.opengl.Matrix;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.util.Size;
 
 import androidx.annotation.MainThread;
 import androidx.annotation.NonNull;
@@ -29,6 +36,7 @@
 import androidx.annotation.RequiresApi;
 import androidx.camera.core.SurfaceEffect;
 import androidx.camera.core.SurfaceOutput;
+import androidx.camera.core.SurfaceOutput.GlTransformOptions;
 import androidx.camera.core.SurfaceRequest;
 import androidx.camera.core.impl.CameraInternal;
 import androidx.camera.core.impl.utils.Threads;
@@ -51,6 +59,7 @@
 @SuppressWarnings("UnusedVariable")
 public class SurfaceEffectNode implements Node<SurfaceEdge, SurfaceEdge> {
 
+    private final GlTransformOptions mGlTransformOptions;
     @NonNull
     final SurfaceEffectInternal mSurfaceEffect;
     @NonNull
@@ -62,11 +71,17 @@
     private SurfaceEdge mInputEdge;
 
     /**
-     * @param surfaceEffect the interface to wrap around.
+     * Constructs the surface effect node
+     *
+     * @param cameraInternal     the associated camera instance.
+     * @param glTransformOptions the OpenGL transformation options.
+     * @param surfaceEffect      the interface to wrap around.
      */
     public SurfaceEffectNode(@NonNull CameraInternal cameraInternal,
+            @NonNull GlTransformOptions glTransformOptions,
             @NonNull SurfaceEffectInternal surfaceEffect) {
         mCameraInternal = cameraInternal;
+        mGlTransformOptions = glTransformOptions;
         mSurfaceEffect = surfaceEffect;
     }
 
@@ -82,29 +97,70 @@
                 "Multiple input stream not supported yet.");
         mInputEdge = inputEdge;
         SettableSurface inputSurface = inputEdge.getSurfaces().get(0);
-
-        // No transform output as placeholder. The correct outputSurface needs to be calculated
-        // based on inputSurface and outputOption.
-        SettableSurface outputSurface = new SettableSurface(
-                inputSurface.getTargets(),
-                inputSurface.getSize(),
-                inputSurface.getFormat(),
-                inputSurface.getSensorToBufferTransform(),
-                // The Surface transform cannot be carried over during buffer copy.
-                /*hasEmbeddedTransform=*/false,
-                inputSurface.getCropRect(),
-                inputSurface.getRotationDegrees(),
-                inputSurface.getMirroring());
-
+        SettableSurface outputSurface = createOutputSurface(inputSurface);
         sendSurfacesToEffectWhenReady(inputSurface, outputSurface);
-
         mOutputEdge = SurfaceEdge.create(singletonList(outputSurface));
         return mOutputEdge;
     }
 
-    private void sendSurfacesToEffectWhenReady(SettableSurface input, SettableSurface output) {
+    @NonNull
+    private SettableSurface createOutputSurface(@NonNull SettableSurface inputSurface) {
+        SettableSurface outputSurface;
+        switch (mGlTransformOptions) {
+            case APPLY_CROP_ROTATE_AND_MIRRORING:
+                Size resolution = inputSurface.getSize();
+                Rect cropRect = inputSurface.getCropRect();
+                int rotationDegrees = inputSurface.getRotationDegrees();
+                boolean mirroring = inputSurface.getMirroring();
+
+                // Calculate rotated resolution and cropRect
+                Size rotatedCroppedSize = is90or270(rotationDegrees)
+                        ? new Size(/*width=*/cropRect.height(), /*height=*/cropRect.width())
+                        : rectToSize(cropRect);
+
+                // Calculate sensorToBufferTransform
+                android.graphics.Matrix sensorToBufferTransform =
+                        new android.graphics.Matrix(inputSurface.getSensorToBufferTransform());
+                android.graphics.Matrix imageTransform = getRectToRect(sizeToRectF(resolution),
+                        new RectF(cropRect), rotationDegrees, mirroring);
+                sensorToBufferTransform.postConcat(imageTransform);
+
+                outputSurface = new SettableSurface(
+                        inputSurface.getTargets(),
+                        rotatedCroppedSize,
+                        inputSurface.getFormat(),
+                        sensorToBufferTransform,
+                        // The Surface transform cannot be carried over during buffer copy.
+                        /*hasEmbeddedTransform=*/false,
+                        sizeToRect(rotatedCroppedSize),
+                        /*rotationDegrees=*/0,
+                        /*mirroring=*/false);
+                break;
+            case USE_SURFACE_TEXTURE_TRANSFORM:
+                // No transform output as placeholder.
+                outputSurface = new SettableSurface(
+                        inputSurface.getTargets(),
+                        inputSurface.getSize(),
+                        inputSurface.getFormat(),
+                        inputSurface.getSensorToBufferTransform(),
+                        // The Surface transform cannot be carried over during buffer copy.
+                        /*hasEmbeddedTransform=*/false,
+                        inputSurface.getCropRect(),
+                        inputSurface.getRotationDegrees(),
+                        inputSurface.getMirroring());
+                break;
+            default:
+                throw new AssertionError("Unknown GlTransformOptions: " + mGlTransformOptions);
+        }
+        return outputSurface;
+    }
+
+    private void sendSurfacesToEffectWhenReady(@NonNull SettableSurface input,
+            @NonNull SettableSurface output) {
         SurfaceRequest surfaceRequest = input.createSurfaceRequest(mCameraInternal);
-        Futures.addCallback(output.createSurfaceOutputFuture(calculateGlTransform()),
+        Futures.addCallback(output.createSurfaceOutputFuture(mGlTransformOptions,
+                        input.getSize(), input.getCropRect(), input.getRotationDegrees(),
+                        input.getMirroring()),
                 new FutureCallback<SurfaceOutput>() {
                     @Override
                     public void onSuccess(@Nullable SurfaceOutput surfaceOutput) {
@@ -124,13 +180,6 @@
 
     }
 
-    float[] calculateGlTransform() {
-        // TODO: generate the GL transform based on cropping and rotation.
-        float[] glTransform = new float[16];
-        Matrix.setIdentityM(glTransform, 0);
-        return glTransform;
-    }
-
     /**
      * {@inheritDoc}
      */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceOutputImpl.java b/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceOutputImpl.java
index 594fc22..9a7513f 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceOutputImpl.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceOutputImpl.java
@@ -16,6 +16,14 @@
 
 package androidx.camera.core.processing;
 
+import static androidx.camera.core.impl.utils.MatrixExt.preRotate;
+import static androidx.camera.core.impl.utils.TransformUtils.getRectToRect;
+import static androidx.camera.core.impl.utils.TransformUtils.rotateSize;
+import static androidx.camera.core.impl.utils.TransformUtils.sizeToRectF;
+
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.graphics.SurfaceTexture;
 import android.opengl.Matrix;
 import android.util.Size;
 import android.view.Surface;
@@ -55,10 +63,14 @@
     private final int mFormat;
     @NonNull
     private final Size mSize;
+    private final GlTransformOptions mGlTransformOptions;
+    private final Size mInputSize;
+    private final Rect mInputCropRect;
+    private final int mRotationDegrees;
+    private final boolean mMirroring;
 
     @NonNull
-    private final float[] mAdditionalTransform;
-
+    private final float[] mGlTransform = new float[16];
     @GuardedBy("mLock")
     @Nullable
     private Consumer<Event> mEventListener;
@@ -80,14 +92,26 @@
             int targets,
             int format,
             @NonNull Size size,
-            @NonNull float[] additionalTransform) {
+            // TODO(b/241910577): remove this flag when PreviewView handles cropped stream.
+            @NonNull GlTransformOptions glTransformOptions,
+            @NonNull Size inputSize,
+            @NonNull Rect inputCropRect,
+            int rotationDegree,
+            boolean mirroring) {
         mSurface = surface;
         mTargets = targets;
         mFormat = format;
         mSize = size;
-        mAdditionalTransform = new float[16];
-        System.arraycopy(additionalTransform, 0, mAdditionalTransform, 0,
-                additionalTransform.length);
+        mGlTransformOptions = glTransformOptions;
+        mInputSize = inputSize;
+        mInputCropRect = new Rect(inputCropRect);
+        mRotationDegrees = rotationDegree;
+        mMirroring = mirroring;
+
+        if (mGlTransformOptions == GlTransformOptions.APPLY_CROP_ROTATE_AND_MIRRORING) {
+            calculateGlTransform();
+        }
+
         mCloseFuture = CallbackToFutureAdapter.getFuture(
                 completer -> {
                     mCloseFutureCompleter = completer;
@@ -210,7 +234,66 @@
      */
     @AnyThread
     @Override
-    public void updateTransformMatrix(@NonNull float[] updated, @NonNull float[] original) {
-        Matrix.multiplyMM(updated, 0, mAdditionalTransform, 0, original, 0);
+    public void updateTransformMatrix(@NonNull float[] output, @NonNull float[] input) {
+        switch (mGlTransformOptions) {
+            case USE_SURFACE_TEXTURE_TRANSFORM:
+                System.arraycopy(input, 0, output, 0, 16);
+                break;
+            case APPLY_CROP_ROTATE_AND_MIRRORING:
+                System.arraycopy(mGlTransform, 0, output, 0, 16);
+                break;
+            default:
+                throw new AssertionError("Unknown GlTransformOptions: " + mGlTransformOptions);
+        }
+    }
+
+    /**
+     * Calculates the GL transformation.
+     *
+     * <p>The calculation takes the assumption that input transform is not taken, that is
+     * {@link SurfaceTexture#getTransformMatrix(float[])}.
+     *
+     * <p>The calculation is:
+     * <ol>
+     *     <li>Add flipping to compensate the up-side down between texture and image buffer
+     *     coordinates.</li>
+     *     <li>Add rotation.</li>
+     *     <li>Add mirroring when mirroring is required.</li>
+     *     <li>Add cropping based on the input size and crop rect.</li>
+     * </ol>
+     */
+    private void calculateGlTransform() {
+        Matrix.setIdentityM(mGlTransform, 0);
+
+        // Flipping
+        Matrix.translateM(mGlTransform, 0, 0f, 1f, 0f);
+        Matrix.scaleM(mGlTransform, 0, 1f, -1f, 1f);
+
+        // Rotation
+        preRotate(mGlTransform, mRotationDegrees, 0.5f, 0.5f);
+
+        // Mirroring
+        if (mMirroring) {
+            Matrix.translateM(mGlTransform, 0, 1, 0f, 0f);
+            Matrix.scaleM(mGlTransform, 0, -1, 1f, 1f);
+        }
+
+        // Crop
+        // Rotate the size and cropRect, and mirror the cropRect.
+        Size rotatedSize = rotateSize(mInputSize, mRotationDegrees);
+        android.graphics.Matrix imageTransform = getRectToRect(sizeToRectF(mInputSize),
+                sizeToRectF(rotatedSize), mRotationDegrees, mMirroring);
+        RectF rotatedCroppedRect = new RectF(mInputCropRect);
+        imageTransform.mapRect(rotatedCroppedRect);
+        // According to the rotated size and cropRect, compute the normalized offset and the scale
+        // of X and Y.
+        float offsetX = rotatedCroppedRect.left / rotatedSize.getWidth();
+        float offsetY = (rotatedSize.getHeight() - rotatedCroppedRect.height()
+                - rotatedCroppedRect.top) / rotatedSize.getHeight();
+        float scaleX = rotatedCroppedRect.width() / rotatedSize.getWidth();
+        float scaleY = rotatedCroppedRect.height() / rotatedSize.getHeight();
+        // Move to the new left-bottom position and apply the scale.
+        Matrix.translateM(mGlTransform, 0, offsetX, offsetY, 0f);
+        Matrix.scaleM(mGlTransform, 0, scaleX, scaleY, 1f);
     }
 }
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/impl/utils/MatrixExtTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/impl/utils/MatrixExtTest.kt
new file mode 100644
index 0000000..0c5367d
--- /dev/null
+++ b/camera/camera-core/src/test/java/androidx/camera/core/impl/utils/MatrixExtTest.kt
@@ -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.camera.core.impl.utils
+
+import android.opengl.Matrix
+import android.os.Build
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+
+private const val FLOAT_TOLERANCE = 1E-4
+
+@RunWith(RobolectricTestRunner::class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+class MatrixExtTest {
+
+    @Test
+    fun setRotate() {
+        val transform = createIdentityMatrix().also {
+            // 0.5x scaling on the Y axis
+            Matrix.scaleM(it, 0, 1f, 0.5f, 1f)
+        }
+
+        // Act.
+        // 90° clockwise rotation around (0.5, 0.5).
+        MatrixExt.setRotate(transform, -90f, 0.5f, 0.5f)
+
+        // Assert.
+        // Scaling should be gone.
+        //      90° rotation
+        // (0,1) -------------> (1,1)
+        val data = floatArrayOf(0f, 1f, 0f, 1f)
+        val result = FloatArray(4)
+        Matrix.multiplyMV(result, 0, transform, 0, data, 0)
+        assertThat(result).usingTolerance(FLOAT_TOLERANCE)
+            .containsExactly(floatArrayOf(1f, 1f, 0f, 1f))
+    }
+
+    @Test
+    fun preRotate() {
+        val transform = createIdentityMatrix().also {
+            // 0.5x scaling on the Y axis
+            Matrix.scaleM(it, 0, 1f, 0.5f, 1f)
+        }
+
+        // Act.
+        // 90° clockwise rotation around (0.5, 0.5).
+        MatrixExt.preRotate(transform, -90f, 0.5f, 0.5f)
+
+        // Assert.
+        //      90° rotation         0.5x scaling on the Y axis
+        // (0,1) -------------> (1,1) -------------------------> (1,0.5)
+        val data = floatArrayOf(0f, 1f, 0f, 1f)
+        val result = FloatArray(4)
+        Matrix.multiplyMV(result, 0, transform, 0, data, 0)
+        assertThat(result).usingTolerance(FLOAT_TOLERANCE)
+            .containsExactly(floatArrayOf(1f, 0.5f, 0f, 1f))
+    }
+
+    @Test
+    fun postRotate() {
+        val transform = createIdentityMatrix().also {
+            // 0.5x scaling on the Y axis
+            Matrix.scaleM(it, 0, 1f, 0.5f, 1f)
+        }
+
+        // Act.
+        // 90° clockwise rotation around (0.5, 0.5).
+        MatrixExt.postRotate(transform, -90f, 0.5f, 0.5f)
+
+        // Assert.
+        //      0.5x scaling on the Y axis         90° rotation
+        // (0,1) ------------------------> (0,0.5) ------------> (0.5,1)
+        val data = floatArrayOf(0f, 1f, 0f, 1f)
+        val result = FloatArray(4)
+        Matrix.multiplyMV(result, 0, transform, 0, data, 0)
+        assertThat(result).usingTolerance(FLOAT_TOLERANCE)
+            .containsExactly(floatArrayOf(0.5f, 1f, 0f, 1f))
+    }
+
+    private fun createIdentityMatrix() = FloatArray(16).apply { setIdentity() }
+
+    private fun FloatArray.setIdentity() {
+        Matrix.setIdentityM(this, 0)
+    }
+}
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/impl/utils/TransformUtilsTest.java b/camera/camera-core/src/test/java/androidx/camera/core/impl/utils/TransformUtilsTest.java
index 2808ba3..3d6cf39 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/impl/utils/TransformUtilsTest.java
+++ b/camera/camera-core/src/test/java/androidx/camera/core/impl/utils/TransformUtilsTest.java
@@ -18,6 +18,8 @@
 
 import static androidx.camera.core.impl.utils.TransformUtils.getExifTransform;
 import static androidx.camera.core.impl.utils.TransformUtils.rectToVertices;
+import static androidx.camera.core.impl.utils.TransformUtils.rotateSize;
+import static androidx.camera.core.impl.utils.TransformUtils.within360;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -46,6 +48,109 @@
     private static final int HEIGHT = 300;
 
     @Test
+    public void reversSize() {
+        assertThat(TransformUtils.reverseSize(new Size(640, 480))).isEqualTo(new Size(480, 640));
+    }
+
+    @Test
+    public void rotateSize_multipleOf90() {
+        Size size = new Size(WIDTH, HEIGHT);
+        //noinspection SuspiciousNameCombination
+        Size rotatedSize = new Size(HEIGHT, WIDTH);
+
+        assertThat(rotateSize(size, 0)).isEqualTo(size);
+        assertThat(rotateSize(size, 90)).isEqualTo(rotatedSize);
+        assertThat(rotateSize(size, 180)).isEqualTo(size);
+        assertThat(rotateSize(size, 270)).isEqualTo(rotatedSize);
+        assertThat(rotateSize(size, 360)).isEqualTo(size);
+        assertThat(rotateSize(size, 450)).isEqualTo(rotatedSize);
+        assertThat(rotateSize(size, -90)).isEqualTo(rotatedSize);
+        assertThat(rotateSize(size, -450)).isEqualTo(rotatedSize);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void rotateSize_notMultipleOf90() {
+        rotateSize(new Size(WIDTH, HEIGHT), 1);
+    }
+
+    @Test
+    public void within360_forVariousValues() {
+        // Positive degrees
+        assertThat(within360(90)).isEqualTo(90);
+        assertThat(within360(360)).isEqualTo(0);
+        assertThat(within360(400)).isEqualTo(40);
+        assertThat(within360(800)).isEqualTo(80);
+        // Negative degrees
+        assertThat(within360(-90)).isEqualTo(270);
+        assertThat(within360(-200)).isEqualTo(160);
+        assertThat(within360(-360)).isEqualTo(0);
+        assertThat(within360(-400)).isEqualTo(320);
+        assertThat(within360(-800)).isEqualTo(280);
+    }
+
+    @Test
+    public void getRectToRect_withRotation() {
+        // Arrange.
+        // From 10x10 with xy-offset 10 to 100x100 with xy-offset 0
+        RectF sourceRect = new RectF(10, 10f, 20f, 20f);
+        RectF targetRect = new RectF(0f, 0f, 100f, 100f);
+
+        RectF testRect0 = new RectF(11f, 11f, 12f, 12f);
+        RectF testRect90 = new RectF(testRect0);
+        RectF testRect180 = new RectF(testRect0);
+        RectF testRect270 = new RectF(testRect0);
+        RectF expectRect0 = new RectF(10f, 10f, 20f, 20f);
+        RectF expectRect90 = new RectF(80f, 10f, 90f, 20f);
+        RectF expectRect180 = new RectF(80f, 80f, 90f, 90f);
+        RectF expectRect270 = new RectF(10f, 80f, 20f, 90f);
+
+        // Act.
+        TransformUtils.getRectToRect(sourceRect, targetRect, 0).mapRect(testRect0);
+        TransformUtils.getRectToRect(sourceRect, targetRect, 90).mapRect(testRect90);
+        TransformUtils.getRectToRect(sourceRect, targetRect, 180).mapRect(testRect180);
+        TransformUtils.getRectToRect(sourceRect, targetRect, 270).mapRect(testRect270);
+
+        // Assert.
+        assertThat(testRect0).isEqualTo(expectRect0);
+        assertThat(testRect90).isEqualTo(expectRect90);
+        assertThat(testRect180).isEqualTo(expectRect180);
+        assertThat(testRect270).isEqualTo(expectRect270);
+    }
+
+    @Test
+    public void getRectToRect_withRotationAndMirroring() {
+        // Arrange.
+        // From 10x10 with xy-offset 10 to 100x100 with xy-offset 0
+        RectF sourceRect = new RectF(10, 10f, 20f, 20f);
+        RectF targetRect = new RectF(0f, 0f, 100f, 100f);
+
+        RectF testRect0 = new RectF(11f, 11f, 12f, 12f);
+        RectF testRect90 = new RectF(testRect0);
+        RectF testRect180 = new RectF(testRect0);
+        RectF testRect270 = new RectF(testRect0);
+        RectF expectRect0 = new RectF(80f, 10f, 90f, 20f);
+        RectF expectRect90 = new RectF(10f, 10f, 20f, 20f);
+        RectF expectRect180 = new RectF(10f, 80f, 20f, 90f);
+        RectF expectRect270 = new RectF(80f, 80f, 90f, 90f);
+
+        // Act.
+        TransformUtils.getRectToRect(sourceRect, targetRect, 0, true)
+                .mapRect(testRect0);
+        TransformUtils.getRectToRect(sourceRect, targetRect, 90, true)
+                .mapRect(testRect90);
+        TransformUtils.getRectToRect(sourceRect, targetRect, 180, true)
+                .mapRect(testRect180);
+        TransformUtils.getRectToRect(sourceRect, targetRect, 270, true)
+                .mapRect(testRect270);
+
+        // Assert.
+        assertThat(testRect0).isEqualTo(expectRect0);
+        assertThat(testRect90).isEqualTo(expectRect90);
+        assertThat(testRect180).isEqualTo(expectRect180);
+        assertThat(testRect270).isEqualTo(expectRect270);
+    }
+
+    @Test
     public void viewPortMatchAllowRoundingError() {
         // Arrange: create two 1:1 crop rect. Due to rounding error, one is 11:9 and another is
         // 9:11.
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/processing/EdgeTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/processing/EdgeTest.kt
new file mode 100644
index 0000000..a2458aa
--- /dev/null
+++ b/camera/camera-core/src/test/java/androidx/camera/core/processing/EdgeTest.kt
@@ -0,0 +1,57 @@
+/*
+ * 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.core.processing
+
+import android.os.Build
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+
+/**
+ * Unit tests for [Edge].
+ */
+@RunWith(RobolectricTestRunner::class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+class EdgeTest {
+
+    companion object {
+        const val DATA = "data"
+    }
+
+    @Test
+    fun acceptData_propagatedToListener() {
+        // Arrange.
+        val edge = Edge<String>()
+        var propagatedData: String? = null
+        edge.setListener {
+            propagatedData = it
+        }
+        // Act.
+        edge.accept(DATA)
+        // Assert.
+        assertThat(propagatedData).isEqualTo(DATA)
+    }
+
+    @Test(expected = NullPointerException::class)
+    fun acceptDataWithoutListener_throwsException() {
+        Edge<String>().accept(DATA)
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/processing/SettableSurfaceTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/processing/SettableSurfaceTest.kt
index 5648bea..0d8616a6 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/processing/SettableSurfaceTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/processing/SettableSurfaceTest.kt
@@ -26,17 +26,21 @@
 import android.view.Surface
 import androidx.camera.core.SurfaceEffect
 import androidx.camera.core.SurfaceOutput
+import androidx.camera.core.SurfaceOutput.GlTransformOptions.USE_SURFACE_TEXTURE_TRANSFORM
 import androidx.camera.core.SurfaceRequest
 import androidx.camera.core.SurfaceRequest.Result.RESULT_REQUEST_CANCELLED
 import androidx.camera.core.impl.DeferrableSurface.SurfaceClosedException
 import androidx.camera.core.impl.DeferrableSurface.SurfaceUnavailableException
 import androidx.camera.core.impl.ImmediateSurface
+import androidx.camera.core.impl.utils.TransformUtils.sizeToRect
 import androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor
 import androidx.camera.core.impl.utils.futures.FutureCallback
 import androidx.camera.core.impl.utils.futures.Futures
 import androidx.camera.testing.fakes.FakeCamera
 import androidx.concurrent.futures.CallbackToFutureAdapter
 import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.runBlocking
 import org.junit.After
 import org.junit.Before
 import org.junit.Test
@@ -55,9 +59,7 @@
 class SettableSurfaceTest {
 
     companion object {
-        private val IDENTITY_MATRIX = FloatArray(16).apply {
-            android.opengl.Matrix.setIdentityM(this, 0)
-        }
+        private val INPUT_SIZE = Size(640, 480)
     }
 
     private lateinit var settableSurface: SettableSurface
@@ -82,6 +84,11 @@
     }
 
     @Test
+    fun closeSettableSurfaceOnIoDispatchers_noCrash(): Unit = runBlocking(Dispatchers.IO) {
+        settableSurface.close()
+    }
+
+    @Test
     fun closeProviderAfterConnected_surfaceNotReleased() {
         // Arrange.
         val surfaceRequest = settableSurface.createSurfaceRequest(FakeCamera())
@@ -148,7 +155,7 @@
     fun createSurfaceOutputWithClosedInstance_surfaceOutputNotCreated() {
         // Arrange: create a SurfaceOutput future from a closed LinkableSurface
         settableSurface.close()
-        val surfaceOutput = settableSurface.createSurfaceOutputFuture(IDENTITY_MATRIX)
+        val surfaceOutput = createSurfaceOutputFuture(settableSurface)
 
         // Act: wait for the SurfaceOutput to return.
         var successful: Boolean? = null
@@ -200,7 +207,7 @@
     fun linkBothProviderAndConsumer_surfaceAndResultsArePropagatedE2E() {
         // Arrange: link a LinkableSurface with a SurfaceRequest and a SurfaceOutput.
         val surfaceRequest = settableSurface.createSurfaceRequest(FakeCamera())
-        val surfaceOutputFuture = settableSurface.createSurfaceOutputFuture(IDENTITY_MATRIX)
+        val surfaceOutputFuture = createSurfaceOutputFuture(settableSurface)
         var surfaceOutput: SurfaceOutput? = null
         Futures.transform(surfaceOutputFuture, {
             surfaceOutput = it
@@ -248,8 +255,17 @@
 
     @Test(expected = IllegalStateException::class)
     fun createSurfaceOutputTwice_throwsException() {
-        settableSurface.createSurfaceOutputFuture(IDENTITY_MATRIX)
-        settableSurface.createSurfaceOutputFuture(IDENTITY_MATRIX)
+        createSurfaceOutputFuture(settableSurface)
+        createSurfaceOutputFuture(settableSurface)
         shadowOf(getMainLooper()).idle()
     }
+
+    private fun createSurfaceOutputFuture(settableSurface: SettableSurface) =
+        settableSurface.createSurfaceOutputFuture(
+            USE_SURFACE_TEXTURE_TRANSFORM,
+            INPUT_SIZE,
+            sizeToRect(INPUT_SIZE),
+            /*rotationDegrees=*/0,
+            /*mirroring=*/false
+        )
 }
\ No newline at end of file
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceEffectNodeTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceEffectNodeTest.kt
index 7df85dd..ca23983 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceEffectNodeTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceEffectNodeTest.kt
@@ -24,6 +24,11 @@
 import android.util.Size
 import android.view.Surface
 import androidx.camera.core.SurfaceEffect.PREVIEW
+import androidx.camera.core.SurfaceOutput.GlTransformOptions
+import androidx.camera.core.SurfaceOutput.GlTransformOptions.APPLY_CROP_ROTATE_AND_MIRRORING
+import androidx.camera.core.SurfaceOutput.GlTransformOptions.USE_SURFACE_TEXTURE_TRANSFORM
+import androidx.camera.core.impl.utils.TransformUtils.is90or270
+import androidx.camera.core.impl.utils.TransformUtils.rectToSize
 import androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor
 import androidx.camera.core.impl.utils.futures.Futures
 import androidx.camera.testing.fakes.FakeCamera
@@ -65,8 +70,6 @@
         appSurfaceTexture = SurfaceTexture(0)
         appSurface = Surface(appSurfaceTexture)
         surfaceEffectInternal = FakeSurfaceEffectInternal(mainThreadExecutor())
-        node = SurfaceEffectNode(FakeCamera(), surfaceEffectInternal)
-        inputEdge = createInputEdge()
     }
 
     @After
@@ -74,33 +77,97 @@
         appSurfaceTexture.release()
         appSurface.release()
         surfaceEffectInternal.release()
-        node.release()
-        inputEdge.surfaces[0].close()
+        if (::node.isInitialized) {
+            node.release()
+        }
+        if (::inputEdge.isInitialized) {
+            inputEdge.surfaces.forEach { it.close() }
+        }
         shadowOf(getMainLooper()).idle()
     }
 
     @Test
-    fun transformInput_outputHasTheSameProperty() {
+    fun transformInput_withoutGlTransform_outputHasTheSameProperty() {
         // Arrange.
+        createSurfaceEffectNode()
+        createInputEdge()
         val inputSurface = inputEdge.surfaces[0]
 
         // Act.
         val outputEdge = node.transform(inputEdge)
 
-        // Asset: without transformation, the output has the same property as the input.
+        // Assert: without transformation, the output has the same property as the input.
         assertThat(outputEdge.surfaces).hasSize(1)
         val outputSurface = outputEdge.surfaces[0]
         assertThat(outputSurface.size).isEqualTo(inputSurface.size)
         assertThat(outputSurface.format).isEqualTo(inputSurface.format)
         assertThat(outputSurface.targets).isEqualTo(inputSurface.targets)
         assertThat(outputSurface.cropRect).isEqualTo(inputSurface.cropRect)
+        assertThat(outputSurface.rotationDegrees).isEqualTo(inputSurface.rotationDegrees)
         assertThat(outputSurface.mirroring).isEqualTo(inputSurface.mirroring)
         assertThat(outputSurface.hasEmbeddedTransform()).isFalse()
     }
 
     @Test
+    fun transformInput_withGlTransformRotation_outputIsCroppedAndRotated() {
+        val cropRect = Rect(200, 100, 600, 400)
+        for (rotationDegrees in arrayOf(0, 90, 180, 270)) {
+            // Arrange.
+            createSurfaceEffectNode(APPLY_CROP_ROTATE_AND_MIRRORING)
+            createInputEdge(
+                size = rectToSize(cropRect),
+                cropRect = cropRect,
+                rotationDegrees = rotationDegrees
+            )
+            // The result cropRect should have zero left and top.
+            val expectedCropRect = if (is90or270(rotationDegrees))
+                Rect(0, 0, cropRect.height(), cropRect.width())
+            else
+                Rect(0, 0, cropRect.width(), cropRect.height())
+
+            // Act.
+            val outputEdge = node.transform(inputEdge)
+
+            // Assert: with transformation, the output size is cropped/rotated and the rotation
+            // degrees is reset.
+            assertThat(outputEdge.surfaces).hasSize(1)
+            val outputSurface = outputEdge.surfaces[0]
+            assertThat(outputSurface.size).isEqualTo(rectToSize(expectedCropRect))
+            assertThat(outputSurface.cropRect).isEqualTo(expectedCropRect)
+            assertThat(outputSurface.rotationDegrees).isEqualTo(0)
+
+            // Clean up.
+            inputEdge.surfaces[0].close()
+            node.release()
+        }
+    }
+
+    @Test
+    fun transformInput_withGlTransformMirroring_outputHasNoMirroring() {
+        for (mirroring in arrayOf(false, true)) {
+            // Arrange.
+            createSurfaceEffectNode(APPLY_CROP_ROTATE_AND_MIRRORING)
+            createInputEdge(mirroring = mirroring)
+
+            // Act.
+            val outputEdge = node.transform(inputEdge)
+
+            // Assert: the mirroring of output is always false.
+            assertThat(outputEdge.surfaces).hasSize(1)
+            val outputSurface = outputEdge.surfaces[0]
+            assertThat(outputSurface.mirroring).isFalse()
+
+            // Clean up.
+            inputEdge.surfaces[0].close()
+            node.release()
+        }
+    }
+
+    @Test
     fun provideSurfaceToOutput_surfaceIsPropagatedE2E() {
         // Arrange.
+        createSurfaceEffectNode()
+        createInputEdge()
         val inputSurface = inputEdge.surfaces[0]
         val outputEdge = node.transform(inputEdge)
         val outputSurface = outputEdge.surfaces[0]
@@ -117,6 +184,8 @@
     @Test
     fun releaseNode_effectIsReleased() {
         // Arrange.
+        createSurfaceEffectNode()
+        createInputEdge()
         val outputSurface = node.transform(inputEdge).surfaces[0]
         outputSurface.setProvider(Futures.immediateFuture(appSurface))
         shadowOf(getMainLooper()).idle()
@@ -130,17 +199,32 @@
         assertThat(surfaceEffectInternal.isOutputSurfaceRequestedToClose).isTrue()
     }
 
-    private fun createInputEdge(): SurfaceEdge {
+    private fun createInputEdge(
+        target: Int = TARGET,
+        size: Size = SIZE,
+        format: Int = FORMAT,
+        sensorToBufferTransform: android.graphics.Matrix = android.graphics.Matrix(),
+        hasEmbeddedTransform: Boolean = true,
+        cropRect: Rect = CROP_RECT,
+        rotationDegrees: Int = ROTATION_DEGREES,
+        mirroring: Boolean = false
+    ) {
         val surface = SettableSurface(
-            TARGET,
-            SIZE,
-            FORMAT,
-            android.graphics.Matrix(),
-            true,
-            CROP_RECT,
-            ROTATION_DEGREES,
-            false
+            target,
+            size,
+            format,
+            sensorToBufferTransform,
+            hasEmbeddedTransform,
+            cropRect,
+            rotationDegrees,
+            mirroring
         )
-        return SurfaceEdge.create(listOf(surface))
+        inputEdge = SurfaceEdge.create(listOf(surface))
     }
-}
\ No newline at end of file
+
+    private fun createSurfaceEffectNode(
+        glTransformOptions: GlTransformOptions = USE_SURFACE_TEXTURE_TRANSFORM
+    ) {
+        node = SurfaceEffectNode(FakeCamera(), glTransformOptions, surfaceEffectInternal)
+    }
+}
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceOutputImplTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceOutputImplTest.kt
index 5e8863e..f056808 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceOutputImplTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceOutputImplTest.kt
@@ -18,12 +18,14 @@
 
 import android.graphics.PixelFormat
 import android.graphics.SurfaceTexture
-import android.opengl.Matrix
 import android.os.Build
 import android.os.Looper
 import android.util.Size
 import android.view.Surface
 import androidx.camera.core.SurfaceEffect
+import androidx.camera.core.SurfaceOutput.GlTransformOptions
+import androidx.camera.core.SurfaceOutput.GlTransformOptions.USE_SURFACE_TEXTURE_TRANSFORM
+import androidx.camera.core.impl.utils.TransformUtils.sizeToRect
 import androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor
 import com.google.common.truth.Truth.assertThat
 import org.junit.After
@@ -44,13 +46,10 @@
 class SurfaceOutputImplTest {
 
     companion object {
-        private val IDENTITY_MATRIX = FloatArray(16).apply {
-            Matrix.setIdentityM(this, 0)
-        }
-        private const val FLOAT_TOLERANCE = 1E-4
         private const val TARGET = SurfaceEffect.PREVIEW
         private const val FORMAT = PixelFormat.RGBA_8888
-        private val SIZE = Size(640, 480)
+        private val OUTPUT_SIZE = Size(640, 480)
+        private val INPUT_SIZE = Size(640, 480)
     }
 
     private lateinit var fakeSurface: Surface
@@ -121,42 +120,33 @@
     }
 
     @Test
-    fun updateMatrix_multipliesMatrices() {
+    fun updateMatrix_useSurfaceTextureTransform_sameResult() {
         // Arrange.
-        // 2x scaling on the x axis.
-        val scale2x = FloatArray(16).apply {
-            Matrix.setIdentityM(this, 0)
-            Matrix.scaleM(this, 0, 2F, 1F, 1F)
-        }
-        val surfaceOut = createFakeSurfaceOutputImpl(transform = scale2x)
+        val surfaceOut =
+            createFakeSurfaceOutputImpl(glTransformOptions = USE_SURFACE_TEXTURE_TRANSFORM)
 
-        // Act: apply the 2x scaling on top of the 90° rotation.
-        // 90° clockwise rotation around (0, 0).
-        val rotate90 = FloatArray(16).apply {
-            Matrix.setRotateM(this, 0, 90F, 0F, 0F, -1F)
-        }
+        // Act.
+        val input = floatArrayOf(1f, 1f, 1f, 1f, 2f, 2f, 2f, 2f, 3f, 3f, 3f, 3f, 4f, 4f, 4f, 4f)
         val result = FloatArray(16)
-        surfaceOut.updateTransformMatrix(result, rotate90)
+        surfaceOut.updateTransformMatrix(result, input)
 
         // Assert.
-        // Assert the result is a multiplication of the two matrices.
-        val expectedMatrix = FloatArray(16).apply {
-            Matrix.multiplyMM(this, 0, scale2x, 0, rotate90, 0)
-        }
-        assertThat(result).usingTolerance(FLOAT_TOLERANCE).containsExactly(expectedMatrix)
-
-        // Assert coordinates mapping is correct.
-        //       90° rotation         2x scaling on the X axis
-        // (1,1) -------------> (1,-1) ----------------------> (2,-1)
-        val point = floatArrayOf(1F, 1F, 0F, 1F)
-        val expectedPoint = FloatArray(4)
-        Matrix.multiplyMV(expectedPoint, 0, result, 0, point, 0)
-        assertThat(expectedPoint).usingTolerance(FLOAT_TOLERANCE)
-            .containsExactly(floatArrayOf(2F, -1F, 0F, 1F))
+        assertThat(result).isEqualTo(input)
     }
 
-    private fun createFakeSurfaceOutputImpl(transform: FloatArray = IDENTITY_MATRIX) =
-        SurfaceOutputImpl(fakeSurface, TARGET, FORMAT, SIZE, transform).apply {
-            surfaceOutputsToCleanup.add(this)
-        }
+    private fun createFakeSurfaceOutputImpl(
+        glTransformOptions: GlTransformOptions = USE_SURFACE_TEXTURE_TRANSFORM
+    ) = SurfaceOutputImpl(
+        fakeSurface,
+        TARGET,
+        FORMAT,
+        OUTPUT_SIZE,
+        glTransformOptions,
+        INPUT_SIZE,
+        sizeToRect(INPUT_SIZE),
+        /*rotationDegrees=*/0,
+        /*mirroring=*/false
+    ).apply {
+        surfaceOutputsToCleanup.add(this)
+    }
 }
\ No newline at end of file
diff --git a/camera/camera-effects/api/1.2.0-beta01.txt b/camera/camera-effects/api/1.2.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/camera/camera-effects/api/1.2.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/camera/camera-effects/api/public_plus_experimental_1.2.0-beta01.txt b/camera/camera-effects/api/public_plus_experimental_1.2.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/camera/camera-effects/api/public_plus_experimental_1.2.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/health/health-connect-client/api/res-current.txt b/camera/camera-effects/api/res-1.2.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to camera/camera-effects/api/res-1.2.0-beta01.txt
diff --git a/camera/camera-effects/api/restricted_1.2.0-beta01.txt b/camera/camera-effects/api/restricted_1.2.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/camera/camera-effects/api/restricted_1.2.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/camera/camera-extensions/api/1.2.0-beta01.txt b/camera/camera-extensions/api/1.2.0-beta01.txt
new file mode 100644
index 0000000..0db7e93
--- /dev/null
+++ b/camera/camera-extensions/api/1.2.0-beta01.txt
@@ -0,0 +1,21 @@
+// Signature format: 4.0
+package androidx.camera.extensions {
+
+  @RequiresApi(21) public final class ExtensionMode {
+    field public static final int AUTO = 5; // 0x5
+    field public static final int BOKEH = 1; // 0x1
+    field public static final int FACE_RETOUCH = 4; // 0x4
+    field public static final int HDR = 2; // 0x2
+    field public static final int NIGHT = 3; // 0x3
+    field public static final int NONE = 0; // 0x0
+  }
+
+  @RequiresApi(21) public final class ExtensionsManager {
+    method public android.util.Range<java.lang.Long!>? getEstimatedCaptureLatencyRange(androidx.camera.core.CameraSelector, int);
+    method public androidx.camera.core.CameraSelector getExtensionEnabledCameraSelector(androidx.camera.core.CameraSelector, int);
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.camera.extensions.ExtensionsManager!> getInstanceAsync(android.content.Context, androidx.camera.core.CameraProvider);
+    method public boolean isExtensionAvailable(androidx.camera.core.CameraSelector, int);
+  }
+
+}
+
diff --git a/camera/camera-extensions/api/public_plus_experimental_1.2.0-beta01.txt b/camera/camera-extensions/api/public_plus_experimental_1.2.0-beta01.txt
new file mode 100644
index 0000000..0db7e93
--- /dev/null
+++ b/camera/camera-extensions/api/public_plus_experimental_1.2.0-beta01.txt
@@ -0,0 +1,21 @@
+// Signature format: 4.0
+package androidx.camera.extensions {
+
+  @RequiresApi(21) public final class ExtensionMode {
+    field public static final int AUTO = 5; // 0x5
+    field public static final int BOKEH = 1; // 0x1
+    field public static final int FACE_RETOUCH = 4; // 0x4
+    field public static final int HDR = 2; // 0x2
+    field public static final int NIGHT = 3; // 0x3
+    field public static final int NONE = 0; // 0x0
+  }
+
+  @RequiresApi(21) public final class ExtensionsManager {
+    method public android.util.Range<java.lang.Long!>? getEstimatedCaptureLatencyRange(androidx.camera.core.CameraSelector, int);
+    method public androidx.camera.core.CameraSelector getExtensionEnabledCameraSelector(androidx.camera.core.CameraSelector, int);
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.camera.extensions.ExtensionsManager!> getInstanceAsync(android.content.Context, androidx.camera.core.CameraProvider);
+    method public boolean isExtensionAvailable(androidx.camera.core.CameraSelector, int);
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/camera/camera-extensions/api/res-1.2.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to camera/camera-extensions/api/res-1.2.0-beta01.txt
diff --git a/camera/camera-extensions/api/restricted_1.2.0-beta01.txt b/camera/camera-extensions/api/restricted_1.2.0-beta01.txt
new file mode 100644
index 0000000..0db7e93
--- /dev/null
+++ b/camera/camera-extensions/api/restricted_1.2.0-beta01.txt
@@ -0,0 +1,21 @@
+// Signature format: 4.0
+package androidx.camera.extensions {
+
+  @RequiresApi(21) public final class ExtensionMode {
+    field public static final int AUTO = 5; // 0x5
+    field public static final int BOKEH = 1; // 0x1
+    field public static final int FACE_RETOUCH = 4; // 0x4
+    field public static final int HDR = 2; // 0x2
+    field public static final int NIGHT = 3; // 0x3
+    field public static final int NONE = 0; // 0x0
+  }
+
+  @RequiresApi(21) public final class ExtensionsManager {
+    method public android.util.Range<java.lang.Long!>? getEstimatedCaptureLatencyRange(androidx.camera.core.CameraSelector, int);
+    method public androidx.camera.core.CameraSelector getExtensionEnabledCameraSelector(androidx.camera.core.CameraSelector, int);
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.camera.extensions.ExtensionsManager!> getInstanceAsync(android.content.Context, androidx.camera.core.CameraProvider);
+    method public boolean isExtensionAvailable(androidx.camera.core.CameraSelector, int);
+  }
+
+}
+
diff --git a/camera/camera-lifecycle/api/1.2.0-beta01.txt b/camera/camera-lifecycle/api/1.2.0-beta01.txt
new file mode 100644
index 0000000..7077f67
--- /dev/null
+++ b/camera/camera-lifecycle/api/1.2.0-beta01.txt
@@ -0,0 +1,16 @@
+// Signature format: 4.0
+package androidx.camera.lifecycle {
+
+  @RequiresApi(21) public final class ProcessCameraProvider implements androidx.camera.core.CameraProvider {
+    method @MainThread public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCase!...);
+    method @MainThread public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCaseGroup);
+    method public java.util.List<androidx.camera.core.CameraInfo!> getAvailableCameraInfos();
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.camera.lifecycle.ProcessCameraProvider!> getInstance(android.content.Context);
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public boolean isBound(androidx.camera.core.UseCase);
+    method @MainThread public void unbind(androidx.camera.core.UseCase!...);
+    method @MainThread public void unbindAll();
+  }
+
+}
+
diff --git a/camera/camera-lifecycle/api/public_plus_experimental_1.2.0-beta01.txt b/camera/camera-lifecycle/api/public_plus_experimental_1.2.0-beta01.txt
new file mode 100644
index 0000000..c9ff443
--- /dev/null
+++ b/camera/camera-lifecycle/api/public_plus_experimental_1.2.0-beta01.txt
@@ -0,0 +1,20 @@
+// Signature format: 4.0
+package androidx.camera.lifecycle {
+
+  @RequiresOptIn @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ExperimentalCameraProviderConfiguration {
+  }
+
+  @RequiresApi(21) public final class ProcessCameraProvider implements androidx.camera.core.CameraProvider {
+    method @MainThread public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCase!...);
+    method @MainThread public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCaseGroup);
+    method @androidx.camera.lifecycle.ExperimentalCameraProviderConfiguration public static void configureInstance(androidx.camera.core.CameraXConfig);
+    method public java.util.List<androidx.camera.core.CameraInfo!> getAvailableCameraInfos();
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.camera.lifecycle.ProcessCameraProvider!> getInstance(android.content.Context);
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public boolean isBound(androidx.camera.core.UseCase);
+    method @MainThread public void unbind(androidx.camera.core.UseCase!...);
+    method @MainThread public void unbindAll();
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/camera/camera-lifecycle/api/res-1.2.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to camera/camera-lifecycle/api/res-1.2.0-beta01.txt
diff --git a/camera/camera-lifecycle/api/restricted_1.2.0-beta01.txt b/camera/camera-lifecycle/api/restricted_1.2.0-beta01.txt
new file mode 100644
index 0000000..7077f67
--- /dev/null
+++ b/camera/camera-lifecycle/api/restricted_1.2.0-beta01.txt
@@ -0,0 +1,16 @@
+// Signature format: 4.0
+package androidx.camera.lifecycle {
+
+  @RequiresApi(21) public final class ProcessCameraProvider implements androidx.camera.core.CameraProvider {
+    method @MainThread public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCase!...);
+    method @MainThread public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCaseGroup);
+    method public java.util.List<androidx.camera.core.CameraInfo!> getAvailableCameraInfos();
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.camera.lifecycle.ProcessCameraProvider!> getInstance(android.content.Context);
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public boolean isBound(androidx.camera.core.UseCase);
+    method @MainThread public void unbind(androidx.camera.core.UseCase!...);
+    method @MainThread public void unbindAll();
+  }
+
+}
+
diff --git a/camera/camera-mlkit-vision/api/1.2.0-beta01.txt b/camera/camera-mlkit-vision/api/1.2.0-beta01.txt
new file mode 100644
index 0000000..0599c25
--- /dev/null
+++ b/camera/camera-mlkit-vision/api/1.2.0-beta01.txt
@@ -0,0 +1,20 @@
+// Signature format: 4.0
+package androidx.camera.mlkit.vision {
+
+  @RequiresApi(21) public class MlKitAnalyzer implements androidx.camera.core.ImageAnalysis.Analyzer {
+    ctor public MlKitAnalyzer(java.util.List<com.google.mlkit.vision.interfaces.Detector<?>!>, int, java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.camera.mlkit.vision.MlKitAnalyzer.Result!>);
+    method public final void analyze(androidx.camera.core.ImageProxy);
+    method public final android.util.Size getDefaultTargetResolution();
+    method public final int getTargetCoordinateSystem();
+    method public final void updateTransform(android.graphics.Matrix?);
+  }
+
+  public static final class MlKitAnalyzer.Result {
+    ctor public MlKitAnalyzer.Result(java.util.Map<com.google.mlkit.vision.interfaces.Detector<?>!,java.lang.Object!>, long, java.util.Map<com.google.mlkit.vision.interfaces.Detector<?>!,java.lang.Throwable!>);
+    method public Throwable? getThrowable(com.google.mlkit.vision.interfaces.Detector<?>);
+    method public long getTimestamp();
+    method public <T> T? getValue(com.google.mlkit.vision.interfaces.Detector<T!>);
+  }
+
+}
+
diff --git a/camera/camera-mlkit-vision/api/public_plus_experimental_1.2.0-beta01.txt b/camera/camera-mlkit-vision/api/public_plus_experimental_1.2.0-beta01.txt
new file mode 100644
index 0000000..0599c25
--- /dev/null
+++ b/camera/camera-mlkit-vision/api/public_plus_experimental_1.2.0-beta01.txt
@@ -0,0 +1,20 @@
+// Signature format: 4.0
+package androidx.camera.mlkit.vision {
+
+  @RequiresApi(21) public class MlKitAnalyzer implements androidx.camera.core.ImageAnalysis.Analyzer {
+    ctor public MlKitAnalyzer(java.util.List<com.google.mlkit.vision.interfaces.Detector<?>!>, int, java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.camera.mlkit.vision.MlKitAnalyzer.Result!>);
+    method public final void analyze(androidx.camera.core.ImageProxy);
+    method public final android.util.Size getDefaultTargetResolution();
+    method public final int getTargetCoordinateSystem();
+    method public final void updateTransform(android.graphics.Matrix?);
+  }
+
+  public static final class MlKitAnalyzer.Result {
+    ctor public MlKitAnalyzer.Result(java.util.Map<com.google.mlkit.vision.interfaces.Detector<?>!,java.lang.Object!>, long, java.util.Map<com.google.mlkit.vision.interfaces.Detector<?>!,java.lang.Throwable!>);
+    method public Throwable? getThrowable(com.google.mlkit.vision.interfaces.Detector<?>);
+    method public long getTimestamp();
+    method public <T> T? getValue(com.google.mlkit.vision.interfaces.Detector<T!>);
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/camera/camera-mlkit-vision/api/res-1.2.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to camera/camera-mlkit-vision/api/res-1.2.0-beta01.txt
diff --git a/camera/camera-mlkit-vision/api/restricted_1.2.0-beta01.txt b/camera/camera-mlkit-vision/api/restricted_1.2.0-beta01.txt
new file mode 100644
index 0000000..0599c25
--- /dev/null
+++ b/camera/camera-mlkit-vision/api/restricted_1.2.0-beta01.txt
@@ -0,0 +1,20 @@
+// Signature format: 4.0
+package androidx.camera.mlkit.vision {
+
+  @RequiresApi(21) public class MlKitAnalyzer implements androidx.camera.core.ImageAnalysis.Analyzer {
+    ctor public MlKitAnalyzer(java.util.List<com.google.mlkit.vision.interfaces.Detector<?>!>, int, java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.camera.mlkit.vision.MlKitAnalyzer.Result!>);
+    method public final void analyze(androidx.camera.core.ImageProxy);
+    method public final android.util.Size getDefaultTargetResolution();
+    method public final int getTargetCoordinateSystem();
+    method public final void updateTransform(android.graphics.Matrix?);
+  }
+
+  public static final class MlKitAnalyzer.Result {
+    ctor public MlKitAnalyzer.Result(java.util.Map<com.google.mlkit.vision.interfaces.Detector<?>!,java.lang.Object!>, long, java.util.Map<com.google.mlkit.vision.interfaces.Detector<?>!,java.lang.Throwable!>);
+    method public Throwable? getThrowable(com.google.mlkit.vision.interfaces.Detector<?>);
+    method public long getTimestamp();
+    method public <T> T? getValue(com.google.mlkit.vision.interfaces.Detector<T!>);
+  }
+
+}
+
diff --git a/camera/camera-mlkit-vision/src/main/java/androidx/camera/mlkit/vision/MlKitAnalyzer.java b/camera/camera-mlkit-vision/src/main/java/androidx/camera/mlkit/vision/MlKitAnalyzer.java
index 52b5f08..55b0cfd 100644
--- a/camera/camera-mlkit-vision/src/main/java/androidx/camera/mlkit/vision/MlKitAnalyzer.java
+++ b/camera/camera-mlkit-vision/src/main/java/androidx/camera/mlkit/vision/MlKitAnalyzer.java
@@ -51,18 +51,18 @@
 import java.util.concurrent.Executor;
 
 /**
- * An implementation of {@link ImageAnalysis.Analyzer} with MLKit libraries.
+ * An implementation of {@link ImageAnalysis.Analyzer} with ML Kit libraries.
  *
- * <p> This class is a wrapper of one or many MLKit {@code Detector}s. It forwards
+ * <p> This class is a wrapper of one or many ML Kit {@code Detector}s. It forwards
  * {@link ImageAnalysis} frames to all the {@code Detector}s sequentially. Once all the
  * {@code Detector}s finish analyzing the frame, {@link Consumer#accept} will be
  * invoked with the aggregated analysis results.
  *
- * <p> This class handles the coordinates transformation between MLKit output and the target
- * coordinate system. Based the {@code targetCoordinateSystem} set in the constructor, it
+ * <p> This class handles the coordinate transformation between ML Kit output and the target
+ * coordinate system. Using the {@code targetCoordinateSystem} set in the constructor, it
  * calculates the {@link Matrix} with the value provided by CameraX via
- * {@link ImageAnalysis.Analyzer#updateTransform} and forward it to the MLKit {@code Detector}. The
- * coordinates returned by MLKit will be in the desired coordinate system.
+ * {@link ImageAnalysis.Analyzer#updateTransform} and forwards it to the ML Kit {@code Detector}. The
+ * coordinates returned by MLKit will be in the specified coordinate system.
  *
  * <p> This class is designed to work seamlessly with the {@code CameraController} class in
  * camera-view. When used with {@link ImageAnalysis} in camera-core, the following scenarios may
@@ -79,7 +79,7 @@
  *  cameraController.setImageAnalysisAnalyzer(executor,
  *       new MlKitAnalyzer(List.of(barcodeScanner), COORDINATE_SYSTEM_VIEW_REFERENCED,
  *       executor, result -> {
- *    // The value of result.getResult(barcodeScanner) can be used directly for drawying UI layover.
+ *    // The value of result.getResult(barcodeScanner) can be used directly for drawing UI overlay.
  *  });
  * </pre></code>
  *
@@ -109,23 +109,23 @@
     /**
      * Constructor of {@link MlKitAnalyzer}.
      *
-     * <p>The list detectors will be invoked sequentially in order.
+     * <p>The list of detectors will be invoked sequentially in order.
      *
      * <p>When the targetCoordinateSystem is {@link ImageAnalysis#COORDINATE_SYSTEM_ORIGINAL}, the
-     * output coordinate system is defined by MLKit, which is the buffer with rotation applied. For
+     * output coordinate system is defined by ML Kit, which is the buffer with rotation applied. For
      * example, if {@link ImageProxy#getHeight()} is {@code h} and the rotation is 90°, (0, 0) in
      * the result maps to the pixel (0, h) in the original buffer.
      *
      * <p>The constructor throws {@link IllegalArgumentException} if
      * {@code Detector#getDetectorType()} is TYPE_SEGMENTATION and {@code targetCoordinateSystem}
-     * is COORDINATE_SYSTEM_ORIGINAL. Currently MLKit does not support transformation with
+     * is COORDINATE_SYSTEM_ORIGINAL. Currently ML Kit does not support transformation with
      * segmentation.
      *
-     * @param detectors              list of MLKit {@link Detector}.
+     * @param detectors              list of ML Kit {@link Detector}.
      * @param targetCoordinateSystem e.g. {@link ImageAnalysis#COORDINATE_SYSTEM_ORIGINAL}
-     *                               the coordinates in MLKit output will be based on this value.
+     *                               the coordinates in ML Kit output will be based on this value.
      * @param executor               on which the consumer is invoked.
-     * @param consumer               invoked when there is new MLKit result.
+     * @param consumer               invoked when there is a new ML Kit result.
      */
     @OptIn(markerClass = TransformExperimental.class)
     public MlKitAnalyzer(
@@ -262,7 +262,7 @@
     /**
      * Gets the recommended resolution for the given {@code Detector} type.
      *
-     * <p> The resolution can be found on MLKit's DAC page.
+     * <p> The resolution can be found on ML Kit's DAC page.
      */
     @NonNull
     private Size getTargetResolution(int detectorType) {
@@ -314,7 +314,7 @@
         }
 
         /**
-         * Get the analysis result for the given MLKit {@code Detector}.
+         * Get the analysis result for the given ML Kit {@code Detector}.
          *
          * <p>Returns {@code null} if the detection is unsuccessful.
          *
diff --git a/camera/camera-mlkit-vision/src/main/java/androidx/camera/mlkit/vision/camera-mlkit-vision-documentation.md b/camera/camera-mlkit-vision/src/main/java/androidx/camera/mlkit/vision/camera-mlkit-vision-documentation.md
index dea5c58..d7bbf31 100644
--- a/camera/camera-mlkit-vision/src/main/java/androidx/camera/mlkit/vision/camera-mlkit-vision-documentation.md
+++ b/camera/camera-mlkit-vision/src/main/java/androidx/camera/mlkit/vision/camera-mlkit-vision-documentation.md
@@ -1,8 +1,8 @@
 # Module root
 
-CameraX MLKit Vision
+CameraX ML Kit Vision
 
 # Package androidx.camera.mlkit.vision
 
-A library providing a seamless integration between CameraX and Google's MLKit library.
+A library providing a seamless integration between CameraX and Google's ML Kit library.
 
diff --git a/camera/camera-testing/build.gradle b/camera/camera-testing/build.gradle
index c521f7b..e3e837c 100644
--- a/camera/camera-testing/build.gradle
+++ b/camera/camera-testing/build.gradle
@@ -30,12 +30,12 @@
     implementation(libs.testRules)
     implementation(libs.testUiautomator)
     api("androidx.annotation:annotation:1.2.0")
-    implementation(libs.espressoCore)
     implementation(libs.guavaListenableFuture)
     implementation("androidx.appcompat:appcompat:1.1.0")
     api(project(":camera:camera-core"))
     implementation("androidx.core:core:1.1.0")
     implementation("androidx.concurrent:concurrent-futures:1.0.0")
+    implementation("androidx.test.espresso:espresso-core:3.3.0")
     implementation("androidx.test.espresso:espresso-idling-resource:3.1.0")
     implementation(libs.junit)
     implementation(libs.kotlinStdlib)
diff --git a/camera/camera-video/api/1.2.0-beta01.txt b/camera/camera-video/api/1.2.0-beta01.txt
new file mode 100644
index 0000000..f8a2ad5
--- /dev/null
+++ b/camera/camera-video/api/1.2.0-beta01.txt
@@ -0,0 +1,167 @@
+// Signature format: 4.0
+package androidx.camera.video {
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class AudioStats {
+    method public abstract int getAudioState();
+    method public abstract Throwable? getErrorCause();
+    method public boolean hasAudio();
+    method public boolean hasError();
+    field public static final int AUDIO_STATE_ACTIVE = 0; // 0x0
+    field public static final int AUDIO_STATE_DISABLED = 1; // 0x1
+    field public static final int AUDIO_STATE_ENCODER_ERROR = 3; // 0x3
+    field public static final int AUDIO_STATE_SOURCE_SILENCED = 2; // 0x2
+  }
+
+  @RequiresApi(21) public class FallbackStrategy {
+    method public static androidx.camera.video.FallbackStrategy higherQualityOrLowerThan(androidx.camera.video.Quality);
+    method public static androidx.camera.video.FallbackStrategy higherQualityThan(androidx.camera.video.Quality);
+    method public static androidx.camera.video.FallbackStrategy lowerQualityOrHigherThan(androidx.camera.video.Quality);
+    method public static androidx.camera.video.FallbackStrategy lowerQualityThan(androidx.camera.video.Quality);
+  }
+
+  @RequiresApi(21) public final class FileDescriptorOutputOptions extends androidx.camera.video.OutputOptions {
+    method public android.os.ParcelFileDescriptor getParcelFileDescriptor();
+  }
+
+  @RequiresApi(21) public static final class FileDescriptorOutputOptions.Builder {
+    ctor public FileDescriptorOutputOptions.Builder(android.os.ParcelFileDescriptor);
+    method public androidx.camera.video.FileDescriptorOutputOptions build();
+    method public androidx.camera.video.FileDescriptorOutputOptions.Builder setFileSizeLimit(long);
+    method public androidx.camera.video.FileDescriptorOutputOptions.Builder setLocation(android.location.Location?);
+  }
+
+  @RequiresApi(21) public final class FileOutputOptions extends androidx.camera.video.OutputOptions {
+    method public java.io.File getFile();
+  }
+
+  @RequiresApi(21) public static final class FileOutputOptions.Builder {
+    ctor public FileOutputOptions.Builder(java.io.File);
+    method public androidx.camera.video.FileOutputOptions build();
+    method public androidx.camera.video.FileOutputOptions.Builder setFileSizeLimit(long);
+    method public androidx.camera.video.FileOutputOptions.Builder setLocation(android.location.Location?);
+  }
+
+  @RequiresApi(21) public final class MediaStoreOutputOptions extends androidx.camera.video.OutputOptions {
+    method public android.net.Uri getCollectionUri();
+    method public android.content.ContentResolver getContentResolver();
+    method public android.content.ContentValues getContentValues();
+    field public static final android.content.ContentValues EMPTY_CONTENT_VALUES;
+  }
+
+  public static final class MediaStoreOutputOptions.Builder {
+    ctor public MediaStoreOutputOptions.Builder(android.content.ContentResolver, android.net.Uri);
+    method public androidx.camera.video.MediaStoreOutputOptions build();
+    method public androidx.camera.video.MediaStoreOutputOptions.Builder setContentValues(android.content.ContentValues);
+    method public androidx.camera.video.MediaStoreOutputOptions.Builder setFileSizeLimit(long);
+    method public androidx.camera.video.MediaStoreOutputOptions.Builder setLocation(android.location.Location?);
+  }
+
+  @RequiresApi(21) public abstract class OutputOptions {
+    method public long getFileSizeLimit();
+    method public android.location.Location? getLocation();
+    field public static final int FILE_SIZE_UNLIMITED = 0; // 0x0
+  }
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class OutputResults {
+    ctor public OutputResults();
+    method public abstract android.net.Uri getOutputUri();
+  }
+
+  @RequiresApi(21) public final class PendingRecording {
+    method @CheckResult public androidx.camera.video.Recording start(java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.camera.video.VideoRecordEvent!>);
+    method @RequiresPermission(android.Manifest.permission.RECORD_AUDIO) public androidx.camera.video.PendingRecording withAudioEnabled();
+  }
+
+  @RequiresApi(21) public class Quality {
+    field public static final androidx.camera.video.Quality FHD;
+    field public static final androidx.camera.video.Quality HD;
+    field public static final androidx.camera.video.Quality HIGHEST;
+    field public static final androidx.camera.video.Quality LOWEST;
+    field public static final androidx.camera.video.Quality SD;
+    field public static final androidx.camera.video.Quality UHD;
+  }
+
+  @RequiresApi(21) public final class QualitySelector {
+    method public static androidx.camera.video.QualitySelector from(androidx.camera.video.Quality);
+    method public static androidx.camera.video.QualitySelector from(androidx.camera.video.Quality, androidx.camera.video.FallbackStrategy);
+    method public static androidx.camera.video.QualitySelector fromOrderedList(java.util.List<androidx.camera.video.Quality!>);
+    method public static androidx.camera.video.QualitySelector fromOrderedList(java.util.List<androidx.camera.video.Quality!>, androidx.camera.video.FallbackStrategy);
+    method public static android.util.Size? getResolution(androidx.camera.core.CameraInfo, androidx.camera.video.Quality);
+    method public static java.util.List<androidx.camera.video.Quality!> getSupportedQualities(androidx.camera.core.CameraInfo);
+    method public static boolean isQualitySupported(androidx.camera.core.CameraInfo, androidx.camera.video.Quality);
+  }
+
+  @RequiresApi(21) public final class Recorder implements androidx.camera.video.VideoOutput {
+    method public java.util.concurrent.Executor? getExecutor();
+    method public androidx.camera.video.QualitySelector getQualitySelector();
+    method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+    method public androidx.camera.video.PendingRecording prepareRecording(android.content.Context, androidx.camera.video.FileOutputOptions);
+    method @RequiresApi(26) public androidx.camera.video.PendingRecording prepareRecording(android.content.Context, androidx.camera.video.FileDescriptorOutputOptions);
+    method public androidx.camera.video.PendingRecording prepareRecording(android.content.Context, androidx.camera.video.MediaStoreOutputOptions);
+    field public static final androidx.camera.video.QualitySelector DEFAULT_QUALITY_SELECTOR;
+  }
+
+  @RequiresApi(21) public static final class Recorder.Builder {
+    ctor public Recorder.Builder();
+    method public androidx.camera.video.Recorder build();
+    method public androidx.camera.video.Recorder.Builder setExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.video.Recorder.Builder setQualitySelector(androidx.camera.video.QualitySelector);
+  }
+
+  @RequiresApi(21) public final class Recording implements java.lang.AutoCloseable {
+    method public void close();
+    method public void pause();
+    method public void resume();
+    method public void stop();
+  }
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class RecordingStats {
+    method public abstract androidx.camera.video.AudioStats getAudioStats();
+    method public abstract long getNumBytesRecorded();
+    method public abstract long getRecordedDurationNanos();
+  }
+
+  @RequiresApi(21) public final class VideoCapture<T extends androidx.camera.video.VideoOutput> extends androidx.camera.core.UseCase {
+    method public T getOutput();
+    method public static <T extends androidx.camera.video.VideoOutput> androidx.camera.video.VideoCapture<T!> withOutput(T);
+  }
+
+  @RequiresApi(21) public interface VideoOutput {
+    method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+  }
+
+  @RequiresApi(21) public abstract class VideoRecordEvent {
+    method public androidx.camera.video.OutputOptions getOutputOptions();
+    method public androidx.camera.video.RecordingStats getRecordingStats();
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Finalize extends androidx.camera.video.VideoRecordEvent {
+    method public Throwable? getCause();
+    method public int getError();
+    method public androidx.camera.video.OutputResults getOutputResults();
+    method public boolean hasError();
+    field public static final int ERROR_ENCODING_FAILED = 6; // 0x6
+    field public static final int ERROR_FILE_SIZE_LIMIT_REACHED = 2; // 0x2
+    field public static final int ERROR_INSUFFICIENT_STORAGE = 3; // 0x3
+    field public static final int ERROR_INVALID_OUTPUT_OPTIONS = 5; // 0x5
+    field public static final int ERROR_NONE = 0; // 0x0
+    field public static final int ERROR_NO_VALID_DATA = 8; // 0x8
+    field public static final int ERROR_RECORDER_ERROR = 7; // 0x7
+    field public static final int ERROR_SOURCE_INACTIVE = 4; // 0x4
+    field public static final int ERROR_UNKNOWN = 1; // 0x1
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Pause extends androidx.camera.video.VideoRecordEvent {
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Resume extends androidx.camera.video.VideoRecordEvent {
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Start extends androidx.camera.video.VideoRecordEvent {
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Status extends androidx.camera.video.VideoRecordEvent {
+  }
+
+}
+
diff --git a/camera/camera-video/api/public_plus_experimental_1.2.0-beta01.txt b/camera/camera-video/api/public_plus_experimental_1.2.0-beta01.txt
new file mode 100644
index 0000000..f8a2ad5
--- /dev/null
+++ b/camera/camera-video/api/public_plus_experimental_1.2.0-beta01.txt
@@ -0,0 +1,167 @@
+// Signature format: 4.0
+package androidx.camera.video {
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class AudioStats {
+    method public abstract int getAudioState();
+    method public abstract Throwable? getErrorCause();
+    method public boolean hasAudio();
+    method public boolean hasError();
+    field public static final int AUDIO_STATE_ACTIVE = 0; // 0x0
+    field public static final int AUDIO_STATE_DISABLED = 1; // 0x1
+    field public static final int AUDIO_STATE_ENCODER_ERROR = 3; // 0x3
+    field public static final int AUDIO_STATE_SOURCE_SILENCED = 2; // 0x2
+  }
+
+  @RequiresApi(21) public class FallbackStrategy {
+    method public static androidx.camera.video.FallbackStrategy higherQualityOrLowerThan(androidx.camera.video.Quality);
+    method public static androidx.camera.video.FallbackStrategy higherQualityThan(androidx.camera.video.Quality);
+    method public static androidx.camera.video.FallbackStrategy lowerQualityOrHigherThan(androidx.camera.video.Quality);
+    method public static androidx.camera.video.FallbackStrategy lowerQualityThan(androidx.camera.video.Quality);
+  }
+
+  @RequiresApi(21) public final class FileDescriptorOutputOptions extends androidx.camera.video.OutputOptions {
+    method public android.os.ParcelFileDescriptor getParcelFileDescriptor();
+  }
+
+  @RequiresApi(21) public static final class FileDescriptorOutputOptions.Builder {
+    ctor public FileDescriptorOutputOptions.Builder(android.os.ParcelFileDescriptor);
+    method public androidx.camera.video.FileDescriptorOutputOptions build();
+    method public androidx.camera.video.FileDescriptorOutputOptions.Builder setFileSizeLimit(long);
+    method public androidx.camera.video.FileDescriptorOutputOptions.Builder setLocation(android.location.Location?);
+  }
+
+  @RequiresApi(21) public final class FileOutputOptions extends androidx.camera.video.OutputOptions {
+    method public java.io.File getFile();
+  }
+
+  @RequiresApi(21) public static final class FileOutputOptions.Builder {
+    ctor public FileOutputOptions.Builder(java.io.File);
+    method public androidx.camera.video.FileOutputOptions build();
+    method public androidx.camera.video.FileOutputOptions.Builder setFileSizeLimit(long);
+    method public androidx.camera.video.FileOutputOptions.Builder setLocation(android.location.Location?);
+  }
+
+  @RequiresApi(21) public final class MediaStoreOutputOptions extends androidx.camera.video.OutputOptions {
+    method public android.net.Uri getCollectionUri();
+    method public android.content.ContentResolver getContentResolver();
+    method public android.content.ContentValues getContentValues();
+    field public static final android.content.ContentValues EMPTY_CONTENT_VALUES;
+  }
+
+  public static final class MediaStoreOutputOptions.Builder {
+    ctor public MediaStoreOutputOptions.Builder(android.content.ContentResolver, android.net.Uri);
+    method public androidx.camera.video.MediaStoreOutputOptions build();
+    method public androidx.camera.video.MediaStoreOutputOptions.Builder setContentValues(android.content.ContentValues);
+    method public androidx.camera.video.MediaStoreOutputOptions.Builder setFileSizeLimit(long);
+    method public androidx.camera.video.MediaStoreOutputOptions.Builder setLocation(android.location.Location?);
+  }
+
+  @RequiresApi(21) public abstract class OutputOptions {
+    method public long getFileSizeLimit();
+    method public android.location.Location? getLocation();
+    field public static final int FILE_SIZE_UNLIMITED = 0; // 0x0
+  }
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class OutputResults {
+    ctor public OutputResults();
+    method public abstract android.net.Uri getOutputUri();
+  }
+
+  @RequiresApi(21) public final class PendingRecording {
+    method @CheckResult public androidx.camera.video.Recording start(java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.camera.video.VideoRecordEvent!>);
+    method @RequiresPermission(android.Manifest.permission.RECORD_AUDIO) public androidx.camera.video.PendingRecording withAudioEnabled();
+  }
+
+  @RequiresApi(21) public class Quality {
+    field public static final androidx.camera.video.Quality FHD;
+    field public static final androidx.camera.video.Quality HD;
+    field public static final androidx.camera.video.Quality HIGHEST;
+    field public static final androidx.camera.video.Quality LOWEST;
+    field public static final androidx.camera.video.Quality SD;
+    field public static final androidx.camera.video.Quality UHD;
+  }
+
+  @RequiresApi(21) public final class QualitySelector {
+    method public static androidx.camera.video.QualitySelector from(androidx.camera.video.Quality);
+    method public static androidx.camera.video.QualitySelector from(androidx.camera.video.Quality, androidx.camera.video.FallbackStrategy);
+    method public static androidx.camera.video.QualitySelector fromOrderedList(java.util.List<androidx.camera.video.Quality!>);
+    method public static androidx.camera.video.QualitySelector fromOrderedList(java.util.List<androidx.camera.video.Quality!>, androidx.camera.video.FallbackStrategy);
+    method public static android.util.Size? getResolution(androidx.camera.core.CameraInfo, androidx.camera.video.Quality);
+    method public static java.util.List<androidx.camera.video.Quality!> getSupportedQualities(androidx.camera.core.CameraInfo);
+    method public static boolean isQualitySupported(androidx.camera.core.CameraInfo, androidx.camera.video.Quality);
+  }
+
+  @RequiresApi(21) public final class Recorder implements androidx.camera.video.VideoOutput {
+    method public java.util.concurrent.Executor? getExecutor();
+    method public androidx.camera.video.QualitySelector getQualitySelector();
+    method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+    method public androidx.camera.video.PendingRecording prepareRecording(android.content.Context, androidx.camera.video.FileOutputOptions);
+    method @RequiresApi(26) public androidx.camera.video.PendingRecording prepareRecording(android.content.Context, androidx.camera.video.FileDescriptorOutputOptions);
+    method public androidx.camera.video.PendingRecording prepareRecording(android.content.Context, androidx.camera.video.MediaStoreOutputOptions);
+    field public static final androidx.camera.video.QualitySelector DEFAULT_QUALITY_SELECTOR;
+  }
+
+  @RequiresApi(21) public static final class Recorder.Builder {
+    ctor public Recorder.Builder();
+    method public androidx.camera.video.Recorder build();
+    method public androidx.camera.video.Recorder.Builder setExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.video.Recorder.Builder setQualitySelector(androidx.camera.video.QualitySelector);
+  }
+
+  @RequiresApi(21) public final class Recording implements java.lang.AutoCloseable {
+    method public void close();
+    method public void pause();
+    method public void resume();
+    method public void stop();
+  }
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class RecordingStats {
+    method public abstract androidx.camera.video.AudioStats getAudioStats();
+    method public abstract long getNumBytesRecorded();
+    method public abstract long getRecordedDurationNanos();
+  }
+
+  @RequiresApi(21) public final class VideoCapture<T extends androidx.camera.video.VideoOutput> extends androidx.camera.core.UseCase {
+    method public T getOutput();
+    method public static <T extends androidx.camera.video.VideoOutput> androidx.camera.video.VideoCapture<T!> withOutput(T);
+  }
+
+  @RequiresApi(21) public interface VideoOutput {
+    method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+  }
+
+  @RequiresApi(21) public abstract class VideoRecordEvent {
+    method public androidx.camera.video.OutputOptions getOutputOptions();
+    method public androidx.camera.video.RecordingStats getRecordingStats();
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Finalize extends androidx.camera.video.VideoRecordEvent {
+    method public Throwable? getCause();
+    method public int getError();
+    method public androidx.camera.video.OutputResults getOutputResults();
+    method public boolean hasError();
+    field public static final int ERROR_ENCODING_FAILED = 6; // 0x6
+    field public static final int ERROR_FILE_SIZE_LIMIT_REACHED = 2; // 0x2
+    field public static final int ERROR_INSUFFICIENT_STORAGE = 3; // 0x3
+    field public static final int ERROR_INVALID_OUTPUT_OPTIONS = 5; // 0x5
+    field public static final int ERROR_NONE = 0; // 0x0
+    field public static final int ERROR_NO_VALID_DATA = 8; // 0x8
+    field public static final int ERROR_RECORDER_ERROR = 7; // 0x7
+    field public static final int ERROR_SOURCE_INACTIVE = 4; // 0x4
+    field public static final int ERROR_UNKNOWN = 1; // 0x1
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Pause extends androidx.camera.video.VideoRecordEvent {
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Resume extends androidx.camera.video.VideoRecordEvent {
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Start extends androidx.camera.video.VideoRecordEvent {
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Status extends androidx.camera.video.VideoRecordEvent {
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/camera/camera-video/api/res-1.2.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to camera/camera-video/api/res-1.2.0-beta01.txt
diff --git a/camera/camera-video/api/restricted_1.2.0-beta01.txt b/camera/camera-video/api/restricted_1.2.0-beta01.txt
new file mode 100644
index 0000000..f8a2ad5
--- /dev/null
+++ b/camera/camera-video/api/restricted_1.2.0-beta01.txt
@@ -0,0 +1,167 @@
+// Signature format: 4.0
+package androidx.camera.video {
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class AudioStats {
+    method public abstract int getAudioState();
+    method public abstract Throwable? getErrorCause();
+    method public boolean hasAudio();
+    method public boolean hasError();
+    field public static final int AUDIO_STATE_ACTIVE = 0; // 0x0
+    field public static final int AUDIO_STATE_DISABLED = 1; // 0x1
+    field public static final int AUDIO_STATE_ENCODER_ERROR = 3; // 0x3
+    field public static final int AUDIO_STATE_SOURCE_SILENCED = 2; // 0x2
+  }
+
+  @RequiresApi(21) public class FallbackStrategy {
+    method public static androidx.camera.video.FallbackStrategy higherQualityOrLowerThan(androidx.camera.video.Quality);
+    method public static androidx.camera.video.FallbackStrategy higherQualityThan(androidx.camera.video.Quality);
+    method public static androidx.camera.video.FallbackStrategy lowerQualityOrHigherThan(androidx.camera.video.Quality);
+    method public static androidx.camera.video.FallbackStrategy lowerQualityThan(androidx.camera.video.Quality);
+  }
+
+  @RequiresApi(21) public final class FileDescriptorOutputOptions extends androidx.camera.video.OutputOptions {
+    method public android.os.ParcelFileDescriptor getParcelFileDescriptor();
+  }
+
+  @RequiresApi(21) public static final class FileDescriptorOutputOptions.Builder {
+    ctor public FileDescriptorOutputOptions.Builder(android.os.ParcelFileDescriptor);
+    method public androidx.camera.video.FileDescriptorOutputOptions build();
+    method public androidx.camera.video.FileDescriptorOutputOptions.Builder setFileSizeLimit(long);
+    method public androidx.camera.video.FileDescriptorOutputOptions.Builder setLocation(android.location.Location?);
+  }
+
+  @RequiresApi(21) public final class FileOutputOptions extends androidx.camera.video.OutputOptions {
+    method public java.io.File getFile();
+  }
+
+  @RequiresApi(21) public static final class FileOutputOptions.Builder {
+    ctor public FileOutputOptions.Builder(java.io.File);
+    method public androidx.camera.video.FileOutputOptions build();
+    method public androidx.camera.video.FileOutputOptions.Builder setFileSizeLimit(long);
+    method public androidx.camera.video.FileOutputOptions.Builder setLocation(android.location.Location?);
+  }
+
+  @RequiresApi(21) public final class MediaStoreOutputOptions extends androidx.camera.video.OutputOptions {
+    method public android.net.Uri getCollectionUri();
+    method public android.content.ContentResolver getContentResolver();
+    method public android.content.ContentValues getContentValues();
+    field public static final android.content.ContentValues EMPTY_CONTENT_VALUES;
+  }
+
+  public static final class MediaStoreOutputOptions.Builder {
+    ctor public MediaStoreOutputOptions.Builder(android.content.ContentResolver, android.net.Uri);
+    method public androidx.camera.video.MediaStoreOutputOptions build();
+    method public androidx.camera.video.MediaStoreOutputOptions.Builder setContentValues(android.content.ContentValues);
+    method public androidx.camera.video.MediaStoreOutputOptions.Builder setFileSizeLimit(long);
+    method public androidx.camera.video.MediaStoreOutputOptions.Builder setLocation(android.location.Location?);
+  }
+
+  @RequiresApi(21) public abstract class OutputOptions {
+    method public long getFileSizeLimit();
+    method public android.location.Location? getLocation();
+    field public static final int FILE_SIZE_UNLIMITED = 0; // 0x0
+  }
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class OutputResults {
+    ctor public OutputResults();
+    method public abstract android.net.Uri getOutputUri();
+  }
+
+  @RequiresApi(21) public final class PendingRecording {
+    method @CheckResult public androidx.camera.video.Recording start(java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.camera.video.VideoRecordEvent!>);
+    method @RequiresPermission(android.Manifest.permission.RECORD_AUDIO) public androidx.camera.video.PendingRecording withAudioEnabled();
+  }
+
+  @RequiresApi(21) public class Quality {
+    field public static final androidx.camera.video.Quality FHD;
+    field public static final androidx.camera.video.Quality HD;
+    field public static final androidx.camera.video.Quality HIGHEST;
+    field public static final androidx.camera.video.Quality LOWEST;
+    field public static final androidx.camera.video.Quality SD;
+    field public static final androidx.camera.video.Quality UHD;
+  }
+
+  @RequiresApi(21) public final class QualitySelector {
+    method public static androidx.camera.video.QualitySelector from(androidx.camera.video.Quality);
+    method public static androidx.camera.video.QualitySelector from(androidx.camera.video.Quality, androidx.camera.video.FallbackStrategy);
+    method public static androidx.camera.video.QualitySelector fromOrderedList(java.util.List<androidx.camera.video.Quality!>);
+    method public static androidx.camera.video.QualitySelector fromOrderedList(java.util.List<androidx.camera.video.Quality!>, androidx.camera.video.FallbackStrategy);
+    method public static android.util.Size? getResolution(androidx.camera.core.CameraInfo, androidx.camera.video.Quality);
+    method public static java.util.List<androidx.camera.video.Quality!> getSupportedQualities(androidx.camera.core.CameraInfo);
+    method public static boolean isQualitySupported(androidx.camera.core.CameraInfo, androidx.camera.video.Quality);
+  }
+
+  @RequiresApi(21) public final class Recorder implements androidx.camera.video.VideoOutput {
+    method public java.util.concurrent.Executor? getExecutor();
+    method public androidx.camera.video.QualitySelector getQualitySelector();
+    method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+    method public androidx.camera.video.PendingRecording prepareRecording(android.content.Context, androidx.camera.video.FileOutputOptions);
+    method @RequiresApi(26) public androidx.camera.video.PendingRecording prepareRecording(android.content.Context, androidx.camera.video.FileDescriptorOutputOptions);
+    method public androidx.camera.video.PendingRecording prepareRecording(android.content.Context, androidx.camera.video.MediaStoreOutputOptions);
+    field public static final androidx.camera.video.QualitySelector DEFAULT_QUALITY_SELECTOR;
+  }
+
+  @RequiresApi(21) public static final class Recorder.Builder {
+    ctor public Recorder.Builder();
+    method public androidx.camera.video.Recorder build();
+    method public androidx.camera.video.Recorder.Builder setExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.video.Recorder.Builder setQualitySelector(androidx.camera.video.QualitySelector);
+  }
+
+  @RequiresApi(21) public final class Recording implements java.lang.AutoCloseable {
+    method public void close();
+    method public void pause();
+    method public void resume();
+    method public void stop();
+  }
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class RecordingStats {
+    method public abstract androidx.camera.video.AudioStats getAudioStats();
+    method public abstract long getNumBytesRecorded();
+    method public abstract long getRecordedDurationNanos();
+  }
+
+  @RequiresApi(21) public final class VideoCapture<T extends androidx.camera.video.VideoOutput> extends androidx.camera.core.UseCase {
+    method public T getOutput();
+    method public static <T extends androidx.camera.video.VideoOutput> androidx.camera.video.VideoCapture<T!> withOutput(T);
+  }
+
+  @RequiresApi(21) public interface VideoOutput {
+    method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+  }
+
+  @RequiresApi(21) public abstract class VideoRecordEvent {
+    method public androidx.camera.video.OutputOptions getOutputOptions();
+    method public androidx.camera.video.RecordingStats getRecordingStats();
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Finalize extends androidx.camera.video.VideoRecordEvent {
+    method public Throwable? getCause();
+    method public int getError();
+    method public androidx.camera.video.OutputResults getOutputResults();
+    method public boolean hasError();
+    field public static final int ERROR_ENCODING_FAILED = 6; // 0x6
+    field public static final int ERROR_FILE_SIZE_LIMIT_REACHED = 2; // 0x2
+    field public static final int ERROR_INSUFFICIENT_STORAGE = 3; // 0x3
+    field public static final int ERROR_INVALID_OUTPUT_OPTIONS = 5; // 0x5
+    field public static final int ERROR_NONE = 0; // 0x0
+    field public static final int ERROR_NO_VALID_DATA = 8; // 0x8
+    field public static final int ERROR_RECORDER_ERROR = 7; // 0x7
+    field public static final int ERROR_SOURCE_INACTIVE = 4; // 0x4
+    field public static final int ERROR_UNKNOWN = 1; // 0x1
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Pause extends androidx.camera.video.VideoRecordEvent {
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Resume extends androidx.camera.video.VideoRecordEvent {
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Start extends androidx.camera.video.VideoRecordEvent {
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Status extends androidx.camera.video.VideoRecordEvent {
+  }
+
+}
+
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/RecorderTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/RecorderTest.kt
index 6d048c5..1a1a246 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/RecorderTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/RecorderTest.kt
@@ -45,6 +45,7 @@
 import androidx.camera.core.impl.utils.executor.CameraXExecutors
 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.testing.GarbageCollectionUtil
@@ -116,6 +117,12 @@
 ) {
 
     @get:Rule
+    val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+        active = implName == CameraPipeConfig::class.simpleName,
+        forAllTests = true,
+    )
+
+    @get:Rule
     val cameraRule = CameraUtil.grantCameraPermissionAndPreTest(
         CameraUtil.PreTestCameraIdList(cameraConfig)
     )
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
new file mode 100644
index 0000000..6800fe9
--- /dev/null
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoCapabilityTest.kt
@@ -0,0 +1,91 @@
+/*
+ * 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.video
+
+import android.content.Context
+import android.os.Build
+import androidx.camera.camera2.Camera2Config
+import androidx.camera.core.CameraSelector
+import androidx.camera.core.internal.CameraUseCaseAdapter
+import androidx.camera.testing.CameraUtil
+import androidx.camera.testing.CameraXUtil
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SdkSuppress
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth
+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
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+@SdkSuppress(minSdkVersion = 21)
+class VideoCapabilityTest {
+
+    private val context: Context = ApplicationProvider.getApplicationContext()
+    private val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
+
+    private lateinit var cameraUseCaseAdapter: CameraUseCaseAdapter
+    private lateinit var videoCapabilities: VideoCapabilities
+
+    @get:Rule
+    val useCamera = CameraUtil.grantCameraPermissionAndPreTest()
+
+    @Before
+    fun setUp() {
+        Assume.assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK))
+
+        CameraXUtil.initialize(context, Camera2Config.defaultConfig()).get()
+
+        val cameraInfo = CameraUtil.createCameraUseCaseAdapter(context, cameraSelector).cameraInfo
+        videoCapabilities = VideoCapabilities.from(cameraInfo)
+    }
+
+    @After
+    fun tearDown() {
+        if (this::cameraUseCaseAdapter.isInitialized) {
+            runBlocking(Dispatchers.Main) {
+                cameraUseCaseAdapter.removeUseCases(cameraUseCaseAdapter.useCases)
+            }
+        }
+
+        CameraXUtil.shutdown().get(10, TimeUnit.SECONDS)
+    }
+
+    @Test
+    fun supportedQualitiesIsNotEmpty() {
+        Assume.assumeFalse(isSpecificSkippedDevice())
+        Truth.assertThat(videoCapabilities.supportedQualities).isNotEmpty()
+    }
+
+    private fun isSpecificSkippedDevice(): Boolean {
+        // skip for b/231903433
+        val isNokia2Point1 = "nokia".equals(Build.BRAND, true) &&
+            "nokia 2.1".equals(Build.MODEL, true)
+        val isMotoE5Play = "motorola".equals(Build.BRAND, true) &&
+            "moto e5 play".equals(Build.MODEL, true)
+
+        return isNokia2Point1 || isMotoE5Play
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoCaptureDeviceTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoCaptureDeviceTest.kt
index 5072806..c905f8a 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
@@ -21,19 +21,21 @@
 import android.os.Build
 import android.view.Surface
 import androidx.camera.camera2.Camera2Config
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig
 import androidx.camera.core.CameraInfo
 import androidx.camera.core.CameraSelector
+import androidx.camera.core.CameraXConfig
 import androidx.camera.core.SurfaceRequest
 import androidx.camera.core.impl.MutableStateObservable
 import androidx.camera.core.impl.Observable
 import androidx.camera.core.internal.CameraUseCaseAdapter
+import androidx.camera.testing.CameraPipeConfigTestRule
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CameraXUtil
 import androidx.camera.testing.GLUtil
 import androidx.camera.video.VideoOutput.SourceState
 import androidx.concurrent.futures.await
 import androidx.test.core.app.ApplicationProvider
-import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
 import androidx.testutils.fail
@@ -74,17 +76,37 @@
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
 
 @LargeTest
-@RunWith(AndroidJUnit4::class)
+@RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = 21)
-class VideoCaptureDeviceTest {
+class VideoCaptureDeviceTest(
+    private val implName: String,
+    private val cameraConfig: CameraXConfig
+) {
+
+    // TODO(b/241296464): remove this rule after fixed
+    @get:Rule
+    val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+        active = implName == CameraPipeConfig::class.simpleName,
+        forAllTests = true,
+    )
 
     @get:Rule
     val cameraRule = CameraUtil.grantCameraPermissionAndPreTest(
-        CameraUtil.PreTestCameraIdList(Camera2Config.defaultConfig())
+        CameraUtil.PreTestCameraIdList(cameraConfig)
     )
 
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "{0}")
+        fun data() = listOf(
+            arrayOf(Camera2Config::class.simpleName, Camera2Config.defaultConfig()),
+            arrayOf(CameraPipeConfig::class.simpleName, CameraPipeConfig.defaultConfig())
+        )
+    }
+
     private val context: Context = ApplicationProvider.getApplicationContext()
     private val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
 
@@ -95,7 +117,7 @@
     fun setUp() {
         CameraXUtil.initialize(
             context,
-            Camera2Config.defaultConfig()
+            cameraConfig
         ).get()
 
         cameraUseCaseAdapter = CameraUtil.createCameraUseCaseAdapter(context, cameraSelector)
@@ -182,6 +204,7 @@
         } ?: fail("Timed out waiting for 5 frame updates. Waited $timeout.")
     }
 
+    @CameraPipeConfigTestRule.CameraPipeExperimental
     @Test
     fun addUseCases_setSupportedQuality_getCorrectResolution() = runBlocking {
         assumeTrue(QualitySelector.getSupportedQualities(cameraInfo).isNotEmpty())
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
index 36147c4..c9f6998 100644
--- 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
@@ -19,7 +19,9 @@
 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.internal.CameraUseCaseAdapter
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CameraXUtil
@@ -27,10 +29,10 @@
 import androidx.camera.video.Quality
 import androidx.camera.video.VideoCapabilities
 import androidx.test.core.app.ApplicationProvider
-import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SdkSuppress
 import androidx.test.filters.SmallTest
 import com.google.common.truth.Truth.assertThat
+import java.util.concurrent.TimeUnit
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.runBlocking
 import org.junit.After
@@ -38,12 +40,24 @@
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
-import java.util.concurrent.TimeUnit
+import org.junit.runners.Parameterized
 
-@RunWith(AndroidJUnit4::class)
+@RunWith(Parameterized::class)
 @SmallTest
 @SdkSuppress(minSdkVersion = 21)
-class AudioEncoderConfigCamcorderProfileResolverTest {
+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())
+        )
+    }
 
     private val context: Context = ApplicationProvider.getApplicationContext()
     private val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
@@ -58,11 +72,12 @@
 
         CameraXUtil.initialize(
             context,
-            Camera2Config.defaultConfig()
+            cameraConfig
         ).get()
 
         val cameraInfo = CameraUtil.createCameraUseCaseAdapter(context, cameraSelector).cameraInfo
         videoCapabilities = VideoCapabilities.from(cameraInfo)
+        Assume.assumeTrue(videoCapabilities.supportedQualities.isNotEmpty())
     }
 
     @After
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
index bb5986b..20b768d 100644
--- 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
@@ -21,7 +21,9 @@
 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.CameraUtil
@@ -31,10 +33,10 @@
 import androidx.camera.video.VideoCapabilities
 import androidx.camera.video.internal.AudioSource
 import androidx.test.core.app.ApplicationProvider
-import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SdkSuppress
 import androidx.test.filters.SmallTest
 import com.google.common.truth.Truth.assertThat
+import java.util.concurrent.TimeUnit
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.runBlocking
 import org.junit.After
@@ -42,12 +44,24 @@
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
-import java.util.concurrent.TimeUnit
+import org.junit.runners.Parameterized
 
-@RunWith(AndroidJUnit4::class)
+@RunWith(Parameterized::class)
 @SmallTest
 @SdkSuppress(minSdkVersion = 21)
-class AudioSourceSettingsCamcorderProfileResolverTest {
+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())
+        )
+    }
 
     private val context: Context = ApplicationProvider.getApplicationContext()
     private val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
@@ -64,11 +78,12 @@
 
         CameraXUtil.initialize(
             context,
-            Camera2Config.defaultConfig()
+            cameraConfig
         ).get()
 
         val cameraInfo = CameraUtil.createCameraUseCaseAdapter(context, cameraSelector).cameraInfo
         videoCapabilities = VideoCapabilities.from(cameraInfo)
+        Assume.assumeTrue(videoCapabilities.supportedQualities.isNotEmpty())
     }
 
     @After
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
index 3a71162..bbd1c21 100644
--- 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
@@ -20,7 +20,9 @@
 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.internal.CameraUseCaseAdapter
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CameraXUtil
@@ -28,10 +30,10 @@
 import androidx.camera.video.VideoCapabilities
 import androidx.camera.video.VideoSpec
 import androidx.test.core.app.ApplicationProvider
-import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SdkSuppress
 import androidx.test.filters.SmallTest
 import com.google.common.truth.Truth.assertThat
+import java.util.concurrent.TimeUnit
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.runBlocking
 import org.junit.After
@@ -39,20 +41,23 @@
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
-import java.util.concurrent.TimeUnit
+import org.junit.runners.Parameterized
 
-@RunWith(AndroidJUnit4::class)
+@RunWith(Parameterized::class)
 @SmallTest
 @SdkSuppress(minSdkVersion = 21)
-class VideoEncoderConfigCamcorderProfileResolverTest {
-
+class VideoEncoderConfigCamcorderProfileResolverTest(
+    private val implName: String,
+    private val cameraConfig: CameraXConfig
+) {
     companion object {
-        // TODO(b/177918193): We currently cannot communicate the frame rate to the camera,
-        //  so we only support 30fps. For now we want to ensure we only ever get an FPS of 30,
-        //  but this check can be removed once we can change frame rate.
-        const val FIXED_FRAME_RATE = 30
+        @JvmStatic
+        @Parameterized.Parameters(name = "{0}")
+        fun data() = listOf(
+            arrayOf(Camera2Config::class.simpleName, Camera2Config.defaultConfig()),
+            arrayOf(CameraPipeConfig::class.simpleName, CameraPipeConfig.defaultConfig())
+        )
     }
-
     private val context: Context = ApplicationProvider.getApplicationContext()
     private val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
     private val defaultVideoSpec = VideoSpec.builder().build()
@@ -66,11 +71,12 @@
 
         CameraXUtil.initialize(
             context,
-            Camera2Config.defaultConfig()
+            cameraConfig
         ).get()
 
         val cameraInfo = CameraUtil.createCameraUseCaseAdapter(context, cameraSelector).cameraInfo
         videoCapabilities = VideoCapabilities.from(cameraInfo)
+        Assume.assumeTrue(videoCapabilities.supportedQualities.isNotEmpty())
     }
 
     @After
@@ -95,17 +101,14 @@
                 it.videoCodecMimeType!!,
                 defaultVideoSpec,
                 Size(it.videoFrameWidth, it.videoFrameHeight),
-                it
+                it,
+                /*expectedFrameRateRange=*/null
             ).get()
 
             assertThat(config.mimeType).isEqualTo(it.videoCodecMimeType)
-            // TODO(b/177918193): Frame rate ratio needs to scale bitrate since we use a fixed
-            //  frame rate. The output config frame rate may not match the profile frame rate.
-            val scaledBitrate =
-                (it.videoBitRate * config.frameRate.toDouble() / it.videoFrameRate).toInt()
-            assertThat(config.bitrate).isEqualTo(scaledBitrate)
+            assertThat(config.bitrate).isEqualTo(it.videoBitRate)
             assertThat(config.resolution).isEqualTo(Size(it.videoFrameWidth, it.videoFrameHeight))
-            assertThat(config.frameRate).isEqualTo(FIXED_FRAME_RATE)
+            assertThat(config.frameRate).isEqualTo(it.videoFrameRate)
         }
     }
 
@@ -118,7 +121,8 @@
             profile.videoCodecMimeType!!,
             defaultVideoSpec,
             surfaceSize,
-            profile
+            profile,
+            /*expectedFrameRateRange=*/null
         ).get().bitrate
 
         val increasedSurfaceSize = Size(surfaceSize.width + 100, surfaceSize.height + 100)
@@ -129,7 +133,8 @@
                 profile.videoCodecMimeType!!,
                 defaultVideoSpec,
                 increasedSurfaceSize,
-                profile
+                profile,
+                /*expectedFrameRateRange=*/null
             ).get().bitrate
         ).isGreaterThan(defaultBitrate)
 
@@ -138,7 +143,8 @@
                 profile.videoCodecMimeType!!,
                 defaultVideoSpec,
                 decreasedSurfaceSize,
-                profile
+                profile,
+                /*expectedFrameRateRange=*/null
             ).get().bitrate
         ).isLessThan(defaultBitrate)
     }
@@ -152,7 +158,8 @@
             profile.videoCodecMimeType!!,
             defaultVideoSpec,
             surfaceSize,
-            profile
+            profile,
+            /*expectedFrameRateRange=*/null
         ).get().bitrate
 
         // Create video spec with limit 20% higher than default.
@@ -169,7 +176,8 @@
                 profile.videoCodecMimeType!!,
                 higherVideoSpec,
                 surfaceSize,
-                profile
+                profile,
+                /*expectedFrameRateRange=*/null
             ).get().bitrate
         ).isEqualTo(higherBitrate)
 
@@ -178,31 +186,80 @@
                 profile.videoCodecMimeType!!,
                 lowerVideoSpec,
                 surfaceSize,
-                profile
+                profile,
+                /*expectedFrameRateRange=*/null
             ).get().bitrate
         ).isEqualTo(lowerBitrate)
     }
 
-    // TODO(b/177918193): We currently cannot communicate the frame rate to the camera,
-    //  so we only support 30fps. Ensure the encoder config always is 30 so the encoder
-    //  gets the correct frame rate.
-    //  This test can be removed once setting the frame rate is supported.
     @Test
-    fun frameRateIsAlways30() {
-        // Give a VideoSpec with a frame rate higher than 30
-        val videoSpec = VideoSpec.builder().setFrameRate(Range(60, 60)).build()
+    fun resolvedFrameRateIsClampedToOperatingRate() {
         val profile = videoCapabilities.getProfile(Quality.HIGHEST)!!
         val surfaceSize = Size(profile.videoFrameWidth, profile.videoFrameHeight)
 
-        assertThat(
-            VideoEncoderConfigCamcorderProfileResolver(
-                profile.videoCodecMimeType!!,
-                videoSpec,
-                surfaceSize,
-                profile
-            ).get().frameRate
-        ).isEqualTo(
-            FIXED_FRAME_RATE
+        // 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!!,
+            defaultVideoSpec,
+            surfaceSize,
+            profile,
+            lowerOperatingRange
+        ).get().frameRate
+
+        val clampedUpFrameRate = VideoEncoderConfigCamcorderProfileResolver(
+            profile.videoCodecMimeType!!,
+            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!!,
+            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!!,
+            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 68e0614..b9be879 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
@@ -34,10 +34,9 @@
     companion object {
         const val MIME_TYPE = "video/avc"
 
-        // TODO(b/177918193): We currently cannot communicate the frame rate to the camera,
-        //  so we only support 30fps. For now we want to ensure we only ever get an FPS of 30,
-        //  but this check can be removed once we can change frame rate.
-        const val FIXED_FRAME_RATE = 30
+        const val FRAME_RATE_30 = 30
+        const val FRAME_RATE_45 = 45
+        const val FRAME_RATE_60 = 60
     }
 
     private val defaultVideoSpec = VideoSpec.builder().build()
@@ -48,30 +47,47 @@
         val surfaceSize720p = CamcorderProfileUtil.RESOLUTION_720P
         val surfaceSize1080p = CamcorderProfileUtil.RESOLUTION_1080P
 
+        val expectedFrameRateRange = Range(FRAME_RATE_30, FRAME_RATE_30)
+
         val configSupplierCif =
-            VideoEncoderConfigDefaultResolver(MIME_TYPE, defaultVideoSpec, surfaceSizeCif)
+            VideoEncoderConfigDefaultResolver(
+                MIME_TYPE,
+                defaultVideoSpec,
+                surfaceSizeCif,
+                expectedFrameRateRange
+            )
         val configSupplier720p =
-            VideoEncoderConfigDefaultResolver(MIME_TYPE, defaultVideoSpec, surfaceSize720p)
+            VideoEncoderConfigDefaultResolver(
+                MIME_TYPE,
+                defaultVideoSpec,
+                surfaceSize720p,
+                expectedFrameRateRange
+            )
         val configSupplier1080p =
-            VideoEncoderConfigDefaultResolver(MIME_TYPE, defaultVideoSpec, surfaceSize1080p)
+            VideoEncoderConfigDefaultResolver(
+                MIME_TYPE,
+                defaultVideoSpec,
+                surfaceSize1080p,
+                expectedFrameRateRange
+            )
 
         val configCif = configSupplierCif.get()
         assertThat(configCif.mimeType).isEqualTo(MIME_TYPE)
         assertThat(configCif.bitrate).isGreaterThan(0)
         assertThat(configCif.resolution).isEqualTo(surfaceSizeCif)
-        assertThat(configCif.frameRate).isEqualTo(FIXED_FRAME_RATE)
+        assertThat(configCif.frameRate).isEqualTo(FRAME_RATE_30)
 
         val config720p = configSupplier720p.get()
         assertThat(config720p.mimeType).isEqualTo(MIME_TYPE)
         assertThat(config720p.bitrate).isGreaterThan(0)
         assertThat(config720p.resolution).isEqualTo(surfaceSize720p)
-        assertThat(config720p.frameRate).isEqualTo(FIXED_FRAME_RATE)
+        assertThat(config720p.frameRate).isEqualTo(FRAME_RATE_30)
 
         val config1080p = configSupplier1080p.get()
         assertThat(config1080p.mimeType).isEqualTo(MIME_TYPE)
         assertThat(config1080p.bitrate).isGreaterThan(0)
         assertThat(config1080p.resolution).isEqualTo(surfaceSize1080p)
-        assertThat(config1080p.frameRate).isEqualTo(FIXED_FRAME_RATE)
+        assertThat(config1080p.frameRate).isEqualTo(FRAME_RATE_30)
     }
 
     @Test
@@ -80,7 +96,12 @@
 
         // Get default bit rate for this size
         val defaultConfig =
-            VideoEncoderConfigDefaultResolver(MIME_TYPE, defaultVideoSpec, surfaceSize720p).get()
+            VideoEncoderConfigDefaultResolver(
+                MIME_TYPE,
+                defaultVideoSpec,
+                surfaceSize720p,
+                /*expectedFrameRateRange=*/null
+            ).get()
         val defaultBitrate = defaultConfig.bitrate
 
         // Create video spec with limit 20% higher than default.
@@ -96,7 +117,8 @@
             VideoEncoderConfigDefaultResolver(
                 MIME_TYPE,
                 higherVideoSpec,
-                surfaceSize720p
+                surfaceSize720p,
+                /*expectedFrameRateRange=*/null
             ).get().bitrate
         ).isEqualTo(higherBitrate)
 
@@ -104,29 +126,72 @@
             VideoEncoderConfigDefaultResolver(
                 MIME_TYPE,
                 lowerVideoSpec,
-                surfaceSize720p
+                surfaceSize720p,
+                /*expectedFrameRateRange=*/null
             ).get().bitrate
         ).isEqualTo(lowerBitrate)
     }
 
-    // TODO(b/177918193): We currently cannot communicate the frame rate to the camera,
-    //  so we only support 30fps. Ensure the encoder config always is 30 so the encoder
-    //  gets the correct frame rate.
-    //  This test can be removed once setting the frame rate is supported.
     @Test
-    fun frameRateIsAlways30() {
+    fun frameRateIsChosenFromVideoSpec_whenNoExpectedRangeProvided() {
         // Give a VideoSpec with a frame rate higher than 30
-        val videoSpec = VideoSpec.builder().setBitrate(Range(60, 60)).build()
+        val videoSpec =
+            VideoSpec.builder().setFrameRate(Range(FRAME_RATE_60, FRAME_RATE_60)).build()
         val size = CamcorderProfileUtil.RESOLUTION_1080P
 
         assertThat(
             VideoEncoderConfigDefaultResolver(
                 MIME_TYPE,
                 videoSpec,
-                size
+                size,
+                /*expectedFrameRateRange=*/null
             ).get().frameRate
         ).isEqualTo(
-            FIXED_FRAME_RATE
+            FRAME_RATE_60
         )
     }
+
+    @Test
+    fun frameRateIsChosenFromExpectedRange_whenNoOverlapWithVideoSpec() {
+        // 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 expectedFrameRateRange = Range(FRAME_RATE_30, FRAME_RATE_30)
+
+        // Expected frame rate range takes precedence over VideoSpec
+        assertThat(
+            VideoEncoderConfigDefaultResolver(
+                MIME_TYPE,
+                videoSpec,
+                size,
+                expectedFrameRateRange
+            ).get().frameRate
+        ).isEqualTo(
+            FRAME_RATE_30
+        )
+    }
+
+    @Test
+    fun frameRateIsChosenFromOverlapOfExpectedRangeAndVideoSpec() {
+        // 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 expectedFrameRateRange = Range(FRAME_RATE_30, FRAME_RATE_60)
+
+        val intersection = expectedFrameRateRange.intersect(videoSpec.frameRate)
+
+        // Expected frame rate range takes precedence over VideoSpec
+        assertThat(
+            VideoEncoderConfigDefaultResolver(
+                MIME_TYPE,
+                videoSpec,
+                size,
+                expectedFrameRateRange
+            ).get().frameRate
+        ).isIn(com.google.common.collect.Range.closed(intersection.lower, intersection.upper))
+    }
 }
\ 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 72e8ffb..dd4c463 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
@@ -126,7 +126,11 @@
             VideoSpec.builder().setQualitySelector(QualitySelector.from(quality)).build()
 
         val mediaFormat = VideoEncoderConfigCamcorderProfileResolver(
-            camcorderProfileVideoMime, videoSpec, resolution!!, camcorderProfile
+            camcorderProfileVideoMime,
+            videoSpec,
+            resolution!!,
+            camcorderProfile,
+            /*expectedFrameRateRange=*/null
         ).get().toMediaFormat()
 
         // Act.
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 775e296..5a2bde4 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/Recorder.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/Recorder.java
@@ -40,6 +40,7 @@
 import android.os.ParcelFileDescriptor;
 import android.provider.MediaStore;
 import android.util.Pair;
+import android.util.Range;
 import android.util.Size;
 import android.view.Surface;
 
@@ -1234,15 +1235,17 @@
 
     @NonNull
     private static VideoEncoderConfig resolveVideoEncoderConfig(@NonNull MimeInfo videoMimeInfo,
-            @NonNull VideoSpec videoSpec, @NonNull Size surfaceSize) {
+            @NonNull VideoSpec videoSpec, @NonNull Size surfaceSize,
+            @Nullable Range<Integer> expectedFrameRateRange) {
         Supplier<VideoEncoderConfig> configSupplier;
         if (videoMimeInfo.getCompatibleCamcorderProfile() != null) {
             configSupplier = new VideoEncoderConfigCamcorderProfileResolver(
                     videoMimeInfo.getMimeType(), videoSpec, surfaceSize,
-                    videoMimeInfo.getCompatibleCamcorderProfile());
+                    videoMimeInfo.getCompatibleCamcorderProfile(),
+                    expectedFrameRateRange);
         } else {
             configSupplier = new VideoEncoderConfigDefaultResolver(videoMimeInfo.getMimeType(),
-                    videoSpec, surfaceSize);
+                    videoSpec, surfaceSize, expectedFrameRateRange);
         }
 
         return configSupplier.get();
@@ -1331,8 +1334,15 @@
     private void setupVideo(@NonNull SurfaceRequest surfaceRequest) {
         MediaSpec mediaSpec = getObservableData(mMediaSpec);
         MimeInfo videoMimeInfo = resolveVideoMimeInfo(mediaSpec);
-        VideoEncoderConfig config = resolveVideoEncoderConfig(videoMimeInfo,
-                mediaSpec.getVideoSpec(), surfaceRequest.getResolution());
+
+        // The VideoSpec from mMediaSpec only contains settings requested by the recorder, but
+        // the actual settings may need to differ depending on the FPS chosen by the camera.
+        // The expected frame rate from the camera is passed on here from the SurfaceRequest.
+        VideoEncoderConfig config = resolveVideoEncoderConfig(
+                videoMimeInfo,
+                mediaSpec.getVideoSpec(),
+                surfaceRequest.getResolution(),
+                surfaceRequest.getExpectedFrameRate());
 
         try {
             mVideoEncoder = mVideoEncoderFactory.createEncoder(mExecutor, config);
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 00bf998..56d3914 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
@@ -16,6 +16,7 @@
 
 package androidx.camera.video;
 
+import static androidx.camera.core.SurfaceOutput.GlTransformOptions.APPLY_CROP_ROTATE_AND_MIRRORING;
 import static androidx.camera.core.impl.ImageOutputConfig.OPTION_DEFAULT_RESOLUTION;
 import static androidx.camera.core.impl.ImageOutputConfig.OPTION_MAX_RESOLUTION;
 import static androidx.camera.core.impl.ImageOutputConfig.OPTION_SUPPORTED_RESOLUTIONS;
@@ -35,9 +36,14 @@
 import static androidx.camera.video.StreamInfo.STREAM_ID_ERROR;
 import static androidx.camera.video.impl.VideoCaptureConfig.OPTION_VIDEO_OUTPUT;
 
+import static java.util.Collections.singletonList;
+import static java.util.Objects.requireNonNull;
+
+import android.graphics.ImageFormat;
 import android.graphics.Rect;
 import android.media.MediaCodec;
 import android.util.Pair;
+import android.util.Range;
 import android.util.Size;
 import android.view.Display;
 import android.view.Surface;
@@ -53,6 +59,7 @@
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.Logger;
+import androidx.camera.core.SurfaceEffect;
 import androidx.camera.core.SurfaceRequest;
 import androidx.camera.core.UseCase;
 import androidx.camera.core.ViewPort;
@@ -79,6 +86,10 @@
 import androidx.camera.core.impl.utils.futures.FutureCallback;
 import androidx.camera.core.impl.utils.futures.Futures;
 import androidx.camera.core.internal.ThreadConfig;
+import androidx.camera.core.processing.SettableSurface;
+import androidx.camera.core.processing.SurfaceEdge;
+import androidx.camera.core.processing.SurfaceEffectInternal;
+import androidx.camera.core.processing.SurfaceEffectNode;
 import androidx.camera.video.StreamInfo.StreamState;
 import androidx.camera.video.impl.VideoCaptureConfig;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
@@ -88,7 +99,6 @@
 
 import java.lang.reflect.Type;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 import java.util.UUID;
@@ -132,6 +142,10 @@
     private SurfaceRequest mSurfaceRequest;
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     VideoOutput.SourceState mSourceState = VideoOutput.SourceState.INACTIVE;
+    @Nullable
+    private SurfaceEffectInternal mSurfaceEffect;
+    @Nullable
+    private SurfaceEffectNode mNode;
 
     /**
      * Create a VideoCapture associated with the given {@link VideoOutput}.
@@ -208,21 +222,10 @@
      *
      * @hide
      */
-    @SuppressWarnings("unchecked")
     @RestrictTo(Scope.LIBRARY_GROUP)
     @Override
     public void onStateAttached() {
         super.onStateAttached();
-        Preconditions.checkNotNull(getAttachedSurfaceResolution(), "The suggested resolution "
-                + "should be already updated and shouldn't be null.");
-        Preconditions.checkState(mSurfaceRequest == null, "The surface request should be null "
-                + "when VideoCapture is attached.");
-        mSessionConfigBuilder = createPipeline(getCameraId(),
-                (VideoCaptureConfig<T>) getCurrentConfig(), getAttachedSurfaceResolution());
-        applyStreamInfoToSessionConfigBuilder(mSessionConfigBuilder, mStreamInfo);
-        updateSessionConfig(mSessionConfigBuilder.build());
-        // VideoCapture has to be active to apply SessionConfig's template type.
-        notifyActive();
         getOutput().getStreamInfo().addObserver(CameraXExecutors.mainThreadExecutor(),
                 mStreamInfoObserver);
         setSourceState(VideoOutput.SourceState.ACTIVE_NON_STREAMING);
@@ -239,6 +242,7 @@
     @NonNull
     protected Size onSuggestedResolutionUpdated(@NonNull Size suggestedResolution) {
         Logger.d(TAG, "suggestedResolution = " + suggestedResolution);
+        String cameraId = getCameraId();
         VideoCaptureConfig<T> config = (VideoCaptureConfig<T>) getCurrentConfig();
 
         // SuggestedResolution gives the upper bound of allowed resolution size.
@@ -269,6 +273,14 @@
             }
         }
 
+        mStreamInfo = fetchObservableValue(getOutput().getStreamInfo(),
+                StreamInfo.STREAM_INFO_ANY_INACTIVE);
+        mSessionConfigBuilder = createPipeline(cameraId, config, finalSelectedResolution);
+        applyStreamInfoToSessionConfigBuilder(mSessionConfigBuilder, mStreamInfo);
+        updateSessionConfig(mSessionConfigBuilder.build());
+        // VideoCapture has to be active to apply SessionConfig's template type.
+        notifyActive();
+
         return finalSelectedResolution;
     }
 
@@ -286,6 +298,27 @@
     }
 
     /**
+     * Sets a {@link SurfaceEffectInternal}.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    public void setEffect(@Nullable SurfaceEffectInternal surfaceEffect) {
+        mSurfaceEffect = surfaceEffect;
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public void onDetached() {
+        clearPipeline();
+    }
+
+    /**
      * {@inheritDoc}
      *
      * @hide
@@ -303,9 +336,6 @@
                         + "cancelled.");
             }
         }
-        // Clear the pipeline to close the surface, which releases the codec so that it's
-        // available for other applications.
-        clearPipeline();
     }
 
     @NonNull
@@ -370,7 +400,8 @@
         Rect cropRect = getCropRect(resolution);
         if (cameraInternal != null && surfaceRequest != null && cropRect != null) {
             surfaceRequest.updateTransformationInfo(SurfaceRequest.TransformationInfo.of(cropRect,
-                    getRelativeRotation(cameraInternal), getTargetRotationInternal()));
+                    mNode != null ? 0 : getRelativeRotation(cameraInternal),
+                    mNode != null ? Surface.ROTATION_0 : getTargetRotationInternal()));
         }
     }
 
@@ -397,12 +428,36 @@
             @NonNull VideoCaptureConfig<T> config,
             @NonNull Size resolution) {
         Threads.checkMainThread();
+        CameraInternal camera = Preconditions.checkNotNull(getCamera());
 
-        mSurfaceRequest = new SurfaceRequest(resolution, Preconditions.checkNotNull(getCamera()),
-                false);
+        // TODO(b/229410005): The expected FPS range will need to come from the camera rather
+        //  than what is requested in the config. For now we use the default range of (30, 30)
+        //  for behavioral consistency.
+        Range<Integer> targetFpsRange = config.getTargetFramerate(Defaults.DEFAULT_FPS_RANGE);
+        if (mSurfaceEffect != null) {
+            mNode = new SurfaceEffectNode(camera, APPLY_CROP_ROTATE_AND_MIRRORING,
+                    mSurfaceEffect);
+            SettableSurface cameraSurface = new SettableSurface(
+                    SurfaceEffect.VIDEO_CAPTURE,
+                    resolution,
+                    ImageFormat.PRIVATE,
+                    getSensorToBufferTransformMatrix(),
+                    /*hasEmbeddedTransform=*/true,
+                    requireNonNull(getCropRect(resolution)),
+                    getRelativeRotation(camera),
+                    /*mirroring=*/false);
+            SurfaceEdge inputEdge = SurfaceEdge.create(singletonList(cameraSurface));
+            SurfaceEdge outputEdge = mNode.transform(inputEdge);
+            SettableSurface appSurface = outputEdge.getSurfaces().get(0);
+            mSurfaceRequest = appSurface.createSurfaceRequest(camera, targetFpsRange);
+            mDeferrableSurface = cameraSurface;
+        } else {
+            mSurfaceRequest = new SurfaceRequest(resolution, camera, false, targetFpsRange);
+            mDeferrableSurface = mSurfaceRequest.getDeferrableSurface();
+        }
+
         config.getVideoOutput().onSurfaceRequested(mSurfaceRequest);
         sendTransformationInfoIfReady(resolution);
-        mDeferrableSurface = mSurfaceRequest.getDeferrableSurface();
         // Since VideoCapture is in video module and can't be recognized by core module, use
         // MediaCodec class instead.
         mDeferrableSurface.setContainerClass(MediaCodec.class);
@@ -425,6 +480,10 @@
             mDeferrableSurface.close();
             mDeferrableSurface = null;
         }
+        if (mNode != null) {
+            mNode.release();
+            mNode = null;
+        }
 
         mSurfaceRequest = null;
         mStreamInfo = StreamInfo.STREAM_INFO_ANY_INACTIVE;
@@ -465,6 +524,8 @@
                 SurfaceRequest::willNotProvideSurface;
         private static final VideoCaptureConfig<?> DEFAULT_CONFIG;
 
+        static final Range<Integer> DEFAULT_FPS_RANGE = new Range<>(30, 30);
+
         static {
             Builder<?> builder = new Builder<>(DEFAULT_VIDEO_OUTPUT)
                     .setSurfaceOccupancyPriority(DEFAULT_SURFACE_OCCUPANCY_PRIORITY);
@@ -550,9 +611,7 @@
             } else {
                 sessionConfigBuilder.addNonRepeatingSurface(mDeferrableSurface);
             }
-        } else {
-            // Don't attach surface when stream is invalid.
-        }
+        } // Don't attach surface when stream is invalid.
 
         setupSurfaceUpdateNotifier(sessionConfigBuilder, isStreamActive);
     }
@@ -677,7 +736,7 @@
                 "No supportedResolutions after filter out");
 
         builder.getMutableConfig().insertOption(OPTION_SUPPORTED_RESOLUTIONS,
-                Collections.singletonList(
+                singletonList(
                         Pair.create(getImageFormat(), supportedResolutions.toArray(new Size[0]))));
     }
 
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 734403e..04d1ecd 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
@@ -31,7 +31,7 @@
  * does not work on the device, and should not be used.
  *
  * <p>QuirkSummary
- *      Bug Id:      202080832
+ *      Bug Id:      202080832, 242526718
  *      Description: On devices exhibiting this quirk, {@link CamcorderProfile} indicates it
  *                   can support resolutions for a specific video encoder (e.g., 3840x2160 for
  *                   {@link VideoEncoder#H264} on Huawei Mate 20), and it can create the video
@@ -39,13 +39,16 @@
  *                   video frames when configured with a {@link MediaCodec} surface at the
  *                   specified resolution. On these devices, the capture session is opened and
  *                   configured, but an error occurs in the HAL. See b/202080832#comment8
- *                   for details of this error.
- *      Device(s):   Huawei Mate 20, Huawei Mate 20 Pro
+ *                   for details of this error. See b/242526718#comment2. On Vivo Y91i,
+ *                   {@link CamcorderProfile} indicates AVC encoder can support resolutions
+ *                   1920x1080 and 1280x720. However, the 1920x1080 and 1280x720 options cannot be
+ *                   configured properly. It only supports 640x480.
+ *      Device(s):   Huawei Mate 20, Huawei Mate 20 Pro, Vivo Y91i
  */
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class ReportedVideoQualityNotSupportedQuirk implements VideoQualityQuirk {
     static boolean load() {
-        return isHuaweiMate20() || isHuaweiMate20Pro();
+        return isHuaweiMate20() || isHuaweiMate20Pro() || isVivoY91i();
     }
 
     private static boolean isHuaweiMate20() {
@@ -56,9 +59,20 @@
         return "Huawei".equalsIgnoreCase(Build.BRAND) && "LYA-AL00".equalsIgnoreCase(Build.MODEL);
     }
 
+    private static boolean isVivoY91i() {
+        return "Vivo".equalsIgnoreCase(Build.BRAND) && "vivo 1820".equalsIgnoreCase(Build.MODEL);
+    }
+
     /** Checks if the given mime type is a problematic quality. */
     @Override
     public boolean isProblematicVideoQuality(@NonNull Quality quality) {
-        return quality == Quality.UHD;
+        if (isHuaweiMate20() || isHuaweiMate20Pro()) {
+            return quality == Quality.UHD;
+        } else if (isVivoY91i()) {
+            // On Y91i, the HD and FHD resolution is problematic with the front camera. The back
+            // camera only supports SD resolution.
+            return quality == Quality.HD || quality == Quality.FHD;
+        }
+        return false;
     }
 }
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 02dca7c3..0e14ec1 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
@@ -20,6 +20,7 @@
 import android.util.Rational;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.camera.core.Logger;
 import androidx.camera.video.VideoSpec;
@@ -31,29 +32,39 @@
 public final class VideoConfigUtil {
     private static final String TAG = "VideoConfigUtil";
 
-    private static final int VIDEO_FRAME_RATE_FIXED_DEFAULT = 30;
-
     // Should not be instantiated.
     private VideoConfigUtil() {
     }
 
-    static int resolveFrameRate(@NonNull VideoSpec videoSpec) {
-        // TODO(b/177918193): We currently cannot communicate the frame rate to the camera,
-        //  so we only support 30fps. This should come from MediaSpec or use
-        //  CamcorderProfile.videoFrameRate if set to AUTO framerate.
-        Range<Integer> videoSpecFrameRateRange = videoSpec.getFrameRate();
-        int resolvedFrameRate = VIDEO_FRAME_RATE_FIXED_DEFAULT;
-        if (VideoSpec.FRAME_RATE_RANGE_AUTO.equals(videoSpecFrameRateRange)
-                || videoSpecFrameRateRange.contains(VIDEO_FRAME_RATE_FIXED_DEFAULT)) {
-            Logger.d(TAG, "Using single supported VIDEO frame rate: " + resolvedFrameRate);
+    static int resolveFrameRate(@NonNull Range<Integer> preferredRange,
+            int exactFrameRateHint, @Nullable Range<Integer> strictOperatingFpsRange) {
+        Range<Integer> refinedRange;
+        if (strictOperatingFpsRange != null) {
+            // We have a strict operating range. Our frame rate should always be in this
+            // range. Since we can only choose a single frame rate (which acts as a target for
+            // VBR), we can only fine tune our preferences within that range.
+            try {
+                // First, let's try to intersect with the preferred frame rate range since this
+                // could contain intent from the user.
+                refinedRange = strictOperatingFpsRange.intersect(preferredRange);
+            } catch (IllegalArgumentException ex) {
+                // Ranges are disjoint. Choose the closest extreme as our frame rate.
+                if (preferredRange.getUpper() < strictOperatingFpsRange.getLower()) {
+                    // Preferred range is below operating range.
+                    return strictOperatingFpsRange.getLower();
+                } else {
+                    // Preferred range is above operating range.
+                    return strictOperatingFpsRange.getUpper();
+                }
+            }
         } else {
-            Logger.w(TAG,
-                    "Requested frame rate range does not include single supported frame rate. "
-                            + "Ignoring range. [range: " + videoSpecFrameRateRange + " supported "
-                            + "frame rate: " + resolvedFrameRate + "]");
+            // We only have the preferred range as a hint since the operating range is null.
+            refinedRange = preferredRange;
         }
 
-        return resolvedFrameRate;
+        // Finally, try to apply the exact frame rate hint to the refined range since
+        // other settings may expect this number.
+        return refinedRange.clamp(exactFrameRateHint);
     }
 
     static int scaleAndClampBitrate(
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
index ba39b52..dc703be 100644
--- 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
@@ -20,6 +20,7 @@
 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;
@@ -41,6 +42,8 @@
     private final VideoSpec mVideoSpec;
     private final Size mSurfaceSize;
     private final CamcorderProfileProxy mCamcorderProfile;
+    @Nullable
+    private final Range<Integer> mExpectedFrameRateRange;
 
     /**
      * Constructor for a VideoEncoderConfigCamcorderProfileResolver.
@@ -51,21 +54,30 @@
      * @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 VideoSpec videoSpec,
             @NonNull Size surfaceSize,
-            @NonNull CamcorderProfileProxy camcorderProfile) {
+            @NonNull CamcorderProfileProxy camcorderProfile,
+            @Nullable Range<Integer> expectedFrameRateRange) {
         mMimeType = mimeType;
         mVideoSpec = videoSpec;
         mSurfaceSize = surfaceSize;
         mCamcorderProfile = camcorderProfile;
+        mExpectedFrameRateRange = expectedFrameRateRange;
     }
 
     @Override
     @NonNull
     public VideoEncoderConfig get() {
-        int resolvedFrameRate = VideoConfigUtil.resolveFrameRate(mVideoSpec);
+        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");
@@ -83,4 +95,18 @@
                 .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/VideoEncoderConfigDefaultResolver.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/config/VideoEncoderConfigDefaultResolver.java
index d61649f..4f84677 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/config/VideoEncoderConfigDefaultResolver.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/config/VideoEncoderConfigDefaultResolver.java
@@ -20,6 +20,7 @@
 import android.util.Size;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.camera.core.Logger;
 import androidx.camera.video.VideoSpec;
@@ -40,10 +41,14 @@
     private static final int VIDEO_BITRATE_BASE = 14000000;
     private static final Size VIDEO_SIZE_BASE = new Size(1280, 720);
     private static final int VIDEO_FRAME_RATE_BASE = 30;
+    private static final int VIDEO_FRAME_RATE_FIXED_DEFAULT = 30;
+    private static final Range<Integer> VALID_FRAME_RATE_RANGE = new Range<>(1, 60);
 
     private final String mMimeType;
     private final VideoSpec mVideoSpec;
     private final Size mSurfaceSize;
+    @Nullable
+    private final Range<Integer> mExpectedFrameRateRange;
 
     /**
      * Constructor for a VideoEncoderConfigDefaultResolver.
@@ -54,16 +59,19 @@
      * @param surfaceSize The size of the surface required by the camera for the video encoder.
      */
     public VideoEncoderConfigDefaultResolver(@NonNull String mimeType,
-            @NonNull VideoSpec videoSpec, @NonNull Size surfaceSize) {
+            @NonNull VideoSpec videoSpec, @NonNull Size surfaceSize,
+            @Nullable Range<Integer> expectedFrameRateRange) {
         mMimeType = mimeType;
         mVideoSpec = videoSpec;
         mSurfaceSize = surfaceSize;
+        mExpectedFrameRateRange = expectedFrameRateRange;
     }
 
     @Override
     @NonNull
     public VideoEncoderConfig get() {
-        int resolvedFrameRate = VideoConfigUtil.resolveFrameRate(mVideoSpec);
+        int resolvedFrameRate = resolveFrameRate();
+        Logger.d(TAG, "Resolved VIDEO frame rate: " + resolvedFrameRate + "fps");
 
         Range<Integer> videoSpecBitrateRange = mVideoSpec.getBitrate();
         Logger.d(TAG, "Using fallback VIDEO bitrate");
@@ -82,4 +90,28 @@
                 .setFrameRate(resolvedFrameRate)
                 .build();
     }
+
+    private int resolveFrameRate() {
+        Range<Integer> videoSpecFrameRateRange = mVideoSpec.getFrameRate();
+        // If the frame rate range isn't AUTO, we'll use the upper frame rate from the video spec
+        // as our default in an attempt to maximize the quality of the video. However, we need to
+        // ensure it is a valid frame rate, so clamp between 1 and 60fps.
+        int defaultFrameRate;
+        if (!VideoSpec.FRAME_RATE_RANGE_AUTO.equals(videoSpecFrameRateRange)) {
+            defaultFrameRate = VALID_FRAME_RATE_RANGE.clamp(videoSpecFrameRateRange.getUpper());
+        } else {
+            // We have no information to base the frame rate on. Use a standard default.
+            defaultFrameRate = VIDEO_FRAME_RATE_FIXED_DEFAULT;
+        }
+
+        Logger.d(TAG,
+                String.format("Frame rate default: %dfps. [Requested range: %s, "
+                                + "Expected operating range: %s]", defaultFrameRate,
+                        videoSpecFrameRateRange, mExpectedFrameRateRange));
+
+        return VideoConfigUtil.resolveFrameRate(
+                /*preferredRange=*/ videoSpecFrameRateRange,
+                /*exactFrameRateHint=*/ defaultFrameRate,
+                /*strictOperatingFpsRange=*/mExpectedFrameRateRange);
+    }
 }
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 0f0e34c..bd66f12 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,11 +18,13 @@
 
 import android.content.Context
 import android.os.Build
+import android.os.Looper
 import android.util.Size
 import android.view.Surface
 import androidx.camera.core.CameraSelector
 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.ImageOutputConfig
@@ -47,13 +49,13 @@
 import androidx.camera.testing.fakes.FakeCameraDeviceSurfaceManager
 import androidx.camera.testing.fakes.FakeCameraFactory
 import androidx.camera.testing.fakes.FakeCameraInfoInternal
+import androidx.camera.testing.fakes.FakeSurfaceEffectInternal
 import androidx.camera.video.StreamInfo.StreamState
 import androidx.camera.video.impl.VideoCaptureConfig
 import androidx.core.util.Consumer
 import androidx.test.core.app.ApplicationProvider
 import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
-import java.util.concurrent.TimeUnit
 import org.junit.After
 import org.junit.Assert.assertThrows
 import org.junit.Test
@@ -62,8 +64,10 @@
 import org.mockito.Mockito.mock
 import org.mockito.Mockito.verify
 import org.robolectric.RobolectricTestRunner
+import org.robolectric.Shadows.shadowOf
 import org.robolectric.annotation.Config
 import org.robolectric.annotation.internal.DoNotInstrument
+import java.util.concurrent.TimeUnit
 
 private val ANY_SIZE = Size(640, 480)
 private const val CAMERA_ID_0 = "0"
@@ -83,14 +87,20 @@
     private lateinit var cameraUseCaseAdapter: CameraUseCaseAdapter
     private lateinit var cameraFactory: CameraFactory
     private lateinit var surfaceManager: FakeCameraDeviceSurfaceManager
+    private var surfaceRequestsToRelease = mutableListOf<SurfaceRequest>()
 
     @After
     fun tearDown() {
         if (this::cameraUseCaseAdapter.isInitialized) {
             cameraUseCaseAdapter.apply {
+                detachUseCases()
                 removeUseCases(useCases)
             }
         }
+        surfaceRequestsToRelease.forEach {
+            // If the request is already provided, then this is no-op.
+            it.willNotProvideSurface()
+        }
         CameraXUtil.shutdown().get(10, TimeUnit.SECONDS)
     }
 
@@ -121,8 +131,7 @@
     fun addUseCases_receiveOnSurfaceRequest() {
         // Arrange.
         setupCamera()
-        cameraUseCaseAdapter =
-            CameraUtil.createCameraUseCaseAdapter(context, CameraSelector.DEFAULT_BACK_CAMERA)
+        createCameraUseCaseAdapter()
 
         var surfaceRequest: SurfaceRequest? = null
         val videoOutput = createVideoOutput(surfaceRequestListener = { surfaceRequest = it })
@@ -131,7 +140,7 @@
             .build()
 
         // Act.
-        cameraUseCaseAdapter.addUseCases(listOf(videoCapture))
+        addAndAttachUseCases(videoCapture)
 
         // Assert.
         assertThat(surfaceRequest).isNotNull()
@@ -141,8 +150,7 @@
     fun addUseCases_withNullMediaSpec_throwException() {
         // Arrange.
         setupCamera()
-        cameraUseCaseAdapter =
-            CameraUtil.createCameraUseCaseAdapter(context, CameraSelector.DEFAULT_BACK_CAMERA)
+        createCameraUseCaseAdapter()
 
         val videoOutput = createVideoOutput(mediaSpec = null)
         val videoCapture = VideoCapture.Builder(videoOutput)
@@ -152,7 +160,7 @@
         // Assert.
         assertThrows(CameraUseCaseAdapter.CameraException::class.java) {
             // Act.
-            cameraUseCaseAdapter.addUseCases(listOf(videoCapture))
+            addAndAttachUseCases(videoCapture)
         }
     }
 
@@ -160,8 +168,7 @@
     fun setQualitySelector_sameResolutionAsQualitySelector() {
         // Arrange.
         setupCamera()
-        cameraUseCaseAdapter =
-            CameraUtil.createCameraUseCaseAdapter(context, CameraSelector.DEFAULT_BACK_CAMERA)
+        createCameraUseCaseAdapter()
 
         // Camera 0 support 2160P(UHD) and 720P(HD)
         val qualityList = arrayOf(
@@ -187,10 +194,13 @@
                 .build()
 
             // Act.
-            cameraUseCaseAdapter.addUseCases(listOf(videoCapture))
+            addAndAttachUseCases(videoCapture)
 
             // Assert.
             assertThat(videoCapture.attachedSurfaceResolution).isEqualTo(resolution)
+
+            // Clean up.
+            detachAndRemoveUseCases(videoCapture)
         }
     }
 
@@ -207,8 +217,7 @@
                 CamcorderProfileUtil.asLowQuality(PROFILE_480P)
             )
         )
-        cameraUseCaseAdapter =
-            CameraUtil.createCameraUseCaseAdapter(context, CameraSelector.DEFAULT_BACK_CAMERA)
+        createCameraUseCaseAdapter()
         surfaceManager.setSuggestedResolution(
             CAMERA_ID_0,
             VideoCaptureConfig::class.java,
@@ -234,7 +243,7 @@
             .build()
 
         // Act.
-        cameraUseCaseAdapter.addUseCases(listOf(videoCapture))
+        addAndAttachUseCases(videoCapture)
 
         // Assert.
         assertSupportedResolutions(
@@ -248,8 +257,7 @@
     fun setQualitySelector_notSupportedQuality_throwException() {
         // Arrange.
         setupCamera()
-        cameraUseCaseAdapter =
-            CameraUtil.createCameraUseCaseAdapter(context, CameraSelector.DEFAULT_BACK_CAMERA)
+        createCameraUseCaseAdapter()
 
         // Camera 0 support 2160P(UHD) and 720P(HD)
         val videoOutput = createVideoOutput(
@@ -264,7 +272,7 @@
         // Assert.
         assertThrows(CameraUseCaseAdapter.CameraException::class.java) {
             // Act.
-            cameraUseCaseAdapter.addUseCases(listOf(videoCapture))
+            addAndAttachUseCases(videoCapture)
         }
     }
 
@@ -272,8 +280,7 @@
     fun noSupportedQuality_supportedResolutionsIsNotSet() {
         // Arrange.
         setupCamera(profiles = emptyArray())
-        cameraUseCaseAdapter =
-            CameraUtil.createCameraUseCaseAdapter(context, CameraSelector.DEFAULT_BACK_CAMERA)
+        createCameraUseCaseAdapter()
 
         val videoOutput = createVideoOutput(
             mediaSpec = MediaSpec.builder().configureVideo {
@@ -285,7 +292,7 @@
             .build()
 
         // Act.
-        cameraUseCaseAdapter.addUseCases(listOf(videoCapture))
+        addAndAttachUseCases(videoCapture)
 
         // Assert.
         val supportedResolutionPairs = videoCapture.currentConfig.retrieveOption(
@@ -299,8 +306,7 @@
     fun removeUseCases_receiveResultOfSurfaceRequest() {
         // Arrange.
         setupCamera()
-        cameraUseCaseAdapter =
-            CameraUtil.createCameraUseCaseAdapter(context, CameraSelector.DEFAULT_BACK_CAMERA)
+        createCameraUseCaseAdapter()
 
         var surfaceResult: SurfaceRequest.Result? = null
         val videoOutput = createVideoOutput { surfaceRequest ->
@@ -314,7 +320,7 @@
             .build()
 
         // Act.
-        cameraUseCaseAdapter.addUseCases(listOf(videoCapture))
+        addAndAttachUseCases(videoCapture)
 
         // Assert.
         // Surface is in use, should not receive any result.
@@ -330,40 +336,6 @@
     }
 
     @Test
-    fun detachUseCases_receiveResultOfSurfaceRequest() {
-        // Arrange.
-        setupCamera()
-        cameraUseCaseAdapter =
-            CameraUtil.createCameraUseCaseAdapter(context, CameraSelector.DEFAULT_BACK_CAMERA)
-
-        var surfaceResult: SurfaceRequest.Result? = null
-        val videoOutput = createVideoOutput { surfaceRequest ->
-            surfaceRequest.provideSurface(
-                mock(Surface::class.java),
-                CameraXExecutors.directExecutor()
-            ) { surfaceResult = it }
-        }
-        val videoCapture = VideoCapture.Builder(videoOutput)
-            .setSessionOptionUnpacker { _, _ -> }
-            .build()
-
-        // Act.
-        cameraUseCaseAdapter.addUseCases(listOf(videoCapture))
-
-        // Assert.
-        // Surface is in use, should not receive any result.
-        assertThat(surfaceResult).isNull()
-
-        // Act.
-        cameraUseCaseAdapter.detachUseCases()
-
-        // Assert.
-        assertThat(surfaceResult!!.resultCode).isEqualTo(
-            SurfaceRequest.Result.RESULT_SURFACE_USED_SUCCESSFULLY
-        )
-    }
-
-    @Test
     fun setTargetRotation_rotationIsChanged() {
         // Arrange.
         val videoCapture = VideoCapture.withOutput(createVideoOutput())
@@ -379,8 +351,7 @@
     fun addUseCases_transformationInfoUpdated() {
         // Arrange.
         setupCamera()
-        cameraUseCaseAdapter =
-            CameraUtil.createCameraUseCaseAdapter(context, CameraSelector.DEFAULT_BACK_CAMERA)
+        createCameraUseCaseAdapter()
         val listener = mock(SurfaceRequest.TransformationInfoListener::class.java)
         val videoOutput = createVideoOutput(
             surfaceRequestListener = {
@@ -396,7 +367,7 @@
             .build()
 
         // Act.
-        cameraUseCaseAdapter.addUseCases(listOf(videoCapture))
+        addAndAttachUseCases(videoCapture)
 
         // Assert.
         verify(listener).onTransformationInfoUpdate(any())
@@ -406,8 +377,7 @@
     fun setTargetRotation_transformationInfoUpdated() {
         // Arrange.
         setupCamera()
-        cameraUseCaseAdapter =
-            CameraUtil.createCameraUseCaseAdapter(context, CameraSelector.DEFAULT_BACK_CAMERA)
+        createCameraUseCaseAdapter()
         var transformationInfo: SurfaceRequest.TransformationInfo? = null
         val videoOutput = createVideoOutput(
             surfaceRequestListener = { surfaceRequest ->
@@ -424,7 +394,7 @@
             .build()
 
         // Act.
-        cameraUseCaseAdapter.addUseCases(listOf(videoCapture))
+        addAndAttachUseCases(videoCapture)
 
         // Assert.
         assertThat(transformationInfo!!.targetRotation).isEqualTo(Surface.ROTATION_90)
@@ -470,6 +440,56 @@
         }
     }
 
+    @Test
+    fun bindAndUnbind_surfacesPropagated() {
+        // Arrange.
+        setupCamera()
+        createCameraUseCaseAdapter()
+        val effect = FakeSurfaceEffectInternal(CameraXExecutors.mainThreadExecutor(), false)
+        var appSurfaceReadyToRelease = false
+        val videoOutput = createVideoOutput(surfaceRequestListener = { surfaceRequest ->
+            surfaceRequest.provideSurface(
+                mock(Surface::class.java),
+                CameraXExecutors.mainThreadExecutor()
+            ) {
+                appSurfaceReadyToRelease = true
+            }
+        })
+        val videoCapture = VideoCapture.Builder(videoOutput)
+            .setSessionOptionUnpacker { _, _ -> }
+            .build()
+
+        // Act: bind and provide Surface.
+        videoCapture.setEffect(effect)
+        addAndAttachUseCases(videoCapture)
+        shadowOf(Looper.getMainLooper()).idle()
+
+        // Assert: surfaceOutput received.
+        assertThat(effect.surfaceOutput).isNotNull()
+        assertThat(effect.isReleased).isFalse()
+        assertThat(effect.isOutputSurfaceRequestedToClose).isFalse()
+        assertThat(effect.isInputSurfaceReleased).isFalse()
+        assertThat(appSurfaceReadyToRelease).isFalse()
+        // effect surface is provided to camera.
+        assertThat(videoCapture.sessionConfig.surfaces[0].surface.get())
+            .isEqualTo(effect.inputSurface)
+
+        // Act: unbind.
+        detachAndRemoveUseCases(videoCapture)
+        shadowOf(Looper.getMainLooper()).idle()
+
+        // Assert: effect and effect surface is released.
+        assertThat(effect.isReleased).isTrue()
+        assertThat(effect.isOutputSurfaceRequestedToClose).isTrue()
+        assertThat(effect.isInputSurfaceReleased).isTrue()
+        assertThat(appSurfaceReadyToRelease).isFalse()
+
+        // Act: close SurfaceOutput
+        effect.surfaceOutput!!.close()
+        shadowOf(Looper.getMainLooper()).idle()
+        assertThat(appSurfaceReadyToRelease).isTrue()
+    }
+
     private fun assertSupportedResolutions(
         videoCapture: VideoCapture<out VideoOutput>,
         vararg expectedResolutions: Size
@@ -486,7 +506,10 @@
         streamState: StreamState = StreamState.ACTIVE,
         mediaSpec: MediaSpec? = MediaSpec.builder().build(),
         surfaceRequestListener: Consumer<SurfaceRequest> = Consumer { it.willNotProvideSurface() }
-    ): TestVideoOutput = TestVideoOutput(streamState, mediaSpec, surfaceRequestListener)
+    ): TestVideoOutput = TestVideoOutput(streamState, mediaSpec) {
+        surfaceRequestsToRelease.add(it)
+        surfaceRequestListener.accept(it)
+    }
 
     private class TestVideoOutput constructor(
         streamState: StreamState,
@@ -512,11 +535,21 @@
         override fun getStreamInfo(): Observable<StreamInfo> = streamInfoObservable
 
         override fun getMediaSpec(): Observable<MediaSpec> = mediaSpecObservable
+    }
 
-        fun setStreamState(streamState: StreamState) =
-            streamInfoObservable.setState(StreamInfo.of(StreamInfo.STREAM_ID_ANY, streamState))
+    private fun addAndAttachUseCases(vararg useCases: UseCase) {
+        cameraUseCaseAdapter.addUseCases(useCases.asList())
+        cameraUseCaseAdapter.attachUseCases()
+    }
 
-        fun setMediaSpec(mediaSpec: MediaSpec) = mediaSpecObservable.setState(mediaSpec)
+    private fun detachAndRemoveUseCases(vararg useCases: UseCase) {
+        cameraUseCaseAdapter.detachUseCases()
+        cameraUseCaseAdapter.removeUseCases(useCases.asList())
+    }
+
+    private fun createCameraUseCaseAdapter() {
+        cameraUseCaseAdapter =
+            CameraUtil.createCameraUseCaseAdapter(context, CameraSelector.DEFAULT_BACK_CAMERA)
     }
 
     private fun setupCamera(
diff --git a/camera/camera-view/api/1.2.0-beta01.txt b/camera/camera-view/api/1.2.0-beta01.txt
new file mode 100644
index 0000000..d1d85ab
--- /dev/null
+++ b/camera/camera-view/api/1.2.0-beta01.txt
@@ -0,0 +1,119 @@
+// Signature format: 4.0
+package androidx.camera.view {
+
+  @RequiresApi(21) public abstract class CameraController {
+    method @MainThread public void clearImageAnalysisAnalyzer();
+    method @MainThread public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
+    method @MainThread public androidx.camera.core.CameraControl? getCameraControl();
+    method @MainThread public androidx.camera.core.CameraInfo? getCameraInfo();
+    method @MainThread public androidx.camera.core.CameraSelector getCameraSelector();
+    method @MainThread public java.util.concurrent.Executor? getImageAnalysisBackgroundExecutor();
+    method @MainThread public int getImageAnalysisBackpressureStrategy();
+    method @MainThread public int getImageAnalysisImageQueueDepth();
+    method @MainThread public androidx.camera.view.CameraController.OutputSize? getImageAnalysisTargetSize();
+    method @MainThread public int getImageCaptureFlashMode();
+    method @MainThread public java.util.concurrent.Executor? getImageCaptureIoExecutor();
+    method @MainThread public int getImageCaptureMode();
+    method @MainThread public androidx.camera.view.CameraController.OutputSize? getImageCaptureTargetSize();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> getInitializationFuture();
+    method @MainThread public androidx.camera.view.CameraController.OutputSize? getPreviewTargetSize();
+    method @MainThread public androidx.lifecycle.LiveData<java.lang.Integer!> getTapToFocusState();
+    method @MainThread public androidx.lifecycle.LiveData<java.lang.Integer!> getTorchState();
+    method @MainThread public androidx.lifecycle.LiveData<androidx.camera.core.ZoomState!> getZoomState();
+    method @MainThread public boolean hasCamera(androidx.camera.core.CameraSelector);
+    method @MainThread public boolean isImageAnalysisEnabled();
+    method @MainThread public boolean isImageCaptureEnabled();
+    method @MainThread public boolean isPinchToZoomEnabled();
+    method @MainThread public boolean isTapToFocusEnabled();
+    method @MainThread public void setCameraSelector(androidx.camera.core.CameraSelector);
+    method @MainThread public void setEnabledUseCases(int);
+    method @MainThread public void setImageAnalysisAnalyzer(java.util.concurrent.Executor, androidx.camera.core.ImageAnalysis.Analyzer);
+    method @MainThread public void setImageAnalysisBackgroundExecutor(java.util.concurrent.Executor?);
+    method @MainThread public void setImageAnalysisBackpressureStrategy(int);
+    method @MainThread public void setImageAnalysisImageQueueDepth(int);
+    method @MainThread public void setImageAnalysisTargetSize(androidx.camera.view.CameraController.OutputSize?);
+    method @MainThread public void setImageCaptureFlashMode(int);
+    method @MainThread public void setImageCaptureIoExecutor(java.util.concurrent.Executor?);
+    method @MainThread public void setImageCaptureMode(int);
+    method @MainThread public void setImageCaptureTargetSize(androidx.camera.view.CameraController.OutputSize?);
+    method @MainThread public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setLinearZoom(@FloatRange(from=0.0f, to=1.0f) float);
+    method @MainThread public void setPinchToZoomEnabled(boolean);
+    method @MainThread public void setPreviewTargetSize(androidx.camera.view.CameraController.OutputSize?);
+    method @MainThread public void setTapToFocusEnabled(boolean);
+    method @MainThread public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setZoomRatio(float);
+    method @MainThread public void takePicture(androidx.camera.core.ImageCapture.OutputFileOptions, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    method @MainThread public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
+    field public static final int COORDINATE_SYSTEM_VIEW_REFERENCED = 1; // 0x1
+    field public static final int IMAGE_ANALYSIS = 2; // 0x2
+    field public static final int IMAGE_CAPTURE = 1; // 0x1
+    field public static final int TAP_TO_FOCUS_FAILED = 4; // 0x4
+    field public static final int TAP_TO_FOCUS_FOCUSED = 2; // 0x2
+    field public static final int TAP_TO_FOCUS_NOT_FOCUSED = 3; // 0x3
+    field public static final int TAP_TO_FOCUS_NOT_STARTED = 0; // 0x0
+    field public static final int TAP_TO_FOCUS_STARTED = 1; // 0x1
+  }
+
+  @RequiresApi(21) public static final class CameraController.OutputSize {
+    ctor public CameraController.OutputSize(int);
+    ctor public CameraController.OutputSize(android.util.Size);
+    method public int getAspectRatio();
+    method public android.util.Size? getResolution();
+    field public static final int UNASSIGNED_ASPECT_RATIO = -1; // 0xffffffff
+  }
+
+  @RequiresApi(21) public final class LifecycleCameraController extends androidx.camera.view.CameraController {
+    ctor public LifecycleCameraController(android.content.Context);
+    method @MainThread public void bindToLifecycle(androidx.lifecycle.LifecycleOwner);
+    method @MainThread public void unbind();
+  }
+
+  @RequiresApi(21) public final class PreviewView extends android.widget.FrameLayout {
+    ctor @UiThread public PreviewView(android.content.Context);
+    ctor @UiThread public PreviewView(android.content.Context, android.util.AttributeSet?);
+    ctor @UiThread public PreviewView(android.content.Context, android.util.AttributeSet?, int);
+    ctor @UiThread public PreviewView(android.content.Context, android.util.AttributeSet?, int, int);
+    method @UiThread public android.graphics.Bitmap? getBitmap();
+    method @UiThread public androidx.camera.view.CameraController? getController();
+    method @UiThread public androidx.camera.view.PreviewView.ImplementationMode getImplementationMode();
+    method @UiThread public androidx.camera.core.MeteringPointFactory getMeteringPointFactory();
+    method public androidx.lifecycle.LiveData<androidx.camera.view.PreviewView.StreamState!> getPreviewStreamState();
+    method @UiThread public androidx.camera.view.PreviewView.ScaleType getScaleType();
+    method @UiThread public androidx.camera.core.Preview.SurfaceProvider getSurfaceProvider();
+    method @UiThread public androidx.camera.core.ViewPort? getViewPort();
+    method @UiThread public androidx.camera.core.ViewPort? getViewPort(int);
+    method @UiThread public void setController(androidx.camera.view.CameraController?);
+    method @UiThread public void setImplementationMode(androidx.camera.view.PreviewView.ImplementationMode);
+    method @UiThread public void setScaleType(androidx.camera.view.PreviewView.ScaleType);
+  }
+
+  @RequiresApi(21) public enum PreviewView.ImplementationMode {
+    enum_constant public static final androidx.camera.view.PreviewView.ImplementationMode COMPATIBLE;
+    enum_constant public static final androidx.camera.view.PreviewView.ImplementationMode PERFORMANCE;
+  }
+
+  @RequiresApi(21) public enum PreviewView.ScaleType {
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FILL_CENTER;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FILL_END;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FILL_START;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FIT_CENTER;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FIT_END;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FIT_START;
+  }
+
+  public enum PreviewView.StreamState {
+    enum_constant public static final androidx.camera.view.PreviewView.StreamState IDLE;
+    enum_constant public static final androidx.camera.view.PreviewView.StreamState STREAMING;
+  }
+
+  @RequiresApi(21) public final class RotationProvider {
+    ctor public RotationProvider(android.content.Context);
+    method @CheckResult public boolean addListener(java.util.concurrent.Executor, androidx.camera.view.RotationProvider.Listener);
+    method public void removeListener(androidx.camera.view.RotationProvider.Listener);
+  }
+
+  public static interface RotationProvider.Listener {
+    method public void onRotationChanged(int);
+  }
+
+}
+
diff --git a/camera/camera-view/api/public_plus_experimental_1.2.0-beta01.txt b/camera/camera-view/api/public_plus_experimental_1.2.0-beta01.txt
new file mode 100644
index 0000000..e27e9b7
--- /dev/null
+++ b/camera/camera-view/api/public_plus_experimental_1.2.0-beta01.txt
@@ -0,0 +1,204 @@
+// Signature format: 4.0
+package androidx.camera.view {
+
+  @RequiresApi(21) public abstract class CameraController {
+    method @MainThread public void clearImageAnalysisAnalyzer();
+    method @MainThread public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
+    method @MainThread public androidx.camera.core.CameraControl? getCameraControl();
+    method @MainThread public androidx.camera.core.CameraInfo? getCameraInfo();
+    method @MainThread public androidx.camera.core.CameraSelector getCameraSelector();
+    method @MainThread public java.util.concurrent.Executor? getImageAnalysisBackgroundExecutor();
+    method @MainThread public int getImageAnalysisBackpressureStrategy();
+    method @MainThread public int getImageAnalysisImageQueueDepth();
+    method @MainThread public androidx.camera.view.CameraController.OutputSize? getImageAnalysisTargetSize();
+    method @MainThread public int getImageCaptureFlashMode();
+    method @MainThread public java.util.concurrent.Executor? getImageCaptureIoExecutor();
+    method @MainThread public int getImageCaptureMode();
+    method @MainThread public androidx.camera.view.CameraController.OutputSize? getImageCaptureTargetSize();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> getInitializationFuture();
+    method @MainThread public androidx.camera.view.CameraController.OutputSize? getPreviewTargetSize();
+    method @MainThread public androidx.lifecycle.LiveData<java.lang.Integer!> getTapToFocusState();
+    method @MainThread public androidx.lifecycle.LiveData<java.lang.Integer!> getTorchState();
+    method @MainThread @androidx.camera.view.video.ExperimentalVideo public androidx.camera.view.CameraController.OutputSize? getVideoCaptureTargetSize();
+    method @MainThread public androidx.lifecycle.LiveData<androidx.camera.core.ZoomState!> getZoomState();
+    method @MainThread public boolean hasCamera(androidx.camera.core.CameraSelector);
+    method @MainThread public boolean isImageAnalysisEnabled();
+    method @MainThread public boolean isImageCaptureEnabled();
+    method @MainThread public boolean isPinchToZoomEnabled();
+    method @MainThread @androidx.camera.view.video.ExperimentalVideo public boolean isRecording();
+    method @MainThread public boolean isTapToFocusEnabled();
+    method @MainThread @androidx.camera.view.video.ExperimentalVideo public boolean isVideoCaptureEnabled();
+    method @MainThread public void setCameraSelector(androidx.camera.core.CameraSelector);
+    method @MainThread public void setEnabledUseCases(int);
+    method @MainThread public void setImageAnalysisAnalyzer(java.util.concurrent.Executor, androidx.camera.core.ImageAnalysis.Analyzer);
+    method @MainThread public void setImageAnalysisBackgroundExecutor(java.util.concurrent.Executor?);
+    method @MainThread public void setImageAnalysisBackpressureStrategy(int);
+    method @MainThread public void setImageAnalysisImageQueueDepth(int);
+    method @MainThread public void setImageAnalysisTargetSize(androidx.camera.view.CameraController.OutputSize?);
+    method @MainThread public void setImageCaptureFlashMode(int);
+    method @MainThread public void setImageCaptureIoExecutor(java.util.concurrent.Executor?);
+    method @MainThread public void setImageCaptureMode(int);
+    method @MainThread public void setImageCaptureTargetSize(androidx.camera.view.CameraController.OutputSize?);
+    method @MainThread public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setLinearZoom(@FloatRange(from=0.0f, to=1.0f) float);
+    method @MainThread public void setPinchToZoomEnabled(boolean);
+    method @MainThread public void setPreviewTargetSize(androidx.camera.view.CameraController.OutputSize?);
+    method @MainThread public void setTapToFocusEnabled(boolean);
+    method @MainThread @androidx.camera.view.video.ExperimentalVideo public void setVideoCaptureTargetSize(androidx.camera.view.CameraController.OutputSize?);
+    method @MainThread public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setZoomRatio(float);
+    method @MainThread @androidx.camera.view.video.ExperimentalVideo public void startRecording(androidx.camera.view.video.OutputFileOptions, java.util.concurrent.Executor, androidx.camera.view.video.OnVideoSavedCallback);
+    method @MainThread @androidx.camera.view.video.ExperimentalVideo public void stopRecording();
+    method @MainThread public void takePicture(androidx.camera.core.ImageCapture.OutputFileOptions, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    method @MainThread public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
+    field public static final int COORDINATE_SYSTEM_VIEW_REFERENCED = 1; // 0x1
+    field public static final int IMAGE_ANALYSIS = 2; // 0x2
+    field public static final int IMAGE_CAPTURE = 1; // 0x1
+    field public static final int TAP_TO_FOCUS_FAILED = 4; // 0x4
+    field public static final int TAP_TO_FOCUS_FOCUSED = 2; // 0x2
+    field public static final int TAP_TO_FOCUS_NOT_FOCUSED = 3; // 0x3
+    field public static final int TAP_TO_FOCUS_NOT_STARTED = 0; // 0x0
+    field public static final int TAP_TO_FOCUS_STARTED = 1; // 0x1
+    field @androidx.camera.view.video.ExperimentalVideo public static final int VIDEO_CAPTURE = 4; // 0x4
+  }
+
+  @RequiresApi(21) public static final class CameraController.OutputSize {
+    ctor public CameraController.OutputSize(int);
+    ctor public CameraController.OutputSize(android.util.Size);
+    method public int getAspectRatio();
+    method public android.util.Size? getResolution();
+    field public static final int UNASSIGNED_ASPECT_RATIO = -1; // 0xffffffff
+  }
+
+  @RequiresApi(21) public final class LifecycleCameraController extends androidx.camera.view.CameraController {
+    ctor public LifecycleCameraController(android.content.Context);
+    method @MainThread public void bindToLifecycle(androidx.lifecycle.LifecycleOwner);
+    method @MainThread public void unbind();
+  }
+
+  @RequiresApi(21) public final class PreviewView extends android.widget.FrameLayout {
+    ctor @UiThread public PreviewView(android.content.Context);
+    ctor @UiThread public PreviewView(android.content.Context, android.util.AttributeSet?);
+    ctor @UiThread public PreviewView(android.content.Context, android.util.AttributeSet?, int);
+    ctor @UiThread public PreviewView(android.content.Context, android.util.AttributeSet?, int, int);
+    method @UiThread public android.graphics.Bitmap? getBitmap();
+    method @UiThread public androidx.camera.view.CameraController? getController();
+    method @UiThread public androidx.camera.view.PreviewView.ImplementationMode getImplementationMode();
+    method @UiThread public androidx.camera.core.MeteringPointFactory getMeteringPointFactory();
+    method public androidx.camera.view.transform.OutputTransform? getOutputTransform();
+    method public androidx.lifecycle.LiveData<androidx.camera.view.PreviewView.StreamState!> getPreviewStreamState();
+    method @UiThread public androidx.camera.view.PreviewView.ScaleType getScaleType();
+    method @UiThread public androidx.camera.core.Preview.SurfaceProvider getSurfaceProvider();
+    method @UiThread public androidx.camera.core.ViewPort? getViewPort();
+    method @UiThread public androidx.camera.core.ViewPort? getViewPort(int);
+    method @UiThread public void setController(androidx.camera.view.CameraController?);
+    method @UiThread public void setImplementationMode(androidx.camera.view.PreviewView.ImplementationMode);
+    method @UiThread public void setScaleType(androidx.camera.view.PreviewView.ScaleType);
+  }
+
+  @RequiresApi(21) public enum PreviewView.ImplementationMode {
+    enum_constant public static final androidx.camera.view.PreviewView.ImplementationMode COMPATIBLE;
+    enum_constant public static final androidx.camera.view.PreviewView.ImplementationMode PERFORMANCE;
+  }
+
+  @RequiresApi(21) public enum PreviewView.ScaleType {
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FILL_CENTER;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FILL_END;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FILL_START;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FIT_CENTER;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FIT_END;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FIT_START;
+  }
+
+  public enum PreviewView.StreamState {
+    enum_constant public static final androidx.camera.view.PreviewView.StreamState IDLE;
+    enum_constant public static final androidx.camera.view.PreviewView.StreamState STREAMING;
+  }
+
+  @RequiresApi(21) public final class RotationProvider {
+    ctor public RotationProvider(android.content.Context);
+    method @CheckResult public boolean addListener(java.util.concurrent.Executor, androidx.camera.view.RotationProvider.Listener);
+    method public void removeListener(androidx.camera.view.RotationProvider.Listener);
+  }
+
+  public static interface RotationProvider.Listener {
+    method public void onRotationChanged(int);
+  }
+
+}
+
+package androidx.camera.view.transform {
+
+  @RequiresApi(21) public final class CoordinateTransform {
+    ctor public CoordinateTransform(androidx.camera.view.transform.OutputTransform, androidx.camera.view.transform.OutputTransform);
+    method public void mapPoint(android.graphics.PointF);
+    method public void mapPoints(float[]);
+    method public void mapRect(android.graphics.RectF);
+    method public void transform(android.graphics.Matrix);
+  }
+
+  @RequiresApi(21) public final class FileTransformFactory {
+    ctor public FileTransformFactory();
+    method public androidx.camera.view.transform.OutputTransform getOutputTransform(android.content.ContentResolver, android.net.Uri) throws java.io.IOException;
+    method public androidx.camera.view.transform.OutputTransform getOutputTransform(java.io.File) throws java.io.IOException;
+    method public androidx.camera.view.transform.OutputTransform getOutputTransform(java.io.InputStream) throws java.io.IOException;
+    method public boolean isUsingExifOrientation();
+    method public void setUsingExifOrientation(boolean);
+  }
+
+  @RequiresApi(21) public final class ImageProxyTransformFactory {
+    ctor public ImageProxyTransformFactory();
+    method public androidx.camera.view.transform.OutputTransform getOutputTransform(androidx.camera.core.ImageProxy);
+    method public boolean isUsingCropRect();
+    method public boolean isUsingRotationDegrees();
+    method public void setUsingCropRect(boolean);
+    method public void setUsingRotationDegrees(boolean);
+  }
+
+  @RequiresApi(21) public final class OutputTransform {
+  }
+
+}
+
+package androidx.camera.view.video {
+
+  @RequiresOptIn @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ExperimentalVideo {
+  }
+
+  @RequiresApi(21) @androidx.camera.view.video.ExperimentalVideo @com.google.auto.value.AutoValue public abstract class Metadata {
+    method public static androidx.camera.view.video.Metadata.Builder builder();
+    method public abstract android.location.Location? getLocation();
+  }
+
+  @com.google.auto.value.AutoValue.Builder public abstract static class Metadata.Builder {
+    method public abstract androidx.camera.view.video.Metadata build();
+    method public abstract androidx.camera.view.video.Metadata.Builder setLocation(android.location.Location?);
+  }
+
+  @RequiresApi(21) @androidx.camera.view.video.ExperimentalVideo public interface OnVideoSavedCallback {
+    method public void onError(int, String, Throwable?);
+    method public void onVideoSaved(androidx.camera.view.video.OutputFileResults);
+    field public static final int ERROR_ENCODER = 1; // 0x1
+    field public static final int ERROR_FILE_IO = 4; // 0x4
+    field public static final int ERROR_INVALID_CAMERA = 5; // 0x5
+    field public static final int ERROR_MUXER = 2; // 0x2
+    field public static final int ERROR_RECORDING_IN_PROGRESS = 3; // 0x3
+    field public static final int ERROR_UNKNOWN = 0; // 0x0
+  }
+
+  @RequiresApi(21) @androidx.camera.view.video.ExperimentalVideo @com.google.auto.value.AutoValue public abstract class OutputFileOptions {
+    method public static androidx.camera.view.video.OutputFileOptions.Builder builder(java.io.File);
+    method public static androidx.camera.view.video.OutputFileOptions.Builder builder(android.os.ParcelFileDescriptor);
+    method public static androidx.camera.view.video.OutputFileOptions.Builder builder(android.content.ContentResolver, android.net.Uri, android.content.ContentValues);
+    method public abstract androidx.camera.view.video.Metadata getMetadata();
+  }
+
+  @com.google.auto.value.AutoValue.Builder public abstract static class OutputFileOptions.Builder {
+    method public abstract androidx.camera.view.video.OutputFileOptions build();
+    method public abstract androidx.camera.view.video.OutputFileOptions.Builder setMetadata(androidx.camera.view.video.Metadata);
+  }
+
+  @RequiresApi(21) @androidx.camera.view.video.ExperimentalVideo @com.google.auto.value.AutoValue public abstract class OutputFileResults {
+    method public abstract android.net.Uri? getSavedUri();
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/camera/camera-view/api/res-1.2.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to camera/camera-view/api/res-1.2.0-beta01.txt
diff --git a/camera/camera-view/api/restricted_1.2.0-beta01.txt b/camera/camera-view/api/restricted_1.2.0-beta01.txt
new file mode 100644
index 0000000..d1d85ab
--- /dev/null
+++ b/camera/camera-view/api/restricted_1.2.0-beta01.txt
@@ -0,0 +1,119 @@
+// Signature format: 4.0
+package androidx.camera.view {
+
+  @RequiresApi(21) public abstract class CameraController {
+    method @MainThread public void clearImageAnalysisAnalyzer();
+    method @MainThread public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
+    method @MainThread public androidx.camera.core.CameraControl? getCameraControl();
+    method @MainThread public androidx.camera.core.CameraInfo? getCameraInfo();
+    method @MainThread public androidx.camera.core.CameraSelector getCameraSelector();
+    method @MainThread public java.util.concurrent.Executor? getImageAnalysisBackgroundExecutor();
+    method @MainThread public int getImageAnalysisBackpressureStrategy();
+    method @MainThread public int getImageAnalysisImageQueueDepth();
+    method @MainThread public androidx.camera.view.CameraController.OutputSize? getImageAnalysisTargetSize();
+    method @MainThread public int getImageCaptureFlashMode();
+    method @MainThread public java.util.concurrent.Executor? getImageCaptureIoExecutor();
+    method @MainThread public int getImageCaptureMode();
+    method @MainThread public androidx.camera.view.CameraController.OutputSize? getImageCaptureTargetSize();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> getInitializationFuture();
+    method @MainThread public androidx.camera.view.CameraController.OutputSize? getPreviewTargetSize();
+    method @MainThread public androidx.lifecycle.LiveData<java.lang.Integer!> getTapToFocusState();
+    method @MainThread public androidx.lifecycle.LiveData<java.lang.Integer!> getTorchState();
+    method @MainThread public androidx.lifecycle.LiveData<androidx.camera.core.ZoomState!> getZoomState();
+    method @MainThread public boolean hasCamera(androidx.camera.core.CameraSelector);
+    method @MainThread public boolean isImageAnalysisEnabled();
+    method @MainThread public boolean isImageCaptureEnabled();
+    method @MainThread public boolean isPinchToZoomEnabled();
+    method @MainThread public boolean isTapToFocusEnabled();
+    method @MainThread public void setCameraSelector(androidx.camera.core.CameraSelector);
+    method @MainThread public void setEnabledUseCases(int);
+    method @MainThread public void setImageAnalysisAnalyzer(java.util.concurrent.Executor, androidx.camera.core.ImageAnalysis.Analyzer);
+    method @MainThread public void setImageAnalysisBackgroundExecutor(java.util.concurrent.Executor?);
+    method @MainThread public void setImageAnalysisBackpressureStrategy(int);
+    method @MainThread public void setImageAnalysisImageQueueDepth(int);
+    method @MainThread public void setImageAnalysisTargetSize(androidx.camera.view.CameraController.OutputSize?);
+    method @MainThread public void setImageCaptureFlashMode(int);
+    method @MainThread public void setImageCaptureIoExecutor(java.util.concurrent.Executor?);
+    method @MainThread public void setImageCaptureMode(int);
+    method @MainThread public void setImageCaptureTargetSize(androidx.camera.view.CameraController.OutputSize?);
+    method @MainThread public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setLinearZoom(@FloatRange(from=0.0f, to=1.0f) float);
+    method @MainThread public void setPinchToZoomEnabled(boolean);
+    method @MainThread public void setPreviewTargetSize(androidx.camera.view.CameraController.OutputSize?);
+    method @MainThread public void setTapToFocusEnabled(boolean);
+    method @MainThread public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setZoomRatio(float);
+    method @MainThread public void takePicture(androidx.camera.core.ImageCapture.OutputFileOptions, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    method @MainThread public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
+    field public static final int COORDINATE_SYSTEM_VIEW_REFERENCED = 1; // 0x1
+    field public static final int IMAGE_ANALYSIS = 2; // 0x2
+    field public static final int IMAGE_CAPTURE = 1; // 0x1
+    field public static final int TAP_TO_FOCUS_FAILED = 4; // 0x4
+    field public static final int TAP_TO_FOCUS_FOCUSED = 2; // 0x2
+    field public static final int TAP_TO_FOCUS_NOT_FOCUSED = 3; // 0x3
+    field public static final int TAP_TO_FOCUS_NOT_STARTED = 0; // 0x0
+    field public static final int TAP_TO_FOCUS_STARTED = 1; // 0x1
+  }
+
+  @RequiresApi(21) public static final class CameraController.OutputSize {
+    ctor public CameraController.OutputSize(int);
+    ctor public CameraController.OutputSize(android.util.Size);
+    method public int getAspectRatio();
+    method public android.util.Size? getResolution();
+    field public static final int UNASSIGNED_ASPECT_RATIO = -1; // 0xffffffff
+  }
+
+  @RequiresApi(21) public final class LifecycleCameraController extends androidx.camera.view.CameraController {
+    ctor public LifecycleCameraController(android.content.Context);
+    method @MainThread public void bindToLifecycle(androidx.lifecycle.LifecycleOwner);
+    method @MainThread public void unbind();
+  }
+
+  @RequiresApi(21) public final class PreviewView extends android.widget.FrameLayout {
+    ctor @UiThread public PreviewView(android.content.Context);
+    ctor @UiThread public PreviewView(android.content.Context, android.util.AttributeSet?);
+    ctor @UiThread public PreviewView(android.content.Context, android.util.AttributeSet?, int);
+    ctor @UiThread public PreviewView(android.content.Context, android.util.AttributeSet?, int, int);
+    method @UiThread public android.graphics.Bitmap? getBitmap();
+    method @UiThread public androidx.camera.view.CameraController? getController();
+    method @UiThread public androidx.camera.view.PreviewView.ImplementationMode getImplementationMode();
+    method @UiThread public androidx.camera.core.MeteringPointFactory getMeteringPointFactory();
+    method public androidx.lifecycle.LiveData<androidx.camera.view.PreviewView.StreamState!> getPreviewStreamState();
+    method @UiThread public androidx.camera.view.PreviewView.ScaleType getScaleType();
+    method @UiThread public androidx.camera.core.Preview.SurfaceProvider getSurfaceProvider();
+    method @UiThread public androidx.camera.core.ViewPort? getViewPort();
+    method @UiThread public androidx.camera.core.ViewPort? getViewPort(int);
+    method @UiThread public void setController(androidx.camera.view.CameraController?);
+    method @UiThread public void setImplementationMode(androidx.camera.view.PreviewView.ImplementationMode);
+    method @UiThread public void setScaleType(androidx.camera.view.PreviewView.ScaleType);
+  }
+
+  @RequiresApi(21) public enum PreviewView.ImplementationMode {
+    enum_constant public static final androidx.camera.view.PreviewView.ImplementationMode COMPATIBLE;
+    enum_constant public static final androidx.camera.view.PreviewView.ImplementationMode PERFORMANCE;
+  }
+
+  @RequiresApi(21) public enum PreviewView.ScaleType {
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FILL_CENTER;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FILL_END;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FILL_START;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FIT_CENTER;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FIT_END;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FIT_START;
+  }
+
+  public enum PreviewView.StreamState {
+    enum_constant public static final androidx.camera.view.PreviewView.StreamState IDLE;
+    enum_constant public static final androidx.camera.view.PreviewView.StreamState STREAMING;
+  }
+
+  @RequiresApi(21) public final class RotationProvider {
+    ctor public RotationProvider(android.content.Context);
+    method @CheckResult public boolean addListener(java.util.concurrent.Executor, androidx.camera.view.RotationProvider.Listener);
+    method public void removeListener(androidx.camera.view.RotationProvider.Listener);
+  }
+
+  public static interface RotationProvider.Listener {
+    method public void onRotationChanged(int);
+  }
+
+}
+
diff --git a/camera/camera-view/build.gradle b/camera/camera-view/build.gradle
index 4339da8..91f57d3 100644
--- a/camera/camera-view/build.gradle
+++ b/camera/camera-view/build.gradle
@@ -51,7 +51,6 @@
 
     androidTestImplementation(libs.multidex)
     androidTestImplementation(libs.mockitoCore)
-    androidTestImplementation(libs.espressoCore)
     androidTestImplementation(libs.testExtJunit)
     androidTestImplementation(libs.testCore)
     androidTestImplementation(libs.testRunner)
@@ -63,6 +62,7 @@
     androidTestImplementation(project(":camera:camera-testing"))
     androidTestImplementation(libs.mockitoCore, excludes.bytebuddy) // DexMaker has it's own MockMaker
     androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation("androidx.test.espresso:espresso-core:3.3.0")
 }
 android {
     defaultConfig {
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewDeviceTest.kt b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewDeviceTest.kt
index 0202c5a..f6d2675 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewDeviceTest.kt
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewDeviceTest.kt
@@ -24,11 +24,14 @@
 import android.util.Size
 import android.view.Display
 import android.view.LayoutInflater
+import android.view.MotionEvent
 import android.view.Surface
 import android.view.SurfaceView
 import android.view.TextureView
 import android.view.View
+import android.view.ViewConfiguration
 import android.widget.FrameLayout
+import androidx.annotation.GuardedBy
 import androidx.camera.camera2.Camera2Config
 import androidx.camera.core.Camera
 import androidx.camera.core.CameraInfo
@@ -53,6 +56,7 @@
 import androidx.camera.testing.fakes.FakeCameraInfoInternal
 import androidx.camera.view.PreviewView.ImplementationMode
 import androidx.camera.view.internal.compat.quirk.DeviceQuirks
+import androidx.camera.view.internal.compat.quirk.SurfaceViewNotCroppedByParentQuirk
 import androidx.camera.view.internal.compat.quirk.SurfaceViewStretchedQuirk
 import androidx.camera.view.test.R
 import androidx.core.content.ContextCompat
@@ -72,6 +76,8 @@
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.ExecutionException
 import java.util.concurrent.Executor
+import java.util.concurrent.ExecutorService
+import java.util.concurrent.Executors
 import java.util.concurrent.Semaphore
 import java.util.concurrent.TimeUnit
 import java.util.concurrent.TimeoutException
@@ -274,8 +280,13 @@
                 return null
             }
         }
+
+        var clickEventHelper: ClickEventHelper? = null
+
         instrumentation.runOnMainSync {
             val previewView = PreviewView(context)
+            clickEventHelper = ClickEventHelper(previewView)
+            previewView.setOnTouchListener(clickEventHelper)
             previewView.controller = fakeController
             notifyLatchWhenLayoutReady(previewView, countDownLatch)
             setContentView(previewView)
@@ -284,10 +295,110 @@
         Truth.assertThat(countDownLatch.await(TIMEOUT_SECONDS.toLong(), TimeUnit.SECONDS)).isTrue()
 
         // Act: click on PreviewView
-        uiDevice.findObject(UiSelector().index(0)).click()
+        clickEventHelper!!.performSingleClick(uiDevice, 3)
 
         // Assert: tap-to-focus is invoked.
-        Truth.assertThat(semaphore.tryAcquire(TIMEOUT_SECONDS.toLong(), TimeUnit.SECONDS)).isTrue()
+        Truth.assertThat(semaphore.tryAcquire(TIMEOUT_SECONDS.toLong(), TimeUnit.SECONDS))
+            .isTrue()
+    }
+
+    /**
+     * A helper to perform single click
+     *
+     * Some devices might have incorrect [MotionEvent#getEventTime()] and
+     * [MotionEvent#getDownTime()] info when issuing click event via UiDevice in the first time.
+     * The system time only occupies around 100ms but the event time difference is around 1000ms
+     * and then the click event is incorrectly recognized as long-click. The issue is caused by RPC
+     * operation handling timing issue. The issue causes [PreviewView] to ignore the click
+     * operation and then onTapToFocus event can't be received. The issue might be recovered in the
+     * new UiDevice click actions.
+     *
+     * This helper will help to perform the click operation and monitor the motion events to retry
+     * if a long click result is detected.
+     */
+    private class ClickEventHelper constructor(private val targetView: View) :
+        View.OnTouchListener {
+        private val lock = Any()
+        @GuardedBy("lock")
+        private var isPerformingClick = false
+        private var uiDevice: UiDevice? = null
+        private var limitedRetryCount = 0
+        private var retriedCounter = 0
+        private var executor: ExecutorService? = null
+
+        override fun onTouch(view: View, event: MotionEvent): Boolean {
+            if (view != targetView) {
+                return false
+            }
+
+            if (event.action == MotionEvent.ACTION_UP) {
+                val longPressTimeout = ViewConfiguration.getLongPressTimeout()
+
+                // Retries the click action if the UP event forms a incorrect long click operation
+                // and retry counter is still under the limited retry count.
+                if (event.eventTime - event.downTime > longPressTimeout &&
+                    retriedCounter < limitedRetryCount
+                ) {
+                    retriedCounter++
+                    performSingleClickInternal()
+                    return false
+                }
+
+                // Resets member variables if incorrect long click operation is not detected or
+                // retry is not allowed any more.
+                uiDevice = null
+                limitedRetryCount = 0
+                retriedCounter = 0
+                executor?.shutdown()
+                synchronized(lock) {
+                    isPerformingClick = false
+                }
+            }
+
+            return false
+        }
+
+        /**
+         * Perform single click action with UiDevice and will retry with the specified count when
+         * incorrect long click operation is detected.
+         *
+         * New single click request will be ignored if the previous request is still performing.
+         */
+        fun performSingleClick(uiDevice: UiDevice, retryCount: Int = 0) {
+            synchronized(lock) {
+                if (isPerformingClick) {
+                    return
+                } else {
+                    isPerformingClick = true
+                }
+            }
+
+            executor = Executors.newSingleThreadExecutor()
+            limitedRetryCount = retryCount
+            retriedCounter = 0
+            this.uiDevice = uiDevice
+            performSingleClickInternal()
+        }
+
+        private fun performSingleClickInternal() {
+            executor!!.execute {
+                var needClearContentDescription = false
+                val originalContentDescription = targetView.contentDescription
+
+                if (originalContentDescription == null || originalContentDescription.isEmpty()) {
+                    needClearContentDescription = true
+                    targetView.contentDescription = targetView.hashCode().toString()
+                }
+
+                uiDevice!!.findObject(
+                    UiSelector().descriptionContains(targetView.contentDescription.toString())
+                ).click()
+
+                if (needClearContentDescription) {
+                    targetView.contentDescription = originalContentDescription
+                }
+            }
+        }
     }
 
     @Test
@@ -398,6 +509,11 @@
         Assume.assumeTrue(Build.VERSION.SDK_INT > 24)
         Assume.assumeTrue(
             DeviceQuirks.get(
+                SurfaceViewNotCroppedByParentQuirk::class.java
+            ) == null
+        )
+        Assume.assumeTrue(
+            DeviceQuirks.get(
                 SurfaceViewStretchedQuirk::class.java
             ) == null
         )
diff --git a/camera/camera-viewfinder/api/1.2.0-beta01.txt b/camera/camera-viewfinder/api/1.2.0-beta01.txt
new file mode 100644
index 0000000..d452929
--- /dev/null
+++ b/camera/camera-viewfinder/api/1.2.0-beta01.txt
@@ -0,0 +1,41 @@
+// Signature format: 4.0
+package androidx.camera.viewfinder {
+
+  @RequiresApi(21) public final class CameraViewfinder extends android.widget.FrameLayout {
+    ctor @UiThread public CameraViewfinder(android.content.Context);
+    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?);
+    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?, int);
+    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?, int, int);
+    method @UiThread public android.graphics.Bitmap? getBitmap();
+    method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ImplementationMode getImplementationMode();
+    method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ScaleType getScaleType();
+    method @UiThread public com.google.common.util.concurrent.ListenableFuture<android.view.Surface!> requestSurfaceAsync(androidx.camera.viewfinder.ViewfinderSurfaceRequest);
+    method @UiThread public void setImplementationMode(androidx.camera.viewfinder.CameraViewfinder.ImplementationMode);
+    method @UiThread public void setScaleType(androidx.camera.viewfinder.CameraViewfinder.ScaleType);
+  }
+
+  @RequiresApi(21) public enum CameraViewfinder.ImplementationMode {
+    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ImplementationMode COMPATIBLE;
+    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ImplementationMode PERFORMANCE;
+  }
+
+  @RequiresApi(21) public enum CameraViewfinder.ScaleType {
+    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_CENTER;
+    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_END;
+    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_START;
+    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_CENTER;
+    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_END;
+    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_START;
+  }
+
+  @RequiresApi(21) public class ViewfinderSurfaceRequest {
+    ctor public ViewfinderSurfaceRequest(android.util.Size, android.hardware.camera2.CameraCharacteristics);
+    method public android.util.Size getResolution();
+    method public int getSensorOrientation();
+    method public boolean isFrontCamera();
+    method public boolean isLegacyDevice();
+    method public void markSurfaceSafeToRelease();
+  }
+
+}
+
diff --git a/camera/camera-viewfinder/api/public_plus_experimental_1.2.0-beta01.txt b/camera/camera-viewfinder/api/public_plus_experimental_1.2.0-beta01.txt
new file mode 100644
index 0000000..d452929
--- /dev/null
+++ b/camera/camera-viewfinder/api/public_plus_experimental_1.2.0-beta01.txt
@@ -0,0 +1,41 @@
+// Signature format: 4.0
+package androidx.camera.viewfinder {
+
+  @RequiresApi(21) public final class CameraViewfinder extends android.widget.FrameLayout {
+    ctor @UiThread public CameraViewfinder(android.content.Context);
+    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?);
+    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?, int);
+    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?, int, int);
+    method @UiThread public android.graphics.Bitmap? getBitmap();
+    method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ImplementationMode getImplementationMode();
+    method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ScaleType getScaleType();
+    method @UiThread public com.google.common.util.concurrent.ListenableFuture<android.view.Surface!> requestSurfaceAsync(androidx.camera.viewfinder.ViewfinderSurfaceRequest);
+    method @UiThread public void setImplementationMode(androidx.camera.viewfinder.CameraViewfinder.ImplementationMode);
+    method @UiThread public void setScaleType(androidx.camera.viewfinder.CameraViewfinder.ScaleType);
+  }
+
+  @RequiresApi(21) public enum CameraViewfinder.ImplementationMode {
+    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ImplementationMode COMPATIBLE;
+    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ImplementationMode PERFORMANCE;
+  }
+
+  @RequiresApi(21) public enum CameraViewfinder.ScaleType {
+    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_CENTER;
+    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_END;
+    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_START;
+    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_CENTER;
+    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_END;
+    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_START;
+  }
+
+  @RequiresApi(21) public class ViewfinderSurfaceRequest {
+    ctor public ViewfinderSurfaceRequest(android.util.Size, android.hardware.camera2.CameraCharacteristics);
+    method public android.util.Size getResolution();
+    method public int getSensorOrientation();
+    method public boolean isFrontCamera();
+    method public boolean isLegacyDevice();
+    method public void markSurfaceSafeToRelease();
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/camera/camera-viewfinder/api/res-1.2.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to camera/camera-viewfinder/api/res-1.2.0-beta01.txt
diff --git a/camera/camera-viewfinder/api/restricted_1.2.0-beta01.txt b/camera/camera-viewfinder/api/restricted_1.2.0-beta01.txt
new file mode 100644
index 0000000..d452929
--- /dev/null
+++ b/camera/camera-viewfinder/api/restricted_1.2.0-beta01.txt
@@ -0,0 +1,41 @@
+// Signature format: 4.0
+package androidx.camera.viewfinder {
+
+  @RequiresApi(21) public final class CameraViewfinder extends android.widget.FrameLayout {
+    ctor @UiThread public CameraViewfinder(android.content.Context);
+    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?);
+    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?, int);
+    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?, int, int);
+    method @UiThread public android.graphics.Bitmap? getBitmap();
+    method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ImplementationMode getImplementationMode();
+    method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ScaleType getScaleType();
+    method @UiThread public com.google.common.util.concurrent.ListenableFuture<android.view.Surface!> requestSurfaceAsync(androidx.camera.viewfinder.ViewfinderSurfaceRequest);
+    method @UiThread public void setImplementationMode(androidx.camera.viewfinder.CameraViewfinder.ImplementationMode);
+    method @UiThread public void setScaleType(androidx.camera.viewfinder.CameraViewfinder.ScaleType);
+  }
+
+  @RequiresApi(21) public enum CameraViewfinder.ImplementationMode {
+    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ImplementationMode COMPATIBLE;
+    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ImplementationMode PERFORMANCE;
+  }
+
+  @RequiresApi(21) public enum CameraViewfinder.ScaleType {
+    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_CENTER;
+    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_END;
+    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_START;
+    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_CENTER;
+    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_END;
+    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_START;
+  }
+
+  @RequiresApi(21) public class ViewfinderSurfaceRequest {
+    ctor public ViewfinderSurfaceRequest(android.util.Size, android.hardware.camera2.CameraCharacteristics);
+    method public android.util.Size getResolution();
+    method public int getSensorOrientation();
+    method public boolean isFrontCamera();
+    method public boolean isLegacyDevice();
+    method public void markSurfaceSafeToRelease();
+  }
+
+}
+
diff --git a/camera/integration-tests/avsynctestapp/src/androidTest/java/androidx/camera/integration/avsync/SignalGeneratorViewModelTest.kt b/camera/integration-tests/avsynctestapp/src/androidTest/java/androidx/camera/integration/avsync/SignalGeneratorViewModelTest.kt
index e8e4933..88847c4 100644
--- a/camera/integration-tests/avsynctestapp/src/androidTest/java/androidx/camera/integration/avsync/SignalGeneratorViewModelTest.kt
+++ b/camera/integration-tests/avsynctestapp/src/androidTest/java/androidx/camera/integration/avsync/SignalGeneratorViewModelTest.kt
@@ -49,10 +49,7 @@
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.TimeUnit
 import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.runBlocking
-import kotlinx.coroutines.test.advanceUntilIdle
-import kotlinx.coroutines.test.runTest
 import kotlinx.coroutines.withContext
 import org.junit.After
 import org.junit.Assume
@@ -89,9 +86,8 @@
         android.Manifest.permission.RECORD_AUDIO
     )
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Before
-    fun setUp() = runTest {
+    fun setUp(): Unit = runBlocking {
         // Skip for b/168175357, b/233661493
         Assume.assumeFalse(
             "Skip tests for Cuttlefish MediaCodec issues",
@@ -123,21 +119,17 @@
         CameraXUtil.shutdown()[10, TimeUnit.SECONDS]
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
-    fun initialRecorder_canMakeRecorderReady() = runTest {
+    fun initialRecorder_canMakeRecorderReady(): Unit = runBlocking {
         viewModel.initialRecorder(context, lifecycleOwner)
-        advanceUntilIdle()
 
         assertThat(viewModel.isRecorderReady).isTrue()
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
-    fun initialSignalGenerator_canMakeGeneratorReady() = runTest {
+    fun initialSignalGenerator_canMakeGeneratorReady(): Unit = runBlocking {
         val beepFrequency = 1500
         viewModel.initialSignalGenerator(context, beepFrequency)
-        advanceUntilIdle()
 
         assertThat(viewModel.isGeneratorReady).isTrue()
     }
@@ -173,12 +165,10 @@
         assertThat(latch.count).isNotEqualTo(0)
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
-    fun startAndStopRecording_canWorkCorrectlyAfterRecorderReady() = runTest {
+    fun startAndStopRecording_canWorkCorrectlyAfterRecorderReady(): Unit = runBlocking {
         // Arrange.
         viewModel.initialRecorder(context, lifecycleOwner)
-        advanceUntilIdle()
 
         assertThat(viewModel.isRecorderReady).isTrue()
 
diff --git a/camera/integration-tests/avsynctestapp/src/androidTest/java/androidx/camera/integration/avsync/model/AudioGeneratorDeviceTest.kt b/camera/integration-tests/avsynctestapp/src/androidTest/java/androidx/camera/integration/avsync/model/AudioGeneratorDeviceTest.kt
index 6f91eca..8e2b047 100644
--- a/camera/integration-tests/avsynctestapp/src/androidTest/java/androidx/camera/integration/avsync/model/AudioGeneratorDeviceTest.kt
+++ b/camera/integration-tests/avsynctestapp/src/androidTest/java/androidx/camera/integration/avsync/model/AudioGeneratorDeviceTest.kt
@@ -22,15 +22,12 @@
 import androidx.test.filters.LargeTest
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.runBlocking
-import kotlinx.coroutines.test.runTest
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 
-@OptIn(ExperimentalCoroutinesApi::class)
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class AudioGeneratorDeviceTest {
@@ -44,22 +41,22 @@
     }
 
     @Test(expected = IllegalArgumentException::class)
-    fun initAudioTrack_throwExceptionWhenFrequencyNegative() = runTest {
+    fun initAudioTrack_throwExceptionWhenFrequencyNegative(): Unit = runBlocking {
         audioGenerator.initAudioTrack(context, -5300, 11.0)
     }
 
     @Test(expected = IllegalArgumentException::class)
-    fun initAudioTrack_throwExceptionWhenLengthNegative() = runTest {
+    fun initAudioTrack_throwExceptionWhenLengthNegative(): Unit = runBlocking {
         audioGenerator.initAudioTrack(context, 5300, -11.0)
     }
 
     @Test
-    fun initAudioTrack_canWorkCorrectly() = runTest {
+    fun initAudioTrack_canWorkCorrectly(): Unit = runBlocking {
         initialAudioTrack(5300, 11.0)
     }
 
     @Test
-    fun canStartAndStopAudioTrack_withoutExceptionAfterInitialized() = runBlocking {
+    fun canStartAndStopAudioTrack_withoutExceptionAfterInitialized(): Unit = runBlocking {
         // Arrange.
         initialAudioTrack(5300, 11.0)
 
diff --git a/camera/integration-tests/coretestapp/build.gradle b/camera/integration-tests/coretestapp/build.gradle
index 3b85cb8..ca2fe62 100644
--- a/camera/integration-tests/coretestapp/build.gradle
+++ b/camera/integration-tests/coretestapp/build.gradle
@@ -89,7 +89,6 @@
     androidTestImplementation(libs.testRules)
     androidTestImplementation(libs.testRunner)
     androidTestImplementation(libs.testUiautomator)
-    androidTestImplementation(libs.espressoCore)
     androidTestImplementation(libs.espressoIdlingResource)
     androidTestImplementation(libs.kotlinStdlib)
     androidTestImplementation(libs.kotlinCoroutinesAndroid)
@@ -101,6 +100,7 @@
     androidTestImplementation(project(":concurrent:concurrent-futures-ktx"))
     androidTestImplementation(project(":internal-testutils-runtime"))
     androidTestImplementation("androidx.lifecycle:lifecycle-runtime-testing:2.3.1")
+    androidTestImplementation("androidx.test.espresso:espresso-core:3.3.0")
 
     testImplementation(libs.junit)
     testImplementation(libs.truth)
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/camera2/SurfaceOrientedMeteringPointFactoryTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/camera2/SurfaceOrientedMeteringPointFactoryTest.kt
new file mode 100644
index 0000000..2b7b471
--- /dev/null
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/camera2/SurfaceOrientedMeteringPointFactoryTest.kt
@@ -0,0 +1,160 @@
+/*
+ * 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.integration.core.camera2
+
+import android.content.Context
+import android.util.Rational
+import androidx.camera.camera2.Camera2Config
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig
+import androidx.camera.core.AspectRatio
+import androidx.camera.core.CameraSelector
+import androidx.camera.core.CameraXConfig
+import androidx.camera.core.ImageAnalysis
+import androidx.camera.core.MeteringPointFactory
+import androidx.camera.core.SurfaceOrientedMeteringPointFactory
+import androidx.camera.testing.CameraUtil
+import androidx.camera.testing.CameraXUtil
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
+import androidx.test.platform.app.InstrumentationRegistry
+import com.google.common.truth.Truth
+import java.util.concurrent.TimeUnit
+import org.junit.After
+import org.junit.Assume
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@LargeTest
+@RunWith(Parameterized::class)
+@SdkSuppress(minSdkVersion = 21)
+class SurfaceOrientedMeteringPointFactoryTest(
+    private val implName: String,
+    private val cameraConfig: CameraXConfig
+) {
+    var pointFactory: SurfaceOrientedMeteringPointFactory? = null
+    private var context: Context? = null
+    @Before
+    fun setUp() {
+        context = ApplicationProvider.getApplicationContext()
+        CameraXUtil.initialize(context!!, cameraConfig)
+        pointFactory = SurfaceOrientedMeteringPointFactory(WIDTH, HEIGHT)
+    }
+
+    @After
+    fun tearDown() {
+        CameraXUtil.shutdown()[10000, TimeUnit.MILLISECONDS]
+    }
+
+    @Test
+    fun defaultAreaSize() {
+        val point = pointFactory!!.createPoint(0f, 0f)
+        Truth.assertThat(point.size).isEqualTo(MeteringPointFactory.getDefaultPointSize())
+        Truth.assertThat(point.surfaceAspectRatio).isNull()
+    }
+
+    @Test
+    fun createPointWithValidAreaSize() {
+        val areaSize = 0.2f
+        val point = pointFactory!!.createPoint(0f, 0f, areaSize)
+        Truth.assertThat(point.size).isEqualTo(areaSize)
+        Truth.assertThat(point.surfaceAspectRatio).isNull()
+    }
+
+    @Test
+    fun createPointLeftTop_correctValueSet() {
+        val meteringPoint = pointFactory!!.createPoint(0f, 0f)
+        Truth.assertThat(meteringPoint.x).isEqualTo(0f)
+        Truth.assertThat(meteringPoint.y).isEqualTo(0f)
+    }
+
+    @Test
+    fun createPointLeftBottom_correctValueSet() {
+        val meteringPoint2 = pointFactory!!.createPoint(0f, HEIGHT)
+        Truth.assertThat(meteringPoint2.x).isEqualTo(0f)
+        Truth.assertThat(meteringPoint2.y).isEqualTo(1f)
+    }
+
+    @Test
+    fun createPointRightTop_correctValueSet() {
+        val meteringPoint3 = pointFactory!!.createPoint(WIDTH, 0f)
+        Truth.assertThat(meteringPoint3.x).isEqualTo(1f)
+        Truth.assertThat(meteringPoint3.y).isEqualTo(0f)
+    }
+
+    @Test
+    fun createPointRightBottom_correctValueSet() {
+        val meteringPoint4 = pointFactory!!.createPoint(WIDTH, HEIGHT)
+        Truth.assertThat(meteringPoint4.x).isEqualTo(1f)
+        Truth.assertThat(meteringPoint4.y).isEqualTo(1f)
+    }
+
+    @Test
+    fun createPointWithFoVUseCase_success() {
+        Assume.assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK))
+        val imageAnalysis = ImageAnalysis.Builder()
+            .setTargetName("ImageAnalysis")
+            .build()
+        val cameraSelector = CameraSelector.Builder().requireLensFacing(
+            CameraSelector.LENS_FACING_BACK
+        ).build()
+        val camera = CameraUtil.createCameraAndAttachUseCase(
+            context!!,
+            cameraSelector, imageAnalysis
+        )
+        val surfaceResolution = imageAnalysis.attachedSurfaceResolution
+        val factory = SurfaceOrientedMeteringPointFactory(
+            WIDTH, HEIGHT, imageAnalysis
+        )
+        val point = factory.createPoint(0f, 0f)
+        Truth.assertThat(point.surfaceAspectRatio).isEqualTo(
+            Rational(surfaceResolution!!.width, surfaceResolution.height)
+        )
+        InstrumentationRegistry.getInstrumentation()
+            .runOnMainSync {
+                // TODO: The removeUseCases() call might be removed after clarifying the
+                //  abortCaptures() issue in b/162314023.
+                camera.removeUseCases(camera.useCases)
+            }
+    }
+
+    @Test(expected = IllegalStateException::class)
+    fun createPointWithFoVUseCase_FailedNotBound() {
+        Assume.assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK))
+        val imageAnalysis = ImageAnalysis.Builder()
+            .setTargetAspectRatio(AspectRatio.RATIO_4_3)
+            .setTargetName("ImageAnalysis")
+            .build()
+
+        // This will throw IllegalStateException.
+        SurfaceOrientedMeteringPointFactory(
+            WIDTH, HEIGHT, imageAnalysis
+        )
+    }
+
+    companion object {
+        private const val WIDTH = 480f
+        private const val HEIGHT = 640f
+        @JvmStatic
+        @Parameterized.Parameters(name = "{0}")
+        fun data() = listOf(
+            arrayOf(Camera2Config::class.simpleName, Camera2Config.defaultConfig()),
+            arrayOf(CameraPipeConfig::class.simpleName, CameraPipeConfig.defaultConfig())
+        )
+    }
+}
\ No newline at end of file
diff --git a/camera/integration-tests/diagnosetestapp/src/main/java/androidx/camera/integration/diagnose/CollectDeviceInfoTask.kt b/camera/integration-tests/diagnosetestapp/src/main/java/androidx/camera/integration/diagnose/CollectDeviceInfoTask.kt
new file mode 100644
index 0000000..2382efe
--- /dev/null
+++ b/camera/integration-tests/diagnosetestapp/src/main/java/androidx/camera/integration/diagnose/CollectDeviceInfoTask.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.camera.integration.diagnose
+
+import android.content.Context
+import android.os.Build
+import androidx.camera.view.LifecycleCameraController
+
+/**
+ * Diagnosis task that collect basic device information
+ * TODO: unit tests for this task (have only tested in end-to-end)
+ */
+class CollectDeviceInfoTask : DiagnosisTask("CollectDeviceInfoTask") {
+
+    /**
+     * Collect device information into a text file
+     */
+    @Override
+    override suspend fun runDiagnosisTask(
+        cameraController: LifecycleCameraController,
+        dataStore: DataStore,
+        context: Context
+    ) {
+        // write file/section header
+        dataStore.appendTitle(this.getTaskName())
+
+        dataStore.appendText("Manufacturer: ${Build.MANUFACTURER}")
+        dataStore.appendText("Model: ${Build.MODEL}")
+        dataStore.appendText("Device: ${Build.DEVICE}")
+        dataStore.appendText("Version code name: ${Build.VERSION.CODENAME}")
+        dataStore.appendText("Version SDK: ${Build.VERSION.SDK_INT}")
+        dataStore.appendText("Fingerprint: ${Build.FINGERPRINT}")
+    }
+}
\ No newline at end of file
diff --git a/camera/integration-tests/diagnosetestapp/src/main/java/androidx/camera/integration/diagnose/DataStore.kt b/camera/integration-tests/diagnosetestapp/src/main/java/androidx/camera/integration/diagnose/DataStore.kt
index 0a1603e..e20d1c9 100644
--- a/camera/integration-tests/diagnosetestapp/src/main/java/androidx/camera/integration/diagnose/DataStore.kt
+++ b/camera/integration-tests/diagnosetestapp/src/main/java/androidx/camera/integration/diagnose/DataStore.kt
@@ -18,7 +18,9 @@
 
 import android.content.Context
 import android.graphics.Bitmap
+import androidx.annotation.WorkerThread
 import java.io.File
+import java.io.FileInputStream
 import java.io.FileOutputStream
 import java.util.zip.ZipEntry
 import java.util.zip.ZipOutputStream
@@ -53,9 +55,25 @@
         logger.appendLine(text)
     }
 
+    fun appendTitle(taskName: String) {
+        appendText("Task name: $taskName")
+    }
+
     /**
-     * Flush text in logger to text file and clear logger
+     * Copy and flush file as an image file to a ZipEntry
      */
+    @WorkerThread
+    fun flushTempFileToImageFile(file: File, filename: String) {
+        val inputStream = FileInputStream(file)
+        zout.putNextEntry(ZipEntry("$filename.jpeg"))
+        inputStream.copyTo(zout)
+        zout.closeEntry()
+    }
+
+    /**
+     * Flush text in logger as a text file to a ZipEntry and clear logger
+     */
+    @WorkerThread
     fun flushTextToTextFile(filename: String) {
         if (logger.isEmpty()) {
             return
@@ -68,8 +86,9 @@
     }
 
     /**
-     * Flush image as JPEG to a Zip Entry
+     * Flush bitmap as JPEG to a ZipEntry
      */
+    @WorkerThread
     fun flushBitmapToFile(imageName: String, bitmap: Bitmap) {
         zout.putNextEntry(ZipEntry(("$imageName.jpeg")))
         bitmap.compress(Bitmap.CompressFormat.JPEG, 100, zout)
diff --git a/camera/integration-tests/diagnosetestapp/src/main/java/androidx/camera/integration/diagnose/Diagnosis.kt b/camera/integration-tests/diagnosetestapp/src/main/java/androidx/camera/integration/diagnose/Diagnosis.kt
index 61747c0..71625af 100644
--- a/camera/integration-tests/diagnosetestapp/src/main/java/androidx/camera/integration/diagnose/Diagnosis.kt
+++ b/camera/integration-tests/diagnosetestapp/src/main/java/androidx/camera/integration/diagnose/Diagnosis.kt
@@ -42,7 +42,7 @@
         val dataStore = DataStore(context, zipFileName)
 
         tasks.forEach { task ->
-            task.runDiagnosisTask(cameraController, dataStore)
+            task.runDiagnosisTask(cameraController, dataStore, context)
             if (!isAggregated) {
                 dataStore.flushTextToTextFile("${task.getTaskName()}")
             }
diff --git a/camera/integration-tests/diagnosetestapp/src/main/java/androidx/camera/integration/diagnose/DiagnosisTask.kt b/camera/integration-tests/diagnosetestapp/src/main/java/androidx/camera/integration/diagnose/DiagnosisTask.kt
index 305ff86..b2c0cf9 100644
--- a/camera/integration-tests/diagnosetestapp/src/main/java/androidx/camera/integration/diagnose/DiagnosisTask.kt
+++ b/camera/integration-tests/diagnosetestapp/src/main/java/androidx/camera/integration/diagnose/DiagnosisTask.kt
@@ -16,6 +16,7 @@
 
 package androidx.camera.integration.diagnose
 
+import android.content.Context
 import androidx.camera.view.LifecycleCameraController
 
 /**
@@ -34,6 +35,7 @@
      */
     abstract suspend fun runDiagnosisTask(
         cameraController: LifecycleCameraController,
-        dataStore: DataStore
+        dataStore: DataStore,
+        context: Context
     )
 }
\ No newline at end of file
diff --git a/camera/integration-tests/diagnosetestapp/src/main/java/androidx/camera/integration/diagnose/ImageCaptureTask.kt b/camera/integration-tests/diagnosetestapp/src/main/java/androidx/camera/integration/diagnose/ImageCaptureTask.kt
new file mode 100644
index 0000000..c7f3812
--- /dev/null
+++ b/camera/integration-tests/diagnosetestapp/src/main/java/androidx/camera/integration/diagnose/ImageCaptureTask.kt
@@ -0,0 +1,96 @@
+/*
+ * 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.integration.diagnose
+
+import android.content.Context
+import android.util.Log
+import androidx.annotation.MainThread
+import androidx.camera.core.ImageCapture
+import androidx.camera.core.ImageCaptureException
+import androidx.camera.core.impl.utils.Threads
+import androidx.camera.view.CameraController.IMAGE_CAPTURE
+import androidx.camera.view.LifecycleCameraController
+import androidx.core.content.ContextCompat
+import kotlinx.coroutines.withContext
+import java.io.File
+import kotlin.coroutines.resume
+import kotlin.coroutines.resumeWithException
+import kotlinx.coroutines.asCoroutineDispatcher
+import kotlinx.coroutines.suspendCancellableCoroutine
+
+/**
+ * Diagnosis task that utilizes ImageCapture use case
+ * TODO: unit tests for this task (have only tested in end-to-end)
+ */
+class ImageCaptureTask : DiagnosisTask("ImageCaptureTask") {
+
+    /**
+     * Collects image captured as JPEG in diagnosis report zip
+     */
+    @Override
+    override suspend fun runDiagnosisTask(
+        cameraController: LifecycleCameraController,
+        dataStore: DataStore,
+        context: Context
+    ) {
+        // write file/section header
+        dataStore.appendTitle(this.getTaskName())
+
+        try {
+            withContext(ContextCompat.getMainExecutor(context).asCoroutineDispatcher()) {
+                captureImage(cameraController, dataStore, context)
+            }?.let {
+                dataStore.flushTempFileToImageFile(it, "ImageCaptureTask")
+            }
+        } catch (exception: ImageCaptureException) {
+            Log.d("ImageCaptureTask", "Failed to run ImageCaptureTask: ${exception.message}")
+        }
+    }
+
+    /**
+     * Runs ImageCapture use case and return image captured
+     */
+    @MainThread
+    suspend fun captureImage(
+        cameraController: LifecycleCameraController,
+        dataStore: DataStore,
+        context: Context
+    ): File? = suspendCancellableCoroutine { continuation ->
+        Threads.checkMainThread()
+
+        // enable ImageCapture use case
+        cameraController.setEnabledUseCases(IMAGE_CAPTURE)
+        dataStore.appendText("image capture enabled: " +
+            "${cameraController.isImageCaptureEnabled}")
+
+        val file = File(context.cacheDir, "temp.jpeg")
+        val outputOption = ImageCapture.OutputFileOptions.Builder(file).build()
+        val mainExecutor = ContextCompat.getMainExecutor(context)
+
+        cameraController.takePicture(outputOption, mainExecutor,
+            object : ImageCapture.OnImageSavedCallback {
+                override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) {
+                    Log.d("ImageCaptureTask", "${outputFileResults.savedUri}")
+                    continuation.resume(file)
+                }
+
+                override fun onError(exception: ImageCaptureException) {
+                    continuation.resumeWithException(exception)
+                }
+            })
+    }
+}
\ No newline at end of file
diff --git a/camera/integration-tests/diagnosetestapp/src/main/java/androidx/camera/integration/diagnose/MainActivity.kt b/camera/integration-tests/diagnosetestapp/src/main/java/androidx/camera/integration/diagnose/MainActivity.kt
index d9a4b31..cab06b9 100644
--- a/camera/integration-tests/diagnosetestapp/src/main/java/androidx/camera/integration/diagnose/MainActivity.kt
+++ b/camera/integration-tests/diagnosetestapp/src/main/java/androidx/camera/integration/diagnose/MainActivity.kt
@@ -61,6 +61,8 @@
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
 
+@OptIn(ExperimentalVideo::class)
+@SuppressLint("NullAnnotationGroup")
 class MainActivity : AppCompatActivity() {
 
     private lateinit var cameraController: LifecycleCameraController
@@ -72,6 +74,8 @@
     private lateinit var barcodeScanner: BarcodeScanner
     private lateinit var analyzer: MlKitAnalyzer
     private lateinit var diagnoseBtn: Button
+    private lateinit var imageCaptureBtn: Button
+    private lateinit var videoCaptureBtn: Button
     private lateinit var calibrationExecutor: ExecutorService
     private var calibrationThreadId: Long = -1
     private lateinit var diagnosisDispatcher: ExecutorCoroutineDispatcher
@@ -89,6 +93,10 @@
         diagnosis = Diagnosis()
         barcodeScanner = BarcodeScanning.getClient()
         diagnoseBtn = findViewById(R.id.diagnose_btn)
+        imageCaptureBtn = findViewById(R.id.image_capture_btn)
+        imageCaptureBtn.visibility = View.INVISIBLE
+        videoCaptureBtn = findViewById(R.id.video_capture_btn)
+        videoCaptureBtn.visibility = View.INVISIBLE
         calibrationExecutor = Executors.newSingleThreadExecutor() { runnable ->
             val thread = Executors.defaultThreadFactory().newThread(runnable)
             thread.name = "CalibrationThread"
@@ -118,7 +126,6 @@
         tabLayout.addTab(diagnoseTab)
 
         // Setup UI events
-        // TODO: switch TabItems to TabLayout.Tab for selecting on id
         tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
             override fun onTabSelected(tab: TabLayout.Tab?) {
                 Log.d(TAG, "tab selected id:${tab?.view?.id}")
@@ -132,35 +139,126 @@
 
             override fun onTabUnselected(tab: TabLayout.Tab?) {
                 Log.d(TAG, "tab unselected:${tab?.view?.id}")
-                if (tab?.view?.id == R.id.diagnose) {
-                    // disable overlay
-                    overlayView.visibility = View.INVISIBLE
-                    // unbind MLKit analyzer
-                    cameraController.clearImageAnalysisAnalyzer()
-                }
+                deselectMode(tab?.view?.id)
             }
         })
 
+        imageCaptureBtn.setOnClickListener {
+            val name = SimpleDateFormat(FILENAME_FORMAT, Locale.US)
+                .format(System.currentTimeMillis())
+            val contentValues = ContentValues().apply {
+                put(MediaStore.MediaColumns.DISPLAY_NAME, name)
+                put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg")
+                if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
+                    put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/CameraX-Image")
+                }
+            }
+
+            // Create output options object which contains file + metadata
+            val outputOptions = ImageCapture.OutputFileOptions
+                .Builder(
+                    contentResolver,
+                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
+                    contentValues
+                )
+                .build()
+
+            // Set up image capture listener, which is triggered after photo has
+            // been taken
+            cameraController.takePicture(
+                outputOptions,
+                executor,
+                object : ImageCapture.OnImageSavedCallback {
+                    override fun onError(exc: ImageCaptureException) {
+                        val msg = "Photo capture failed: ${exc.message}"
+                        showToast(msg)
+                    }
+
+                    override fun onImageSaved(output: ImageCapture.OutputFileResults) {
+                        val msg = "Photo capture succeeded: ${output.savedUri}"
+                        showToast(msg)
+                    }
+                }
+            )
+        }
+
+        videoCaptureBtn.setOnClickListener {
+            // determine whether the onclick is to start recording or stop recording
+            if (cameraController.isRecording) {
+                cameraController.stopRecording()
+                videoCaptureBtn.setText(R.string.start_video_capture)
+                val msg = "video stopped recording"
+                showToast(msg)
+            } else {
+                // building file output
+                val name = SimpleDateFormat(FILENAME_FORMAT, Locale.US)
+                    .format(System.currentTimeMillis())
+                val contentValues = ContentValues().apply {
+                    put(MediaStore.MediaColumns.DISPLAY_NAME, name)
+                    put(MediaStore.MediaColumns.MIME_TYPE, "video/mp4")
+                    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
+                        put(MediaStore.Video.Media.RELATIVE_PATH, "Movies/CameraX-Video")
+                    }
+                }
+                val outputFileOptions = OutputFileOptions
+                    .builder(
+                        contentResolver,
+                        MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
+                        contentValues
+                    )
+                    .build()
+                Log.d(TAG, "finished composing video name")
+
+                // start recording
+                try {
+                    cameraController.startRecording(
+                        outputFileOptions,
+                        executor,
+                        object : OnVideoSavedCallback {
+                            override fun onVideoSaved(outputFileResults: OutputFileResults) {
+                                val msg = "Video record succeeded: " + outputFileResults.savedUri
+                                showToast(msg)
+                            }
+
+                            override fun onError(
+                                videoCaptureError: Int,
+                                message: String,
+                                cause: Throwable?
+                            ) {
+                                Log.e(TAG, "Video saving failed: $message")
+                            }
+                        }
+                    )
+                    videoCaptureBtn.setText(R.string.stop_video_capture)
+                    val msg = "video recording"
+                    showToast(msg)
+                } catch (exception: RuntimeException) {
+                    Log.e(TAG, "Video failed to record: " + exception.message)
+                }
+            }
+        }
+
         diagnoseBtn.setOnClickListener {
             lifecycleScope.launch {
                 try {
                     val reportFile = withContext(diagnosisDispatcher) {
-                        // TODO: create functionality for adding diagnosis task and setting is aggregated
+                        // creating tasks to diagnose
                         val taskList = mutableListOf<DiagnosisTask>()
+                        taskList.add(CollectDeviceInfoTask())
+                        taskList.add(ImageCaptureTask())
                         val isAggregated = true
                         Log.i(TAG, "dispatcher: ${Thread.currentThread().name}")
                         diagnosis.diagnose(baseContext, taskList, cameraController, isAggregated)
                     }
                     val msg: String = if (reportFile != null) {
-                        Log.d(TAG, "file at ${reportFile.path}")
-                        "Successfully collected device info"
+                        "Successfully collected diagnosis to ${reportFile.path}"
                     } else {
                         "Diagnosis failed: No file"
                     }
-                    Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
+                    showToast(msg)
                 } catch (e: IOException) {
                     val msg = "Failed to collect information"
-                    Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
+                    showToast(msg)
                     Log.e(TAG, "IOException caught: ${e.message}")
                 }
             }
@@ -177,11 +275,8 @@
             if (allPermissionsGranted()) {
                 startCamera()
             } else {
-                Toast.makeText(
-                    this,
-                    "Permissions not granted by the user.",
-                    Toast.LENGTH_SHORT
-                ).show()
+                val msg = "Permissions not granted by the user"
+                showToast(msg)
                 // TODO: fail gracefully
                 finish()
             }
@@ -196,115 +291,33 @@
 
     private fun selectMode(id: Int?) {
         when (id) {
-            R.id.image_capture -> takePhoto()
-            R.id.video_capture -> captureVideo()
+            R.id.image_capture -> photoMode()
+            R.id.video_capture -> videoMode()
             R.id.diagnose -> diagnose()
         }
     }
 
-    private fun takePhoto() {
-        cameraController.setEnabledUseCases(IMAGE_CAPTURE)
-
-        val name = SimpleDateFormat(FILENAME_FORMAT, Locale.US)
-            .format(System.currentTimeMillis())
-        val contentValues = ContentValues().apply {
-            put(MediaStore.MediaColumns.DISPLAY_NAME, name)
-            put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg")
-            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
-                put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/CameraX-Image")
+    private fun deselectMode(id: Int?) {
+        when (id) {
+            R.id.image_capture -> imageCaptureBtn.visibility = View.INVISIBLE
+            R.id.video_capture -> videoCaptureBtn.visibility = View.INVISIBLE
+            R.id.diagnose -> {
+                // disable overlay
+                overlayView.visibility = View.INVISIBLE
+                // unbind MLKit analyzer
+                cameraController.clearImageAnalysisAnalyzer()
             }
         }
-
-        // Create output options object which contains file + metadata
-        val outputOptions = ImageCapture.OutputFileOptions
-            .Builder(
-                contentResolver,
-                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
-                contentValues
-            )
-            .build()
-
-        // Set up image capture listener, which is triggered after photo has
-        // been taken
-        cameraController.takePicture(
-            outputOptions,
-            executor,
-            object : ImageCapture.OnImageSavedCallback {
-                override fun onError(exc: ImageCaptureException) {
-                    val msg = "Photo capture failed: ${exc.message}"
-                    Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
-                    Log.d(TAG, msg)
-                }
-
-                override fun onImageSaved(output: ImageCapture.OutputFileResults) {
-                    val msg = "Photo capture succeeded: ${output.savedUri}"
-                    Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
-                    Log.d(TAG, msg)
-                }
-            }
-        )
     }
 
-    @SuppressLint("NullAnnotationGroup")
-    @OptIn(ExperimentalVideo::class)
-    private fun captureVideo() {
-        // determine whether the onclick is to start recording or stop recording
-        if (cameraController.isRecording) {
-            cameraController.stopRecording()
-            val msg = "video stopped recording"
-            Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
-            Log.d(TAG, msg)
-        } else {
-            // enabling video capture
-            cameraController.setEnabledUseCases(VIDEO_CAPTURE)
+    private fun photoMode() {
+        cameraController.setEnabledUseCases(IMAGE_CAPTURE)
+        imageCaptureBtn.visibility = View.VISIBLE
+    }
 
-            // building file output
-            val name = SimpleDateFormat(FILENAME_FORMAT, Locale.US)
-                .format(System.currentTimeMillis())
-            val contentValues = ContentValues().apply {
-                put(MediaStore.MediaColumns.DISPLAY_NAME, name)
-                put(MediaStore.MediaColumns.MIME_TYPE, "video/mp4")
-                if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
-                    put(MediaStore.Video.Media.RELATIVE_PATH, "Movies/CameraX-Video")
-                }
-            }
-            val outputFileOptions = OutputFileOptions
-                .builder(
-                    contentResolver,
-                    MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
-                    contentValues
-                )
-                .build()
-            Log.d(TAG, "finished composing video name")
-
-            // start recording
-            try {
-                cameraController.startRecording(
-                    outputFileOptions,
-                    executor,
-                    object : OnVideoSavedCallback {
-                        override fun onVideoSaved(outputFileResults: OutputFileResults) {
-                            val msg = "Video record succeeded: " + outputFileResults.savedUri
-                            Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
-                            Log.d(TAG, msg)
-                        }
-
-                        override fun onError(
-                            videoCaptureError: Int,
-                            message: String,
-                            cause: Throwable?
-                        ) {
-                            Log.e(TAG, "Video saving failed: $message")
-                        }
-                    }
-                )
-                val msg = "video recording"
-                Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
-                Log.d(TAG, msg)
-            } catch (exception: RuntimeException) {
-                Log.e(TAG, "Video failed to record: " + exception.message)
-            }
-        }
+    private fun videoMode() {
+        cameraController.setEnabledUseCases(VIDEO_CAPTURE)
+        videoCaptureBtn.visibility = View.VISIBLE
     }
 
     private fun diagnose() {
@@ -351,6 +364,11 @@
             "Not working on Calibration Thread")
     }
 
+    private fun showToast(msg: String) {
+        Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
+        Log.d(TAG, msg)
+    }
+
     override fun onDestroy() {
         super.onDestroy()
         calibrationExecutor.shutdown()
diff --git a/camera/integration-tests/diagnosetestapp/src/main/res/layout/activity_main.xml b/camera/integration-tests/diagnosetestapp/src/main/res/layout/activity_main.xml
index 06d09be..75496bd 100644
--- a/camera/integration-tests/diagnosetestapp/src/main/res/layout/activity_main.xml
+++ b/camera/integration-tests/diagnosetestapp/src/main/res/layout/activity_main.xml
@@ -30,6 +30,30 @@
             android:layout_width="match_parent"
             android:layout_height="match_parent" />
 
+        <Button
+            android:id="@+id/image_capture_btn"
+            android:layout_gravity="bottom"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:padding="20dp"
+            android:text="@string/image_capture"
+            android:textSize="20sp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent" />
+
+        <Button
+            android:id="@+id/video_capture_btn"
+            android:layout_gravity="bottom"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:padding="20dp"
+            android:text="@string/start_video_capture"
+            android:textSize="20sp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent" />
+
         <androidx.camera.integration.diagnose.OverlayView
             android:id="@+id/overlay_view"
             android:layout_width="match_parent"
@@ -39,8 +63,8 @@
             <Button
                 android:id="@+id/diagnose_btn"
                 android:layout_width="wrap_content"
+                android:layout_gravity="bottom"
                 android:layout_height="wrap_content"
-                android:layout_marginBottom="16dp"
                 android:enabled="false"
                 android:padding="20dp"
                 android:text="@string/begin_diagnosis"
diff --git a/camera/integration-tests/diagnosetestapp/src/main/res/values/strings.xml b/camera/integration-tests/diagnosetestapp/src/main/res/values/strings.xml
index 89b04e5..091e7b8 100644
--- a/camera/integration-tests/diagnosetestapp/src/main/res/values/strings.xml
+++ b/camera/integration-tests/diagnosetestapp/src/main/res/values/strings.xml
@@ -17,7 +17,8 @@
 <resources>
     <string name="app_name">diagnosetestapp</string>
     <string name="image_capture">Take Photo</string>
-    <string name="video_capture">Record Video</string>
+    <string name="start_video_capture">Start Recording</string>
+    <string name="stop_video_capture">Stop Recording</string>
     <string name="diagnose">Diagnose</string>
     <string name="begin_diagnosis">Begin Diagnosis</string>
 </resources>
\ No newline at end of file
diff --git a/camera/integration-tests/diagnosetestapp/src/test/java/androidx/camera/integration/diagnose/FakeTextAndImageSavingTask.kt b/camera/integration-tests/diagnosetestapp/src/test/java/androidx/camera/integration/diagnose/FakeTextAndImageSavingTask.kt
index 752a7d5..aec614a 100644
--- a/camera/integration-tests/diagnosetestapp/src/test/java/androidx/camera/integration/diagnose/FakeTextAndImageSavingTask.kt
+++ b/camera/integration-tests/diagnosetestapp/src/test/java/androidx/camera/integration/diagnose/FakeTextAndImageSavingTask.kt
@@ -16,6 +16,7 @@
 
 package androidx.camera.integration.diagnose
 
+import android.content.Context
 import android.graphics.Bitmap
 import android.graphics.Color.BLUE
 
@@ -24,7 +25,8 @@
 class FakeTextAndImageSavingTask : DiagnosisTask("FakeTextAndImageSavingTask") {
     override suspend fun runDiagnosisTask(
         cameraController: LifecycleCameraController,
-        dataStore: DataStore
+        dataStore: DataStore,
+        context: Context
     ) {
         dataStore.appendText("This is fake task 2.")
         // append bitmap with each pixel set to blue
diff --git a/camera/integration-tests/diagnosetestapp/src/test/java/androidx/camera/integration/diagnose/FakeTextSavingTask.kt b/camera/integration-tests/diagnosetestapp/src/test/java/androidx/camera/integration/diagnose/FakeTextSavingTask.kt
index e15e941..51bb314 100644
--- a/camera/integration-tests/diagnosetestapp/src/test/java/androidx/camera/integration/diagnose/FakeTextSavingTask.kt
+++ b/camera/integration-tests/diagnosetestapp/src/test/java/androidx/camera/integration/diagnose/FakeTextSavingTask.kt
@@ -16,6 +16,7 @@
 
 package androidx.camera.integration.diagnose
 
+import android.content.Context
 import androidx.camera.view.LifecycleCameraController
 
 class FakeTextSavingTask : DiagnosisTask("FakeTextSavingTask") {
@@ -23,7 +24,8 @@
     @Override
     override suspend fun runDiagnosisTask(
         cameraController: LifecycleCameraController,
-        dataStore: DataStore
+        dataStore: DataStore,
+        context: Context
     ) {
         dataStore.appendText("This is a fake test 1.")
         dataStore.appendText("Line 2.")
diff --git a/camera/integration-tests/extensionstestapp/build.gradle b/camera/integration-tests/extensionstestapp/build.gradle
index 7d733c7..220b5e9 100644
--- a/camera/integration-tests/extensionstestapp/build.gradle
+++ b/camera/integration-tests/extensionstestapp/build.gradle
@@ -67,8 +67,8 @@
     androidTestImplementation(libs.testRunner)
     androidTestImplementation(libs.testRules)
     androidTestImplementation(libs.testUiautomator)
-    androidTestImplementation(libs.espressoCore)
     androidTestImplementation(libs.truth)
+    androidTestImplementation("androidx.test.espresso:espresso-core:3.3.0")
     androidTestImplementation(project(":camera:camera-testing"))
     androidTestImplementation(project(":internal-testutils-runtime"))
     androidTestCompileOnly(project(":camera:camera-extensions-stub"))
diff --git a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/BindUnbindUseCasesStressTest.kt b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/BindUnbindUseCasesStressTest.kt
index 154ec0c..a048a4d 100644
--- a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/BindUnbindUseCasesStressTest.kt
+++ b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/BindUnbindUseCasesStressTest.kt
@@ -29,12 +29,12 @@
 import androidx.camera.core.ImageProxy
 import androidx.camera.core.Preview
 import androidx.camera.extensions.ExtensionsManager
-import androidx.camera.integration.extensions.util.ExtensionsTestUtil
-import androidx.camera.integration.extensions.util.ExtensionsTestUtil.STRESS_TEST_OPERATION_REPEAT_COUNT
-import androidx.camera.integration.extensions.util.ExtensionsTestUtil.STRESS_TEST_REPEAT_COUNT
-import androidx.camera.integration.extensions.util.ExtensionsTestUtil.VERIFICATION_TARGET_IMAGE_ANALYSIS
-import androidx.camera.integration.extensions.util.ExtensionsTestUtil.VERIFICATION_TARGET_IMAGE_CAPTURE
-import androidx.camera.integration.extensions.util.ExtensionsTestUtil.VERIFICATION_TARGET_PREVIEW
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil.STRESS_TEST_OPERATION_REPEAT_COUNT
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil.STRESS_TEST_REPEAT_COUNT
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil.VERIFICATION_TARGET_IMAGE_ANALYSIS
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil.VERIFICATION_TARGET_IMAGE_CAPTURE
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil.VERIFICATION_TARGET_PREVIEW
 import androidx.camera.integration.extensions.utils.CameraSelectorUtil
 import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
@@ -98,7 +98,7 @@
 
     @Before
     fun setUp(): Unit = runBlocking {
-        assumeTrue(ExtensionsTestUtil.isTargetDeviceAvailableForExtensions())
+        assumeTrue(CameraXExtensionsTestUtil.isTargetDeviceAvailableForExtensions())
         cameraProvider = ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
         extensionsManager = ExtensionsManager.getInstanceAsync(
             context,
@@ -144,7 +144,7 @@
         @JvmStatic
         @get:Parameterized.Parameters(name = "cameraId = {0}, extensionMode = {1}")
         val parameters: Collection<Array<Any>>
-            get() = ExtensionsTestUtil.getAllCameraIdExtensionModeCombinations()
+            get() = CameraXExtensionsTestUtil.getAllCameraIdExtensionModeCombinations()
     }
 
     @LabTestRule.LabTestOnly
diff --git a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/ImageCaptureExtenderValidationTest.kt b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/ImageCaptureExtenderValidationTest.kt
index 8590255..7725e1c 100644
--- a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/ImageCaptureExtenderValidationTest.kt
+++ b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/ImageCaptureExtenderValidationTest.kt
@@ -17,33 +17,33 @@
 package androidx.camera.integration.extensions
 
 import android.content.Context
-import android.content.Intent
 import android.hardware.camera2.CameraCharacteristics
 import android.os.Build
 import androidx.camera.camera2.Camera2Config
 import androidx.camera.camera2.interop.Camera2CameraInfo
 import androidx.camera.core.CameraSelector
+import androidx.camera.core.impl.CaptureBundle
 import androidx.camera.core.impl.ImageCaptureConfig
 import androidx.camera.extensions.ExtensionsManager
 import androidx.camera.extensions.internal.ExtensionVersion
 import androidx.camera.extensions.internal.Version
-import androidx.camera.integration.extensions.IntentExtraKey.INTENT_EXTRA_KEY_CAMERA_ID
-import androidx.camera.integration.extensions.IntentExtraKey.INTENT_EXTRA_KEY_EXTENSION_MODE
-import androidx.camera.integration.extensions.util.ExtensionsTestUtil
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil.launchCameraExtensionsActivity
+import androidx.camera.integration.extensions.util.HOME_TIMEOUT_MS
+import androidx.camera.integration.extensions.util.waitForPreviewIdle
 import androidx.camera.integration.extensions.utils.CameraSelectorUtil
 import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CameraUtil.PreTestCameraIdList
 import androidx.camera.testing.CoreAppTestUtil
 import androidx.camera.testing.fakes.FakeLifecycleOwner
-import androidx.camera.testing.waitForIdle
-import androidx.test.core.app.ActivityScenario
 import androidx.test.core.app.ApplicationProvider
-import androidx.test.espresso.IdlingResource
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
 import androidx.test.filters.SmallTest
 import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.uiautomator.UiDevice
+import androidx.testutils.withActivity
 import com.google.common.truth.Truth.assertThat
 import java.util.concurrent.TimeUnit
 import kotlinx.coroutines.Dispatchers
@@ -57,8 +57,6 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
-private const val BASIC_SAMPLE_PACKAGE = "androidx.camera.integration.extensions"
-
 @SmallTest
 @RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = 21)
@@ -79,11 +77,9 @@
     private lateinit var baseCameraSelector: CameraSelector
     private lateinit var extensionCameraSelector: CameraSelector
 
-    private lateinit var activityScenario: ActivityScenario<CameraExtensionsActivity>
-
     @Before
     fun setUp(): Unit = runBlocking {
-        assumeTrue(ExtensionsTestUtil.isTargetDeviceAvailableForExtensions())
+        assumeTrue(CameraXExtensionsTestUtil.isTargetDeviceAvailableForExtensions())
         cameraProvider = ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
         extensionsManager = ExtensionsManager.getInstanceAsync(
             context,
@@ -107,27 +103,25 @@
 
     @After
     fun cleanUp(): Unit = runBlocking {
-        if (::activityScenario.isInitialized) {
-            activityScenario.onActivity { it.finish() }
+        val cameraProvider =
+            ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
+        withContext(Dispatchers.Main) {
+            cameraProvider.unbindAll()
+            cameraProvider.shutdown()
         }
 
-        if (::cameraProvider.isInitialized) {
-            withContext(Dispatchers.Main) {
-                cameraProvider.unbindAll()
-                cameraProvider.shutdown()[10000, TimeUnit.MILLISECONDS]
-            }
-        }
-
-        if (::extensionsManager.isInitialized) {
-            extensionsManager.shutdown()[10000, TimeUnit.MILLISECONDS]
-        }
+        val extensionsManager = ExtensionsManager.getInstanceAsync(
+            context,
+            cameraProvider
+        )[10000, TimeUnit.MILLISECONDS]
+        extensionsManager.shutdown()
     }
 
     companion object {
         @JvmStatic
         @get:Parameterized.Parameters(name = "cameraId = {0}, extensionMode = {1}")
         val parameters: Collection<Array<Any>>
-            get() = ExtensionsTestUtil.getAllCameraIdExtensionModeCombinations()
+            get() = CameraXExtensionsTestUtil.getAllCameraIdExtensionModeCombinations()
     }
 
     @Test
@@ -138,7 +132,7 @@
 
         // Creates the ImageCaptureExtenderImpl to retrieve the target format/resolutions pair list
         // from vendor library for the target effect mode.
-        val impl = ExtensionsTestUtil.createImageCaptureExtenderImpl(
+        val impl = CameraXExtensionsTestUtil.createImageCaptureExtenderImpl(
             extensionMode,
             cameraId,
             cameraCharacteristics
@@ -154,7 +148,7 @@
     fun returnsNullFromOnPresetSession_whenAPILevelOlderThan28() {
         // Creates the ImageCaptureExtenderImpl to check that onPresetSession() returns null when
         // API level is older than 28.
-        val impl = ExtensionsTestUtil.createImageCaptureExtenderImpl(
+        val impl = CameraXExtensionsTestUtil.createImageCaptureExtenderImpl(
             extensionMode,
             cameraId,
             cameraCharacteristics
@@ -176,7 +170,7 @@
         )
 
         // Calls bind to lifecycle to get the selected camera
-        var camera = withContext(Dispatchers.Main) {
+        val camera = withContext(Dispatchers.Main) {
             cameraProvider.bindToLifecycle(FakeLifecycleOwner(), extensionCameraSelector)
         }
 
@@ -184,7 +178,7 @@
         val characteristics = Camera2CameraInfo.extractCameraCharacteristics(camera.cameraInfo)
 
         // Creates ImageCaptureExtenderImpl directly to retrieve the capture latency range info
-        val impl = ExtensionsTestUtil.createImageCaptureExtenderImpl(
+        val impl = CameraXExtensionsTestUtil.createImageCaptureExtenderImpl(
             extensionMode,
             cameraId,
             characteristics
@@ -203,56 +197,42 @@
         // window before starting the test.
         CoreAppTestUtil.prepareDeviceUI(InstrumentationRegistry.getInstrumentation())
 
-        val intent = ApplicationProvider.getApplicationContext<Context>().packageManager
-            .getLaunchIntentForPackage(BASIC_SAMPLE_PACKAGE)?.apply {
-                putExtra(INTENT_EXTRA_KEY_CAMERA_ID, cameraId)
-                putExtra(INTENT_EXTRA_KEY_EXTENSION_MODE, extensionMode)
-                flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
+        val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()).apply {
+            setOrientationNatural()
+        }
+
+        val activityScenario = launchCameraExtensionsActivity(cameraId, extensionMode)
+
+        with(activityScenario) {
+            use {
+                var captureBundle: CaptureBundle? = null
+                withActivity {
+                    // Retrieves the CaptureProcessor from ImageCapture's config
+                    val captureProcessor = imageCapture!!.currentConfig.retrieveOption(
+                        ImageCaptureConfig.OPTION_CAPTURE_PROCESSOR, null
+                    )
+
+                    assumeTrue(captureProcessor != null)
+
+                    // Retrieves the CaptureBundle from ImageCapture's config
+                    captureBundle = imageCapture!!.currentConfig.retrieveOption(
+                        ImageCaptureConfig.OPTION_CAPTURE_BUNDLE
+                    )
+                }
+
+                waitForPreviewIdle()
+
+                // Calls CaptureBundle#getCaptureStages() will call
+                // ImageCaptureExtenderImpl#getCaptureStages(). Checks the returned value is
+                // not empty.
+                assertThat(captureBundle!!.captureStages).isNotEmpty()
             }
-
-        activityScenario = ActivityScenario.launch(intent)
-        var initializationIdlingResource: IdlingResource? = null
-        var previewViewIdlingResource: IdlingResource? = null
-
-        activityScenario.onActivity {
-            initializationIdlingResource = it.initializationIdlingResource
-            previewViewIdlingResource = it.previewViewStreamingStateIdlingResource
         }
 
-        // Wait for CameraExtensionsActivity's initialization to be complete
-        initializationIdlingResource.waitForIdle()
-
-        activityScenario.onActivity {
-            assumeTrue(it.isExtensionModeSupported(cameraId, extensionMode))
-
-            // Retrieves the CaptureProcessor from ImageCapture's config
-            val captureProcessor =
-                it.imageCapture!!.currentConfig.retrieveOption(
-                    ImageCaptureConfig.OPTION_CAPTURE_PROCESSOR, null
-                )
-
-            // Only runs the test when CaptureProcessor is not null
-            assumeTrue(captureProcessor != null)
-        }
-
-        // Waits for preview view turned to STREAMING state to make sure that the capture session
-        // has been created and the capture stages can be retrieved from the vendor library
-        // successfully.
-        previewViewIdlingResource.waitForIdle()
-
-        activityScenario.onActivity {
-            // Checks that CameraExtensionsActivity's current extension mode is correct.
-            assertThat(it.currentExtensionMode).isEqualTo(extensionMode)
-
-            // Retrieves the CaptureBundle from ImageCapture's config
-            val captureBundle =
-                it.imageCapture!!.currentConfig.retrieveOption(
-                    ImageCaptureConfig.OPTION_CAPTURE_BUNDLE
-                )
-
-            // Calls CaptureBundle#getCaptureStages() will call
-            // ImageCaptureExtenderImpl#getCaptureStages(). Checks the returned value is not empty.
-            assertThat(captureBundle!!.captureStages).isNotEmpty()
-        }
+        // Unfreeze rotation so the device can choose the orientation via its own policy. Be nice
+        // to other tests :)
+        device.unfreezeRotation()
+        device.pressHome()
+        device.waitForIdle(HOME_TIMEOUT_MS)
     }
 }
diff --git a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/ImageCaptureTest.kt b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/ImageCaptureTest.kt
index 8c8262c..9ae2428 100644
--- a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/ImageCaptureTest.kt
+++ b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/ImageCaptureTest.kt
@@ -18,26 +18,23 @@
 
 import android.Manifest
 import android.content.Context
-import android.content.Intent
 import androidx.camera.camera2.Camera2Config
-import androidx.camera.integration.extensions.IntentExtraKey.INTENT_EXTRA_KEY_CAMERA_ID
-import androidx.camera.integration.extensions.IntentExtraKey.INTENT_EXTRA_KEY_DELETE_CAPTURED_IMAGE
-import androidx.camera.integration.extensions.IntentExtraKey.INTENT_EXTRA_KEY_EXTENSION_MODE
-import androidx.camera.integration.extensions.util.ExtensionsTestUtil
+import androidx.camera.extensions.ExtensionsManager
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil.assumeExtensionModeSupported
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil.launchCameraExtensionsActivity
+import androidx.camera.integration.extensions.util.HOME_TIMEOUT_MS
+import androidx.camera.integration.extensions.util.takePictureAndWaitForImageSavedIdle
+import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CameraUtil.PreTestCameraIdList
 import androidx.camera.testing.CoreAppTestUtil
-import androidx.camera.testing.waitForIdle
-import androidx.test.core.app.ActivityScenario
 import androidx.test.core.app.ApplicationProvider
-import androidx.test.espresso.Espresso
-import androidx.test.espresso.IdlingResource
-import androidx.test.espresso.action.ViewActions
-import androidx.test.espresso.matcher.ViewMatchers.withId
 import androidx.test.filters.LargeTest
 import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.rule.GrantPermissionRule
-import com.google.common.truth.Truth.assertThat
+import androidx.test.uiautomator.UiDevice
+import java.util.concurrent.TimeUnit
 import org.junit.After
 import org.junit.Assume.assumeTrue
 import org.junit.Before
@@ -46,14 +43,13 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
-private const val BASIC_SAMPLE_PACKAGE = "androidx.camera.integration.extensions"
-
 /**
  * The tests to verify that ImageCapture can work well when extension modes are enabled.
  */
 @LargeTest
 @RunWith(Parameterized::class)
 class ImageCaptureTest(private val cameraId: String, private val extensionMode: Int) {
+    private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
 
     @get:Rule
     val useCamera = CameraUtil.grantCameraPermissionAndPreTest(
@@ -64,27 +60,54 @@
     val storagePermissionRule =
         GrantPermissionRule.grant(Manifest.permission.WRITE_EXTERNAL_STORAGE)!!
 
-    private lateinit var activityScenario: ActivityScenario<CameraExtensionsActivity>
+    private val context = ApplicationProvider.getApplicationContext<Context>()
 
     companion object {
         @Parameterized.Parameters(name = "cameraId = {0}, extensionMode = {1}")
         @JvmStatic
-        fun parameters() = ExtensionsTestUtil.getAllCameraIdExtensionModeCombinations()
+        fun parameters() = CameraXExtensionsTestUtil.getAllCameraIdExtensionModeCombinations()
     }
 
     @Before
-    fun setUp() {
-        assumeTrue(ExtensionsTestUtil.isTargetDeviceAvailableForExtensions())
+    fun setup() {
+        assumeTrue(CameraXExtensionsTestUtil.isTargetDeviceAvailableForExtensions())
         // Clear the device UI and check if there is no dialog or lock screen on the top of the
-        // window before starting the test.
+        // window before start the test.
         CoreAppTestUtil.prepareDeviceUI(InstrumentationRegistry.getInstrumentation())
+        // Use the natural orientation throughout these tests to ensure the activity isn't
+        // recreated unexpectedly. This will also freeze the sensors until
+        // mDevice.unfreezeRotation() in the tearDown() method. Any simulated rotations will be
+        // explicitly initiated from within the test.
+        device.setOrientationNatural()
+
+        val cameraProvider =
+            ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
+
+        val extensionsManager = ExtensionsManager.getInstanceAsync(
+            context,
+            cameraProvider
+        )[10000, TimeUnit.MILLISECONDS]
+
+        assumeExtensionModeSupported(extensionsManager, cameraId, extensionMode)
     }
 
     @After
     fun tearDown() {
-        if (::activityScenario.isInitialized) {
-            activityScenario.onActivity { it.finish() }
-        }
+        val cameraProvider =
+            ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
+        cameraProvider.shutdown()
+
+        val extensionsManager = ExtensionsManager.getInstanceAsync(
+            context,
+            cameraProvider
+        )[10000, TimeUnit.MILLISECONDS]
+        extensionsManager.shutdown()
+
+        // Unfreeze rotation so the device can choose the orientation via its own policy. Be nice
+        // to other tests :)
+        device.unfreezeRotation()
+        device.pressHome()
+        device.waitForIdle(HOME_TIMEOUT_MS)
     }
 
     /**
@@ -92,51 +115,12 @@
      */
     @Test
     fun takePictureWithExtensionMode() {
-        val intent = ApplicationProvider.getApplicationContext<Context>().packageManager
-            .getLaunchIntentForPackage(BASIC_SAMPLE_PACKAGE)?.apply {
-                putExtra(INTENT_EXTRA_KEY_CAMERA_ID, cameraId)
-                putExtra(INTENT_EXTRA_KEY_EXTENSION_MODE, extensionMode)
-                putExtra(INTENT_EXTRA_KEY_DELETE_CAPTURED_IMAGE, true)
-                flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
+        val activityScenario = launchCameraExtensionsActivity(cameraId, extensionMode)
+
+        with(activityScenario) {
+            use {
+                takePictureAndWaitForImageSavedIdle()
             }
-
-        activityScenario = ActivityScenario.launch(intent)
-        var initializationIdlingResource: IdlingResource? = null
-        var previewViewIdlingResource: IdlingResource? = null
-        var takePictureIdlingResource: IdlingResource? = null
-
-        activityScenario.onActivity {
-            initializationIdlingResource = it.initializationIdlingResource
-            previewViewIdlingResource = it.previewViewStreamingStateIdlingResource
-            takePictureIdlingResource = it.takePictureIdlingResource
-        }
-
-        // Wait for CameraExtensionsActivity's initialization to be complete
-        initializationIdlingResource.waitForIdle()
-
-        activityScenario.onActivity {
-            assumeTrue(it.isExtensionModeSupported(cameraId, extensionMode))
-        }
-
-        // Waits for preview view turned to STREAMING state to make sure that the capture session
-        // has been created and the capture stages can be retrieved from the vendor library
-        // successfully.
-        previewViewIdlingResource.waitForIdle()
-
-        activityScenario.onActivity {
-            // Checks that CameraExtensionsActivity's current extension mode is correct.
-            assertThat(it.currentExtensionMode).isEqualTo(extensionMode)
-        }
-
-        // Issue take picture.
-        Espresso.onView(withId(R.id.Picture)).perform(ViewActions.click())
-
-        // Wait for the take picture success callback.
-        takePictureIdlingResource.waitForIdle()
-
-        activityScenario.onActivity {
-            assertThat(it.imageCapture).isNotNull()
-            assertThat(it.preview).isNotNull()
         }
     }
 }
\ No newline at end of file
diff --git a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/LifecycleStatusChangeStressTest.kt b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/LifecycleStatusChangeStressTest.kt
index 63893a5..20f3f82 100644
--- a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/LifecycleStatusChangeStressTest.kt
+++ b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/LifecycleStatusChangeStressTest.kt
@@ -18,46 +18,38 @@
 
 import android.Manifest
 import android.content.Context
-import android.content.Intent
 import androidx.camera.camera2.Camera2Config
-import androidx.camera.integration.extensions.IntentExtraKey.INTENT_EXTRA_KEY_CAMERA_ID
-import androidx.camera.integration.extensions.IntentExtraKey.INTENT_EXTRA_KEY_DELETE_CAPTURED_IMAGE
-import androidx.camera.integration.extensions.IntentExtraKey.INTENT_EXTRA_KEY_EXTENSION_MODE
-import androidx.camera.integration.extensions.util.ExtensionsTestUtil
-import androidx.camera.integration.extensions.util.ExtensionsTestUtil.STRESS_TEST_OPERATION_REPEAT_COUNT
-import androidx.camera.integration.extensions.util.ExtensionsTestUtil.VERIFICATION_TARGET_IMAGE_CAPTURE
-import androidx.camera.integration.extensions.util.ExtensionsTestUtil.VERIFICATION_TARGET_PREVIEW
+import androidx.camera.extensions.ExtensionsManager
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil.STRESS_TEST_OPERATION_REPEAT_COUNT
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil.VERIFICATION_TARGET_IMAGE_CAPTURE
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil.VERIFICATION_TARGET_PREVIEW
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil.launchCameraExtensionsActivity
+import androidx.camera.integration.extensions.util.HOME_TIMEOUT_MS
+import androidx.camera.integration.extensions.util.takePictureAndWaitForImageSavedIdle
+import androidx.camera.integration.extensions.util.waitForPreviewIdle
+import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CameraUtil.PreTestCameraIdList
 import androidx.camera.testing.CoreAppTestUtil
 import androidx.camera.testing.LabTestRule
-import androidx.camera.testing.StressTestRule
-import androidx.camera.testing.waitForIdle
 import androidx.lifecycle.Lifecycle.State.CREATED
 import androidx.lifecycle.Lifecycle.State.RESUMED
-import androidx.test.core.app.ActivityScenario
 import androidx.test.core.app.ApplicationProvider
-import androidx.test.espresso.Espresso
-import androidx.test.espresso.action.ViewActions
-import androidx.test.espresso.idling.CountingIdlingResource
-import androidx.test.espresso.matcher.ViewMatchers
 import androidx.test.filters.LargeTest
 import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.rule.GrantPermissionRule
 import androidx.test.uiautomator.UiDevice
 import androidx.testutils.RepeatRule
-import com.google.common.truth.Truth.assertThat
+import java.util.concurrent.TimeUnit
 import org.junit.After
 import org.junit.Assume.assumeTrue
 import org.junit.Before
-import org.junit.ClassRule
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
-private const val BASIC_SAMPLE_PACKAGE = "androidx.camera.integration.extensions"
-
 /**
  * Stress tests to verify that Preview and ImageCapture can work well when changing lifecycle
  * status.
@@ -76,65 +68,75 @@
     )
 
     @get:Rule
-    val labTest: LabTestRule = LabTestRule()
-
-    @get:Rule
-    val repeatRule = RepeatRule()
-
-    @get:Rule
     val storagePermissionRule =
         GrantPermissionRule.grant(Manifest.permission.WRITE_EXTERNAL_STORAGE)!!
 
-    private lateinit var activityScenario: ActivityScenario<CameraExtensionsActivity>
-
-    private lateinit var initializationIdlingResource: CountingIdlingResource
-    private lateinit var previewViewStreamingStateIdlingResource: CountingIdlingResource
-    private lateinit var previewViewIdleStateIdlingResource: CountingIdlingResource
-    private lateinit var takePictureIdlingResource: CountingIdlingResource
+    private val context = ApplicationProvider.getApplicationContext<Context>()
 
     companion object {
-        @ClassRule
-        @JvmField val stressTest = StressTestRule()
-
         @Parameterized.Parameters(name = "cameraId = {0}, extensionMode = {1}")
         @JvmStatic
-        fun parameters() = ExtensionsTestUtil.getAllCameraIdExtensionModeCombinations()
+        fun parameters() = CameraXExtensionsTestUtil.getAllCameraIdExtensionModeCombinations()
     }
 
     @Before
-    fun setUp() {
-        assumeTrue(ExtensionsTestUtil.isTargetDeviceAvailableForExtensions())
+    fun setup() {
+        assumeTrue(CameraXExtensionsTestUtil.isTargetDeviceAvailableForExtensions())
+        CoreAppTestUtil.assumeCompatibleDevice()
         // Clear the device UI and check if there is no dialog or lock screen on the top of the
-        // window before starting the test.
+        // window before start the test.
         CoreAppTestUtil.prepareDeviceUI(InstrumentationRegistry.getInstrumentation())
         // Use the natural orientation throughout these tests to ensure the activity isn't
         // recreated unexpectedly. This will also freeze the sensors until
         // mDevice.unfreezeRotation() in the tearDown() method. Any simulated rotations will be
         // explicitly initiated from within the test.
         device.setOrientationNatural()
+
+        val cameraProvider =
+            ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
+
+        val extensionsManager = ExtensionsManager.getInstanceAsync(
+            context,
+            cameraProvider
+        )[10000, TimeUnit.MILLISECONDS]
+
+        // Checks whether the extension mode can be supported first before launching the activity.
+        CameraXExtensionsTestUtil.assumeExtensionModeSupported(
+            extensionsManager,
+            cameraId,
+            extensionMode
+        )
     }
 
     @After
     fun tearDown() {
+        val cameraProvider =
+            ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
+        cameraProvider.shutdown()
+
+        val extensionsManager = ExtensionsManager.getInstanceAsync(
+            context,
+            cameraProvider
+        )[10000, TimeUnit.MILLISECONDS]
+        extensionsManager.shutdown()
+
         // Unfreeze rotation so the device can choose the orientation via its own policy. Be nice
         // to other tests :)
         device.unfreezeRotation()
-
-        if (::activityScenario.isInitialized) {
-            activityScenario.onActivity { it.finish() }
-        }
+        device.pressHome()
+        device.waitForIdle(HOME_TIMEOUT_MS)
     }
 
     @LabTestRule.LabTestOnly
     @Test
-    @RepeatRule.Repeat(times = ExtensionsTestUtil.STRESS_TEST_REPEAT_COUNT)
+    @RepeatRule.Repeat(times = CameraXExtensionsTestUtil.STRESS_TEST_REPEAT_COUNT)
     fun pauseResumeActivity_checkPreviewInEachTime() {
         pauseResumeActivity_checkOutput_repeatedly(VERIFICATION_TARGET_PREVIEW)
     }
 
     @LabTestRule.LabTestOnly
     @Test
-    @RepeatRule.Repeat(times = ExtensionsTestUtil.STRESS_TEST_REPEAT_COUNT)
+    @RepeatRule.Repeat(times = CameraXExtensionsTestUtil.STRESS_TEST_REPEAT_COUNT)
     fun pauseResumeActivity_checkImageCaptureInEachTime() {
         pauseResumeActivity_checkOutput_repeatedly(VERIFICATION_TARGET_IMAGE_CAPTURE)
     }
@@ -143,44 +145,36 @@
         verificationTarget: Int,
         repeatCount: Int = STRESS_TEST_OPERATION_REPEAT_COUNT
     ) {
-        launchActivityAndRetrieveIdlingResources()
+        val activityScenario = launchCameraExtensionsActivity(cameraId, extensionMode)
 
-        for (i in 1..repeatCount) {
-            activityScenario.onActivity { it.resetPreviewViewIdleStateIdlingResource() }
+        with(activityScenario) {
+            use {
+                repeat(repeatCount) {
+                    moveToState(CREATED)
+                    moveToState(RESUMED)
 
-            // Pauses and resumes activity
-            activityScenario.moveToState(CREATED)
-            activityScenario.moveToState(RESUMED)
+                    if (verificationTarget.and(VERIFICATION_TARGET_PREVIEW) != 0) {
+                        waitForPreviewIdle()
+                    }
 
-            previewViewIdleStateIdlingResource.waitForIdle()
-            activityScenario.onActivity { it.resetPreviewViewStreamingStateIdlingResource() }
-
-            // Assert: checks PreviewView can enter STREAMING state
-            if (verificationTarget.and(VERIFICATION_TARGET_PREVIEW) != 0) {
-                previewViewStreamingStateIdlingResource.waitForIdle()
-            }
-
-            // Assert: checks ImageCapture can take a picture
-            if (verificationTarget.and(VERIFICATION_TARGET_IMAGE_CAPTURE) != 0) {
-                // Issues take picture.
-                Espresso.onView(ViewMatchers.withId(R.id.Picture)).perform(ViewActions.click())
-
-                // Waits for the take picture success callback.
-                takePictureIdlingResource.waitForIdle()
+                    if (verificationTarget.and(VERIFICATION_TARGET_IMAGE_CAPTURE) != 0) {
+                        takePictureAndWaitForImageSavedIdle()
+                    }
+                }
             }
         }
     }
 
     @LabTestRule.LabTestOnly
     @Test
-    @RepeatRule.Repeat(times = ExtensionsTestUtil.STRESS_TEST_REPEAT_COUNT)
+    @RepeatRule.Repeat(times = CameraXExtensionsTestUtil.STRESS_TEST_REPEAT_COUNT)
     fun checkPreview_afterPauseResumeActivityRepeatedly() {
         pauseResumeActivityRepeatedly_thenCheckOutput(VERIFICATION_TARGET_PREVIEW)
     }
 
     @LabTestRule.LabTestOnly
     @Test
-    @RepeatRule.Repeat(times = ExtensionsTestUtil.STRESS_TEST_REPEAT_COUNT)
+    @RepeatRule.Repeat(times = CameraXExtensionsTestUtil.STRESS_TEST_REPEAT_COUNT)
     fun checkImageCapture_afterPauseResumeActivityRepeatedly() {
         pauseResumeActivityRepeatedly_thenCheckOutput(VERIFICATION_TARGET_IMAGE_CAPTURE)
     }
@@ -189,62 +183,23 @@
         verificationTarget: Int,
         repeatCount: Int = STRESS_TEST_OPERATION_REPEAT_COUNT
     ) {
-        launchActivityAndRetrieveIdlingResources()
+        val activityScenario = launchCameraExtensionsActivity(cameraId, extensionMode)
 
-        activityScenario.onActivity { it.resetPreviewViewIdleStateIdlingResource() }
+        with(activityScenario) {
+            use {
+                repeat(repeatCount) {
+                    moveToState(CREATED)
+                    moveToState(RESUMED)
+                }
 
-        // Pauses and resumes activity 10 times
-        for (i in 1..repeatCount) {
-            activityScenario.moveToState(CREATED)
-            activityScenario.moveToState(RESUMED)
-        }
+                if (verificationTarget.and(VERIFICATION_TARGET_PREVIEW) != 0) {
+                    waitForPreviewIdle()
+                }
 
-        if (verificationTarget.and(VERIFICATION_TARGET_PREVIEW) != 0) {
-            previewViewStreamingStateIdlingResource.waitForIdle()
-        }
-
-        if (verificationTarget.and(VERIFICATION_TARGET_IMAGE_CAPTURE) != 0) {
-            // Presses capture button
-            Espresso.onView(ViewMatchers.withId(R.id.Picture)).perform(ViewActions.click())
-
-            // Waits for the take picture success callback.
-            takePictureIdlingResource.waitForIdle()
-        }
-    }
-
-    private fun launchActivityAndRetrieveIdlingResources() {
-        val intent = ApplicationProvider.getApplicationContext<Context>().packageManager
-            .getLaunchIntentForPackage(BASIC_SAMPLE_PACKAGE)?.apply {
-                putExtra(INTENT_EXTRA_KEY_CAMERA_ID, cameraId)
-                putExtra(INTENT_EXTRA_KEY_EXTENSION_MODE, extensionMode)
-                putExtra(INTENT_EXTRA_KEY_DELETE_CAPTURED_IMAGE, true)
-                flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
+                if (verificationTarget.and(VERIFICATION_TARGET_IMAGE_CAPTURE) != 0) {
+                    takePictureAndWaitForImageSavedIdle()
+                }
             }
-
-        activityScenario = ActivityScenario.launch(intent)
-
-        activityScenario.onActivity {
-            initializationIdlingResource = it.initializationIdlingResource
-            previewViewStreamingStateIdlingResource = it.previewViewStreamingStateIdlingResource
-            previewViewIdleStateIdlingResource = it.previewViewIdleStateIdlingResource
-            takePictureIdlingResource = it.takePictureIdlingResource
-        }
-
-        // Waits for CameraExtensionsActivity's initialization to be complete
-        initializationIdlingResource.waitForIdle()
-
-        activityScenario.onActivity {
-            assumeTrue(it.isExtensionModeSupported(cameraId, extensionMode))
-        }
-
-        // Waits for preview view turned to STREAMING state to make sure that the capture session
-        // has been created and the capture stages can be retrieved from the vendor library
-        // successfully.
-        previewViewStreamingStateIdlingResource.waitForIdle()
-
-        activityScenario.onActivity {
-            // Checks that CameraExtensionsActivity's current extension mode is correct.
-            assertThat(it.currentExtensionMode).isEqualTo(extensionMode)
         }
     }
 }
\ No newline at end of file
diff --git a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/OpenCloseCameraStressTest.kt b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/OpenCloseCameraStressTest.kt
index de449eb..465e321 100644
--- a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/OpenCloseCameraStressTest.kt
+++ b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/OpenCloseCameraStressTest.kt
@@ -26,9 +26,9 @@
 import androidx.camera.core.Preview
 import androidx.camera.core.UseCase
 import androidx.camera.extensions.ExtensionsManager
-import androidx.camera.integration.extensions.util.ExtensionsTestUtil
-import androidx.camera.integration.extensions.util.ExtensionsTestUtil.STRESS_TEST_OPERATION_REPEAT_COUNT
-import androidx.camera.integration.extensions.util.ExtensionsTestUtil.STRESS_TEST_REPEAT_COUNT
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil.STRESS_TEST_OPERATION_REPEAT_COUNT
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil.STRESS_TEST_REPEAT_COUNT
 import androidx.camera.integration.extensions.utils.CameraSelectorUtil
 import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
@@ -88,7 +88,7 @@
 
     @Before
     fun setUp(): Unit = runBlocking {
-        assumeTrue(ExtensionsTestUtil.isTargetDeviceAvailableForExtensions())
+        assumeTrue(CameraXExtensionsTestUtil.isTargetDeviceAvailableForExtensions())
         cameraProvider = ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
         extensionsManager = ExtensionsManager.getInstanceAsync(
             context,
@@ -137,7 +137,7 @@
         @JvmStatic
         @get:Parameterized.Parameters(name = "cameraId = {0}, extensionMode = {1}")
         val parameters: Collection<Array<Any>>
-            get() = ExtensionsTestUtil.getAllCameraIdExtensionModeCombinations()
+            get() = CameraXExtensionsTestUtil.getAllCameraIdExtensionModeCombinations()
     }
 
     @LabTestRule.LabTestOnly
@@ -164,7 +164,7 @@
         vararg useCases: UseCase,
         repeatCount: Int = STRESS_TEST_OPERATION_REPEAT_COUNT
     ): Unit = runBlocking {
-        for (i in 1..repeatCount) {
+        repeat(repeatCount) {
             val openCameraLatch = CountDownLatch(1)
             val closeCameraLatch = CountDownLatch(1)
             val observer = Observer<CameraState> { state ->
diff --git a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/OpenCloseCaptureSessionStressTest.kt b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/OpenCloseCaptureSessionStressTest.kt
index fadb7ad..0ec8da2 100644
--- a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/OpenCloseCaptureSessionStressTest.kt
+++ b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/OpenCloseCaptureSessionStressTest.kt
@@ -40,9 +40,9 @@
 import androidx.camera.core.impl.UseCaseConfigFactory
 import androidx.camera.extensions.ExtensionMode
 import androidx.camera.extensions.ExtensionsManager
-import androidx.camera.integration.extensions.util.ExtensionsTestUtil
-import androidx.camera.integration.extensions.util.ExtensionsTestUtil.STRESS_TEST_OPERATION_REPEAT_COUNT
-import androidx.camera.integration.extensions.util.ExtensionsTestUtil.STRESS_TEST_REPEAT_COUNT
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil.STRESS_TEST_OPERATION_REPEAT_COUNT
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil.STRESS_TEST_REPEAT_COUNT
 import androidx.camera.integration.extensions.utils.CameraSelectorUtil
 import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
@@ -104,7 +104,7 @@
 
     @Before
     fun setUp(): Unit = runBlocking {
-        assumeTrue(ExtensionsTestUtil.isTargetDeviceAvailableForExtensions())
+        assumeTrue(CameraXExtensionsTestUtil.isTargetDeviceAvailableForExtensions())
         cameraProvider = ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
         extensionsManager = ExtensionsManager.getInstanceAsync(
             context,
@@ -221,7 +221,7 @@
         @JvmStatic
         @get:Parameterized.Parameters(name = "cameraId = {0}, extensionMode = {1}")
         val parameters: Collection<Array<Any>>
-            get() = ExtensionsTestUtil.getAllCameraIdExtensionModeCombinations()
+            get() = CameraXExtensionsTestUtil.getAllCameraIdExtensionModeCombinations()
 
         /**
          * Retrieves the default extended camera config provider id string
diff --git a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/PreviewExtenderValidationTest.kt b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/PreviewExtenderValidationTest.kt
index f707563..c0a25f0 100644
--- a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/PreviewExtenderValidationTest.kt
+++ b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/PreviewExtenderValidationTest.kt
@@ -28,7 +28,7 @@
 import androidx.camera.extensions.impl.RequestUpdateProcessorImpl
 import androidx.camera.extensions.internal.ExtensionVersion
 import androidx.camera.extensions.internal.Version
-import androidx.camera.integration.extensions.util.ExtensionsTestUtil
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil
 import androidx.camera.integration.extensions.utils.CameraSelectorUtil
 import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
@@ -72,7 +72,7 @@
 
     @Before
     fun setUp(): Unit = runBlocking {
-        assumeTrue(ExtensionsTestUtil.isTargetDeviceAvailableForExtensions())
+        assumeTrue(CameraXExtensionsTestUtil.isTargetDeviceAvailableForExtensions())
         cameraProvider = ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
         extensionsManager = ExtensionsManager.getInstanceAsync(
             context,
@@ -112,7 +112,7 @@
         @JvmStatic
         @get:Parameterized.Parameters(name = "cameraId = {0}, extensionMode = {1}")
         val parameters: Collection<Array<Any>>
-            get() = ExtensionsTestUtil.getAllCameraIdExtensionModeCombinations()
+            get() = CameraXExtensionsTestUtil.getAllCameraIdExtensionModeCombinations()
     }
 
     @Test
@@ -123,7 +123,7 @@
 
         // Creates the ImageCaptureExtenderImpl to retrieve the target format/resolutions pair list
         // from vendor library for the target effect mode.
-        val impl = ExtensionsTestUtil.createPreviewExtenderImpl(
+        val impl = CameraXExtensionsTestUtil.createPreviewExtenderImpl(
             extensionMode,
             cameraId,
             cameraCharacteristics
@@ -139,7 +139,7 @@
     fun returnsNullFromOnPresetSession_whenAPILevelOlderThan28() {
         // Creates the ImageCaptureExtenderImpl to check that onPresetSession() returns null when
         // API level is older than 28.
-        val impl = ExtensionsTestUtil.createPreviewExtenderImpl(
+        val impl = CameraXExtensionsTestUtil.createPreviewExtenderImpl(
             extensionMode,
             cameraId,
             cameraCharacteristics
@@ -149,7 +149,7 @@
 
     @Test
     fun returnCorrectProcessor() {
-        val impl = ExtensionsTestUtil.createPreviewExtenderImpl(
+        val impl = CameraXExtensionsTestUtil.createPreviewExtenderImpl(
             extensionMode,
             cameraId,
             cameraCharacteristics
diff --git a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/PreviewProcessorTimestampTest.kt b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/PreviewProcessorTimestampTest.kt
index 5895e4c..f96fbed 100644
--- a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/PreviewProcessorTimestampTest.kt
+++ b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/PreviewProcessorTimestampTest.kt
@@ -39,7 +39,7 @@
 import androidx.camera.core.impl.UseCaseConfigFactory
 import androidx.camera.extensions.ExtensionMode
 import androidx.camera.extensions.ExtensionsManager
-import androidx.camera.integration.extensions.util.ExtensionsTestUtil
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil
 import androidx.camera.integration.extensions.utils.CameraSelectorUtil
 import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
@@ -147,7 +147,7 @@
 
     @Before
     fun setUp(): Unit = runBlocking {
-        assumeTrue(ExtensionsTestUtil.isTargetDeviceAvailableForExtensions())
+        assumeTrue(CameraXExtensionsTestUtil.isTargetDeviceAvailableForExtensions())
         assumeFalse(Build.BRAND.equals("Samsung", ignoreCase = true))
         cameraProvider = ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
         extensionsManager = ExtensionsManager.getInstanceAsync(
@@ -238,7 +238,7 @@
         @JvmStatic
         @get:Parameterized.Parameters(name = "cameraId = {0}, extensionMode = {1}")
         val parameters: Collection<Array<Any>>
-            get() = ExtensionsTestUtil.getAllCameraIdExtensionModeCombinations()
+            get() = CameraXExtensionsTestUtil.getAllCameraIdExtensionModeCombinations()
 
         /**
          * Retrieves the default extended camera config provider id string
diff --git a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/PreviewTest.kt b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/PreviewTest.kt
index 28ea3620..23690eb 100644
--- a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/PreviewTest.kt
+++ b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/PreviewTest.kt
@@ -18,22 +18,23 @@
 
 import android.Manifest
 import android.content.Context
-import android.content.Intent
 import androidx.camera.camera2.Camera2Config
-import androidx.camera.integration.extensions.IntentExtraKey.INTENT_EXTRA_KEY_CAMERA_ID
-import androidx.camera.integration.extensions.IntentExtraKey.INTENT_EXTRA_KEY_EXTENSION_MODE
-import androidx.camera.integration.extensions.util.ExtensionsTestUtil
+import androidx.camera.extensions.ExtensionsManager
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil.assumeExtensionModeSupported
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil.launchCameraExtensionsActivity
+import androidx.camera.integration.extensions.util.HOME_TIMEOUT_MS
+import androidx.camera.integration.extensions.util.waitForPreviewIdle
+import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CameraUtil.PreTestCameraIdList
 import androidx.camera.testing.CoreAppTestUtil
-import androidx.camera.testing.waitForIdle
-import androidx.test.core.app.ActivityScenario
 import androidx.test.core.app.ApplicationProvider
-import androidx.test.espresso.IdlingResource
 import androidx.test.filters.LargeTest
 import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.rule.GrantPermissionRule
-import com.google.common.truth.Truth.assertThat
+import androidx.test.uiautomator.UiDevice
+import java.util.concurrent.TimeUnit
 import org.junit.After
 import org.junit.Assume.assumeTrue
 import org.junit.Before
@@ -42,14 +43,13 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
-private const val BASIC_SAMPLE_PACKAGE = "androidx.camera.integration.extensions"
-
 /**
  * The tests to verify that Preview can work well when extension modes are enabled.
  */
 @LargeTest
 @RunWith(Parameterized::class)
 class PreviewTest(private val cameraId: String, private val extensionMode: Int) {
+    private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
 
     @get:Rule
     val useCamera = CameraUtil.grantCameraPermissionAndPreTest(
@@ -60,27 +60,55 @@
     val storagePermissionRule =
         GrantPermissionRule.grant(Manifest.permission.WRITE_EXTERNAL_STORAGE)!!
 
-    private lateinit var activityScenario: ActivityScenario<CameraExtensionsActivity>
+    private val context = ApplicationProvider.getApplicationContext<Context>()
 
     companion object {
         @Parameterized.Parameters(name = "cameraId = {0}, extensionMode = {1}")
         @JvmStatic
-        fun parameters() = ExtensionsTestUtil.getAllCameraIdExtensionModeCombinations()
+        fun parameters() = CameraXExtensionsTestUtil.getAllCameraIdExtensionModeCombinations()
     }
 
     @Before
-    fun setUp() {
-        assumeTrue(ExtensionsTestUtil.isTargetDeviceAvailableForExtensions())
+    fun setup() {
+        assumeTrue(CameraUtil.deviceHasCamera())
+        assumeTrue(CameraXExtensionsTestUtil.isTargetDeviceAvailableForExtensions())
         // Clear the device UI and check if there is no dialog or lock screen on the top of the
-        // window before starting the test.
+        // window before start the test.
         CoreAppTestUtil.prepareDeviceUI(InstrumentationRegistry.getInstrumentation())
+        // Use the natural orientation throughout these tests to ensure the activity isn't
+        // recreated unexpectedly. This will also freeze the sensors until
+        // mDevice.unfreezeRotation() in the tearDown() method. Any simulated rotations will be
+        // explicitly initiated from within the test.
+        device.setOrientationNatural()
+
+        val cameraProvider =
+            ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
+
+        val extensionsManager = ExtensionsManager.getInstanceAsync(
+            context,
+            cameraProvider
+        )[10000, TimeUnit.MILLISECONDS]
+
+        assumeExtensionModeSupported(extensionsManager, cameraId, extensionMode)
     }
 
     @After
     fun tearDown() {
-        if (::activityScenario.isInitialized) {
-            activityScenario.onActivity { it.finish() }
-        }
+        val cameraProvider =
+            ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
+        cameraProvider.shutdown()
+
+        val extensionsManager = ExtensionsManager.getInstanceAsync(
+            context,
+            cameraProvider
+        )[10000, TimeUnit.MILLISECONDS]
+        extensionsManager.shutdown()
+
+        // Unfreeze rotation so the device can choose the orientation via its own policy. Be nice
+        // to other tests :)
+        device.unfreezeRotation()
+        device.pressHome()
+        device.waitForIdle(HOME_TIMEOUT_MS)
     }
 
     /**
@@ -89,37 +117,12 @@
      */
     @Test
     fun previewWithExtensionModeCanEnterStreamingState() {
-        val intent = ApplicationProvider.getApplicationContext<Context>().packageManager
-            .getLaunchIntentForPackage(BASIC_SAMPLE_PACKAGE)?.apply {
-                putExtra(INTENT_EXTRA_KEY_CAMERA_ID, cameraId)
-                putExtra(INTENT_EXTRA_KEY_EXTENSION_MODE, extensionMode)
-                flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
+        val activityScenario = launchCameraExtensionsActivity(cameraId, extensionMode)
+
+        with(activityScenario) {
+            use {
+                waitForPreviewIdle()
             }
-
-        activityScenario = ActivityScenario.launch(intent)
-        var initializationIdlingResource: IdlingResource? = null
-        var previewViewIdlingResource: IdlingResource? = null
-
-        activityScenario.onActivity {
-            initializationIdlingResource = it.initializationIdlingResource
-            previewViewIdlingResource = it.previewViewStreamingStateIdlingResource
-        }
-
-        // Wait for CameraExtensionsActivity's initialization to be complete
-        initializationIdlingResource.waitForIdle()
-
-        activityScenario.onActivity {
-            assumeTrue(it.isExtensionModeSupported(cameraId, extensionMode))
-        }
-
-        // Waits for preview view turned to STREAMING state to make sure that the capture session
-        // has been created and the capture stages can be retrieved from the vendor library
-        // successfully.
-        previewViewIdlingResource.waitForIdle()
-
-        activityScenario.onActivity {
-            // Checks that CameraExtensionsActivity's current extension mode is correct.
-            assertThat(it.currentExtensionMode).isEqualTo(extensionMode)
         }
     }
 }
\ No newline at end of file
diff --git a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/SwitchAvailableModesStressTest.kt b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/SwitchAvailableModesStressTest.kt
index e03c34a..4d557ad 100644
--- a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/SwitchAvailableModesStressTest.kt
+++ b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/SwitchAvailableModesStressTest.kt
@@ -18,31 +18,31 @@
 
 import android.Manifest
 import android.content.Context
-import android.content.Intent
 import androidx.camera.camera2.Camera2Config
 import androidx.camera.extensions.ExtensionMode
-import androidx.camera.integration.extensions.IntentExtraKey.INTENT_EXTRA_KEY_CAMERA_ID
-import androidx.camera.integration.extensions.IntentExtraKey.INTENT_EXTRA_KEY_DELETE_CAPTURED_IMAGE
-import androidx.camera.integration.extensions.IntentExtraKey.INTENT_EXTRA_KEY_EXTENSION_MODE
-import androidx.camera.integration.extensions.util.ExtensionsTestUtil
-import androidx.camera.integration.extensions.util.ExtensionsTestUtil.STRESS_TEST_OPERATION_REPEAT_COUNT
+import androidx.camera.extensions.ExtensionsManager
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil.STRESS_TEST_OPERATION_REPEAT_COUNT
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil.launchCameraExtensionsActivity
+import androidx.camera.integration.extensions.util.HOME_TIMEOUT_MS
+import androidx.camera.integration.extensions.util.takePictureAndWaitForImageSavedIdle
+import androidx.camera.integration.extensions.util.waitForPreviewIdle
+import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CameraUtil.PreTestCameraIdList
 import androidx.camera.testing.CoreAppTestUtil
 import androidx.camera.testing.LabTestRule
 import androidx.camera.testing.StressTestRule
-import androidx.camera.testing.waitForIdle
-import androidx.test.core.app.ActivityScenario
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.espresso.Espresso
 import androidx.test.espresso.action.ViewActions
-import androidx.test.espresso.idling.CountingIdlingResource
 import androidx.test.espresso.matcher.ViewMatchers
 import androidx.test.filters.LargeTest
 import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.rule.GrantPermissionRule
 import androidx.test.uiautomator.UiDevice
 import androidx.testutils.RepeatRule
+import java.util.concurrent.TimeUnit
 import org.junit.After
 import org.junit.Assume.assumeTrue
 import org.junit.Before
@@ -52,8 +52,6 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
-private const val BASIC_SAMPLE_PACKAGE = "androidx.camera.integration.extensions"
-
 /**
  * Stress tests to verify that Preview and ImageCapture can work well when switching modes.
  */
@@ -68,24 +66,17 @@
     )
 
     @get:Rule
-    val labTest: LabTestRule = LabTestRule()
-
-    @get:Rule
-    val repeatRule = RepeatRule()
-
-    @get:Rule
     val storagePermissionRule =
         GrantPermissionRule.grant(Manifest.permission.WRITE_EXTERNAL_STORAGE)!!
 
-    private lateinit var activityScenario: ActivityScenario<CameraExtensionsActivity>
+    private val context = ApplicationProvider.getApplicationContext<Context>()
 
-    private lateinit var initializationIdlingResource: CountingIdlingResource
-    private lateinit var previewViewIdlingResource: CountingIdlingResource
-    private lateinit var takePictureIdlingResource: CountingIdlingResource
+    private var firstSupportedExtensionMode: Int = ExtensionMode.NONE
 
     companion object {
         @ClassRule
-        @JvmField val stressTest = StressTestRule()
+        @JvmField
+        val stressTest = StressTestRule()
 
         @Parameterized.Parameters(name = "cameraId = {0}")
         @JvmStatic
@@ -93,93 +84,95 @@
     }
 
     @Before
-    fun setUp() {
-        assumeTrue(ExtensionsTestUtil.isTargetDeviceAvailableForExtensions())
+    fun setup() {
+        assumeTrue(CameraUtil.deviceHasCamera())
+        assumeTrue(CameraXExtensionsTestUtil.isTargetDeviceAvailableForExtensions())
         // Clear the device UI and check if there is no dialog or lock screen on the top of the
-        // window before starting the test.
+        // window before start the test.
         CoreAppTestUtil.prepareDeviceUI(InstrumentationRegistry.getInstrumentation())
         // Use the natural orientation throughout these tests to ensure the activity isn't
         // recreated unexpectedly. This will also freeze the sensors until
         // mDevice.unfreezeRotation() in the tearDown() method. Any simulated rotations will be
         // explicitly initiated from within the test.
         device.setOrientationNatural()
+
+        val cameraProvider =
+            ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
+
+        val extensionsManager = ExtensionsManager.getInstanceAsync(
+            context,
+            cameraProvider
+        )[10000, TimeUnit.MILLISECONDS]
+
+        // Checks whether any extension mode can be supported first before launching the activity.
+        CameraXExtensionsTestUtil.assumeAnyExtensionModeSupported(
+            extensionsManager,
+            cameraId
+        )
+
+        firstSupportedExtensionMode =
+            CameraXExtensionsTestUtil.getFirstSupportedExtensionMode(extensionsManager, cameraId)
     }
 
     @After
     fun tearDown() {
+        val cameraProvider =
+            ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
+        cameraProvider.shutdown()
+
+        val extensionsManager = ExtensionsManager.getInstanceAsync(
+            context,
+            cameraProvider
+        )[10000, TimeUnit.MILLISECONDS]
+        extensionsManager.shutdown()
+
         // Unfreeze rotation so the device can choose the orientation via its own policy. Be nice
         // to other tests :)
         device.unfreezeRotation()
-
-        if (::activityScenario.isInitialized) {
-            activityScenario.onActivity { it.finish() }
-        }
+        device.pressHome()
+        device.waitForIdle(HOME_TIMEOUT_MS)
     }
 
     @LabTestRule.LabTestOnly
     @Test
-    @RepeatRule.Repeat(times = ExtensionsTestUtil.STRESS_TEST_REPEAT_COUNT)
+    @RepeatRule.Repeat(times = CameraXExtensionsTestUtil.STRESS_TEST_REPEAT_COUNT)
     fun switchModeTenTimes_canCaptureImageInEachTime() {
-        launchActivityAndRetrieveIdlingResources()
+        val activityScenario = launchCameraExtensionsActivity(cameraId, firstSupportedExtensionMode)
 
-        for (i in 1..STRESS_TEST_OPERATION_REPEAT_COUNT) {
-            // Issues take picture.
-            Espresso.onView(ViewMatchers.withId(R.id.Picture)).perform(ViewActions.click())
+        with(activityScenario) {
+            use {
+                repeat(STRESS_TEST_OPERATION_REPEAT_COUNT) {
+                    // Switches to next available mode
+                    Espresso.onView(ViewMatchers.withId(R.id.PhotoToggle))
+                        .perform(ViewActions.click())
 
-            // Waits for the take picture success callback.
-            takePictureIdlingResource.waitForIdle()
+                    // Waits for preview view turned to STREAMING state after switching mode
+                    waitForPreviewIdle()
 
-            previewViewIdlingResource.increment()
-
-            // Switches to next available mode
-            Espresso.onView(ViewMatchers.withId(R.id.PhotoToggle)).perform(ViewActions.click())
-
-            // Waits for preview view turned to STREAMING state after switching camera
-            previewViewIdlingResource.waitForIdle()
+                    // Waits for the take picture success callback.
+                    takePictureAndWaitForImageSavedIdle()
+                }
+            }
         }
     }
 
     @LabTestRule.LabTestOnly
     @Test
-    @RepeatRule.Repeat(times = ExtensionsTestUtil.STRESS_TEST_REPEAT_COUNT)
+    @RepeatRule.Repeat(times = CameraXExtensionsTestUtil.STRESS_TEST_REPEAT_COUNT)
     fun canCaptureImage_afterSwitchModeTenTimes() {
-        launchActivityAndRetrieveIdlingResources()
+        val activityScenario = launchCameraExtensionsActivity(cameraId, firstSupportedExtensionMode)
 
-        // Switches to next available mode ten times
-        for (i in 1..STRESS_TEST_OPERATION_REPEAT_COUNT) {
-            Espresso.onView(ViewMatchers.withId(R.id.PhotoToggle)).perform(ViewActions.click())
-        }
+        with(activityScenario) {
+            use {
+                repeat(STRESS_TEST_OPERATION_REPEAT_COUNT) {
+                    // Switches to next available mode
+                    Espresso.onView(ViewMatchers.withId(R.id.PhotoToggle))
+                        .perform(ViewActions.click())
 
-        // Issues take picture.
-        Espresso.onView(ViewMatchers.withId(R.id.Picture)).perform(ViewActions.click())
-
-        // Waits for the take picture success callback.
-        takePictureIdlingResource.waitForIdle()
-    }
-
-    private fun launchActivityAndRetrieveIdlingResources() {
-        val intent = ApplicationProvider.getApplicationContext<Context>().packageManager
-            .getLaunchIntentForPackage(BASIC_SAMPLE_PACKAGE)?.apply {
-                putExtra(INTENT_EXTRA_KEY_CAMERA_ID, cameraId)
-                putExtra(INTENT_EXTRA_KEY_EXTENSION_MODE, ExtensionMode.NONE)
-                putExtra(INTENT_EXTRA_KEY_DELETE_CAPTURED_IMAGE, true)
-                flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
+                    // Waits for the take picture success callback.
+                    takePictureAndWaitForImageSavedIdle()
+                }
             }
-
-        activityScenario = ActivityScenario.launch(intent)
-
-        activityScenario.onActivity {
-            initializationIdlingResource = it.initializationIdlingResource
-            previewViewIdlingResource = it.previewViewStreamingStateIdlingResource
-            takePictureIdlingResource = it.takePictureIdlingResource
         }
-
-        // Waits for CameraExtensionsActivity's initialization to be complete
-        initializationIdlingResource.waitForIdle()
-
-        // Waits for preview view turned to STREAMING state to make sure that the capture session
-        // has been created and the capture stages can be retrieved from the vendor library
-        // successfully.
-        previewViewIdlingResource.waitForIdle()
     }
 }
diff --git a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/SwitchCameraStressTest.kt b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/SwitchCameraStressTest.kt
index 0d4225a..59e5d43 100644
--- a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/SwitchCameraStressTest.kt
+++ b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/SwitchCameraStressTest.kt
@@ -18,32 +18,30 @@
 
 import android.Manifest
 import android.content.Context
-import android.content.Intent
 import androidx.camera.camera2.Camera2Config
 import androidx.camera.core.CameraSelector
-import androidx.camera.extensions.ExtensionMode
-import androidx.camera.integration.extensions.IntentExtraKey.INTENT_EXTRA_KEY_CAMERA_ID
-import androidx.camera.integration.extensions.IntentExtraKey.INTENT_EXTRA_KEY_DELETE_CAPTURED_IMAGE
-import androidx.camera.integration.extensions.IntentExtraKey.INTENT_EXTRA_KEY_EXTENSION_MODE
-import androidx.camera.integration.extensions.util.ExtensionsTestUtil
-import androidx.camera.integration.extensions.util.ExtensionsTestUtil.STRESS_TEST_OPERATION_REPEAT_COUNT
+import androidx.camera.extensions.ExtensionsManager
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil.STRESS_TEST_OPERATION_REPEAT_COUNT
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil.launchCameraExtensionsActivity
+import androidx.camera.integration.extensions.util.HOME_TIMEOUT_MS
+import androidx.camera.integration.extensions.util.takePictureAndWaitForImageSavedIdle
+import androidx.camera.integration.extensions.util.waitForPreviewIdle
+import androidx.camera.integration.extensions.utils.ExtensionModeUtil
+import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CameraUtil.PreTestCameraIdList
 import androidx.camera.testing.CoreAppTestUtil
 import androidx.camera.testing.LabTestRule
 import androidx.camera.testing.StressTestRule
-import androidx.camera.testing.waitForIdle
-import androidx.test.core.app.ActivityScenario
 import androidx.test.core.app.ApplicationProvider
-import androidx.test.espresso.Espresso
-import androidx.test.espresso.action.ViewActions
-import androidx.test.espresso.idling.CountingIdlingResource
-import androidx.test.espresso.matcher.ViewMatchers
 import androidx.test.filters.LargeTest
 import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.rule.GrantPermissionRule
 import androidx.test.uiautomator.UiDevice
 import androidx.testutils.RepeatRule
+import androidx.testutils.withActivity
+import java.util.concurrent.TimeUnit
 import org.junit.After
 import org.junit.Assume.assumeTrue
 import org.junit.Before
@@ -53,7 +51,7 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
-private const val BASIC_SAMPLE_PACKAGE = "androidx.camera.integration.extensions"
+private const val DEFAULT_BACK_CAMERA_ID = "0"
 
 /**
  * Stress tests to verify that Preview and ImageCapture can work well when switching cameras.
@@ -69,20 +67,12 @@
     )
 
     @get:Rule
-    val labTest: LabTestRule = LabTestRule()
-
-    @get:Rule
-    val repeatRule = RepeatRule()
-
-    @get:Rule
     val storagePermissionRule =
         GrantPermissionRule.grant(Manifest.permission.WRITE_EXTERNAL_STORAGE)!!
 
-    private lateinit var activityScenario: ActivityScenario<CameraExtensionsActivity>
+    private val context = ApplicationProvider.getApplicationContext<Context>()
 
-    private lateinit var initializationIdlingResource: CountingIdlingResource
-    private lateinit var previewViewIdlingResource: CountingIdlingResource
-    private lateinit var takePictureIdlingResource: CountingIdlingResource
+    private var startingExtensionMode: Int = extensionMode
 
     companion object {
         @ClassRule
@@ -90,123 +80,123 @@
 
         @Parameterized.Parameters(name = "extensionMode = {0}")
         @JvmStatic
-        fun parameters() = arrayOf(
-            ExtensionMode.BOKEH,
-            ExtensionMode.HDR,
-            ExtensionMode.NIGHT,
-            ExtensionMode.FACE_RETOUCH,
-            ExtensionMode.AUTO
-        )
+        fun parameters() = ExtensionModeUtil.AVAILABLE_EXTENSION_MODES
     }
 
     @Before
-    fun setUp() {
-        assumeTrue(ExtensionsTestUtil.isTargetDeviceAvailableForExtensions())
+    fun setup() {
+        assumeTrue(CameraUtil.deviceHasCamera())
+        assumeTrue(CameraXExtensionsTestUtil.isTargetDeviceAvailableForExtensions())
         // Clear the device UI and check if there is no dialog or lock screen on the top of the
-        // window before starting the test.
+        // window before start the test.
         CoreAppTestUtil.prepareDeviceUI(InstrumentationRegistry.getInstrumentation())
         // Use the natural orientation throughout these tests to ensure the activity isn't
         // recreated unexpectedly. This will also freeze the sensors until
         // mDevice.unfreezeRotation() in the tearDown() method. Any simulated rotations will be
         // explicitly initiated from within the test.
         device.setOrientationNatural()
+
+        val cameraProvider =
+            ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
+
+        val extensionsManager = ExtensionsManager.getInstanceAsync(
+            context,
+            cameraProvider
+        )[10000, TimeUnit.MILLISECONDS]
+
+        val isBackCameraSupported = extensionsManager.isExtensionAvailable(
+            CameraSelector.DEFAULT_BACK_CAMERA, extensionMode
+        )
+        val isFrontCameraSupported = extensionsManager.isExtensionAvailable(
+            CameraSelector.DEFAULT_FRONT_CAMERA, extensionMode
+        )
+
+        // Checks whether the extension mode can be supported first before launching the activity.
+        // Only runs the test when at least one of the back or front cameras support the target
+        // testing extension mode
+        assumeTrue(isBackCameraSupported || isFrontCameraSupported)
+
+        if (!isBackCameraSupported) {
+            startingExtensionMode = CameraXExtensionsTestUtil.getFirstSupportedExtensionMode(
+                extensionsManager,
+                DEFAULT_BACK_CAMERA_ID
+            )
+        }
     }
 
     @After
     fun tearDown() {
+        val cameraProvider =
+            ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
+        cameraProvider.shutdown()
+
+        val extensionsManager = ExtensionsManager.getInstanceAsync(
+            context,
+            cameraProvider
+        )[10000, TimeUnit.MILLISECONDS]
+        extensionsManager.shutdown()
+
         // Unfreeze rotation so the device can choose the orientation via its own policy. Be nice
         // to other tests :)
         device.unfreezeRotation()
-
-        if (::activityScenario.isInitialized) {
-            activityScenario.onActivity { it.finish() }
-        }
+        device.pressHome()
+        device.waitForIdle(HOME_TIMEOUT_MS)
     }
 
     @LabTestRule.LabTestOnly
     @Test
-    @RepeatRule.Repeat(times = ExtensionsTestUtil.STRESS_TEST_REPEAT_COUNT)
+    @RepeatRule.Repeat(times = CameraXExtensionsTestUtil.STRESS_TEST_REPEAT_COUNT)
     fun switchCameraTenTimes_canCaptureImageInEachTime() {
-        launchActivityAndRetrieveIdlingResources()
+        val activityScenario = launchCameraExtensionsActivity(
+            DEFAULT_BACK_CAMERA_ID,
+            startingExtensionMode
+        )
 
-        for (i in 1..STRESS_TEST_OPERATION_REPEAT_COUNT) {
-            // Issues take picture.
-            Espresso.onView(ViewMatchers.withId(R.id.Picture)).perform(ViewActions.click())
+        with(activityScenario) {
+            use {
+                repeat(STRESS_TEST_OPERATION_REPEAT_COUNT) {
+                    // Waits for the take picture success callback.
+                    takePictureAndWaitForImageSavedIdle()
 
-            // Waits for the take picture success callback.
-            takePictureIdlingResource.waitForIdle()
+                    withActivity {
+                        // Switches camera
+                        switchCameras()
+                        // Switches to the target testing extension mode as possible because some
+                        // extension modes may not be supported in some lens facing of cameras.
+                        switchToExtensionMode(extensionMode)
+                    }
 
-            previewViewIdlingResource.increment()
-
-            activityScenario.onActivity {
-                // Switches camera
-                it.switchCameras()
-                // Switches to the target testing extension mode as possible because some extension
-                // modes may not be supported in some lens facing of cameras.
-                it.switchToExtensionMode(extensionMode)
+                    // Waits for preview view turned to STREAMING state after switching camera
+                    waitForPreviewIdle()
+                }
             }
-
-            // Waits for preview view turned to STREAMING state after switching camera
-            previewViewIdlingResource.waitForIdle()
         }
     }
 
     @LabTestRule.LabTestOnly
     @Test
-    @RepeatRule.Repeat(times = ExtensionsTestUtil.STRESS_TEST_REPEAT_COUNT)
+    @RepeatRule.Repeat(times = CameraXExtensionsTestUtil.STRESS_TEST_REPEAT_COUNT)
     fun canCaptureImage_afterSwitchCameraTenTimes() {
-        launchActivityAndRetrieveIdlingResources()
+        val activityScenario = launchCameraExtensionsActivity(
+            DEFAULT_BACK_CAMERA_ID,
+            startingExtensionMode
+        )
 
-        // Pauses and resumes activity 10 times
-        for (i in 1..STRESS_TEST_OPERATION_REPEAT_COUNT) {
-            activityScenario.onActivity {
-                // Switches camera
-                it.switchCameras()
-                // Switches to the target testing extension mode as possible because some extension
-                // modes may not be supported in some lens facing of cameras.
-                it.switchToExtensionMode(extensionMode)
+        with(activityScenario) {
+            use {
+                repeat(STRESS_TEST_OPERATION_REPEAT_COUNT) {
+                    withActivity {
+                        // Switches camera
+                        switchCameras()
+                        // Switches to the target testing extension mode as possible because some
+                        // extension modes may not be supported in some lens facing of cameras.
+                        switchToExtensionMode(extensionMode)
+                    }
+                }
+
+                // Waits for the take picture success callback.
+                takePictureAndWaitForImageSavedIdle()
             }
         }
-
-        // Presses capture button
-        Espresso.onView(ViewMatchers.withId(R.id.Picture)).perform(ViewActions.click())
-
-        // Waits for the take picture success callback.
-        takePictureIdlingResource.waitForIdle()
-    }
-
-    private fun launchActivityAndRetrieveIdlingResources() {
-        val intent = ApplicationProvider.getApplicationContext<Context>().packageManager
-            .getLaunchIntentForPackage(BASIC_SAMPLE_PACKAGE)?.apply {
-                putExtra(INTENT_EXTRA_KEY_CAMERA_ID, "0")
-                putExtra(INTENT_EXTRA_KEY_EXTENSION_MODE, extensionMode)
-                putExtra(INTENT_EXTRA_KEY_DELETE_CAPTURED_IMAGE, true)
-                flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
-            }
-
-        activityScenario = ActivityScenario.launch(intent)
-
-        activityScenario.onActivity {
-            initializationIdlingResource = it.initializationIdlingResource
-            previewViewIdlingResource = it.previewViewStreamingStateIdlingResource
-            takePictureIdlingResource = it.takePictureIdlingResource
-        }
-
-        // Waits for CameraExtensionsActivity's initialization to be complete
-        initializationIdlingResource.waitForIdle()
-
-        // Only runs the test when at least one of the back or front cameras support the target
-        // testing extension mode
-        activityScenario.onActivity {
-            assumeTrue(
-                it.isExtensionModeSupported(CameraSelector.DEFAULT_BACK_CAMERA, extensionMode) ||
-                    it.isExtensionModeSupported(CameraSelector.DEFAULT_FRONT_CAMERA, extensionMode)
-            )
-        }
-
-        // Waits for preview view turned to STREAMING state to make sure that the capture session
-        // has been created and the capture stages can be retrieved from the vendor library
-        // successfully.
-        previewViewIdlingResource.waitForIdle()
     }
 }
diff --git a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/camera2extensions/Camera2ExtensionsActivityTest.kt b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/camera2extensions/Camera2ExtensionsActivityTest.kt
index 83bfe24..e15f5b5 100644
--- a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/camera2extensions/Camera2ExtensionsActivityTest.kt
+++ b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/camera2extensions/Camera2ExtensionsActivityTest.kt
@@ -23,8 +23,9 @@
 import androidx.camera.integration.extensions.Camera2ExtensionsActivity
 import androidx.camera.integration.extensions.IntentExtraKey.INTENT_EXTRA_KEY_CAMERA_ID
 import androidx.camera.integration.extensions.IntentExtraKey.INTENT_EXTRA_KEY_EXTENSION_MODE
+import androidx.camera.integration.extensions.util.BASIC_SAMPLE_PACKAGE
 import androidx.camera.integration.extensions.util.Camera2ExtensionsTestUtil
-import androidx.camera.integration.extensions.util.EXTENSIONS_TEST_APP_PACKAGE
+import androidx.camera.integration.extensions.util.CameraXExtensionsTestUtil
 import androidx.camera.integration.extensions.util.waitForCaptureSessionConfiguredIdle
 import androidx.camera.integration.extensions.util.waitForImageSavedIdle
 import androidx.camera.integration.extensions.util.waitForPreviewIdle
@@ -80,7 +81,7 @@
     @Before
     fun setup() {
         Assume.assumeTrue(CameraUtil.deviceHasCamera())
-        CoreAppTestUtil.assumeCompatibleDevice()
+        assumeTrue(CameraXExtensionsTestUtil.isTargetDeviceAvailableForExtensions())
         // Clears the device UI and check if there is no dialog or lock screen on the top of the
         // window before start the test.
         CoreAppTestUtil.prepareDeviceUI(InstrumentationRegistry.getInstrumentation())
@@ -209,7 +210,7 @@
         val context = ApplicationProvider.getApplicationContext<Context>()
         assumeTrue(isCamera2ExtensionModeSupported(context, cameraId, extensionMode))
         val intent = context.packageManager
-            .getLaunchIntentForPackage(EXTENSIONS_TEST_APP_PACKAGE)!!.apply {
+            .getLaunchIntentForPackage(BASIC_SAMPLE_PACKAGE)!!.apply {
                 putExtra(INTENT_EXTRA_KEY_CAMERA_ID, cameraId)
                 putExtra(INTENT_EXTRA_KEY_EXTENSION_MODE, extensionMode)
                 setClassName(context, Camera2ExtensionsActivity::class.java.name)
diff --git a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/util/Camera2ExtensionsActivityTestExtensions.kt b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/util/Camera2ExtensionsActivityTestExtensions.kt
index f7a24cd..13cfeb4 100644
--- a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/util/Camera2ExtensionsActivityTestExtensions.kt
+++ b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/util/Camera2ExtensionsActivityTestExtensions.kt
@@ -27,8 +27,6 @@
 import androidx.test.espresso.matcher.ViewMatchers
 import androidx.testutils.withActivity
 
-const val EXTENSIONS_TEST_APP_PACKAGE = "androidx.camera.integration.extensions"
-
 /**
  * Waits until the capture session has been configured and its idling resource has become idle.
  */
diff --git a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/util/CameraXExtensionsActivityTestExtensions.kt b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/util/CameraXExtensionsActivityTestExtensions.kt
new file mode 100644
index 0000000..3b078a4
--- /dev/null
+++ b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/util/CameraXExtensionsActivityTestExtensions.kt
@@ -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.camera.integration.extensions.util
+
+import androidx.camera.integration.extensions.CameraExtensionsActivity
+import androidx.camera.integration.extensions.R
+import androidx.test.core.app.ActivityScenario
+import androidx.test.espresso.Espresso
+import androidx.test.espresso.IdlingRegistry
+import androidx.test.espresso.action.ViewActions
+import androidx.test.espresso.assertion.ViewAssertions
+import androidx.test.espresso.matcher.ViewMatchers
+import androidx.testutils.withActivity
+
+/**
+ * Waits until the initialization idling resource has become idle.
+ */
+internal fun ActivityScenario<CameraExtensionsActivity>.waitForInitializationIdle() {
+    val idlingResource = withActivity {
+        initializationIdlingResource
+    }
+    try {
+        IdlingRegistry.getInstance().register(idlingResource)
+        // Waits for the initializationIdlingResource becoming idle
+        Espresso.onIdle()
+    } finally { // Always releases the idling resource, in case of timeout exceptions.
+        IdlingRegistry.getInstance().unregister(idlingResource)
+    }
+}
+
+/**
+ * Waits until the PreviewView has become STREAMING state and its idling resource has become idle.
+ */
+internal fun ActivityScenario<CameraExtensionsActivity>.waitForPreviewIdle() {
+    val idlingResource = withActivity {
+        resetPreviewViewStreamingStateIdlingResource()
+        previewViewStreamingStateIdlingResource
+    }
+    try {
+        IdlingRegistry.getInstance().register(idlingResource)
+        // Waits for the previewViewStreamingStateIdlingResource becoming idle
+        Espresso.onView(ViewMatchers.withId(R.id.viewFinder))
+            .check(ViewAssertions.matches(ViewMatchers.isDisplayed()))
+    } finally { // Always releases the idling resource, in case of timeout exceptions.
+        IdlingRegistry.getInstance().unregister(idlingResource)
+    }
+}
+
+/**
+ * Waits until captured image has been saved and its idling resource has become idle.
+ */
+internal fun ActivityScenario<CameraExtensionsActivity>.takePictureAndWaitForImageSavedIdle() {
+    val idlingResource = withActivity {
+        takePictureIdlingResource
+    }
+    try {
+        IdlingRegistry.getInstance().register(idlingResource)
+        // Performs click action and waits for the takePictureIdlingResource becoming idle
+        Espresso.onView(ViewMatchers.withId(R.id.Picture)).perform(ViewActions.click())
+    } finally { // Always releases the idling resource, in case of timeout exceptions.
+        IdlingRegistry.getInstance().unregister(idlingResource)
+    }
+}
\ No newline at end of file
diff --git a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/util/CameraXExtensionsTestUtil.kt b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/util/CameraXExtensionsTestUtil.kt
new file mode 100644
index 0000000..fbece45
--- /dev/null
+++ b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/util/CameraXExtensionsTestUtil.kt
@@ -0,0 +1,259 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.extensions.util
+
+import android.content.Context
+import android.content.Intent
+import android.hardware.camera2.CameraCharacteristics
+import android.os.Build
+import androidx.camera.core.ImageAnalysis
+import androidx.camera.core.ImageCapture
+import androidx.camera.core.Preview
+import androidx.camera.extensions.ExtensionMode
+import androidx.camera.extensions.ExtensionsManager
+import androidx.camera.extensions.impl.AutoImageCaptureExtenderImpl
+import androidx.camera.extensions.impl.AutoPreviewExtenderImpl
+import androidx.camera.extensions.impl.BeautyImageCaptureExtenderImpl
+import androidx.camera.extensions.impl.BeautyPreviewExtenderImpl
+import androidx.camera.extensions.impl.BokehImageCaptureExtenderImpl
+import androidx.camera.extensions.impl.BokehPreviewExtenderImpl
+import androidx.camera.extensions.impl.HdrImageCaptureExtenderImpl
+import androidx.camera.extensions.impl.HdrPreviewExtenderImpl
+import androidx.camera.extensions.impl.ImageCaptureExtenderImpl
+import androidx.camera.extensions.impl.NightImageCaptureExtenderImpl
+import androidx.camera.extensions.impl.NightPreviewExtenderImpl
+import androidx.camera.extensions.impl.PreviewExtenderImpl
+import androidx.camera.extensions.internal.ExtensionVersion
+import androidx.camera.integration.extensions.CameraExtensionsActivity
+import androidx.camera.integration.extensions.IntentExtraKey
+import androidx.camera.integration.extensions.utils.CameraSelectorUtil.createCameraSelectorById
+import androidx.camera.integration.extensions.utils.ExtensionModeUtil
+import androidx.camera.integration.extensions.utils.ExtensionModeUtil.AVAILABLE_EXTENSION_MODES
+import androidx.camera.testing.CameraUtil
+import androidx.test.core.app.ActivityScenario
+import androidx.test.core.app.ApplicationProvider
+import com.google.common.truth.Truth.assertThat
+import junit.framework.AssertionFailedError
+import org.junit.Assume.assumeTrue
+
+object CameraXExtensionsTestUtil {
+
+    /**
+     * Gets a list of all camera id and extension mode combinations.
+     */
+    @JvmStatic
+    fun getAllCameraIdExtensionModeCombinations(): List<Array<Any>> =
+        arrayListOf<Array<Any>>().apply {
+            CameraUtil.getBackwardCompatibleCameraIdListOrThrow().forEach { cameraId ->
+                ExtensionModeUtil.AVAILABLE_EXTENSION_MODES.forEach { mode ->
+                    add(arrayOf(cameraId, mode))
+                }
+            }
+        }
+
+    /**
+     * Gets a list of all camera id and mode combinations. Normal mode and all extension modes will
+     * be included.
+     */
+    @JvmStatic
+    fun getAllCameraIdModeCombinations(): List<Array<Any>> =
+        arrayListOf<Array<Any>>().apply {
+            val allModes = mutableListOf<Int>()
+            allModes.add(0, ExtensionMode.NONE)
+            allModes.addAll(ExtensionModeUtil.AVAILABLE_EXTENSION_MODES)
+            CameraUtil.getBackwardCompatibleCameraIdListOrThrow().forEach { cameraId ->
+                allModes.forEach { mode ->
+                    add(arrayOf(cameraId, mode))
+                }
+            }
+        }
+
+    /**
+     * Creates an [ImageCaptureExtenderImpl] object for specific [ExtensionMode] and
+     * camera id.
+     *
+     * @param extensionMode The extension mode for the created object.
+     * @param cameraId The target camera id.
+     * @param cameraCharacteristics The camera characteristics of the target camera.
+     * @return An [ImageCaptureExtenderImpl] object.
+     */
+    @JvmStatic
+    fun createImageCaptureExtenderImpl(
+        @ExtensionMode.Mode extensionMode: Int,
+        cameraId: String,
+        cameraCharacteristics: CameraCharacteristics
+    ): ImageCaptureExtenderImpl = when (extensionMode) {
+        ExtensionMode.HDR -> HdrImageCaptureExtenderImpl()
+        ExtensionMode.BOKEH -> BokehImageCaptureExtenderImpl()
+        ExtensionMode.FACE_RETOUCH -> BeautyImageCaptureExtenderImpl()
+        ExtensionMode.NIGHT -> NightImageCaptureExtenderImpl()
+        ExtensionMode.AUTO -> AutoImageCaptureExtenderImpl()
+        else -> throw AssertionFailedError("No such ImageCapture extender implementation")
+    }.apply { init(cameraId, cameraCharacteristics) }
+
+    /**
+     * Creates a [PreviewExtenderImpl] object for specific [ExtensionMode] and
+     * camera id.
+     *
+     * @param extensionMode The extension mode for the created object.
+     * @param cameraId The target camera id.
+     * @param cameraCharacteristics The camera characteristics of the target camera.
+     * @return A [PreviewExtenderImpl] object.
+     */
+    @JvmStatic
+    fun createPreviewExtenderImpl(
+        @ExtensionMode.Mode extensionMode: Int,
+        cameraId: String,
+        cameraCharacteristics: CameraCharacteristics
+    ): PreviewExtenderImpl = when (extensionMode) {
+        ExtensionMode.HDR -> HdrPreviewExtenderImpl()
+        ExtensionMode.BOKEH -> BokehPreviewExtenderImpl()
+        ExtensionMode.FACE_RETOUCH -> BeautyPreviewExtenderImpl()
+        ExtensionMode.NIGHT -> NightPreviewExtenderImpl()
+        ExtensionMode.AUTO -> AutoPreviewExtenderImpl()
+        else -> throw AssertionFailedError("No such Preview extender implementation")
+    }.apply {
+        init(cameraId, cameraCharacteristics)
+    }
+
+    /**
+     * Returns whether the target camera device can support the test for a specific extension mode.
+     */
+    @JvmStatic
+    fun isTargetDeviceAvailableForExtensions(): Boolean {
+        // Runtime version must be non-null if the device supports extensions.
+        if (ExtensionVersion.getRuntimeVersion() == null) {
+            return false
+        }
+
+        // Skips Cuttlefish device since actually it is not a real marketing device which supports
+        // extensions and it will cause pre-submit failures.
+        return !Build.MODEL.contains("Cuttlefish", true)
+    }
+
+    @JvmStatic
+    fun assumeExtensionModeSupported(
+        extensionsManager: ExtensionsManager,
+        cameraId: String,
+        extensionMode: Int
+    ) {
+        val cameraIdCameraSelector = createCameraSelectorById(cameraId)
+        assumeTrue(extensionsManager.isExtensionAvailable(cameraIdCameraSelector, extensionMode))
+    }
+
+    @JvmStatic
+    fun assumeAnyExtensionModeSupported(
+        extensionsManager: ExtensionsManager,
+        cameraId: String
+    ) {
+        val cameraIdCameraSelector = createCameraSelectorById(cameraId)
+        var anyExtensionModeSupported = false
+
+        AVAILABLE_EXTENSION_MODES.forEach { mode ->
+            if (extensionsManager.isExtensionAvailable(cameraIdCameraSelector, mode)) {
+                anyExtensionModeSupported = true
+                return@forEach
+            }
+        }
+
+        assumeTrue(anyExtensionModeSupported)
+    }
+
+    @JvmStatic
+    fun getFirstSupportedExtensionMode(
+        extensionsManager: ExtensionsManager,
+        cameraId: String
+    ): Int {
+        val cameraIdCameraSelector = createCameraSelectorById(cameraId)
+
+        AVAILABLE_EXTENSION_MODES.forEach { mode ->
+            if (extensionsManager.isExtensionAvailable(cameraIdCameraSelector, mode)) {
+                return mode
+            }
+        }
+
+        return ExtensionMode.NONE
+    }
+
+    @JvmStatic
+    fun launchCameraExtensionsActivity(
+        cameraId: String,
+        extensionMode: Int,
+        deleteCapturedImages: Boolean = true,
+    ): ActivityScenario<CameraExtensionsActivity> {
+        val intent = ApplicationProvider.getApplicationContext<Context>().packageManager
+            .getLaunchIntentForPackage(BASIC_SAMPLE_PACKAGE)?.apply {
+                putExtra(IntentExtraKey.INTENT_EXTRA_KEY_CAMERA_ID, cameraId)
+                putExtra(IntentExtraKey.INTENT_EXTRA_KEY_EXTENSION_MODE, extensionMode)
+                putExtra(
+                    IntentExtraKey.INTENT_EXTRA_KEY_DELETE_CAPTURED_IMAGE,
+                    deleteCapturedImages
+                )
+                flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
+            }
+
+        val activityScenario: ActivityScenario<CameraExtensionsActivity> =
+            ActivityScenario.launch(intent)
+
+        activityScenario.waitForInitializationIdle()
+
+        // Ensure ActivityScenario is cleaned up properly
+        // Wait for PreviewView to become STREAMING state and its IdlingResource to become idle.
+        activityScenario.onActivity {
+            // Checks that CameraExtensionsActivity's current extension mode is correct.
+            assertThat(it.currentExtensionMode).isEqualTo(extensionMode)
+        }
+
+        return activityScenario
+    }
+
+    /**
+     * Stress test repeat count to run the test
+     */
+    const val STRESS_TEST_REPEAT_COUNT = 2
+
+    /**
+     * Stress test target testing operation count.
+     *
+     * <p>The target testing operation might be:
+     * <ul>
+     *     <li> Open and close camera
+     *     <li> Open and close capture session
+     *     <li> Bind and unbind use cases
+     *     <li> Pause and resume lifecycle owner
+     *     <li> Switch cameras
+     *     <li> Switch extension modes
+     * </ul>
+     *
+     */
+    const val STRESS_TEST_OPERATION_REPEAT_COUNT = 10
+
+    /**
+     * Constant to specify that the verification target is [Preview].
+     */
+    const val VERIFICATION_TARGET_PREVIEW = 0x1
+
+    /**
+     * Constant to specify that the verification target is [ImageCapture].
+     */
+    const val VERIFICATION_TARGET_IMAGE_CAPTURE = 0x2
+
+    /**
+     * Constant to specify that the verification target is [ImageAnalysis].
+     */
+    const val VERIFICATION_TARGET_IMAGE_ANALYSIS = 0x4
+}
\ No newline at end of file
diff --git a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/util/ExtensionsTestUtil.kt b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/util/ExtensionsTestUtil.kt
deleted file mode 100644
index 5deea13..0000000
--- a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/util/ExtensionsTestUtil.kt
+++ /dev/null
@@ -1,172 +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.integration.extensions.util
-
-import android.hardware.camera2.CameraCharacteristics
-import android.os.Build
-import androidx.camera.core.ImageAnalysis
-import androidx.camera.core.ImageCapture
-import androidx.camera.core.Preview
-import androidx.camera.extensions.ExtensionMode
-import androidx.camera.extensions.impl.AutoImageCaptureExtenderImpl
-import androidx.camera.extensions.impl.AutoPreviewExtenderImpl
-import androidx.camera.extensions.impl.BeautyImageCaptureExtenderImpl
-import androidx.camera.extensions.impl.BeautyPreviewExtenderImpl
-import androidx.camera.extensions.impl.BokehImageCaptureExtenderImpl
-import androidx.camera.extensions.impl.BokehPreviewExtenderImpl
-import androidx.camera.extensions.impl.HdrImageCaptureExtenderImpl
-import androidx.camera.extensions.impl.HdrPreviewExtenderImpl
-import androidx.camera.extensions.impl.ImageCaptureExtenderImpl
-import androidx.camera.extensions.impl.NightImageCaptureExtenderImpl
-import androidx.camera.extensions.impl.NightPreviewExtenderImpl
-import androidx.camera.extensions.impl.PreviewExtenderImpl
-import androidx.camera.extensions.internal.ExtensionVersion
-import androidx.camera.integration.extensions.utils.ExtensionModeUtil
-import androidx.camera.testing.CameraUtil
-import junit.framework.AssertionFailedError
-
-object ExtensionsTestUtil {
-
-    /**
-     * Gets a list of all camera id and extension mode combinations.
-     */
-    @JvmStatic
-    fun getAllCameraIdExtensionModeCombinations(): List<Array<Any>> =
-        arrayListOf<Array<Any>>().apply {
-            CameraUtil.getBackwardCompatibleCameraIdListOrThrow().forEach { cameraId ->
-                ExtensionModeUtil.AVAILABLE_EXTENSION_MODES.forEach { mode ->
-                    add(arrayOf(cameraId, mode))
-                }
-            }
-        }
-
-    /**
-     * Gets a list of all camera id and mode combinations. Normal mode and all extension modes will
-     * be included.
-     */
-    @JvmStatic
-    fun getAllCameraIdModeCombinations(): List<Array<Any>> =
-        arrayListOf<Array<Any>>().apply {
-            val allModes = mutableListOf<Int>()
-            allModes.add(0, ExtensionMode.NONE)
-            allModes.addAll(ExtensionModeUtil.AVAILABLE_EXTENSION_MODES)
-            CameraUtil.getBackwardCompatibleCameraIdListOrThrow().forEach { cameraId ->
-                allModes.forEach { mode ->
-                    add(arrayOf(cameraId, mode))
-                }
-            }
-        }
-
-    /**
-     * Creates an [ImageCaptureExtenderImpl] object for specific [ExtensionMode] and
-     * camera id.
-     *
-     * @param extensionMode The extension mode for the created object.
-     * @param cameraId The target camera id.
-     * @param cameraCharacteristics The camera characteristics of the target camera.
-     * @return An [ImageCaptureExtenderImpl] object.
-     */
-    @JvmStatic
-    fun createImageCaptureExtenderImpl(
-        @ExtensionMode.Mode extensionMode: Int,
-        cameraId: String,
-        cameraCharacteristics: CameraCharacteristics
-    ): ImageCaptureExtenderImpl = when (extensionMode) {
-        ExtensionMode.HDR -> HdrImageCaptureExtenderImpl()
-        ExtensionMode.BOKEH -> BokehImageCaptureExtenderImpl()
-        ExtensionMode.FACE_RETOUCH -> BeautyImageCaptureExtenderImpl()
-        ExtensionMode.NIGHT -> NightImageCaptureExtenderImpl()
-        ExtensionMode.AUTO -> AutoImageCaptureExtenderImpl()
-        else -> throw AssertionFailedError("No such ImageCapture extender implementation")
-    }.apply { init(cameraId, cameraCharacteristics) }
-
-    /**
-     * Creates a [PreviewExtenderImpl] object for specific [ExtensionMode] and
-     * camera id.
-     *
-     * @param extensionMode The extension mode for the created object.
-     * @param cameraId The target camera id.
-     * @param cameraCharacteristics The camera characteristics of the target camera.
-     * @return A [PreviewExtenderImpl] object.
-     */
-    @JvmStatic
-    fun createPreviewExtenderImpl(
-        @ExtensionMode.Mode extensionMode: Int,
-        cameraId: String,
-        cameraCharacteristics: CameraCharacteristics
-    ): PreviewExtenderImpl = when (extensionMode) {
-        ExtensionMode.HDR -> HdrPreviewExtenderImpl()
-        ExtensionMode.BOKEH -> BokehPreviewExtenderImpl()
-        ExtensionMode.FACE_RETOUCH -> BeautyPreviewExtenderImpl()
-        ExtensionMode.NIGHT -> NightPreviewExtenderImpl()
-        ExtensionMode.AUTO -> AutoPreviewExtenderImpl()
-        else -> throw AssertionFailedError("No such Preview extender implementation")
-    }.apply {
-        init(cameraId, cameraCharacteristics)
-    }
-
-    /**
-     * Returns whether the target camera device can support the test for a specific extension mode.
-     */
-    @JvmStatic
-    fun isTargetDeviceAvailableForExtensions(): Boolean {
-        // Runtime version must be non-null if the device supports extensions.
-        if (ExtensionVersion.getRuntimeVersion() == null) {
-            return false
-        }
-
-        // Skips Cuttlefish device since actually it is not a real marketing device which supports
-        // extensions and it will cause pre-submit failures.
-        return !Build.MODEL.contains("Cuttlefish", true)
-    }
-
-    /**
-     * Stress test repeat count to run the test
-     */
-    const val STRESS_TEST_REPEAT_COUNT = 2
-
-    /**
-     * Stress test target testing operation count.
-     *
-     * <p>The target testing operation might be:
-     * <ul>
-     *     <li> Open and close camera
-     *     <li> Open and close capture session
-     *     <li> Bind and unbind use cases
-     *     <li> Pause and resume lifecycle owner
-     *     <li> Switch cameras
-     *     <li> Switch extension modes
-     * </ul>
-     *
-     */
-    const val STRESS_TEST_OPERATION_REPEAT_COUNT = 10
-
-    /**
-     * Constant to specify that the verification target is [Preview].
-     */
-    const val VERIFICATION_TARGET_PREVIEW = 0x1
-
-    /**
-     * Constant to specify that the verification target is [ImageCapture].
-     */
-    const val VERIFICATION_TARGET_IMAGE_CAPTURE = 0x2
-
-    /**
-     * Constant to specify that the verification target is [ImageAnalysis].
-     */
-    const val VERIFICATION_TARGET_IMAGE_ANALYSIS = 0x4
-}
\ No newline at end of file
diff --git a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/util/TestContants.kt b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/util/TestContants.kt
new file mode 100644
index 0000000..b3ab2a4
--- /dev/null
+++ b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/util/TestContants.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.camera.integration.extensions.util
+
+/**
+ * The basic package name of the extensions test app
+ */
+const val BASIC_SAMPLE_PACKAGE = "androidx.camera.integration.extensions"
+
+/**
+ * Timeout duration to wait for idle after pressing HOME key
+ */
+const val HOME_TIMEOUT_MS = 3000L
\ No newline at end of file
diff --git a/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java b/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java
index fb4355d..8064fd3 100644
--- a/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java
+++ b/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java
@@ -654,39 +654,43 @@
 
     @VisibleForTesting
     @ExtensionMode.Mode
-    int getCurrentExtensionMode() {
+    public int getCurrentExtensionMode() {
         return mCurrentExtensionMode;
     }
 
     @VisibleForTesting
-    CountingIdlingResource getInitializationIdlingResource() {
+    @NonNull
+    public CountingIdlingResource getInitializationIdlingResource() {
         return mInitializationIdlingResource;
     }
 
     @VisibleForTesting
-    CountingIdlingResource getPreviewViewStreamingStateIdlingResource() {
+    @NonNull
+    public CountingIdlingResource getPreviewViewStreamingStateIdlingResource() {
         return mPreviewViewStreamingStateIdlingResource;
     }
 
     @VisibleForTesting
-    CountingIdlingResource getPreviewViewIdleStateIdlingResource() {
+    @NonNull
+    public CountingIdlingResource getPreviewViewIdleStateIdlingResource() {
         return mPreviewViewIdleStateIdlingResource;
     }
 
     @VisibleForTesting
-    CountingIdlingResource getTakePictureIdlingResource() {
+    @NonNull
+    public CountingIdlingResource getTakePictureIdlingResource() {
         return mTakePictureIdlingResource;
     }
 
     @VisibleForTesting
-    void resetPreviewViewStreamingStateIdlingResource() {
+    public void resetPreviewViewStreamingStateIdlingResource() {
         if (mPreviewViewStreamingStateIdlingResource.isIdleNow()) {
             mPreviewViewStreamingStateIdlingResource.increment();
         }
     }
 
     @VisibleForTesting
-    void resetPreviewViewIdleStateIdlingResource() {
+    public void resetPreviewViewIdleStateIdlingResource() {
         if (mPreviewViewIdleStateIdlingResource.isIdleNow()) {
             mPreviewViewIdleStateIdlingResource.increment();
         }
diff --git a/camera/integration-tests/uiwidgetstestapp/build.gradle b/camera/integration-tests/uiwidgetstestapp/build.gradle
index 4c8c5d1..b7a82ad 100644
--- a/camera/integration-tests/uiwidgetstestapp/build.gradle
+++ b/camera/integration-tests/uiwidgetstestapp/build.gradle
@@ -65,6 +65,7 @@
     implementation(libs.kotlinStdlib)
     implementation(project(":camera:camera-core"))
     implementation(project(":camera:camera-camera2"))
+    implementation(project(":camera:camera-camera2-pipe-integration"))
     implementation(project(":camera:camera-lifecycle"))
     implementation(project(":camera:camera-view"))
     implementation(project(":camera:camera-video"))
@@ -103,7 +104,7 @@
     androidTestImplementation(libs.testRunner)
     androidTestImplementation(libs.testRules)
     androidTestImplementation(libs.testUiautomator)
-    androidTestImplementation(libs.espressoCore)
+    androidTestImplementation("androidx.test.espresso:espresso-core:3.3.0")
     androidTestImplementation(project(":camera:camera-testing"))
     androidTestImplementation(project(":internal-testutils-runtime"))
     androidTestImplementation(libs.truth)
diff --git a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageAnalysisBaseTest.kt b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageAnalysisBaseTest.kt
index 5d45ab8..e69c9d3 100644
--- a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageAnalysisBaseTest.kt
+++ b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageAnalysisBaseTest.kt
@@ -19,7 +19,10 @@
 import android.content.Context
 import android.content.Intent
 import androidx.camera.camera2.Camera2Config
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig
+import androidx.camera.core.CameraSelector
 import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.testing.CameraPipeConfigTestRule
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CoreAppTestUtil
 import androidx.test.core.app.ActivityScenario
@@ -44,11 +47,25 @@
  * - Wait a couple of frames
  * - Verify the image analysis image rotation
  */
-abstract class ImageAnalysisBaseTest<A : CameraActivity> {
+abstract class ImageAnalysisBaseTest<A : CameraActivity>(
+    cameraXConfig: String = CameraActivity.CAMERA2_IMPLEMENTATION_OPTION
+) {
+
+    @get:Rule
+    val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+        active = cameraXConfig == CameraActivity.CAMERA_PIPE_IMPLEMENTATION_OPTION,
+        forAllTests = true,
+    )
 
     @get:Rule
     val useCameraRule = CameraUtil.grantCameraPermissionAndPreTest(
-        testCameraRule, CameraUtil.PreTestCameraIdList(Camera2Config.defaultConfig())
+        testCameraRule, CameraUtil.PreTestCameraIdList(
+            if (cameraXConfig == CameraActivity.CAMERA2_IMPLEMENTATION_OPTION) {
+                Camera2Config.defaultConfig()
+            } else {
+                CameraPipeConfig.defaultConfig()
+            }
+        )
     )
 
     @get:Rule
@@ -80,9 +97,10 @@
 
     protected inline fun <reified A : CameraActivity> verifyRotation(
         lensFacing: Int,
-        rotate: ActivityScenario<A>.() -> Unit
+        cameraXConfig: String = CameraActivity.CAMERA2_IMPLEMENTATION_OPTION,
+        rotate: ActivityScenario<A>.() -> Unit,
     ) {
-        val activityScenario: ActivityScenario<A> = launchActivity(lensFacing)
+        val activityScenario: ActivityScenario<A> = launchActivity(lensFacing, cameraXConfig)
         activityScenario.use { scenario ->
 
             // Wait until the camera is set up and analysis starts receiving frames
@@ -110,13 +128,17 @@
         }
     }
 
-    protected inline fun <reified A : CameraActivity> launchActivity(lensFacing: Int):
+    protected inline fun <reified A : CameraActivity> launchActivity(
+        lensFacing: Int,
+        cameraXConfig: String,
+    ):
         ActivityScenario<A> {
             val intent = Intent(
                 ApplicationProvider.getApplicationContext(),
                 A::class.java
             ).apply {
                 putExtra(CameraActivity.KEY_LENS_FACING, lensFacing)
+                putExtra(CameraActivity.KEY_CAMERA_IMPLEMENTATION, cameraXConfig)
             }
             return ActivityScenario.launch<A>(intent)
         }
@@ -137,6 +159,16 @@
         protected const val TIMEOUT = 20L
 
         @JvmStatic
+        protected val lensFacingList =
+            arrayOf(CameraSelector.LENS_FACING_BACK, CameraSelector.LENS_FACING_FRONT)
+
+        @JvmStatic
+        protected val cameraXConfigList = arrayOf(
+            CameraActivity.CAMERA2_IMPLEMENTATION_OPTION,
+            CameraActivity.CAMERA_PIPE_IMPLEMENTATION_OPTION
+        )
+
+        @JvmStatic
         lateinit var testCameraRule: CameraUtil.PreTestCamera
 
         @BeforeClass
diff --git a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageAnalysisLockedOrientationTest.kt b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageAnalysisLockedOrientationTest.kt
index 4f4899a..c96ac71 100644
--- a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageAnalysisLockedOrientationTest.kt
+++ b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageAnalysisLockedOrientationTest.kt
@@ -16,7 +16,6 @@
 
 package androidx.camera.integration.uiwidgets.rotations
 
-import androidx.camera.core.CameraSelector
 import androidx.test.core.app.ActivityScenario
 import androidx.test.filters.LargeTest
 import org.junit.After
@@ -29,21 +28,24 @@
 @LargeTest
 class ImageAnalysisLockedOrientationTest(
     private val lensFacing: Int,
-    private val rotationDegrees: Int
-) : ImageAnalysisBaseTest<LockedOrientationActivity>() {
+    private val rotationDegrees: Int,
+    private val cameraXConfig: String
+) : ImageAnalysisBaseTest<LockedOrientationActivity>(cameraXConfig) {
 
     companion object {
         @JvmStatic
-        @Parameterized.Parameters(name = "lensFacing={0}, rotationDegrees={1}")
+        private val rotationDegrees = arrayOf(0, 90, 180, 270)
+
+        @JvmStatic
+        @Parameterized.Parameters(name = "lensFacing={0}, rotationDegrees={1}, cameraXConfig={2}")
         fun data() = mutableListOf<Array<Any?>>().apply {
-            add(arrayOf(CameraSelector.LENS_FACING_BACK, 0))
-            add(arrayOf(CameraSelector.LENS_FACING_BACK, 90))
-            add(arrayOf(CameraSelector.LENS_FACING_BACK, 180))
-            add(arrayOf(CameraSelector.LENS_FACING_BACK, 270))
-            add(arrayOf(CameraSelector.LENS_FACING_FRONT, 0))
-            add(arrayOf(CameraSelector.LENS_FACING_FRONT, 90))
-            add(arrayOf(CameraSelector.LENS_FACING_FRONT, 180))
-            add(arrayOf(CameraSelector.LENS_FACING_FRONT, 270))
+            lensFacingList.forEach { lens ->
+                rotationDegrees.forEach { rotation ->
+                    cameraXConfigList.forEach { cameraXConfig ->
+                        add(arrayOf(lens, rotation, cameraXConfig))
+                    }
+                }
+            }
         }
     }
 
@@ -59,7 +61,7 @@
 
     @Test
     fun verifyRotation() {
-        verifyRotation<LockedOrientationActivity>(lensFacing) {
+        verifyRotation<LockedOrientationActivity>(lensFacing, cameraXConfig) {
             rotate(rotationDegrees)
         }
     }
diff --git a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageAnalysisOrientationConfigChangesTest.kt b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageAnalysisOrientationConfigChangesTest.kt
index 0748b49..f1ca9eb 100644
--- a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageAnalysisOrientationConfigChangesTest.kt
+++ b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageAnalysisOrientationConfigChangesTest.kt
@@ -19,7 +19,6 @@
 import android.os.Build
 import android.view.Surface
 import android.view.View
-import androidx.camera.core.CameraSelector
 import androidx.test.core.app.ActivityScenario
 import androidx.test.filters.LargeTest
 import androidx.test.platform.app.InstrumentationRegistry
@@ -38,21 +37,29 @@
 @LargeTest
 class ImageAnalysisOrientationConfigChangesTest(
     private val lensFacing: Int,
-    private val rotation: Int
-) : ImageAnalysisBaseTest<OrientationConfigChangesOverriddenActivity>() {
+    private val rotation: Int,
+    private val cameraXConfig: String
+) : ImageAnalysisBaseTest<OrientationConfigChangesOverriddenActivity>(cameraXConfig) {
 
     companion object {
         @JvmStatic
-        @Parameterized.Parameters(name = "lensFacing={0}, rotation={1}")
+        private val rotations = arrayOf(
+            Surface.ROTATION_0,
+            Surface.ROTATION_90,
+            Surface.ROTATION_180,
+            Surface.ROTATION_270
+        )
+
+        @JvmStatic
+        @Parameterized.Parameters(name = "lensFacing={0}, rotation={1}, cameraXConfig={2}")
         fun data() = mutableListOf<Array<Any?>>().apply {
-            add(arrayOf(CameraSelector.LENS_FACING_BACK, Surface.ROTATION_0))
-            add(arrayOf(CameraSelector.LENS_FACING_BACK, Surface.ROTATION_90))
-            add(arrayOf(CameraSelector.LENS_FACING_BACK, Surface.ROTATION_180))
-            add(arrayOf(CameraSelector.LENS_FACING_BACK, Surface.ROTATION_270))
-            add(arrayOf(CameraSelector.LENS_FACING_FRONT, Surface.ROTATION_0))
-            add(arrayOf(CameraSelector.LENS_FACING_FRONT, Surface.ROTATION_90))
-            add(arrayOf(CameraSelector.LENS_FACING_FRONT, Surface.ROTATION_180))
-            add(arrayOf(CameraSelector.LENS_FACING_FRONT, Surface.ROTATION_270))
+            lensFacingList.forEach { lens ->
+                rotations.forEach { rotation ->
+                    cameraXConfigList.forEach { cameraXConfig ->
+                        add(arrayOf(lens, rotation, cameraXConfig))
+                    }
+                }
+            }
         }
     }
 
@@ -75,7 +82,7 @@
 
     @Test
     fun verifyRotation() {
-        verifyRotation<OrientationConfigChangesOverriddenActivity>(lensFacing) {
+        verifyRotation<OrientationConfigChangesOverriddenActivity>(lensFacing, cameraXConfig) {
             if (rotate(rotation)) {
 
                 // Wait for the rotation to occur
diff --git a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageAnalysisUnlockedOrientationTest.kt b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageAnalysisUnlockedOrientationTest.kt
index 82aa20f..870f64b 100644
--- a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageAnalysisUnlockedOrientationTest.kt
+++ b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageAnalysisUnlockedOrientationTest.kt
@@ -19,6 +19,9 @@
 import android.app.Instrumentation
 import androidx.camera.core.CameraSelector.LENS_FACING_BACK
 import androidx.camera.core.CameraSelector.LENS_FACING_FRONT
+import androidx.camera.integration.uiwidgets.rotations.RotationUnlocked.Left
+import androidx.camera.integration.uiwidgets.rotations.RotationUnlocked.Natural
+import androidx.camera.integration.uiwidgets.rotations.RotationUnlocked.Right
 import androidx.test.filters.LargeTest
 import androidx.test.platform.app.InstrumentationRegistry
 import org.junit.After
@@ -31,20 +34,23 @@
 @LargeTest
 class ImageAnalysisUnlockedOrientationTest(
     private val lensFacing: Int,
+    private val cameraXConfig: String,
     private val rotation: RotationUnlocked,
     private val testName: String
-) : ImageAnalysisBaseTest<UnlockedOrientationActivity>() {
+) : ImageAnalysisBaseTest<UnlockedOrientationActivity>(cameraXConfig) {
 
     companion object {
         @JvmStatic
-        @Parameterized.Parameters(name = "{2}")
+        @Parameterized.Parameters(name = "cameraXConfig={1}, {3}")
         fun data() = mutableListOf<Array<Any?>>().apply {
-            add(arrayOf(LENS_FACING_BACK, RotationUnlocked.Natural, "Back lens - Natural"))
-            add(arrayOf(LENS_FACING_BACK, RotationUnlocked.Left, "Back lens - Left"))
-            add(arrayOf(LENS_FACING_BACK, RotationUnlocked.Right, "Back lens - Right"))
-            add(arrayOf(LENS_FACING_FRONT, RotationUnlocked.Natural, "Front lens - Natural"))
-            add(arrayOf(LENS_FACING_FRONT, RotationUnlocked.Left, "Front lens - Left"))
-            add(arrayOf(LENS_FACING_FRONT, RotationUnlocked.Right, "Front lens - Right"))
+            cameraXConfigList.forEach { config ->
+                add(arrayOf(LENS_FACING_BACK, config, Natural, "Back lens - Natural"))
+                add(arrayOf(LENS_FACING_BACK, config, Left, "Back lens - Left"))
+                add(arrayOf(LENS_FACING_BACK, config, Right, "Back lens - Right"))
+                add(arrayOf(LENS_FACING_FRONT, config, Natural, "Front lens - Natural"))
+                add(arrayOf(LENS_FACING_FRONT, config, Left, "Front lens - Left"))
+                add(arrayOf(LENS_FACING_FRONT, config, Right, "Front lens - Right"))
+            }
         }
     }
 
@@ -60,7 +66,7 @@
 
     @Test
     fun verifyRotation() {
-        verifyRotation<UnlockedOrientationActivity>(lensFacing) {
+        verifyRotation<UnlockedOrientationActivity>(lensFacing, cameraXConfig) {
             if (rotation.shouldRotate) {
                 rotateDeviceAndWait()
             }
diff --git a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageCaptureBaseTest.kt b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageCaptureBaseTest.kt
index 025cb71..1a25aaa 100644
--- a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageCaptureBaseTest.kt
+++ b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageCaptureBaseTest.kt
@@ -22,9 +22,11 @@
 import android.os.Environment
 import android.view.View
 import androidx.camera.camera2.Camera2Config
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig
 import androidx.camera.core.CameraSelector
 import androidx.camera.integration.uiwidgets.R
 import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.testing.CameraPipeConfigTestRule
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CoreAppTestUtil
 import androidx.test.core.app.ActivityScenario
@@ -53,11 +55,25 @@
  * - Wait for the image capture callback
  * - Verify the picture's rotation or resolution
  */
-abstract class ImageCaptureBaseTest<A : CameraActivity> {
+abstract class ImageCaptureBaseTest<A : CameraActivity>(
+    cameraXConfig: String = CameraActivity.CAMERA2_IMPLEMENTATION_OPTION
+) {
+
+    @get:Rule
+    val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+        active = cameraXConfig == CameraActivity.CAMERA_PIPE_IMPLEMENTATION_OPTION,
+        forAllTests = true,
+    )
 
     @get:Rule
     val useCameraRule = CameraUtil.grantCameraPermissionAndPreTest(
-        testCameraRule, CameraUtil.PreTestCameraIdList(Camera2Config.defaultConfig())
+        testCameraRule, CameraUtil.PreTestCameraIdList(
+            if (cameraXConfig == CameraActivity.CAMERA2_IMPLEMENTATION_OPTION) {
+                Camera2Config.defaultConfig()
+            } else {
+                CameraPipeConfig.defaultConfig()
+            }
+        )
     )
 
     @get:Rule
@@ -113,9 +129,11 @@
     protected inline fun <reified A : CameraActivity> verifyRotation(
         lensFacing: Int,
         captureMode: Int,
-        rotate: ActivityScenario<A>.() -> Unit
+        cameraXConfig: String = CameraActivity.CAMERA2_IMPLEMENTATION_OPTION,
+        rotate: ActivityScenario<A>.() -> Unit,
     ) {
-        val activityScenario: ActivityScenario<A> = launchActivity(lensFacing, captureMode)
+        val activityScenario: ActivityScenario<A> =
+            launchActivity(lensFacing, captureMode, cameraXConfig)
         activityScenario.use { scenario ->
 
             // Wait until the camera is set up and analysis starts receiving frames
@@ -172,7 +190,8 @@
 
     protected inline fun <reified A : CameraActivity> launchActivity(
         lensFacing: Int,
-        captureMode: Int
+        captureMode: Int,
+        cameraXConfig: String,
     ): ActivityScenario<A> {
         val intent = Intent(
             ApplicationProvider.getApplicationContext(),
@@ -180,6 +199,7 @@
         ).apply {
             putExtra(CameraActivity.KEY_LENS_FACING, lensFacing)
             putExtra(CameraActivity.KEY_IMAGE_CAPTURE_MODE, captureMode)
+            putExtra(CameraActivity.KEY_CAMERA_IMPLEMENTATION, cameraXConfig)
         }
         return ActivityScenario.launch<A>(intent)
     }
@@ -206,10 +226,16 @@
             CameraActivity.IMAGE_CAPTURE_MODE_MEDIA_STORE
         )
         @JvmStatic
-        protected val lensFacing =
+        protected val lensFacingList =
             arrayOf(CameraSelector.LENS_FACING_BACK, CameraSelector.LENS_FACING_FRONT)
 
         @JvmStatic
+        protected val cameraXConfigList = arrayOf(
+            CameraActivity.CAMERA2_IMPLEMENTATION_OPTION,
+            CameraActivity.CAMERA_PIPE_IMPLEMENTATION_OPTION
+        )
+
+        @JvmStatic
         lateinit var testCameraRule: CameraUtil.PreTestCamera
 
         @BeforeClass
diff --git a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageCaptureLockedOrientationTest.kt b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageCaptureLockedOrientationTest.kt
index 696972a..7165a2e 100644
--- a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageCaptureLockedOrientationTest.kt
+++ b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageCaptureLockedOrientationTest.kt
@@ -29,18 +29,23 @@
 class ImageCaptureLockedOrientationTest(
     private val lensFacing: Int,
     private val rotationDegrees: Int,
-    private val captureMode: Int
-) : ImageCaptureBaseTest<LockedOrientationActivity>() {
+    private val captureMode: Int,
+    private val cameraXConfig: String
+) : ImageCaptureBaseTest<LockedOrientationActivity>(cameraXConfig) {
 
     companion object {
         private val rotationDegrees = arrayOf(0, 90, 180, 270)
         @JvmStatic
-        @Parameterized.Parameters(name = "lensFacing={0}, rotationDegrees={1}, captureMode={2}")
+        @Parameterized.Parameters(
+            name = "lensFacing={0}, rotationDegrees={1}, captureMode={2}, cameraXConfig={3}"
+        )
         fun data() = mutableListOf<Array<Any?>>().apply {
-            lensFacing.forEach { lens ->
+            lensFacingList.forEach { lens ->
                 rotationDegrees.forEach { rotation ->
                     captureModes.forEach { mode ->
-                        add(arrayOf(lens, rotation, mode))
+                        cameraXConfigList.forEach { cameraXConfig ->
+                            add(arrayOf(lens, rotation, mode, cameraXConfig))
+                        }
                     }
                 }
             }
@@ -59,7 +64,7 @@
 
     @Test
     fun verifyRotation() {
-        verifyRotation<LockedOrientationActivity>(lensFacing, captureMode) {
+        verifyRotation<LockedOrientationActivity>(lensFacing, captureMode, cameraXConfig) {
             rotate(rotationDegrees)
         }
     }
diff --git a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageCaptureOrientationConfigChangesTest.kt b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageCaptureOrientationConfigChangesTest.kt
index c773656..ffc5c97 100644
--- a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageCaptureOrientationConfigChangesTest.kt
+++ b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageCaptureOrientationConfigChangesTest.kt
@@ -38,8 +38,9 @@
 class ImageCaptureOrientationConfigChangesTest(
     private val lensFacing: Int,
     private val rotation: Int,
-    private val captureMode: Int
-) : ImageCaptureBaseTest<OrientationConfigChangesOverriddenActivity>() {
+    private val captureMode: Int,
+    private val cameraXConfig: String
+) : ImageCaptureBaseTest<OrientationConfigChangesOverriddenActivity>(cameraXConfig) {
 
     companion object {
         private val rotations = arrayOf(
@@ -50,12 +51,16 @@
         )
 
         @JvmStatic
-        @Parameterized.Parameters(name = "lensFacing={0}, rotation={1}, captureMode={2}")
+        @Parameterized.Parameters(
+            name = "lensFacing={0}, rotation={1}, captureMode={2}, cameraXConfig={3}"
+        )
         fun data() = mutableListOf<Array<Any?>>().apply {
-            lensFacing.forEach { lens ->
+            lensFacingList.forEach { lens ->
                 rotations.forEach { rotation ->
                     captureModes.forEach { mode ->
-                        add(arrayOf(lens, rotation, mode))
+                        cameraXConfigList.forEach { cameraXConfig ->
+                            add(arrayOf(lens, rotation, mode, cameraXConfig))
+                        }
                     }
                 }
             }
@@ -83,7 +88,8 @@
     fun verifyRotation() {
         verifyRotation<OrientationConfigChangesOverriddenActivity>(
             lensFacing,
-            captureMode
+            captureMode,
+            cameraXConfig
         ) {
             if (rotate(rotation)) {
 
diff --git a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageCaptureUnlockedOrientationTest.kt b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageCaptureUnlockedOrientationTest.kt
index 0248f11..a0204db 100644
--- a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageCaptureUnlockedOrientationTest.kt
+++ b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageCaptureUnlockedOrientationTest.kt
@@ -35,48 +35,51 @@
 class ImageCaptureUnlockedOrientationTest(
     private val lensFacing: Int,
     private val captureMode: Int,
+    private val cameraXConfig: String,
     private val rotation: RotationUnlocked,
     private val testName: String
-) : ImageCaptureBaseTest<UnlockedOrientationActivity>() {
+) : ImageCaptureBaseTest<UnlockedOrientationActivity>(cameraXConfig) {
 
     companion object {
         @JvmStatic
-        @Parameterized.Parameters(name = "{3}")
+        @Parameterized.Parameters(name = "cameraXConfig={2}, {4}")
         fun data() = mutableListOf<Array<Any?>>().apply {
-            lensFacing.forEach { lens ->
+            lensFacingList.forEach { lens ->
                 captureModes.forEach { mode ->
-                    val lensName = if (lens == CameraSelector.LENS_FACING_BACK) {
-                        "Back lens"
-                    } else {
-                        "Front lens"
-                    }
+                    cameraXConfigList.forEach { cameraXConfig ->
+                        val lensName = if (lens == CameraSelector.LENS_FACING_BACK) {
+                            "Back lens"
+                        } else {
+                            "Front lens"
+                        }
 
-                    val captureModeName = when (mode) {
-                        IMAGE_CAPTURE_MODE_IN_MEMORY -> "In memory"
-                        IMAGE_CAPTURE_MODE_FILE -> "File"
-                        IMAGE_CAPTURE_MODE_OUTPUT_STREAM -> "Output stream"
-                        IMAGE_CAPTURE_MODE_MEDIA_STORE -> "Media store"
-                        else -> "Invalid capture mode"
-                    }
+                        val captureModeName = when (mode) {
+                            IMAGE_CAPTURE_MODE_IN_MEMORY -> "In memory"
+                            IMAGE_CAPTURE_MODE_FILE -> "File"
+                            IMAGE_CAPTURE_MODE_OUTPUT_STREAM -> "Output stream"
+                            IMAGE_CAPTURE_MODE_MEDIA_STORE -> "Media store"
+                            else -> "Invalid capture mode"
+                        }
 
-                    add(
-                        arrayOf(
-                            lens, mode, RotationUnlocked.Natural,
-                            "$lensName - $captureModeName - Natural"
+                        add(
+                            arrayOf(
+                                lens, mode, cameraXConfig, RotationUnlocked.Natural,
+                                "$lensName - $captureModeName - Natural"
+                            )
                         )
-                    )
-                    add(
-                        arrayOf(
-                            lens, mode, RotationUnlocked.Left,
-                            "$lensName - $captureModeName - Left"
+                        add(
+                            arrayOf(
+                                lens, mode, cameraXConfig, RotationUnlocked.Left,
+                                "$lensName - $captureModeName - Left"
+                            )
                         )
-                    )
-                    add(
-                        arrayOf(
-                            lens, mode, RotationUnlocked.Right,
-                            "$lensName - $captureModeName - Right"
+                        add(
+                            arrayOf(
+                                lens, mode, cameraXConfig, RotationUnlocked.Right,
+                                "$lensName - $captureModeName - Right"
+                            )
                         )
-                    )
+                    }
                 }
             }
         }
@@ -94,7 +97,7 @@
 
     @Test
     fun verifyRotation() {
-        verifyRotation<UnlockedOrientationActivity>(lensFacing, captureMode) {
+        verifyRotation<UnlockedOrientationActivity>(lensFacing, captureMode, cameraXConfig) {
             if (rotation.shouldRotate) {
                 rotateDeviceAndWait()
             }
diff --git a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/viewpager/ViewPager2ActivityTest.kt b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/viewpager/ViewPager2ActivityTest.kt
index 1f21a3d..1567135 100644
--- a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/viewpager/ViewPager2ActivityTest.kt
+++ b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/viewpager/ViewPager2ActivityTest.kt
@@ -22,8 +22,11 @@
 import android.view.TextureView
 import android.view.View
 import androidx.camera.camera2.Camera2Config
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig
 import androidx.camera.core.CameraSelector
 import androidx.camera.integration.uiwidgets.R
+import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.testing.CameraPipeConfigTestRule
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CoreAppTestUtil
 import androidx.camera.view.PreviewView
@@ -44,6 +47,7 @@
 import kotlinx.coroutines.Deferred
 import kotlinx.coroutines.async
 import kotlinx.coroutines.runBlocking
+import org.junit.After
 import org.junit.Assume
 import org.junit.Before
 import org.junit.Rule
@@ -53,24 +57,50 @@
 
 @RunWith(Parameterized::class)
 @LargeTest
-class ViewPager2ActivityTest(private val lensFacing: Int) {
+class ViewPager2ActivityTest(private val lensFacing: Int, private val cameraXConfig: String) {
 
     companion object {
         private const val ACTION_IDLE_TIMEOUT: Long = 5000
+
         @JvmStatic
-        @Parameterized.Parameters(name = "lensFacing={0}")
-        fun data() = listOf(
-            CameraSelector.LENS_FACING_FRONT,
-            CameraSelector.LENS_FACING_BACK
+        private val lensFacingList =
+            arrayOf(CameraSelector.LENS_FACING_BACK, CameraSelector.LENS_FACING_FRONT)
+
+        @JvmStatic
+        private val cameraXConfigList = arrayOf(
+            CameraFragment.CAMERA2_IMPLEMENTATION_OPTION,
+            CameraFragment.CAMERA_PIPE_IMPLEMENTATION_OPTION
         )
 
+        @JvmStatic
+        @Parameterized.Parameters(name = "lensFacing={0}, cameraXConfig={1}")
+        fun data() = mutableListOf<Array<Any?>>().apply {
+            lensFacingList.forEach { lens ->
+                cameraXConfigList.forEach { cameraXConfig ->
+                    add(arrayOf(lens, cameraXConfig))
+                }
+            }
+        }
+
         @JvmField
         val testCameraRule = CameraUtil.PreTestCamera()
     }
 
     @get:Rule
+    val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+        active = cameraXConfig == CameraFragment.CAMERA_PIPE_IMPLEMENTATION_OPTION,
+        forAllTests = true,
+    )
+
+    @get:Rule
     val useCamera = CameraUtil.grantCameraPermissionAndPreTest(
-        testCameraRule, CameraUtil.PreTestCameraIdList(Camera2Config.defaultConfig())
+        testCameraRule, CameraUtil.PreTestCameraIdList(
+            if (cameraXConfig == CameraFragment.CAMERA2_IMPLEMENTATION_OPTION) {
+                Camera2Config.defaultConfig()
+            } else {
+                CameraPipeConfig.defaultConfig()
+            }
+        )
     )
 
     private val mDevice =
@@ -80,15 +110,27 @@
     fun setUp() {
         Assume.assumeTrue(CameraUtil.hasCameraWithLensFacing(lensFacing))
 
+        // Ensure it's in a natural orientation. This change could delay around 1 sec, please
+        // call this earlier before launching the test activity.
+        mDevice.setOrientationNatural()
+
         // Clear the device UI and check if there is no dialog or lock screen on the top of the
         // window.
         CoreAppTestUtil.prepareDeviceUI(InstrumentationRegistry.getInstrumentation())
     }
 
+    @After
+    fun tearDown() {
+        val context = ApplicationProvider.getApplicationContext<Context>()
+        val cameraProvider = ProcessCameraProvider.getInstance(context)[10, TimeUnit.SECONDS]
+        cameraProvider.shutdown()[10, TimeUnit.SECONDS]
+        mDevice.unfreezeRotation()
+    }
+
     // The test makes sure the camera PreviewView is in the streaming state.
     @Test
     fun testPreviewViewUpdateAfterStopResume() {
-        launchActivity(lensFacing).use { scenario ->
+        launchActivity(lensFacing, cameraXConfig).use { scenario ->
             // At first, check Preview in stream state
             assertStreamState(scenario, PreviewView.StreamState.STREAMING)
 
@@ -106,7 +148,7 @@
     @Test
     fun testPreviewViewUpdateAfterSwitch() {
 
-        launchActivity(lensFacing).use { scenario ->
+        launchActivity(lensFacing, cameraXConfig).use { scenario ->
             // At first, check Preview in stream state
             assertStreamState(scenario, PreviewView.StreamState.STREAMING)
 
@@ -126,7 +168,7 @@
 
     @Test
     fun testPreviewViewUpdateAfterSwitchAndStop_ResumeAndSwitchBack() {
-        launchActivity(lensFacing).use { scenario ->
+        launchActivity(lensFacing, cameraXConfig).use { scenario ->
             // At first, check Preview in stream state
             assertStreamState(scenario, PreviewView.StreamState.STREAMING)
 
@@ -151,13 +193,18 @@
         }
     }
 
-    private fun launchActivity(lensFacing: Int):
+    private fun launchActivity(
+        lensFacing: Int,
+        cameraXConfig: String = CameraFragment.CAMERA2_IMPLEMENTATION_OPTION,
+    ):
         ActivityScenario<ViewPager2Activity> {
             val intent = Intent(
                 ApplicationProvider.getApplicationContext<Context>(),
                 ViewPager2Activity::class.java
-            )
-            intent.putExtra(BaseActivity.INTENT_LENS_FACING, lensFacing)
+            ).apply {
+                putExtra(BaseActivity.INTENT_LENS_FACING, lensFacing)
+                putExtra(CameraFragment.KEY_CAMERA_IMPLEMENTATION, cameraXConfig)
+            }
             return ActivityScenario.launch<ViewPager2Activity>(intent)
         }
 
diff --git a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/viewpager/ViewPagerActivityTest.kt b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/viewpager/ViewPagerActivityTest.kt
index bbfc526..d4b7e98 100644
--- a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/viewpager/ViewPagerActivityTest.kt
+++ b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/viewpager/ViewPagerActivityTest.kt
@@ -22,8 +22,11 @@
 import android.view.TextureView
 import android.view.View
 import androidx.camera.camera2.Camera2Config
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig
 import androidx.camera.core.CameraSelector
 import androidx.camera.integration.uiwidgets.R
+import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.testing.CameraPipeConfigTestRule
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CoreAppTestUtil
 import androidx.camera.view.PreviewView
@@ -46,6 +49,7 @@
 import kotlinx.coroutines.Deferred
 import kotlinx.coroutines.async
 import kotlinx.coroutines.runBlocking
+import org.junit.After
 import org.junit.Assume
 import org.junit.Before
 import org.junit.Rule
@@ -55,24 +59,50 @@
 
 @RunWith(Parameterized::class)
 @LargeTest
-class ViewPagerActivityTest(private val lensFacing: Int) {
+class ViewPagerActivityTest(private val lensFacing: Int, private val cameraXConfig: String) {
 
     companion object {
         private const val ACTION_IDLE_TIMEOUT: Long = 5000
+
         @JvmStatic
-        @Parameterized.Parameters(name = "lensFacing={0}")
-        fun data() = listOf(
-            CameraSelector.LENS_FACING_FRONT,
-            CameraSelector.LENS_FACING_BACK
+        private val lensFacingList =
+            arrayOf(CameraSelector.LENS_FACING_BACK, CameraSelector.LENS_FACING_FRONT)
+
+        @JvmStatic
+        private val cameraXConfigList = arrayOf(
+            CameraFragment.CAMERA2_IMPLEMENTATION_OPTION,
+            CameraFragment.CAMERA_PIPE_IMPLEMENTATION_OPTION
         )
 
+        @JvmStatic
+        @Parameterized.Parameters(name = "lensFacing={0}, cameraXConfig={1}")
+        fun data() = mutableListOf<Array<Any?>>().apply {
+            lensFacingList.forEach { lens ->
+                cameraXConfigList.forEach { cameraXConfig ->
+                    add(arrayOf(lens, cameraXConfig))
+                }
+            }
+        }
+
         @JvmField
         val testCameraRule = CameraUtil.PreTestCamera()
     }
 
     @get:Rule
+    val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+        active = cameraXConfig == CameraFragment.CAMERA_PIPE_IMPLEMENTATION_OPTION,
+        forAllTests = true,
+    )
+
+    @get:Rule
     val useCamera = CameraUtil.grantCameraPermissionAndPreTest(
-        testCameraRule, CameraUtil.PreTestCameraIdList(Camera2Config.defaultConfig())
+        testCameraRule, CameraUtil.PreTestCameraIdList(
+            if (cameraXConfig == CameraFragment.CAMERA2_IMPLEMENTATION_OPTION) {
+                Camera2Config.defaultConfig()
+            } else {
+                CameraPipeConfig.defaultConfig()
+            }
+        )
     )
 
     private val mDevice =
@@ -82,15 +112,27 @@
     fun setUp() {
         Assume.assumeTrue(CameraUtil.hasCameraWithLensFacing(lensFacing))
 
+        // Ensure it's in a natural orientation. This change could delay around 1 sec, please
+        // call this earlier before launching the test activity.
+        mDevice.setOrientationNatural()
+
         // Clear the device UI and check if there is no dialog or lock screen on the top of the
         // window.
         CoreAppTestUtil.prepareDeviceUI(InstrumentationRegistry.getInstrumentation())
     }
 
+    @After
+    fun tearDown() {
+        val context = ApplicationProvider.getApplicationContext<Context>()
+        val cameraProvider = ProcessCameraProvider.getInstance(context)[10, TimeUnit.SECONDS]
+        cameraProvider.shutdown()[10, TimeUnit.SECONDS]
+        mDevice.unfreezeRotation()
+    }
+
     // The test makes sure the camera PreviewView is in the streaming state.
     @Test
     fun testPreviewViewUpdateAfterStopResume() {
-        launchActivity(lensFacing).use { scenario ->
+        launchActivity(lensFacing, cameraXConfig).use { scenario ->
             // At first, check Preview in stream state
             assertStreamState(scenario, PreviewView.StreamState.STREAMING)
 
@@ -108,7 +150,7 @@
     @FlakyTest(bugId = 230873000)
     @Test
     fun testPreviewViewUpdateAfterSwitch() {
-        launchActivity(lensFacing).use { scenario ->
+        launchActivity(lensFacing, cameraXConfig).use { scenario ->
             // At first, check Preview in stream state
             assertStreamState(scenario, PreviewView.StreamState.STREAMING)
 
@@ -127,7 +169,7 @@
 
     @Test
     fun testPreviewViewUpdateAfterSwitchOutAndStop_ResumeAndSwitchBack() {
-        launchActivity(lensFacing).use { scenario ->
+        launchActivity(lensFacing, cameraXConfig).use { scenario ->
             // At first, check Preview in stream state
             assertStreamState(scenario, PreviewView.StreamState.STREAMING)
 
@@ -154,13 +196,18 @@
     // TODO(b/162810853): Add tests for PreviewView with PreviewView.ImplementationMode
     //  .SURFACE_VIEW in ViewPagerActivity.
 
-    private fun launchActivity(lensFacing: Int):
+    private fun launchActivity(
+        lensFacing: Int,
+        cameraXConfig: String = CameraFragment.CAMERA2_IMPLEMENTATION_OPTION,
+    ):
         ActivityScenario<ViewPagerActivity> {
             val intent = Intent(
                 ApplicationProvider.getApplicationContext<Context>(),
                 ViewPagerActivity::class.java
-            )
-            intent.putExtra(BaseActivity.INTENT_LENS_FACING, lensFacing)
+            ).apply {
+                putExtra(BaseActivity.INTENT_LENS_FACING, lensFacing)
+                putExtra(CameraFragment.KEY_CAMERA_IMPLEMENTATION, cameraXConfig)
+            }
             return ActivityScenario.launch<ViewPagerActivity>(intent)
         }
 
diff --git a/camera/integration-tests/uiwidgetstestapp/src/main/java/androidx/camera/integration/uiwidgets/rotations/CameraActivity.kt b/camera/integration-tests/uiwidgetstestapp/src/main/java/androidx/camera/integration/uiwidgets/rotations/CameraActivity.kt
index c6f702ef..3cfa805 100644
--- a/camera/integration-tests/uiwidgetstestapp/src/main/java/androidx/camera/integration/uiwidgets/rotations/CameraActivity.kt
+++ b/camera/integration-tests/uiwidgetstestapp/src/main/java/androidx/camera/integration/uiwidgets/rotations/CameraActivity.kt
@@ -22,10 +22,14 @@
 import android.os.Build
 import android.os.Bundle
 import android.provider.MediaStore
+import android.text.TextUtils
 import android.util.Log
 import android.util.Size
+import androidx.annotation.OptIn
 import androidx.annotation.VisibleForTesting
 import androidx.appcompat.app.AppCompatActivity
+import androidx.camera.camera2.Camera2Config
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig
 import androidx.camera.core.Camera
 import androidx.camera.core.CameraSelector
 import androidx.camera.core.ImageAnalysis
@@ -35,6 +39,7 @@
 import androidx.camera.core.Preview
 import androidx.camera.core.impl.utils.executor.CameraXExecutors
 import androidx.camera.integration.uiwidgets.databinding.ActivityRotationsMainBinding
+import androidx.camera.lifecycle.ExperimentalCameraProviderConfiguration
 import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.core.app.ActivityCompat
 import androidx.core.content.ContextCompat
@@ -96,7 +101,29 @@
         }
     }
 
+    @OptIn(ExperimentalCameraProviderConfiguration::class)
     private fun setUpCamera() {
+        val newCameraImpl = intent.getStringExtra(KEY_CAMERA_IMPLEMENTATION)
+        Log.d(TAG, "Set up cameraImpl: $newCameraImpl")
+        if (!TextUtils.isEmpty(newCameraImpl) && newCameraImpl != cameraImpl) {
+            try {
+                Log.d(TAG, "ProcessCameraProvider initialize using $newCameraImpl")
+                ProcessCameraProvider.configureInstance(
+                    when (newCameraImpl) {
+                        CAMERA2_IMPLEMENTATION_OPTION -> Camera2Config.defaultConfig()
+                        CAMERA_PIPE_IMPLEMENTATION_OPTION -> CameraPipeConfig.defaultConfig()
+                        else -> Camera2Config.defaultConfig()
+                    }
+                )
+                cameraImpl = newCameraImpl
+            } catch (e: IllegalStateException) {
+                throw IllegalStateException(
+                    "WARNING: CameraX is currently configured to a different implementation " +
+                        "this would have resulted in unexpected behavior.", e
+                )
+            }
+        }
+
         val cameraProcessFuture = ProcessCameraProvider.getInstance(this)
         cameraProcessFuture.addListener(
             Runnable {
@@ -305,6 +332,9 @@
     companion object {
         const val KEY_LENS_FACING = "lens-facing"
         const val KEY_IMAGE_CAPTURE_MODE = "image-capture-mode"
+        const val KEY_CAMERA_IMPLEMENTATION = "camera_implementation"
+        const val CAMERA2_IMPLEMENTATION_OPTION = "camera2"
+        const val CAMERA_PIPE_IMPLEMENTATION_OPTION = "camera_pipe"
         const val IMAGE_CAPTURE_MODE_IN_MEMORY = 0
         const val IMAGE_CAPTURE_MODE_FILE = 1
         const val IMAGE_CAPTURE_MODE_OUTPUT_STREAM = 2
@@ -314,5 +344,6 @@
         private const val REQUEST_CODE_PERMISSIONS = 20
         val PERMISSIONS =
             arrayOf(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE)
+        private var cameraImpl: String? = null
     }
 }
diff --git a/camera/integration-tests/uiwidgetstestapp/src/main/java/androidx/camera/integration/uiwidgets/viewpager/CameraFragment.kt b/camera/integration-tests/uiwidgetstestapp/src/main/java/androidx/camera/integration/uiwidgets/viewpager/CameraFragment.kt
index 02db5e1..e9c2b48 100644
--- a/camera/integration-tests/uiwidgetstestapp/src/main/java/androidx/camera/integration/uiwidgets/viewpager/CameraFragment.kt
+++ b/camera/integration-tests/uiwidgetstestapp/src/main/java/androidx/camera/integration/uiwidgets/viewpager/CameraFragment.kt
@@ -18,13 +18,18 @@
 
 import android.content.Context
 import android.os.Bundle
+import android.text.TextUtils
 import android.util.Log
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
+import androidx.annotation.OptIn
+import androidx.camera.camera2.Camera2Config
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig
 import androidx.camera.core.CameraSelector
 import androidx.camera.core.Preview
 import androidx.camera.integration.uiwidgets.databinding.FragmentTextureviewBinding
+import androidx.camera.lifecycle.ExperimentalCameraProviderConfiguration
 import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.view.PreviewView
 import androidx.core.content.ContextCompat
@@ -38,6 +43,10 @@
     companion object {
         fun newInstance() = CameraFragment()
         private const val TAG = "CameraFragment"
+        const val KEY_CAMERA_IMPLEMENTATION = "camera_implementation"
+        const val CAMERA2_IMPLEMENTATION_OPTION = "camera2"
+        const val CAMERA_PIPE_IMPLEMENTATION_OPTION = "camera_pipe"
+        private var cameraImpl: String? = null
     }
 
     private var _binding: FragmentTextureviewBinding? = null
@@ -46,8 +55,29 @@
     private lateinit var cameraProviderFuture: ListenableFuture<ProcessCameraProvider>
     private lateinit var cameraProvider: ProcessCameraProvider
 
+    @OptIn(ExperimentalCameraProviderConfiguration::class)
     override fun onAttach(context: Context) {
         super.onAttach(context)
+        val newCameraImpl = activity?.intent?.getStringExtra(KEY_CAMERA_IMPLEMENTATION)
+        Log.d(TAG, "Set up cameraImpl: $newCameraImpl")
+        if (!TextUtils.isEmpty(newCameraImpl) && newCameraImpl != cameraImpl) {
+            try {
+                Log.d(TAG, "ProcessCameraProvider initialize using $newCameraImpl")
+                ProcessCameraProvider.configureInstance(
+                    when (newCameraImpl) {
+                        CAMERA2_IMPLEMENTATION_OPTION -> Camera2Config.defaultConfig()
+                        CAMERA_PIPE_IMPLEMENTATION_OPTION -> CameraPipeConfig.defaultConfig()
+                        else -> Camera2Config.defaultConfig()
+                    }
+                )
+                cameraImpl = newCameraImpl
+            } catch (e: IllegalStateException) {
+                throw IllegalStateException(
+                    "WARNING: CameraX is currently configured to a different implementation " +
+                        "this would have resulted in unexpected behavior.", e
+                )
+            }
+        }
         cameraProviderFuture = ProcessCameraProvider.getInstance(context)
     }
 
diff --git a/camera/integration-tests/viewfindertestapp/build.gradle b/camera/integration-tests/viewfindertestapp/build.gradle
index 0623a35..0a81027 100644
--- a/camera/integration-tests/viewfindertestapp/build.gradle
+++ b/camera/integration-tests/viewfindertestapp/build.gradle
@@ -67,8 +67,8 @@
     androidTestImplementation(libs.testRunner)
     androidTestImplementation(libs.testRules)
     androidTestImplementation(libs.testUiautomator)
-    androidTestImplementation(libs.espressoCore)
     androidTestImplementation(libs.truth)
+    androidTestImplementation("androidx.test.espresso:espresso-core:3.3.0")
     debugImplementation(libs.testCore)
     debugImplementation("androidx.fragment:fragment-testing:1.2.3")
     // camera-testing added as 'implementation' dependency to include camera-testing activity in APK
diff --git a/camera/integration-tests/viewtestapp/build.gradle b/camera/integration-tests/viewtestapp/build.gradle
index 0f6a227..63a32ad 100644
--- a/camera/integration-tests/viewtestapp/build.gradle
+++ b/camera/integration-tests/viewtestapp/build.gradle
@@ -92,7 +92,7 @@
     androidTestImplementation(libs.testRunner)
     androidTestImplementation(libs.testRules)
     androidTestImplementation(libs.testUiautomator)
-    androidTestImplementation(libs.espressoCore)
+    androidTestImplementation("androidx.test.espresso:espresso-core:3.3.0")
     androidTestImplementation("androidx.lifecycle:lifecycle-runtime-testing:2.3.1")
     androidTestImplementation("androidx.lifecycle:lifecycle-runtime:2.3.1")
     androidTestImplementation("androidx.lifecycle:lifecycle-livedata-ktx:2.2.0")
diff --git a/car/app/app-automotive/api/current.txt b/car/app/app-automotive/api/current.txt
index e0b9e41..fbc3e22 100644
--- a/car/app/app-automotive/api/current.txt
+++ b/car/app/app-automotive/api/current.txt
@@ -39,3 +39,50 @@
 
 }
 
+package androidx.car.app.hardware.common {
+
+  public final class CarZoneAreaIdConstants {
+    field public static final int AREA_ID_GLOBAL = 0; // 0x0
+  }
+
+  public static final class CarZoneAreaIdConstants.VehicleAreaSeat {
+    field public static final int COL_ALL = 1911; // 0x777
+    field public static final int COL_CENTER = 546; // 0x222
+    field public static final int COL_LEFT = 273; // 0x111
+    field public static final int COL_RIGHT = 1092; // 0x444
+    field public static final int ROW_1_CENTER = 2; // 0x2
+    field public static final int ROW_1_LEFT = 1; // 0x1
+    field public static final int ROW_1_RIGHT = 4; // 0x4
+    field public static final int ROW_2_CENTER = 32; // 0x20
+    field public static final int ROW_2_LEFT = 16; // 0x10
+    field public static final int ROW_2_RIGHT = 64; // 0x40
+    field public static final int ROW_3_CENTER = 512; // 0x200
+    field public static final int ROW_3_LEFT = 256; // 0x100
+    field public static final int ROW_3_RIGHT = 1024; // 0x400
+    field public static final int ROW_ALL = 1911; // 0x777
+    field public static final int ROW_FIRST = 7; // 0x7
+    field public static final int ROW_SECOND = 112; // 0x70
+    field public static final int ROW_THIRD = 1792; // 0x700
+  }
+
+  public interface CarZoneAreaIdConverter {
+    method public com.google.common.collect.ImmutableSet<androidx.car.app.hardware.common.CarZone!> convertAreaIdToCarZones(int);
+  }
+
+  public final class CarZoneUtils {
+    method public static com.google.common.collect.ImmutableSet<androidx.car.app.hardware.common.CarZone!> convertAreaIdToCarZones(int, int);
+    method public static androidx.car.app.hardware.common.CarZoneAreaIdConverter getZoneAreaIdConverter(int);
+  }
+
+  public class GlobalCarZoneAreaIdConverter implements androidx.car.app.hardware.common.CarZoneAreaIdConverter {
+    ctor public GlobalCarZoneAreaIdConverter();
+    method public com.google.common.collect.ImmutableSet<androidx.car.app.hardware.common.CarZone!> convertAreaIdToCarZones(int);
+  }
+
+  public class SeatCarZoneAreaIdConverter implements androidx.car.app.hardware.common.CarZoneAreaIdConverter {
+    ctor public SeatCarZoneAreaIdConverter();
+    method public com.google.common.collect.ImmutableSet<androidx.car.app.hardware.common.CarZone!> convertAreaIdToCarZones(int);
+  }
+
+}
+
diff --git a/car/app/app-automotive/api/public_plus_experimental_current.txt b/car/app/app-automotive/api/public_plus_experimental_current.txt
index d7ebfbc..6e7e9f6 100644
--- a/car/app/app-automotive/api/public_plus_experimental_current.txt
+++ b/car/app/app-automotive/api/public_plus_experimental_current.txt
@@ -47,3 +47,50 @@
 
 }
 
+package androidx.car.app.hardware.common {
+
+  public final class CarZoneAreaIdConstants {
+    field public static final int AREA_ID_GLOBAL = 0; // 0x0
+  }
+
+  public static final class CarZoneAreaIdConstants.VehicleAreaSeat {
+    field public static final int COL_ALL = 1911; // 0x777
+    field public static final int COL_CENTER = 546; // 0x222
+    field public static final int COL_LEFT = 273; // 0x111
+    field public static final int COL_RIGHT = 1092; // 0x444
+    field public static final int ROW_1_CENTER = 2; // 0x2
+    field public static final int ROW_1_LEFT = 1; // 0x1
+    field public static final int ROW_1_RIGHT = 4; // 0x4
+    field public static final int ROW_2_CENTER = 32; // 0x20
+    field public static final int ROW_2_LEFT = 16; // 0x10
+    field public static final int ROW_2_RIGHT = 64; // 0x40
+    field public static final int ROW_3_CENTER = 512; // 0x200
+    field public static final int ROW_3_LEFT = 256; // 0x100
+    field public static final int ROW_3_RIGHT = 1024; // 0x400
+    field public static final int ROW_ALL = 1911; // 0x777
+    field public static final int ROW_FIRST = 7; // 0x7
+    field public static final int ROW_SECOND = 112; // 0x70
+    field public static final int ROW_THIRD = 1792; // 0x700
+  }
+
+  public interface CarZoneAreaIdConverter {
+    method public com.google.common.collect.ImmutableSet<androidx.car.app.hardware.common.CarZone!> convertAreaIdToCarZones(int);
+  }
+
+  public final class CarZoneUtils {
+    method public static com.google.common.collect.ImmutableSet<androidx.car.app.hardware.common.CarZone!> convertAreaIdToCarZones(int, int);
+    method public static androidx.car.app.hardware.common.CarZoneAreaIdConverter getZoneAreaIdConverter(int);
+  }
+
+  public class GlobalCarZoneAreaIdConverter implements androidx.car.app.hardware.common.CarZoneAreaIdConverter {
+    ctor public GlobalCarZoneAreaIdConverter();
+    method public com.google.common.collect.ImmutableSet<androidx.car.app.hardware.common.CarZone!> convertAreaIdToCarZones(int);
+  }
+
+  public class SeatCarZoneAreaIdConverter implements androidx.car.app.hardware.common.CarZoneAreaIdConverter {
+    ctor public SeatCarZoneAreaIdConverter();
+    method public com.google.common.collect.ImmutableSet<androidx.car.app.hardware.common.CarZone!> convertAreaIdToCarZones(int);
+  }
+
+}
+
diff --git a/car/app/app-automotive/api/restricted_current.txt b/car/app/app-automotive/api/restricted_current.txt
index 9c3b7b0..0517edf 100644
--- a/car/app/app-automotive/api/restricted_current.txt
+++ b/car/app/app-automotive/api/restricted_current.txt
@@ -39,3 +39,50 @@
 
 }
 
+package androidx.car.app.hardware.common {
+
+  public final class CarZoneAreaIdConstants {
+    field public static final int AREA_ID_GLOBAL = 0; // 0x0
+  }
+
+  public static final class CarZoneAreaIdConstants.VehicleAreaSeat {
+    field public static final int COL_ALL = 1911; // 0x777
+    field public static final int COL_CENTER = 546; // 0x222
+    field public static final int COL_LEFT = 273; // 0x111
+    field public static final int COL_RIGHT = 1092; // 0x444
+    field public static final int ROW_1_CENTER = 2; // 0x2
+    field public static final int ROW_1_LEFT = 1; // 0x1
+    field public static final int ROW_1_RIGHT = 4; // 0x4
+    field public static final int ROW_2_CENTER = 32; // 0x20
+    field public static final int ROW_2_LEFT = 16; // 0x10
+    field public static final int ROW_2_RIGHT = 64; // 0x40
+    field public static final int ROW_3_CENTER = 512; // 0x200
+    field public static final int ROW_3_LEFT = 256; // 0x100
+    field public static final int ROW_3_RIGHT = 1024; // 0x400
+    field public static final int ROW_ALL = 1911; // 0x777
+    field public static final int ROW_FIRST = 7; // 0x7
+    field public static final int ROW_SECOND = 112; // 0x70
+    field public static final int ROW_THIRD = 1792; // 0x700
+  }
+
+  public interface CarZoneAreaIdConverter {
+    method public com.google.common.collect.ImmutableSet<androidx.car.app.hardware.common.CarZone!> convertAreaIdToCarZones(int);
+  }
+
+  public final class CarZoneUtils {
+    method public static com.google.common.collect.ImmutableSet<androidx.car.app.hardware.common.CarZone!> convertAreaIdToCarZones(int, int);
+    method public static androidx.car.app.hardware.common.CarZoneAreaIdConverter getZoneAreaIdConverter(int);
+  }
+
+  public class GlobalCarZoneAreaIdConverter implements androidx.car.app.hardware.common.CarZoneAreaIdConverter {
+    ctor public GlobalCarZoneAreaIdConverter();
+    method public com.google.common.collect.ImmutableSet<androidx.car.app.hardware.common.CarZone!> convertAreaIdToCarZones(int);
+  }
+
+  public class SeatCarZoneAreaIdConverter implements androidx.car.app.hardware.common.CarZoneAreaIdConverter {
+    ctor public SeatCarZoneAreaIdConverter();
+    method public com.google.common.collect.ImmutableSet<androidx.car.app.hardware.common.CarZone!> convertAreaIdToCarZones(int);
+  }
+
+}
+
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/activity/CarAppViewModelFactory.java b/car/app/app-automotive/src/main/java/androidx/car/app/activity/CarAppViewModelFactory.java
index 4ce892c..dd8bdef 100644
--- a/car/app/app-automotive/src/main/java/androidx/car/app/activity/CarAppViewModelFactory.java
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/activity/CarAppViewModelFactory.java
@@ -24,6 +24,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.SessionInfo;
+import androidx.core.util.Pair;
 import androidx.lifecycle.ViewModel;
 import androidx.lifecycle.ViewModelProvider;
 
@@ -31,13 +32,15 @@
 import java.util.Map;
 
 /**
- * A factory to provide a unique {@link CarAppViewModel} for each given {@link ComponentName}.
+ * A factory to provide a unique {@link CarAppViewModel} for each pair of {@link ComponentName} and
+ * {@link SessionInfo}.
  *
  * @hide
  */
 @RestrictTo(LIBRARY)
 class CarAppViewModelFactory implements ViewModelProvider.Factory {
-    private static final Map<ComponentName, CarAppViewModelFactory> sInstances = new HashMap<>();
+    private static final Map<Pair<ComponentName, SessionInfo>, CarAppViewModelFactory> sInstances =
+            new HashMap<>();
 
     Application mApplication;
     ComponentName mComponentName;
@@ -51,17 +54,19 @@
     }
 
     /**
-     * Retrieve a singleton instance of CarAppViewModelFactory for the given key.
+     * Retrieve a singleton instance of CarAppViewModelFactory for the given
+     * {@link ComponentName} and {@link SessionInfo}.
      *
      * @return A valid {@link CarAppViewModelFactory}
      */
     @NonNull
     static CarAppViewModelFactory getInstance(Application application,
             ComponentName componentName, SessionInfo sessionInfo) {
-        CarAppViewModelFactory instance = sInstances.get(componentName);
+        Pair<ComponentName, SessionInfo> instanceCacheKey = new Pair<>(componentName, sessionInfo);
+        CarAppViewModelFactory instance = sInstances.get(instanceCacheKey);
         if (instance == null) {
             instance = new CarAppViewModelFactory(componentName, application, sessionInfo);
-            sInstances.put(componentName, instance);
+            sInstances.put(instanceCacheKey, instance);
         }
         return instance;
     }
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/climate/AutomotiveCarClimate.java b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/climate/AutomotiveCarClimate.java
index 2360c73..20a978f 100644
--- a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/climate/AutomotiveCarClimate.java
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/climate/AutomotiveCarClimate.java
@@ -49,6 +49,7 @@
 import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_SEAT_VENTILATION_LEVEL;
 import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_STEERING_WHEEL_HEAT;
 import static androidx.car.app.hardware.common.CarValueUtils.getCarValue;
+import static androidx.car.app.hardware.common.PropertyUtils.getMinMaxProfileIntegerMap;
 
 import static java.util.Objects.requireNonNull;
 
@@ -58,6 +59,7 @@
 import androidx.annotation.RestrictTo;
 import androidx.annotation.VisibleForTesting;
 import androidx.car.app.annotations.ExperimentalCarApi;
+import androidx.car.app.hardware.common.CarPropertyProfile;
 import androidx.car.app.hardware.common.CarPropertyResponse;
 import androidx.car.app.hardware.common.CarSetOperationStatusCallback;
 import androidx.car.app.hardware.common.CarValue;
@@ -70,12 +72,9 @@
 import com.google.common.util.concurrent.ListenableFuture;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
 
@@ -90,6 +89,7 @@
 
     @VisibleForTesting
     static final float DEFAULT_SAMPLE_RATE_HZ = 5f;
+    static final float DEFAULT_TEMPERATURE_INCREMENT = -1f;
     static ImmutableBiMap<Integer, Integer> sFeatureToPropertyId =
             new ImmutableBiMap.Builder<Integer,
                     Integer>()
@@ -158,7 +158,7 @@
             propertyIds.add(requireNonNull(sFeatureToPropertyId.get(
                     feature.getFeature())));
         }
-        ListenableFuture<List<CarPropertyResponse<?>>> future =
+        ListenableFuture<List<CarPropertyProfile<?>>> future =
                 mPropertyManager.fetchSupportedZonesResponse(
                         propertyIds, executor);
         populateData(executor, callback, future);
@@ -267,11 +267,11 @@
 
     private static void populateData(@NonNull Executor executor,
             @NonNull CarClimateProfileCallback onCarClimateProfileCallback,
-            ListenableFuture<List<CarPropertyResponse<?>>> future) {
+            ListenableFuture<List<CarPropertyProfile<?>>> future) {
         future.addListener(() -> {
-            List<CarPropertyResponse<?>> carPropertyResponses;
+            List<CarPropertyProfile<?>> carPropertyProfiles;
             try {
-                carPropertyResponses = future.get();
+                carPropertyProfiles = future.get();
             } catch (ExecutionException e) {
                 Log.e(LogTags.TAG_CAR_HARDWARE,
                         "Failed to get CarPropertyResponse due to error", e);
@@ -282,45 +282,126 @@
                 Thread.currentThread().interrupt();
                 return;
             }
-            Map<Integer, List<CarZone>> featuresWithResponseCarZones = new HashMap<>();
 
             // Extract all car zones corresponding to each feature.
-            for (CarPropertyResponse<?> carPropertyResponse : carPropertyResponses) {
+            for (CarPropertyProfile<?> carPropertyProfile : carPropertyProfiles) {
                 Integer feature = sFeatureToPropertyId.inverse().get(
-                        carPropertyResponse.getPropertyId());
+                        carPropertyProfile.getPropertyId());
                 if (feature == null) {
                     Log.e(LogTags.TAG_CAR_HARDWARE, "Feature not found for property Id "
-                            + carPropertyResponse.getPropertyId());
+                            + carPropertyProfile.getPropertyId());
                     continue;
                 }
 
-                List<CarZone> carZones = featuresWithResponseCarZones.getOrDefault(feature,
-                        new ArrayList<>());
-                carZones.addAll(carPropertyResponse.getCarZones());
-                featuresWithResponseCarZones.put(feature, carZones);
-            }
-
-            // Populate callback with all the car zones per feature.
-            for (Map.Entry<Integer, List<CarZone>> entry :
-                    featuresWithResponseCarZones.entrySet()) {
-                // TODO(b/237548439): Remove tempCarZoneSet once the pipeline is ready for the real
-                // values.
-                Set<CarZone> tempCarZoneSet = new HashSet<>(entry.getValue());
-                switch (entry.getKey()) {
+                switch (feature) {
                     case FEATURE_HVAC_POWER:
                         onCarClimateProfileCallback.onHvacPowerProfileAvailable(
-                                new HvacPowerProfile.Builder(
-                                        Collections.singletonList(tempCarZoneSet)).build());
+                                new HvacPowerProfile.Builder(carPropertyProfile.getCarZones())
+                                        .build());
+                        break;
+                    case FEATURE_CABIN_TEMPERATURE:
+                        onCarClimateProfileCallback.onCabinTemperatureProfileAvailable(
+                                new CabinTemperatureProfile.Builder(
+                                        requireNonNull(carPropertyProfile.getCelsiusRange()),
+                                        requireNonNull(carPropertyProfile.getFahrenheitRange()),
+                                        (carPropertyProfile.getCelsiusIncrement() != null
+                                                ? carPropertyProfile.getCelsiusIncrement()
+                                                : DEFAULT_TEMPERATURE_INCREMENT),
+                                        (carPropertyProfile.getFahrenheitIncrement() != null
+                                                ? carPropertyProfile.getFahrenheitIncrement()
+                                                : DEFAULT_TEMPERATURE_INCREMENT))
+                                        .build()
+                        );
+                        break;
+                    case FEATURE_FAN_SPEED:
+                        onCarClimateProfileCallback.onFanSpeedLevelProfileAvailable(
+                                new FanSpeedLevelProfile.Builder(getMinMaxProfileIntegerMap(
+                                        requireNonNull(
+                                                carPropertyProfile.getCarZoneSetsToMinMaxRange())))
+                                        .build()
+                        );
+                        break;
+                    case FEATURE_FAN_DIRECTION:
+                        onCarClimateProfileCallback.onFanDirectionProfileAvailable(
+                                new FanDirectionProfile.Builder(getMinMaxProfileIntegerMap(
+                                        requireNonNull(
+                                                carPropertyProfile.getCarZoneSetsToMinMaxRange())))
+                                        .build()
+                        );
+                        break;
+                    case FEATURE_SEAT_TEMPERATURE_LEVEL:
+                        onCarClimateProfileCallback.onSeatTemperatureLevelProfileAvailable(
+                                new SeatTemperatureProfile.Builder(getMinMaxProfileIntegerMap(
+                                        requireNonNull(
+                                                carPropertyProfile.getCarZoneSetsToMinMaxRange())))
+                                        .build()
+                        );
+                        break;
+                    case FEATURE_SEAT_VENTILATION_LEVEL:
+                        onCarClimateProfileCallback.onSeatVentilationLevelProfileAvailable(
+                                new SeatVentilationProfile.Builder(getMinMaxProfileIntegerMap(
+                                        requireNonNull(
+                                                carPropertyProfile.getCarZoneSetsToMinMaxRange())))
+                                        .build()
+                        );
+                        break;
+                    case FEATURE_STEERING_WHEEL_HEAT:
+                        onCarClimateProfileCallback.onSteeringWheelHeatProfileAvailable(
+                                new SteeringWheelHeatProfile.Builder(getMinMaxProfileIntegerMap(
+                                        requireNonNull(
+                                                carPropertyProfile.getCarZoneSetsToMinMaxRange())))
+                                        .build()
+                        );
+                        break;
+                    case FEATURE_HVAC_AC:
+                        onCarClimateProfileCallback.onHvacAcProfileAvailable(
+                                new HvacAcProfile.Builder(carPropertyProfile.getCarZones())
+                                        .build());
+                        break;
+                    case FEATURE_HVAC_MAX_AC:
+                        onCarClimateProfileCallback.onHvacMaxAcModeProfileAvailable(
+                                new HvacMaxAcModeProfile.Builder(carPropertyProfile.getCarZones())
+                                        .build());
+                        break;
+                    case FEATURE_HVAC_RECIRCULATION:
+                        onCarClimateProfileCallback.onHvacRecirculationProfileAvailable(
+                                new HvacRecirculationProfile.Builder(
+                                        carPropertyProfile.getCarZones())
+                                        .build());
+                        break;
+                    case FEATURE_HVAC_AUTO_RECIRCULATION:
+                        onCarClimateProfileCallback.onHvacAutoRecirculationProfileAvailable(
+                                new HvacAutoRecirculationProfile.Builder(
+                                        carPropertyProfile.getCarZones())
+                                        .build());
+                        break;
+                    case FEATURE_HVAC_AUTO_MODE:
+                        onCarClimateProfileCallback.onHvacAutoModeProfileAvailable(
+                                new HvacAutoModeProfile.Builder(carPropertyProfile.getCarZones())
+                                        .build());
+                        break;
+                    case FEATURE_HVAC_DUAL_MODE:
+                        onCarClimateProfileCallback.onHvacDualModeProfileAvailable(
+                                new HvacDualModeProfile.Builder(carPropertyProfile.getCarZones())
+                                        .build());
+                        break;
+                    case FEATURE_HVAC_DEFROSTER:
+                        onCarClimateProfileCallback.onDefrosterProfileAvailable(
+                                new DefrosterProfile.Builder(carPropertyProfile.getCarZones())
+                                        .build());
+                        break;
+                    case FEATURE_HVAC_MAX_DEFROSTER:
+                        onCarClimateProfileCallback.onMaxDefrosterProfileAvailable(
+                                new MaxDefrosterProfile.Builder(carPropertyProfile.getCarZones())
+                                        .build());
                         break;
                     default:
                         Log.e(LogTags.TAG_CAR_HARDWARE,
                                 "Invalid response callback while populating data for "
-                                        + "feature value: " + entry.getKey());
+                                        + "feature value: " + feature);
                         break;
-
                 }
             }
-            // TODO(b/215225317): Populate other callbacks.
         }, executor);
     }
 }
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/CarPropertyProfile.java b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/CarPropertyProfile.java
new file mode 100644
index 0000000..8036db4
--- /dev/null
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/CarPropertyProfile.java
@@ -0,0 +1,160 @@
+/*
+ * 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.car.app.hardware.common;
+
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
+
+import android.util.Pair;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Container class for information about property profile such as the car zones and supported
+ * property values associated with them.
+ *
+ * <p>{@link PropertyManager} uses it to give response to front-end components such as
+ * {@link androidx.car.app.hardware.climate.AutomotiveCarClimate}.
+ *
+ * @param <T> is the value type of response.
+ *
+ * @hide
+ */
+@RestrictTo(LIBRARY)
+@AutoValue
+public abstract class CarPropertyProfile<T> {
+
+    /** Returns one of the values in {@link android.car.VehiclePropertyIds}. */
+    public abstract int getPropertyId();
+
+    /** Returns a map of min/max values for a property corresponding to a set of car zones.
+     *
+     * <p>The set of car zones represent the zones in which the associated feature can be regulated
+     * together.
+     */
+    @Nullable
+    public abstract ImmutableMap<Set<CarZone>, Pair<T, T>> getCarZoneSetsToMinMaxRange();
+
+    /** Returns a pair of min and max values for the temperature set in Celsius.
+     *
+     * <p> Not all the values within this range may be supported in the car.
+     * If getCelsiusIncrement() returns a non-null value, then Min/Max values combined with the
+     * Celsius increment can be used to determine the supported temperature values.</p>
+     */
+    @Nullable
+    public abstract Pair<Float, Float> getCelsiusRange();
+
+    /** Returns a pair of min and max values for the temperature set in Fahrenheit.
+     *
+     * <p> Not all the values within this range may be supported in the car.
+     * If getFahrenheitRange() returns a non-null value, then Min/Max values combined with the
+     * Fahrenheit increment can be used to determine the supported temperature values.</p>
+     */
+
+    @Nullable
+    public abstract Pair<Float, Float> getFahrenheitRange();
+
+    /** Returns the increment value for the temperature set config in Celsius. */
+    @Nullable
+    public abstract Float getCelsiusIncrement();
+
+    /** Returns the increment value for the temperature set config in Fahrenheit. */
+    @Nullable
+    public abstract Float getFahrenheitIncrement();
+
+    /** Returns a list of set of {@link CarZone}s controlled together. */
+    @NonNull
+    public abstract ImmutableList<Set<CarZone>> getCarZones();
+
+    /** Returns one of the values in {@link CarValue.StatusCode}. */
+    public abstract @CarValue.StatusCode int getStatus();
+
+    /** Gets a builder class for {@link CarPropertyProfile}. */
+    @NonNull
+    public static <T> Builder<T> builder() {
+        return new AutoValue_CarPropertyProfile.Builder<T>()
+                .setCarZones(Collections.singletonList(
+                        Collections.singleton(CarZone.CAR_ZONE_GLOBAL)))
+                .setCarZoneSetsToMinMaxRange(null)
+                .setCelsiusRange(null)
+                .setFahrenheitRange(null)
+                .setCelsiusIncrement(null)
+                .setFahrenheitIncrement(null);
+    }
+
+    /**
+     * A builder for {@link CarPropertyProfile}
+     *
+     * @param <T> is the type for all min/max values.
+     */
+    @AutoValue.Builder
+    public abstract static class Builder<T> {
+        /** Sets a property ID for the {@link CarPropertyProfile}. */
+        @NonNull
+        public abstract Builder<T> setPropertyId(int propertyId);
+
+        /**
+         * Sets a status code for the {@link CarPropertyProfile}.
+         */
+        @NonNull
+        public abstract Builder<T> setStatus(@CarValue.StatusCode int status);
+
+        /** Sets a min/max range pair value for the {@link CarPropertyProfile}. */
+        @NonNull
+        public abstract Builder<T> setCarZoneSetsToMinMaxRange(
+                @Nullable Map<Set<CarZone>, Pair<T, T>> minMaxRange);
+
+        /** Sets a min/max range for temperature in Celsius. */
+        @NonNull
+        public abstract Builder<T> setCelsiusRange(
+                @Nullable Pair<Float, Float> celsiusRange);
+
+        /** Sets a min/max range for temperature in Fahrenheit. */
+        @NonNull
+        public abstract Builder<T> setFahrenheitRange(
+                @Nullable Pair<Float, Float> fahrenheitRange);
+
+        /** Sets the value of increment for temperature set config in Celsius. */
+        @NonNull
+        public abstract Builder<T> setCelsiusIncrement(
+                @Nullable Float celsiusIncrement);
+
+        /** Sets the value of increment for temperature set config in Fahrenheit. */
+        @NonNull
+        public abstract Builder<T> setFahrenheitIncrement(
+                @Nullable Float fahrenheitIncrement);
+
+        /** Sets the list of set of {@link CarZone}s for the {@link CarPropertyProfile}. */
+        @NonNull
+        public abstract Builder<T> setCarZones(
+                @NonNull List<Set<CarZone>> carZones);
+
+        /** Creates an instance of {@link CarPropertyProfile}. */
+        @NonNull
+        public abstract CarPropertyProfile<T> build();
+    }
+}
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/CarZoneAreaIdConstants.java b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/CarZoneAreaIdConstants.java
new file mode 100644
index 0000000..8f7deb1
--- /dev/null
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/CarZoneAreaIdConstants.java
@@ -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.car.app.hardware.common;
+
+/** Car Zone area mapping constants */
+public final class CarZoneAreaIdConstants {
+
+    /** Area Id for global (non-zoned) properties */
+    public static final int AREA_ID_GLOBAL = 0;
+
+    /** Seat car zone area mapping constants */
+    // Platform Hvac areas
+    public static final class VehicleAreaSeat {
+        public static final int ROW_1_LEFT = android.car.VehicleAreaSeat.SEAT_ROW_1_LEFT;
+        public static final int ROW_1_CENTER = android.car.VehicleAreaSeat.SEAT_ROW_1_CENTER;
+        public static final int ROW_1_RIGHT = android.car.VehicleAreaSeat.SEAT_ROW_1_RIGHT;
+
+        public static final int ROW_2_LEFT = android.car.VehicleAreaSeat.SEAT_ROW_2_LEFT;
+        public static final int ROW_2_CENTER = android.car.VehicleAreaSeat.SEAT_ROW_2_CENTER;
+        public static final int ROW_2_RIGHT = android.car.VehicleAreaSeat.SEAT_ROW_2_RIGHT;
+
+        public static final int ROW_3_LEFT = android.car.VehicleAreaSeat.SEAT_ROW_3_LEFT;
+        public static final int ROW_3_CENTER = android.car.VehicleAreaSeat.SEAT_ROW_3_CENTER;
+        public static final int ROW_3_RIGHT = android.car.VehicleAreaSeat.SEAT_ROW_3_RIGHT;
+
+        public static final int ROW_FIRST = ROW_1_LEFT | ROW_1_CENTER | ROW_1_RIGHT;
+        public static final int ROW_SECOND = ROW_2_LEFT | ROW_2_CENTER | ROW_2_RIGHT;
+        public static final int ROW_THIRD = ROW_3_LEFT | ROW_3_CENTER | ROW_3_RIGHT;
+        public static final int ROW_ALL = ROW_FIRST | ROW_SECOND | ROW_THIRD;
+
+        public static final int COL_LEFT = ROW_1_LEFT | ROW_2_LEFT | ROW_3_LEFT;
+        public static final int COL_CENTER = ROW_1_CENTER | ROW_2_CENTER | ROW_3_CENTER;
+        public static final int COL_RIGHT = ROW_1_RIGHT | ROW_2_RIGHT | ROW_3_RIGHT;
+        public static final int COL_ALL = COL_LEFT | COL_CENTER | COL_RIGHT;
+
+        private VehicleAreaSeat() {}
+    }
+
+    private CarZoneAreaIdConstants() {}
+}
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/CarZoneAreaIdConverter.java b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/CarZoneAreaIdConverter.java
new file mode 100644
index 0000000..df95abf
--- /dev/null
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/CarZoneAreaIdConverter.java
@@ -0,0 +1,28 @@
+/*
+ * 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.car.app.hardware.common;
+
+import androidx.annotation.NonNull;
+
+import com.google.common.collect.ImmutableSet;
+
+/** Interface for zone to area mapping functionality */
+public interface CarZoneAreaIdConverter {
+    /** Converts {@code areaId} into a list of Car zones. */
+    @NonNull
+    ImmutableSet<CarZone> convertAreaIdToCarZones(int areaId);
+}
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/CarZoneUtils.java b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/CarZoneUtils.java
new file mode 100644
index 0000000..64bcec6
--- /dev/null
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/CarZoneUtils.java
@@ -0,0 +1,78 @@
+/*
+ * 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.car.app.hardware.common;
+
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
+
+import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.RestrictTo;
+
+import com.google.common.collect.ImmutableSet;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/** Car zone utility methods. */
+public final class CarZoneUtils {
+
+    /**
+     * Area types determine how {@link CarZone}s are converted to and from platform area ids.
+     *
+     * @hide
+     */
+    @RestrictTo(LIBRARY)
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef({
+            AreaType.SEAT,
+            AreaType.NONE,
+    })
+    public @interface AreaType {
+        int SEAT = 1;
+        int NONE = 2;
+    }
+
+    private CarZoneUtils() {}
+
+    /**
+     * Converts {@code areaId}, which is a bitmask of car areas, into a list of car zones.
+     * Each object in the return list corresponds to an area in {@code areaId}.
+     */
+    @NonNull
+    public static ImmutableSet<CarZone> convertAreaIdToCarZones(
+            @AreaType int areaType, int areaId) {
+        return getZoneAreaIdConverter(areaType).convertAreaIdToCarZones(areaId);
+    }
+
+    /**
+     * Gets an object of the converter classes based on the area type. Only Seat area
+     * type is supported yet.
+     */
+    @NonNull
+    public static CarZoneAreaIdConverter getZoneAreaIdConverter(
+            @AreaType int areaType) {
+        switch (areaType) {
+            //TODO(b/241144091): Add support for other types of areas.
+            case AreaType.NONE:
+                return new GlobalCarZoneAreaIdConverter();
+            case AreaType.SEAT:
+                return new SeatCarZoneAreaIdConverter();
+            default:
+                throw new IllegalArgumentException("Unsupported areaType: " + areaType);
+        }
+    }
+}
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/GlobalCarZoneAreaIdConverter.java b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/GlobalCarZoneAreaIdConverter.java
new file mode 100644
index 0000000..861c340
--- /dev/null
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/GlobalCarZoneAreaIdConverter.java
@@ -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.car.app.hardware.common;
+
+import androidx.annotation.NonNull;
+
+import com.google.common.collect.ImmutableSet;
+
+/** CarZone to areaId converter for Global zones. */
+public class GlobalCarZoneAreaIdConverter implements CarZoneAreaIdConverter {
+    @NonNull
+    @Override
+    public ImmutableSet<CarZone> convertAreaIdToCarZones(int areaId) {
+        return ImmutableSet.of(CarZone.CAR_ZONE_GLOBAL);
+    }
+}
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/PropertyManager.java b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/PropertyManager.java
index 17db790..374103f 100644
--- a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/PropertyManager.java
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/PropertyManager.java
@@ -17,7 +17,6 @@
 package androidx.car.app.hardware.common;
 
 import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-import static androidx.car.app.hardware.common.PropertyUtils.CAR_ZONE_TO_AREA_ID;
 
 import android.car.hardware.CarPropertyValue;
 import android.content.Context;
@@ -33,7 +32,6 @@
 import com.google.common.util.concurrent.ListenableFuture;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -209,25 +207,24 @@
     }
 
     /**
-     * Returns a list of {@link CarPropertyResponse}s that contain the supported car zones for
-     * the given propertyIds.
+     * Returns a list of {@link CarPropertyProfile}s that contains the supported car zones and
+     * the corresponding min/max values for the given propertyIds.
      *
      * @param propertyIds a list of property Ids.
      * @param executor              executes the expensive operation such as fetching property
      *                              values from cars
-     * @return {@link ListenableFuture} contains a list of {@link CarPropertyResponse}
+     * @return {@link ListenableFuture} contains a list of {@link CarPropertyProfile}
      * @throws SecurityException if the application did not grant permissions for getting
      *                           property
      */
     @NonNull
-    public ListenableFuture<List<CarPropertyResponse<?>>> fetchSupportedZonesResponse(
+    public ListenableFuture<List<CarPropertyProfile<?>>> fetchSupportedZonesResponse(
             @NonNull List<Integer> propertyIds, @NonNull Executor executor) {
         checkPermissions(propertyIds);
         return CallbackToFutureAdapter.getFuture(completer -> {
-            executor.execute(() -> mPropertyRequestProcessor.fetchSupportedCarZones(
+            executor.execute(() -> mPropertyRequestProcessor.fetchCarPropertyProfiles(
                     propertyIds,
-                    (propertyIdAreaIds, errors) -> completer.set(
-                            createResponsesForSupportedCarZones(propertyIdAreaIds, errors))));
+                    completer::set));
             return "Get property values done";
         });
     }
@@ -325,27 +322,6 @@
         return carResponses;
     }
 
-    private static List<CarPropertyResponse<?>> createResponsesForSupportedCarZones(
-            List<PropertyIdAreaId> propertyIdAreaIds,
-            List<CarInternalError> propertyErrors) {
-        List<CarPropertyResponse<?>> carPropertyResponses = new ArrayList<>();
-        for (PropertyIdAreaId propertyIdAreaId : propertyIdAreaIds) {
-            CarPropertyResponse.Builder<Object> carPropertyResponseBuilder =
-                    CarPropertyResponse.builder()
-                            .setPropertyId(propertyIdAreaId.getPropertyId())
-                            .setTimestampMillis(System.currentTimeMillis())
-                            .setCarZones(Collections.singletonList(
-                                    CAR_ZONE_TO_AREA_ID.inverse().get(
-                                            propertyIdAreaId.getAreaId())));
-            carPropertyResponses.add(carPropertyResponseBuilder.build());
-        }
-        for (CarInternalError error : propertyErrors) {
-            carPropertyResponses.add(CarPropertyResponse.builder().setPropertyId(
-                    error.getPropertyId()).setStatus(error.getErrorCode()).build());
-        }
-        return carPropertyResponses;
-    }
-
     private void checkPermissions(List<Integer> propertyIds) {
         Set<String> requiredPermission = PropertyUtils.getReadPermissionsByPropertyIds(propertyIds);
         for (String permission : requiredPermission) {
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/PropertyRequestProcessor.java b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/PropertyRequestProcessor.java
index 60e8427..78fb4fa 100644
--- a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/PropertyRequestProcessor.java
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/PropertyRequestProcessor.java
@@ -16,7 +16,13 @@
 
 package androidx.car.app.hardware.common;
 
+import static android.car.VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL;
+import static android.car.VehicleAreaType.VEHICLE_AREA_TYPE_SEAT;
+import static android.car.VehiclePropertyIds.HVAC_TEMPERATURE_SET;
+
 import static androidx.annotation.RestrictTo.Scope.LIBRARY;
+import static androidx.car.app.hardware.common.CarValue.STATUS_SUCCESS;
+import static androidx.car.app.hardware.common.CarZoneUtils.convertAreaIdToCarZones;
 
 import android.car.Car;
 import android.car.hardware.CarPropertyConfig;
@@ -24,6 +30,7 @@
 import android.car.hardware.property.CarPropertyManager;
 import android.content.Context;
 import android.util.ArraySet;
+import android.util.Pair;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
@@ -31,7 +38,10 @@
 import com.google.common.collect.ImmutableList;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import javax.annotation.Nullable;
 
@@ -45,6 +55,8 @@
     private final CarPropertyManager mCarPropertyManager;
     private PropertyEventCallback mPropertyEventCallback;
 
+    static final float TEMPERATURE_CONFIG_DENOMINATION = 10f;
+
     /**
      *  Registers this listener to get results from
      *  {@link #fetchCarPropertyValues(List, OnGetPropertiesListener)}.
@@ -60,16 +72,14 @@
                 List<CarInternalError> errors);
     }
 
-    interface OnGetSupportedCarZonesListener {
+    interface OnGetCarPropertyProfilesListener {
         /**
          * Called when get all properties' supported car zones have value or errors.
          *
-         * @param propertyIdAreaIds  a list of {@link PropertyIdAreaId}, empty if there are no
-         *                           errors.
-         * @param errors            a list of {@link CarInternalError}, empty if there are no errors
+         * @param carPropertyProfiles  a list of {@link CarPropertyProfile}, empty if there are no
+         *                           responses.
          */
-        void onGetSupportedCarZones(List<PropertyIdAreaId> propertyIdAreaIds,
-                List<CarInternalError> errors);
+        void onGetCarPropertyProfiles(List<CarPropertyProfile<?>> carPropertyProfiles);
     }
 
     /**
@@ -156,19 +166,59 @@
         listener.onGetProperties(values, errors);
     }
 
-    public void fetchSupportedCarZones(List<Integer> propertyIds,
-            @NonNull OnGetSupportedCarZonesListener listener) {
+    public void fetchCarPropertyProfiles(List<Integer> propertyIds,
+            @NonNull OnGetCarPropertyProfilesListener listener) {
         ImmutableList.Builder<CarInternalError> errors = new ImmutableList.Builder<>();
-        ImmutableList.Builder<PropertyIdAreaId> propertyIdAreaIds = new ImmutableList.Builder<>();
+        List<CarPropertyProfile<?>> carPropertyProfile = new ArrayList<>();
         for (Integer propertyId : propertyIds) {
             try {
                 CarPropertyConfig<?> propertyConfig = getPropertyConfig(propertyId);
-                if (propertyConfig == null) {
+                if (propertyConfig == null
+                        || (propertyConfig.getAreaType() != VEHICLE_AREA_TYPE_GLOBAL
+                        && propertyConfig.getAreaType() != VEHICLE_AREA_TYPE_SEAT)) {
                     errors.add(CarInternalError.create(propertyId, CarValue.STATUS_UNIMPLEMENTED));
                 } else {
+                    int areaType = propertyConfig.getAreaType() == VEHICLE_AREA_TYPE_SEAT
+                            ? CarZoneUtils.AreaType.SEAT : CarZoneUtils.AreaType.NONE;
+                    Map<Set<CarZone>, Pair<Object, Object>> minMaxRange = new HashMap<>();
+                    List<Set<CarZone>> carZones = new ArrayList<>();
                     for (Integer areaId : propertyConfig.getAreaIds()) {
-                        propertyIdAreaIds.add(PropertyIdAreaId.builder().setPropertyId(propertyId)
-                                .setAreaId(areaId).build());
+                        if (propertyConfig.getMinValue(areaId) != null
+                                && propertyConfig.getMaxValue(areaId) != null) {
+                            minMaxRange.put(convertAreaIdToCarZones(areaType,
+                                    areaId), new Pair<>(propertyConfig.getMinValue(areaId),
+                                    propertyConfig.getMaxValue(areaId)));
+                        }
+                        carZones.add(convertAreaIdToCarZones(areaType, areaId));
+                    }
+
+                    if (propertyConfig.getConfigArray().size() != 0
+                            && propertyId == HVAC_TEMPERATURE_SET) {
+                        carPropertyProfile.add(CarPropertyProfile.builder()
+                                .setPropertyId(propertyId)
+                                .setCelsiusRange(new Pair<>(
+                                        (propertyConfig.getConfigArray().get(0)
+                                                / TEMPERATURE_CONFIG_DENOMINATION),
+                                        (propertyConfig.getConfigArray().get(1)
+                                                / TEMPERATURE_CONFIG_DENOMINATION)))
+                                .setFahrenheitRange(new Pair<>(
+                                        (propertyConfig.getConfigArray().get(3)
+                                                / TEMPERATURE_CONFIG_DENOMINATION),
+                                        (propertyConfig.getConfigArray().get(4)
+                                                / TEMPERATURE_CONFIG_DENOMINATION)))
+                                .setCelsiusIncrement(propertyConfig.getConfigArray().get(2)
+                                        / TEMPERATURE_CONFIG_DENOMINATION)
+                                .setFahrenheitIncrement(
+                                        propertyConfig.getConfigArray().get(5)
+                                                / TEMPERATURE_CONFIG_DENOMINATION)
+                                .setStatus(STATUS_SUCCESS)
+                                .build());
+                    } else {
+                        carPropertyProfile.add(CarPropertyProfile.builder()
+                                .setPropertyId(propertyId)
+                                .setCarZones(carZones)
+                                .setStatus(STATUS_SUCCESS)
+                                .setCarZoneSetsToMinMaxRange(minMaxRange).build());
                     }
                 }
             } catch (IllegalArgumentException e) {
@@ -177,7 +227,13 @@
                 errors.add(CarInternalError.create(propertyId, CarValue.STATUS_UNAVAILABLE));
             }
         }
-        listener.onGetSupportedCarZones(propertyIdAreaIds.build(), errors.build());
+        for (CarInternalError error : errors.build()) {
+            carPropertyProfile.add(CarPropertyProfile.builder()
+                    .setPropertyId(error.getPropertyId())
+                    .setStatus(error.getErrorCode())
+                    .build());
+        }
+        listener.onGetCarPropertyProfiles(carPropertyProfile);
     }
 
     /**
@@ -223,4 +279,4 @@
         List<CarPropertyConfig> configs = mCarPropertyManager.getPropertyList(propertySet);
         return configs.size() == 0 ? null : configs.get(0);
     }
-}
+}
\ No newline at end of file
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/PropertyUtils.java b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/PropertyUtils.java
index 9c7e7a9..9b73706 100644
--- a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/PropertyUtils.java
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/PropertyUtils.java
@@ -25,7 +25,6 @@
 import static java.util.Objects.requireNonNull;
 
 import android.car.Car;
-import android.car.VehicleAreaSeat;
 import android.car.VehicleAreaType;
 import android.car.VehiclePropertyIds;
 import android.car.hardware.CarPropertyValue;
@@ -46,6 +45,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -77,6 +77,10 @@
     private static final String CAR_PERMISSION_VENDOR_EXTENSION =
             "android.car.permission.CAR_VENDOR_EXTENSION";
 
+    // System level permission in car-lib to access car climate.
+    private static final String CAR_PERMISSION_CLIMATE_CONTROL =
+            "android.car.permission.CONTROL_CAR_CLIMATE";
+
     // Index key is property id, value is the permission to read property.
     private static final SparseArray<String> PERMISSION_READ_PROPERTY = new SparseArray<String>() {
         {
@@ -112,6 +116,21 @@
             append(VehiclePropertyIds.PARKING_BRAKE_ON, Car.PERMISSION_POWERTRAIN);
             append(VehiclePropertyIds.PARKING_BRAKE_AUTO_APPLY, Car.PERMISSION_POWERTRAIN);
             append(VehiclePropertyIds.FUEL_VOLUME_DISPLAY_UNITS, Car.PERMISSION_READ_DISPLAY_UNITS);
+            append(VehiclePropertyIds.HVAC_POWER_ON, CAR_PERMISSION_CLIMATE_CONTROL);
+            append(VehiclePropertyIds.HVAC_AC_ON, CAR_PERMISSION_CLIMATE_CONTROL);
+            append(VehiclePropertyIds.HVAC_MAX_AC_ON, CAR_PERMISSION_CLIMATE_CONTROL);
+            append(VehiclePropertyIds.HVAC_TEMPERATURE_SET, CAR_PERMISSION_CLIMATE_CONTROL);
+            append(VehiclePropertyIds.HVAC_FAN_SPEED, CAR_PERMISSION_CLIMATE_CONTROL);
+            append(VehiclePropertyIds.HVAC_FAN_DIRECTION, CAR_PERMISSION_CLIMATE_CONTROL);
+            append(VehiclePropertyIds.HVAC_SEAT_TEMPERATURE, CAR_PERMISSION_CLIMATE_CONTROL);
+            append(VehiclePropertyIds.HVAC_SEAT_VENTILATION, CAR_PERMISSION_CLIMATE_CONTROL);
+            append(VehiclePropertyIds.HVAC_STEERING_WHEEL_HEAT, CAR_PERMISSION_CLIMATE_CONTROL);
+            append(VehiclePropertyIds.HVAC_RECIRC_ON, CAR_PERMISSION_CLIMATE_CONTROL);
+            append(VehiclePropertyIds.HVAC_AUTO_RECIRC_ON, CAR_PERMISSION_CLIMATE_CONTROL);
+            append(VehiclePropertyIds.HVAC_AUTO_ON, CAR_PERMISSION_CLIMATE_CONTROL);
+            append(VehiclePropertyIds.HVAC_DUAL_ON, CAR_PERMISSION_CLIMATE_CONTROL);
+            append(VehiclePropertyIds.HVAC_DEFROSTER, CAR_PERMISSION_CLIMATE_CONTROL);
+            append(VehiclePropertyIds.HVAC_MAX_DEFROST_ON, CAR_PERMISSION_CLIMATE_CONTROL);
         }
     };
 
@@ -120,33 +139,33 @@
             new ImmutableBiMap.Builder<CarZone, Integer>()
                     .put(new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
                                     .setColumn(CarZone.CAR_ZONE_COLUMN_LEFT).build(),
-                            VehicleAreaSeat.SEAT_ROW_1_LEFT)
+                            CarZoneAreaIdConstants.VehicleAreaSeat.ROW_1_LEFT)
                     .put(new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
                                     .setColumn(CarZone.CAR_ZONE_COLUMN_CENTER).build(),
-                            VehicleAreaSeat.SEAT_ROW_1_CENTER)
+                            CarZoneAreaIdConstants.VehicleAreaSeat.ROW_1_CENTER)
                     .put(new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
                                     .setColumn(CarZone.CAR_ZONE_COLUMN_RIGHT).build(),
-                            VehicleAreaSeat.SEAT_ROW_1_RIGHT)
+                            CarZoneAreaIdConstants.VehicleAreaSeat.ROW_1_RIGHT)
                     .put(new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_SECOND)
                                     .setColumn(CarZone.CAR_ZONE_COLUMN_LEFT).build(),
-                            VehicleAreaSeat.SEAT_ROW_2_LEFT)
+                            CarZoneAreaIdConstants.VehicleAreaSeat.ROW_2_LEFT)
                     .put(new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_SECOND)
                                     .setColumn(CarZone.CAR_ZONE_COLUMN_CENTER).build(),
-                            VehicleAreaSeat.SEAT_ROW_2_CENTER)
+                            CarZoneAreaIdConstants.VehicleAreaSeat.ROW_2_CENTER)
                     .put(new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_SECOND)
                                     .setColumn(CarZone.CAR_ZONE_COLUMN_RIGHT).build(),
-                            VehicleAreaSeat.SEAT_ROW_2_RIGHT)
+                            CarZoneAreaIdConstants.VehicleAreaSeat.ROW_2_RIGHT)
                     .put(new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_THIRD)
                                     .setColumn(CarZone.CAR_ZONE_COLUMN_LEFT).build(),
-                            VehicleAreaSeat.SEAT_ROW_3_LEFT)
+                            CarZoneAreaIdConstants.VehicleAreaSeat.ROW_3_LEFT)
                     .put(new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_THIRD)
                                     .setColumn(CarZone.CAR_ZONE_COLUMN_CENTER).build(),
-                            VehicleAreaSeat.SEAT_ROW_3_CENTER)
+                            CarZoneAreaIdConstants.VehicleAreaSeat.ROW_3_CENTER)
                     .put(new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_THIRD)
                                     .setColumn(CarZone.CAR_ZONE_COLUMN_RIGHT).build(),
-                            VehicleAreaSeat.SEAT_ROW_3_RIGHT)
+                            CarZoneAreaIdConstants.VehicleAreaSeat.ROW_3_RIGHT)
                     .put(new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_ALL)
-                                    .setColumn(CarZone.CAR_ZONE_COLUMN_ALL).build(), 0)
+                            .setColumn(CarZone.CAR_ZONE_COLUMN_ALL).build(), 0)
                     .buildOrThrow();
 
     // Permissions for writing properties. They are system level permissions.
@@ -157,6 +176,21 @@
             append(VehiclePropertyIds.RANGE_REMAINING, CAR_PERMISSION_ADJUST_RANGE_REMAINING);
             append(VehiclePropertyIds.FUEL_VOLUME_DISPLAY_UNITS,
                     Car.PERMISSION_CONTROL_DISPLAY_UNITS + CAR_PERMISSION_VENDOR_EXTENSION);
+            append(VehiclePropertyIds.HVAC_POWER_ON, CAR_PERMISSION_CLIMATE_CONTROL);
+            append(VehiclePropertyIds.HVAC_AC_ON, CAR_PERMISSION_CLIMATE_CONTROL);
+            append(VehiclePropertyIds.HVAC_MAX_AC_ON, CAR_PERMISSION_CLIMATE_CONTROL);
+            append(VehiclePropertyIds.HVAC_TEMPERATURE_SET, CAR_PERMISSION_CLIMATE_CONTROL);
+            append(VehiclePropertyIds.HVAC_FAN_SPEED, CAR_PERMISSION_CLIMATE_CONTROL);
+            append(VehiclePropertyIds.HVAC_FAN_DIRECTION, CAR_PERMISSION_CLIMATE_CONTROL);
+            append(VehiclePropertyIds.HVAC_SEAT_TEMPERATURE, CAR_PERMISSION_CLIMATE_CONTROL);
+            append(VehiclePropertyIds.HVAC_SEAT_VENTILATION, CAR_PERMISSION_CLIMATE_CONTROL);
+            append(VehiclePropertyIds.HVAC_STEERING_WHEEL_HEAT, CAR_PERMISSION_CLIMATE_CONTROL);
+            append(VehiclePropertyIds.HVAC_RECIRC_ON, CAR_PERMISSION_CLIMATE_CONTROL);
+            append(VehiclePropertyIds.HVAC_AUTO_RECIRC_ON, CAR_PERMISSION_CLIMATE_CONTROL);
+            append(VehiclePropertyIds.HVAC_AUTO_ON, CAR_PERMISSION_CLIMATE_CONTROL);
+            append(VehiclePropertyIds.HVAC_DUAL_ON, CAR_PERMISSION_CLIMATE_CONTROL);
+            append(VehiclePropertyIds.HVAC_DEFROSTER, CAR_PERMISSION_CLIMATE_CONTROL);
+            append(VehiclePropertyIds.HVAC_MAX_DEFROST_ON, CAR_PERMISSION_CLIMATE_CONTROL);
         }
     };
     private static final Set<Integer> ON_CHANGE_PROPERTIES =
@@ -420,6 +454,24 @@
         return propertyIdWithAreaIds;
     }
 
+    /** Returns a map of min/max values in Integer corresponding to a set of car zones.
+     *
+     * <p> The method is a utility to convert Pair<?, ?> to Pair<Integer, Integer>.
+     */
+    @NonNull
+    public static Map<Set<CarZone>, Pair<Integer, Integer>> getMinMaxProfileIntegerMap(
+            @NonNull Map<Set<CarZone>, ? extends Pair<?, ?>> minMaxRange) {
+        Map<Set<CarZone>, Pair<Integer, Integer>>
+                carZoneSetsToIntegerValues = new HashMap<>();
+        for (Map.Entry<Set<CarZone>, ? extends Pair<?, ?>> entry : requireNonNull(minMaxRange
+                        .entrySet())) {
+            carZoneSetsToIntegerValues.put(entry.getKey(),
+                    new Pair<>((Integer) entry.getValue().first,
+                            (Integer) entry.getValue().second));
+        }
+        return carZoneSetsToIntegerValues;
+    }
+
     private PropertyUtils() {
     }
-}
+}
\ No newline at end of file
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/SeatCarZoneAreaIdConverter.java b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/SeatCarZoneAreaIdConverter.java
new file mode 100644
index 0000000..294e51e
--- /dev/null
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/SeatCarZoneAreaIdConverter.java
@@ -0,0 +1,110 @@
+/*
+ * 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.car.app.hardware.common;
+
+import static androidx.car.app.hardware.common.CarZone.CAR_ZONE_COLUMN_CENTER;
+import static androidx.car.app.hardware.common.CarZone.CAR_ZONE_COLUMN_LEFT;
+import static androidx.car.app.hardware.common.CarZone.CAR_ZONE_COLUMN_RIGHT;
+import static androidx.car.app.hardware.common.CarZone.CAR_ZONE_ROW_FIRST;
+import static androidx.car.app.hardware.common.CarZone.CAR_ZONE_ROW_SECOND;
+import static androidx.car.app.hardware.common.CarZone.CAR_ZONE_ROW_THIRD;
+
+import androidx.annotation.NonNull;
+
+import com.google.common.collect.ImmutableSet;
+
+/** CarZone to areaId converter for Seat */
+public class SeatCarZoneAreaIdConverter implements CarZoneAreaIdConverter {
+
+    public SeatCarZoneAreaIdConverter() {}
+
+    /**
+     * Converts seatAreaId, which is a bitmask of VehicleAreaSeat areas, into a list of
+     * Car zones. Each object in the return list corresponds to a VehicleAreaSeat area in seatAreaId
+     *
+     * @param seatAreaId the area Id that needs to be converted to CarZone
+     */
+    @NonNull
+    @Override
+    public ImmutableSet<CarZone> convertAreaIdToCarZones(int seatAreaId) {
+        ImmutableSet.Builder<CarZone> zones = new ImmutableSet.Builder<>();
+
+        // first row
+
+        // left column
+        if ((seatAreaId & CarZoneAreaIdConstants.VehicleAreaSeat.ROW_1_LEFT)
+                == CarZoneAreaIdConstants.VehicleAreaSeat.ROW_1_LEFT) {
+            zones.add(new CarZone.Builder().setRow(CAR_ZONE_ROW_FIRST)
+                    .setColumn(CAR_ZONE_COLUMN_LEFT).build());
+        }
+        // center column
+        if ((seatAreaId & CarZoneAreaIdConstants.VehicleAreaSeat.ROW_1_CENTER)
+                == CarZoneAreaIdConstants.VehicleAreaSeat.ROW_1_CENTER) {
+            zones.add(new CarZone.Builder().setRow(CAR_ZONE_ROW_FIRST)
+                    .setColumn(CAR_ZONE_COLUMN_CENTER).build());
+        }
+        // right column
+        if ((seatAreaId & CarZoneAreaIdConstants.VehicleAreaSeat.ROW_1_RIGHT)
+                == CarZoneAreaIdConstants.VehicleAreaSeat.ROW_1_RIGHT) {
+            zones.add(new CarZone.Builder().setRow(CAR_ZONE_ROW_FIRST)
+                    .setColumn(CAR_ZONE_COLUMN_RIGHT).build());
+        }
+
+        // second row
+
+        // left column
+        if ((seatAreaId & CarZoneAreaIdConstants.VehicleAreaSeat.ROW_2_LEFT)
+                == CarZoneAreaIdConstants.VehicleAreaSeat.ROW_2_LEFT) {
+            zones.add(new CarZone.Builder().setRow(CAR_ZONE_ROW_SECOND)
+                    .setColumn(CAR_ZONE_COLUMN_LEFT).build());
+        }
+        // center column
+        if ((seatAreaId & CarZoneAreaIdConstants.VehicleAreaSeat.ROW_2_CENTER)
+                == CarZoneAreaIdConstants.VehicleAreaSeat.ROW_2_CENTER) {
+            zones.add(new CarZone.Builder().setRow(CAR_ZONE_ROW_SECOND)
+                    .setColumn(CAR_ZONE_COLUMN_CENTER).build());
+        }
+        // right column
+        if ((seatAreaId & CarZoneAreaIdConstants.VehicleAreaSeat.ROW_2_RIGHT)
+                == CarZoneAreaIdConstants.VehicleAreaSeat.ROW_2_RIGHT) {
+            zones.add(new CarZone.Builder().setRow(CAR_ZONE_ROW_SECOND)
+                    .setColumn(CAR_ZONE_COLUMN_RIGHT).build());
+        }
+
+        // third row
+
+        // left column
+        if ((seatAreaId & CarZoneAreaIdConstants.VehicleAreaSeat.ROW_3_LEFT)
+                == CarZoneAreaIdConstants.VehicleAreaSeat.ROW_3_LEFT) {
+            zones.add(new CarZone.Builder().setRow(CAR_ZONE_ROW_THIRD)
+                    .setColumn(CAR_ZONE_COLUMN_LEFT).build());
+        }
+        // center column
+        if ((seatAreaId & CarZoneAreaIdConstants.VehicleAreaSeat.ROW_3_CENTER)
+                == CarZoneAreaIdConstants.VehicleAreaSeat.ROW_3_CENTER) {
+            zones.add(new CarZone.Builder().setRow(CAR_ZONE_ROW_THIRD)
+                    .setColumn(CAR_ZONE_COLUMN_CENTER).build());
+        }
+        // right column
+        if ((seatAreaId & CarZoneAreaIdConstants.VehicleAreaSeat.ROW_3_RIGHT)
+                == CarZoneAreaIdConstants.VehicleAreaSeat.ROW_3_RIGHT) {
+            zones.add(new CarZone.Builder().setRow(CAR_ZONE_ROW_THIRD)
+                    .setColumn(CAR_ZONE_COLUMN_RIGHT).build());
+        }
+        return zones.build();
+    }
+}
diff --git a/car/app/app-automotive/src/test/java/androidx/car/app/activity/CarAppViewModelFactoryTest.java b/car/app/app-automotive/src/test/java/androidx/car/app/activity/CarAppViewModelFactoryTest.java
index 8625a22..fc228fe 100644
--- a/car/app/app-automotive/src/test/java/androidx/car/app/activity/CarAppViewModelFactoryTest.java
+++ b/car/app/app-automotive/src/test/java/androidx/car/app/activity/CarAppViewModelFactoryTest.java
@@ -17,12 +17,14 @@
 package androidx.car.app.activity;
 
 import static androidx.car.app.SessionInfo.DEFAULT_SESSION_INFO;
+import static androidx.car.app.SessionInfo.DISPLAY_TYPE_MAIN;
 
 import static com.google.common.truth.Truth.assertThat;
 
 import android.app.Application;
 import android.content.ComponentName;
 
+import androidx.car.app.SessionInfo;
 import androidx.test.core.app.ApplicationProvider;
 
 import org.junit.Test;
@@ -49,18 +51,29 @@
         CarAppViewModelFactory factory2 = CarAppViewModelFactory.getInstance(mApplication,
                 TEST_COMPONENT_NAME_1, DEFAULT_SESSION_INFO);
 
-        assertThat(factory1).isEqualTo(factory2);
+        assertThat(factory1).isSameInstanceAs(factory2);
     }
 
     @Test
-    public void getInstance_differentKeys_returnsDifferent() {
+    public void getInstance_differentComponentNames_returnsDifferent() {
         CarAppViewModelFactory factory1 = CarAppViewModelFactory.getInstance(mApplication,
                 TEST_COMPONENT_NAME_1, DEFAULT_SESSION_INFO);
 
         CarAppViewModelFactory factory2 = CarAppViewModelFactory.getInstance(mApplication,
                 TEST_COMPONENT_NAME_2, DEFAULT_SESSION_INFO);
 
-        assertThat(factory1).isNotEqualTo(factory2);
+        assertThat(factory1).isNotSameInstanceAs(factory2);
+    }
+
+    @Test
+    public void getInstance_differentSessionInfos_returnsDifferent() {
+        CarAppViewModelFactory factory1 = CarAppViewModelFactory.getInstance(mApplication,
+                TEST_COMPONENT_NAME_1, DEFAULT_SESSION_INFO);
+
+        CarAppViewModelFactory factory2 = CarAppViewModelFactory.getInstance(mApplication,
+                TEST_COMPONENT_NAME_1, new SessionInfo(DISPLAY_TYPE_MAIN, "a session id"));
+
+        assertThat(factory1).isNotSameInstanceAs(factory2);
     }
 
     @Test
diff --git a/car/app/app-automotive/src/test/java/androidx/car/app/hardware/climate/AutomotiveCarClimateTest.java b/car/app/app-automotive/src/test/java/androidx/car/app/hardware/climate/AutomotiveCarClimateTest.java
index 3601ed8..f3ec4e0 100644
--- a/car/app/app-automotive/src/test/java/androidx/car/app/hardware/climate/AutomotiveCarClimateTest.java
+++ b/car/app/app-automotive/src/test/java/androidx/car/app/hardware/climate/AutomotiveCarClimateTest.java
@@ -16,10 +16,38 @@
 
 package androidx.car.app.hardware.climate;
 
+import static android.car.VehiclePropertyIds.HVAC_AC_ON;
+import static android.car.VehiclePropertyIds.HVAC_AUTO_ON;
+import static android.car.VehiclePropertyIds.HVAC_AUTO_RECIRC_ON;
+import static android.car.VehiclePropertyIds.HVAC_DEFROSTER;
+import static android.car.VehiclePropertyIds.HVAC_DUAL_ON;
+import static android.car.VehiclePropertyIds.HVAC_FAN_DIRECTION;
+import static android.car.VehiclePropertyIds.HVAC_FAN_SPEED;
+import static android.car.VehiclePropertyIds.HVAC_MAX_AC_ON;
+import static android.car.VehiclePropertyIds.HVAC_MAX_DEFROST_ON;
 import static android.car.VehiclePropertyIds.HVAC_POWER_ON;
+import static android.car.VehiclePropertyIds.HVAC_RECIRC_ON;
+import static android.car.VehiclePropertyIds.HVAC_SEAT_TEMPERATURE;
+import static android.car.VehiclePropertyIds.HVAC_SEAT_VENTILATION;
+import static android.car.VehiclePropertyIds.HVAC_STEERING_WHEEL_HEAT;
+import static android.car.VehiclePropertyIds.HVAC_TEMPERATURE_SET;
 
 import static androidx.car.app.hardware.climate.AutomotiveCarClimate.DEFAULT_SAMPLE_RATE_HZ;
+import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_CABIN_TEMPERATURE;
+import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_FAN_DIRECTION;
+import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_FAN_SPEED;
+import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_HVAC_AC;
+import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_HVAC_AUTO_MODE;
+import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_HVAC_AUTO_RECIRCULATION;
+import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_HVAC_DEFROSTER;
+import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_HVAC_DUAL_MODE;
+import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_HVAC_MAX_AC;
+import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_HVAC_MAX_DEFROSTER;
 import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_HVAC_POWER;
+import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_HVAC_RECIRCULATION;
+import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_SEAT_TEMPERATURE_LEVEL;
+import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_SEAT_VENTILATION_LEVEL;
+import static androidx.car.app.hardware.climate.ClimateProfileRequest.FEATURE_STEERING_WHEEL_HEAT;
 import static androidx.car.app.hardware.common.CarValue.STATUS_SUCCESS;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -27,13 +55,16 @@
 
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.car.Car;
 import android.car.hardware.property.CarPropertyManager;
+import android.util.Pair;
 
 import androidx.annotation.NonNull;
+import androidx.car.app.hardware.common.CarPropertyProfile;
 import androidx.car.app.hardware.common.CarPropertyResponse;
 import androidx.car.app.hardware.common.CarValue;
 import androidx.car.app.hardware.common.CarZone;
@@ -43,6 +74,8 @@
 import androidx.test.rule.GrantPermissionRule;
 
 import com.google.common.collect.ImmutableMap;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
 
 import org.junit.Before;
 import org.junit.Rule;
@@ -57,8 +90,10 @@
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Executor;
 import java.util.concurrent.atomic.AtomicReference;
@@ -71,6 +106,7 @@
     public GrantPermissionRule mPermissionsRule = GrantPermissionRule.grant(
             "android.car.permission.CONTROL_CAR_CLIMATE");
     private List<CarPropertyResponse<?>> mResponse;
+    private List<CarPropertyProfile<?>> mCarPropertyProfiles;
     private CountDownLatch mCountDownLatch;
     private final Executor mExecutor = directExecutor();
     private AutomotiveCarClimate mAutomotiveCarClimate;
@@ -90,6 +126,7 @@
         mAutomotiveCarClimate = new AutomotiveCarClimate(mPropertyManager);
         mCountDownLatch = new CountDownLatch(1);
         mResponse = new ArrayList<>();
+        mCarPropertyProfiles = new ArrayList<>();
         mCarZone = new CarZone.Builder().build();
     }
 
@@ -136,4 +173,727 @@
         assertThat(carValue.getStatus()).isEqualTo(STATUS_SUCCESS);
     }
 
+    @Test
+    public void fetchHvacPower_verifyResponse() throws InterruptedException {
+        CarZone frontLeft = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_LEFT).build();
+        CarZone frontRight = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_RIGHT).build();
+        List<Set<CarZone>> carZones = new ArrayList<>();
+        carZones.add(Collections.singleton(frontLeft));
+        carZones.add(Collections.singleton(frontRight));
+        List<Integer> propertyIds = Collections.singletonList(HVAC_POWER_ON);
+        mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_POWER_ON)
+                .setCarZones(carZones).setStatus(STATUS_SUCCESS).build());
+        ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
+                Futures.immediateFuture(mCarPropertyProfiles);
+        when(mPropertyManager.fetchSupportedZonesResponse(
+                eq(propertyIds), eq(mExecutor))).thenReturn(
+                listenableCarPropertyProfile);
+
+        AtomicReference<HvacPowerProfile> loadedResult = new AtomicReference<>();
+        CarClimateProfileCallback listener = new CarClimateProfileCallback() {
+            @Override
+            public void onHvacPowerProfileAvailable(@NonNull HvacPowerProfile hvacPowerProfile) {
+                loadedResult.set(hvacPowerProfile);
+                mCountDownLatch.countDown();
+            }
+        };
+
+        CarClimateFeature.Builder mCarClimateBuilder = new CarClimateFeature.Builder(
+                FEATURE_HVAC_POWER);
+        mCarClimateBuilder.addCarZones(frontLeft);
+        mCarClimateBuilder.addCarZones(frontRight);
+
+        CarClimateFeature mCarClimateFeature = new CarClimateFeature(mCarClimateBuilder);
+        ClimateProfileRequest.Builder builder =
+                new ClimateProfileRequest.Builder();
+        builder.addClimateProfileFeatures(mCarClimateFeature);
+        mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
+        verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
+                eq(propertyIds),
+                eq(mExecutor));
+        mCountDownLatch.await();
+
+        assertThat(loadedResult.get().getSupportedCarZoneSets()).isEqualTo(carZones);
+    }
+
+    @Test
+    public void fetchCabinTemperature_verifyResponse() throws InterruptedException {
+        CarZone frontLeft = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_LEFT).build();
+        CarZone frontRight = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_RIGHT).build();
+        List<Set<CarZone>> carZones = new ArrayList<>();
+        carZones.add(Collections.singleton(frontLeft));
+        carZones.add(Collections.singleton(frontRight));
+        List<Integer> propertyIds = Collections.singletonList(HVAC_TEMPERATURE_SET);
+        mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_TEMPERATURE_SET)
+                .setCelsiusRange(new Pair<>(16.0f, 18.0f))
+                .setFahrenheitRange(new Pair<>(60.5f, 64.5f)).setCelsiusIncrement(0.5f)
+                .setFahrenheitIncrement(1.0f).setCarZones(carZones).setStatus(STATUS_SUCCESS)
+                .build());
+        ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfiles =
+                Futures.immediateFuture(mCarPropertyProfiles);
+        when(mPropertyManager.fetchSupportedZonesResponse(
+                eq(propertyIds), eq(mExecutor))).thenReturn(
+                listenableCarPropertyProfiles);
+
+        AtomicReference<CabinTemperatureProfile> loadedResult = new AtomicReference<>();
+        CarClimateProfileCallback listener = new CarClimateProfileCallback() {
+            @Override
+            public void onCabinTemperatureProfileAvailable(@NonNull CabinTemperatureProfile
+                    cabinTemperatureProfile) {
+                loadedResult.set(cabinTemperatureProfile);
+                mCountDownLatch.countDown();
+            }
+        };
+
+        CarClimateFeature.Builder mCarClimateBuilder = new CarClimateFeature.Builder(
+                FEATURE_CABIN_TEMPERATURE);
+        mCarClimateBuilder.addCarZones(frontLeft);
+        mCarClimateBuilder.addCarZones(frontRight);
+
+        CarClimateFeature mCarClimateFeature = new CarClimateFeature(mCarClimateBuilder);
+        ClimateProfileRequest.Builder builder =
+                new ClimateProfileRequest.Builder();
+        builder.addClimateProfileFeatures(mCarClimateFeature);
+        mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
+        verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
+                eq(propertyIds),
+                eq(mExecutor));
+        mCountDownLatch.await();
+
+        CabinTemperatureProfile cabinTemperatureProfile = loadedResult.get();
+        assertThat(cabinTemperatureProfile.getSupportedMinMaxCelsiusRange())
+                .isEqualTo(new Pair<>(16.0f, 18.0f));
+        assertThat(cabinTemperatureProfile.getSupportedMinMaxFahrenheitRange())
+                .isEqualTo(new Pair<>(60.5f, 64.5f));
+        assertThat(cabinTemperatureProfile.getCelsiusSupportedIncrement())
+                .isEqualTo(0.5f);
+        assertThat(cabinTemperatureProfile.getFahrenheitSupportedIncrement())
+                .isEqualTo(1.0f);
+    }
+
+    @Test
+    public void fetchFanSpeed_verifyResponse() throws InterruptedException {
+        Map<Set<CarZone>, Pair<Object, Object>> minMaxValueMap = new HashMap<>();
+        CarZone frontLeft = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_LEFT).build();
+        CarZone frontRight = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_RIGHT).build();
+        minMaxValueMap.put(Collections.singleton(frontLeft), new Pair<>(1, 7));
+        minMaxValueMap.put(Collections.singleton(frontRight), new Pair<>(2, 6));
+        List<Set<CarZone>> carZones = new ArrayList<>();
+        carZones.add(Collections.singleton(frontLeft));
+        carZones.add(Collections.singleton(frontRight));
+        List<Integer> propertyIds = Collections.singletonList(HVAC_FAN_SPEED);
+        mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_FAN_SPEED)
+                .setCarZones(carZones).setCarZoneSetsToMinMaxRange(minMaxValueMap)
+                .setStatus(STATUS_SUCCESS).build());
+        ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
+                Futures.immediateFuture(mCarPropertyProfiles);
+        when(mPropertyManager.fetchSupportedZonesResponse(
+                eq(propertyIds), eq(mExecutor))).thenReturn(listenableCarPropertyProfile);
+
+        AtomicReference<FanSpeedLevelProfile> loadedResult = new AtomicReference<>();
+        CarClimateProfileCallback listener = new CarClimateProfileCallback() {
+            @Override
+            public void onFanSpeedLevelProfileAvailable(@NonNull FanSpeedLevelProfile
+                    fanSpeedLevelProfile) {
+                loadedResult.set(fanSpeedLevelProfile);
+                mCountDownLatch.countDown();
+            }
+        };
+
+        CarClimateFeature.Builder mCarClimateBuilder = new CarClimateFeature.Builder(
+                FEATURE_FAN_SPEED);
+        mCarClimateBuilder.addCarZones(frontLeft);
+        mCarClimateBuilder.addCarZones(frontRight);
+
+        CarClimateFeature mCarClimateFeature = new CarClimateFeature(mCarClimateBuilder);
+        ClimateProfileRequest.Builder builder =
+                new ClimateProfileRequest.Builder();
+        builder.addClimateProfileFeatures(mCarClimateFeature);
+        mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
+        verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
+                eq(propertyIds),
+                eq(mExecutor));
+        mCountDownLatch.await();
+
+        assertThat(loadedResult.get().getCarZoneSetsToFanSpeedLevelRanges()).isEqualTo(
+                minMaxValueMap);
+    }
+
+    @Test
+    public void fetchFanDirection_verifyResponse() throws InterruptedException {
+        Map<Set<CarZone>, Pair<Object, Object>> minMaxValueMap = new HashMap<>();
+        CarZone frontLeft = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_LEFT).build();
+        CarZone frontRight = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_RIGHT).build();
+        minMaxValueMap.put(Collections.singleton(frontLeft), new Pair<>(1, 7));
+        minMaxValueMap.put(Collections.singleton(frontRight), new Pair<>(2, 6));
+        List<Set<CarZone>> carZones = new ArrayList<>();
+        carZones.add(Collections.singleton(frontLeft));
+        carZones.add(Collections.singleton(frontRight));
+        mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_FAN_DIRECTION)
+                .setCarZones(carZones).setCarZoneSetsToMinMaxRange(minMaxValueMap)
+                .setStatus(STATUS_SUCCESS).build());
+        ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
+                Futures.immediateFuture(mCarPropertyProfiles);
+        List<Integer> propertyIds = Collections.singletonList(HVAC_FAN_DIRECTION);
+        when(mPropertyManager.fetchSupportedZonesResponse(
+                eq(propertyIds), eq(mExecutor))).thenReturn(
+                listenableCarPropertyProfile);
+
+        AtomicReference<FanDirectionProfile> loadedResult = new AtomicReference<>();
+        CarClimateProfileCallback listener = new CarClimateProfileCallback() {
+            @Override
+            public void onFanDirectionProfileAvailable(@NonNull FanDirectionProfile
+                    fanDirectionProfile) {
+                loadedResult.set(fanDirectionProfile);
+                mCountDownLatch.countDown();
+            }
+        };
+
+        CarClimateFeature.Builder mCarClimateBuilder = new CarClimateFeature.Builder(
+                FEATURE_FAN_DIRECTION);
+        mCarClimateBuilder.addCarZones(frontLeft);
+        mCarClimateBuilder.addCarZones(frontRight);
+
+        CarClimateFeature mCarClimateFeature = new CarClimateFeature(mCarClimateBuilder);
+        ClimateProfileRequest.Builder builder =
+                new ClimateProfileRequest.Builder();
+        builder.addClimateProfileFeatures(mCarClimateFeature);
+        mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
+        verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
+                eq(propertyIds),
+                eq(mExecutor));
+        mCountDownLatch.await();
+
+        assertThat(loadedResult.get().getCarZoneSetsToFanDirectionValues()).isEqualTo(
+                minMaxValueMap);
+    }
+
+    @Test
+    public void fetchSeatTemperature_verifyResponse() throws InterruptedException {
+        Map<Set<CarZone>, Pair<Object, Object>> minMaxValueMap = new HashMap<>();
+        CarZone frontLeft = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_LEFT).build();
+        CarZone frontRight = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_RIGHT).build();
+        minMaxValueMap.put(Collections.singleton(frontLeft), new Pair<>(1, 7));
+        minMaxValueMap.put(Collections.singleton(frontRight), new Pair<>(2, 6));
+        List<Set<CarZone>> carZones = new ArrayList<>();
+        carZones.add(Collections.singleton(frontLeft));
+        carZones.add(Collections.singleton(frontRight));
+        mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_SEAT_TEMPERATURE)
+                .setCarZones(carZones).setCarZoneSetsToMinMaxRange(minMaxValueMap)
+                .setStatus(STATUS_SUCCESS).build());
+        ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
+                Futures.immediateFuture(mCarPropertyProfiles);
+        List<Integer> propertyIds = Collections.singletonList(HVAC_SEAT_TEMPERATURE);
+        when(mPropertyManager.fetchSupportedZonesResponse(
+                eq(propertyIds), eq(mExecutor))).thenReturn(
+                listenableCarPropertyProfile);
+
+        AtomicReference<SeatTemperatureProfile> loadedResult = new AtomicReference<>();
+        CarClimateProfileCallback listener = new CarClimateProfileCallback() {
+            @Override
+            public void onSeatTemperatureLevelProfileAvailable(@NonNull SeatTemperatureProfile
+                    supportedCarZonesAndFanDirectionLevels) {
+                loadedResult.set(supportedCarZonesAndFanDirectionLevels);
+                mCountDownLatch.countDown();
+            }
+        };
+
+        CarClimateFeature.Builder mCarClimateBuilder = new CarClimateFeature.Builder(
+                FEATURE_SEAT_TEMPERATURE_LEVEL);
+        mCarClimateBuilder.addCarZones(frontLeft);
+        mCarClimateBuilder.addCarZones(frontRight);
+
+        CarClimateFeature mCarClimateFeature = new CarClimateFeature(mCarClimateBuilder);
+        ClimateProfileRequest.Builder builder =
+                new ClimateProfileRequest.Builder();
+        builder.addClimateProfileFeatures(mCarClimateFeature);
+        mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
+        verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
+                eq(propertyIds),
+                eq(mExecutor));
+        mCountDownLatch.await();
+
+        assertThat(loadedResult.get().getCarZoneSetsToSeatTemperatureValues()).isEqualTo(
+                minMaxValueMap);
+    }
+
+    @Test
+    public void fetchSeatVentilation_verifyResponse() throws InterruptedException {
+        Map<Set<CarZone>, Pair<Object, Object>> minMaxValueMap = new HashMap<>();
+        CarZone frontLeft = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_LEFT).build();
+        CarZone frontRight = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_RIGHT).build();
+        minMaxValueMap.put(Collections.singleton(frontLeft), new Pair<>(1, 7));
+        minMaxValueMap.put(Collections.singleton(frontRight), new Pair<>(2, 6));
+        List<Set<CarZone>> carZones = new ArrayList<>();
+        carZones.add(Collections.singleton(frontLeft));
+        carZones.add(Collections.singleton(frontRight));
+        mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_SEAT_VENTILATION)
+                .setCarZones(carZones).setCarZoneSetsToMinMaxRange(minMaxValueMap)
+                .setStatus(STATUS_SUCCESS).build());
+        ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
+                Futures.immediateFuture(mCarPropertyProfiles);
+        List<Integer> propertyIds = Collections.singletonList(HVAC_SEAT_VENTILATION);
+        when(mPropertyManager.fetchSupportedZonesResponse(
+                eq(propertyIds), eq(mExecutor))).thenReturn(
+                listenableCarPropertyProfile);
+
+        AtomicReference<SeatVentilationProfile> loadedResult = new AtomicReference<>();
+        CarClimateProfileCallback listener = new CarClimateProfileCallback() {
+            @Override
+            public void onSeatVentilationLevelProfileAvailable(@NonNull SeatVentilationProfile
+                    supportedCarZonesAndSeatVentilationLevels) {
+                loadedResult.set(supportedCarZonesAndSeatVentilationLevels);
+                mCountDownLatch.countDown();
+            }
+        };
+
+        CarClimateFeature.Builder mCarClimateBuilder = new CarClimateFeature.Builder(
+                FEATURE_SEAT_VENTILATION_LEVEL);
+        mCarClimateBuilder.addCarZones(frontLeft);
+        mCarClimateBuilder.addCarZones(frontRight);
+
+        CarClimateFeature mCarClimateFeature = new CarClimateFeature(mCarClimateBuilder);
+        ClimateProfileRequest.Builder builder =
+                new ClimateProfileRequest.Builder();
+        builder.addClimateProfileFeatures(mCarClimateFeature);
+        mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
+        verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
+                eq(propertyIds),
+                eq(mExecutor));
+        mCountDownLatch.await();
+
+        assertThat(loadedResult.get().getCarZoneSetsToSeatVentilationValues()).isEqualTo(
+                minMaxValueMap);
+    }
+
+    @Test
+    public void fetchSteeringWheelHeat_verifyResponse() throws InterruptedException {
+        Map<Set<CarZone>, Pair<Object, Object>> minMaxValueMap = new HashMap<>();
+        CarZone frontLeft = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_LEFT).build();
+        CarZone frontRight = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_RIGHT).build();
+        minMaxValueMap.put(Collections.singleton(frontLeft), new Pair<>(1, 7));
+        minMaxValueMap.put(Collections.singleton(frontRight), new Pair<>(2, 6));
+        List<Set<CarZone>> carZones = new ArrayList<>();
+        carZones.add(Collections.singleton(frontLeft));
+        carZones.add(Collections.singleton(frontRight));
+        mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(
+                HVAC_STEERING_WHEEL_HEAT)
+                .setCarZones(carZones).setCarZoneSetsToMinMaxRange(minMaxValueMap)
+                .setStatus(STATUS_SUCCESS).build());
+        ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
+                Futures.immediateFuture(mCarPropertyProfiles);
+        List<Integer> propertyIds = Collections.singletonList(HVAC_STEERING_WHEEL_HEAT);
+        when(mPropertyManager.fetchSupportedZonesResponse(
+                eq(propertyIds), eq(mExecutor))).thenReturn(
+                listenableCarPropertyProfile);
+
+        AtomicReference<SteeringWheelHeatProfile> loadedResult = new AtomicReference<>();
+        CarClimateProfileCallback listener = new CarClimateProfileCallback() {
+            @Override
+            public void onSteeringWheelHeatProfileAvailable(@NonNull SteeringWheelHeatProfile
+                    steeringWheelHeatProfile) {
+                loadedResult.set(steeringWheelHeatProfile);
+                mCountDownLatch.countDown();
+            }
+        };
+
+        CarClimateFeature.Builder mCarClimateBuilder = new CarClimateFeature.Builder(
+                FEATURE_STEERING_WHEEL_HEAT);
+        mCarClimateBuilder.addCarZones(frontLeft);
+        mCarClimateBuilder.addCarZones(frontRight);
+
+        CarClimateFeature mCarClimateFeature = new CarClimateFeature(mCarClimateBuilder);
+        ClimateProfileRequest.Builder builder =
+                new ClimateProfileRequest.Builder();
+        builder.addClimateProfileFeatures(mCarClimateFeature);
+        mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
+        verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
+                eq(propertyIds),
+                eq(mExecutor));
+        mCountDownLatch.await();
+
+        assertThat(loadedResult.get().getCarZoneSetsToSteeringWheelHeatValues()).isEqualTo(
+                minMaxValueMap);
+    }
+
+    @Test
+    public void fetchHvacRecirculation_verifyResponse() throws InterruptedException {
+        CarZone frontLeft = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_LEFT).build();
+        CarZone frontRight = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_RIGHT).build();
+        List<Set<CarZone>> carZones = new ArrayList<>();
+        carZones.add(Collections.singleton(frontLeft));
+        carZones.add(Collections.singleton(frontRight));
+        mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_RECIRC_ON)
+                .setCarZones(carZones).setStatus(STATUS_SUCCESS).build());
+        ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
+                Futures.immediateFuture(mCarPropertyProfiles);
+        List<Integer> propertyIds = Collections.singletonList(HVAC_RECIRC_ON);
+        when(mPropertyManager.fetchSupportedZonesResponse(
+                eq(propertyIds), eq(mExecutor))).thenReturn(
+                listenableCarPropertyProfile);
+
+        AtomicReference<HvacRecirculationProfile> loadedResult = new AtomicReference<>();
+        CarClimateProfileCallback listener = new CarClimateProfileCallback() {
+            @Override
+            public void onHvacRecirculationProfileAvailable(@NonNull HvacRecirculationProfile
+                    hvacRecirculationProfile) {
+                loadedResult.set(hvacRecirculationProfile);
+                mCountDownLatch.countDown();
+            }
+        };
+
+        CarClimateFeature.Builder mCarClimateBuilder = new CarClimateFeature.Builder(
+                FEATURE_HVAC_RECIRCULATION);
+        mCarClimateBuilder.addCarZones(frontLeft);
+        mCarClimateBuilder.addCarZones(frontRight);
+
+        CarClimateFeature mCarClimateFeature = new CarClimateFeature(mCarClimateBuilder);
+        ClimateProfileRequest.Builder builder =
+                new ClimateProfileRequest.Builder();
+        builder.addClimateProfileFeatures(mCarClimateFeature);
+        mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
+        verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
+                eq(propertyIds),
+                eq(mExecutor));
+        mCountDownLatch.await();
+
+        assertThat(loadedResult.get().getSupportedCarZones()).isEqualTo(carZones);
+    }
+
+    @Test
+    public void fetchHvacAutoRecirculation_verifyResponse() throws InterruptedException {
+        CarZone frontLeft = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_LEFT).build();
+        CarZone frontRight = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_RIGHT).build();
+        List<Set<CarZone>> carZones = new ArrayList<>();
+        carZones.add(Collections.singleton(frontLeft));
+        carZones.add(Collections.singleton(frontRight));
+        List<Integer> propertyIds = Collections.singletonList(HVAC_AUTO_RECIRC_ON);
+        mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_AUTO_RECIRC_ON)
+                .setCarZones(carZones).setStatus(STATUS_SUCCESS).build());
+        ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
+                Futures.immediateFuture(mCarPropertyProfiles);
+        when(mPropertyManager.fetchSupportedZonesResponse(
+                eq(propertyIds), eq(mExecutor))).thenReturn(
+                listenableCarPropertyProfile);
+
+        AtomicReference<HvacAutoRecirculationProfile> loadedResult = new AtomicReference<>();
+        CarClimateProfileCallback listener = new CarClimateProfileCallback() {
+            @Override
+            public void onHvacAutoRecirculationProfileAvailable(@NonNull
+                    HvacAutoRecirculationProfile hvacAutoRecirculationProfile) {
+                loadedResult.set(hvacAutoRecirculationProfile);
+                mCountDownLatch.countDown();
+            }
+        };
+
+        CarClimateFeature.Builder mCarClimateBuilder = new CarClimateFeature.Builder(
+                FEATURE_HVAC_AUTO_RECIRCULATION);
+        mCarClimateBuilder.addCarZones(frontLeft);
+        mCarClimateBuilder.addCarZones(frontRight);
+
+        CarClimateFeature mCarClimateFeature = new CarClimateFeature(mCarClimateBuilder);
+        ClimateProfileRequest.Builder builder =
+                new ClimateProfileRequest.Builder();
+        builder.addClimateProfileFeatures(mCarClimateFeature);
+        mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
+        verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
+                eq(propertyIds),
+                eq(mExecutor));
+        mCountDownLatch.await();
+
+        assertThat(loadedResult.get().getSupportedCarZoneSets()).isEqualTo(carZones);
+    }
+
+    @Test
+    public void fetchHvacAutoMode_verifyResponse() throws InterruptedException {
+        CarZone frontLeft = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_LEFT).build();
+        CarZone frontRight = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_RIGHT).build();
+        List<Set<CarZone>> carZones = new ArrayList<>();
+        carZones.add(Collections.singleton(frontLeft));
+        carZones.add(Collections.singleton(frontRight));
+        List<Integer> propertyIds = Collections.singletonList(HVAC_AUTO_ON);
+        mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_AUTO_ON)
+                .setCarZones(carZones).setStatus(STATUS_SUCCESS).build());
+        ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
+                Futures.immediateFuture(mCarPropertyProfiles);
+        when(mPropertyManager.fetchSupportedZonesResponse(
+                eq(propertyIds), eq(mExecutor))).thenReturn(
+                listenableCarPropertyProfile);
+
+        AtomicReference<HvacAutoModeProfile> loadedResult = new AtomicReference<>();
+        CarClimateProfileCallback listener = new CarClimateProfileCallback() {
+            @Override
+            public void onHvacAutoModeProfileAvailable(@NonNull HvacAutoModeProfile
+                    hvacAutoModeProfile) {
+                loadedResult.set(hvacAutoModeProfile);
+                mCountDownLatch.countDown();
+            }
+        };
+
+        CarClimateFeature.Builder mCarClimateBuilder = new CarClimateFeature.Builder(
+                FEATURE_HVAC_AUTO_MODE);
+        mCarClimateBuilder.addCarZones(frontLeft);
+        mCarClimateBuilder.addCarZones(frontRight);
+
+        CarClimateFeature mCarClimateFeature = new CarClimateFeature(mCarClimateBuilder);
+        ClimateProfileRequest.Builder builder =
+                new ClimateProfileRequest.Builder();
+        builder.addClimateProfileFeatures(mCarClimateFeature);
+        mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
+        verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
+                eq(propertyIds),
+                eq(mExecutor));
+        mCountDownLatch.await();
+
+        assertThat(loadedResult.get().getSupportedCarZoneSets()).isEqualTo(carZones);
+    }
+
+    @Test
+    public void fetchHvacDualMode_verifyResponse() throws InterruptedException {
+        CarZone frontLeft = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_LEFT).build();
+        CarZone frontRight = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_RIGHT).build();
+        List<Set<CarZone>> carZones = new ArrayList<>();
+        carZones.add(Collections.singleton(frontLeft));
+        carZones.add(Collections.singleton(frontRight));
+        List<Integer> propertyIds = Collections.singletonList(HVAC_DUAL_ON);
+        mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_DUAL_ON)
+                .setCarZones(carZones).setStatus(STATUS_SUCCESS).build());
+        ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
+                Futures.immediateFuture(mCarPropertyProfiles);
+        when(mPropertyManager.fetchSupportedZonesResponse(
+                eq(propertyIds), eq(mExecutor))).thenReturn(
+                listenableCarPropertyProfile);
+
+        AtomicReference<HvacDualModeProfile> loadedResult = new AtomicReference<>();
+        CarClimateProfileCallback listener = new CarClimateProfileCallback() {
+            @Override
+            public void onHvacDualModeProfileAvailable(@NonNull HvacDualModeProfile
+                    hvacDualModeProfile) {
+                loadedResult.set(hvacDualModeProfile);
+                mCountDownLatch.countDown();
+            }
+        };
+
+        CarClimateFeature.Builder mCarClimateBuilder = new CarClimateFeature.Builder(
+                FEATURE_HVAC_DUAL_MODE);
+        mCarClimateBuilder.addCarZones(frontLeft);
+        mCarClimateBuilder.addCarZones(frontRight);
+
+        CarClimateFeature mCarClimateFeature = new CarClimateFeature(mCarClimateBuilder);
+        ClimateProfileRequest.Builder builder =
+                new ClimateProfileRequest.Builder();
+        builder.addClimateProfileFeatures(mCarClimateFeature);
+        mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
+        verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
+                eq(propertyIds),
+                eq(mExecutor));
+        mCountDownLatch.await();
+
+        assertThat(loadedResult.get().getSupportedCarZoneSets()).isEqualTo(carZones);
+    }
+
+    @Test
+    public void fetchDefroster_verifyResponse() throws InterruptedException {
+        CarZone frontLeft = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_LEFT).build();
+        CarZone frontRight = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_RIGHT).build();
+        List<Set<CarZone>> carZones = new ArrayList<>();
+        carZones.add(Collections.singleton(frontLeft));
+        carZones.add(Collections.singleton(frontRight));
+        List<Integer> propertyIds = Collections.singletonList(HVAC_DEFROSTER);
+        mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_DEFROSTER)
+                .setCarZones(carZones).setStatus(STATUS_SUCCESS).build());
+        ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
+                Futures.immediateFuture(mCarPropertyProfiles);
+        when(mPropertyManager.fetchSupportedZonesResponse(
+                eq(propertyIds), eq(mExecutor))).thenReturn(
+                listenableCarPropertyProfile);
+
+        AtomicReference<DefrosterProfile> loadedResult = new AtomicReference<>();
+        CarClimateProfileCallback listener = new CarClimateProfileCallback() {
+            @Override
+            public void onDefrosterProfileAvailable(@NonNull DefrosterProfile defrosterProfile) {
+                loadedResult.set(defrosterProfile);
+                mCountDownLatch.countDown();
+            }
+        };
+
+        CarClimateFeature.Builder mCarClimateBuilder = new CarClimateFeature.Builder(
+                FEATURE_HVAC_DEFROSTER);
+        mCarClimateBuilder.addCarZones(frontLeft);
+        mCarClimateBuilder.addCarZones(frontRight);
+
+        CarClimateFeature mCarClimateFeature = new CarClimateFeature(mCarClimateBuilder);
+        ClimateProfileRequest.Builder builder =
+                new ClimateProfileRequest.Builder();
+        builder.addClimateProfileFeatures(mCarClimateFeature);
+        mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
+        verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
+                eq(propertyIds),
+                eq(mExecutor));
+        mCountDownLatch.await();
+
+        assertThat(loadedResult.get().getSupportedCarZoneSets()).isEqualTo(carZones);
+    }
+
+    @Test
+    public void fetchMaxDefroster_verifyResponse() throws InterruptedException {
+        CarZone frontLeft = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_LEFT).build();
+        CarZone frontRight = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_RIGHT).build();
+        List<Set<CarZone>> carZones = new ArrayList<>();
+        carZones.add(Collections.singleton(frontLeft));
+        carZones.add(Collections.singleton(frontRight));
+        List<Integer> propertyIds = Collections.singletonList(HVAC_MAX_DEFROST_ON);
+        mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_MAX_DEFROST_ON)
+                .setCarZones(carZones).setStatus(STATUS_SUCCESS).build());
+        ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
+                Futures.immediateFuture(mCarPropertyProfiles);
+        when(mPropertyManager.fetchSupportedZonesResponse(
+                eq(propertyIds), eq(mExecutor))).thenReturn(
+                listenableCarPropertyProfile);
+
+        AtomicReference<MaxDefrosterProfile> loadedResult = new AtomicReference<>();
+        CarClimateProfileCallback listener = new CarClimateProfileCallback() {
+            @Override
+            public void onMaxDefrosterProfileAvailable(@NonNull MaxDefrosterProfile
+                    maxDefrosterProfile) {
+                loadedResult.set(maxDefrosterProfile);
+                mCountDownLatch.countDown();
+            }
+        };
+
+        CarClimateFeature.Builder mCarClimateBuilder = new CarClimateFeature.Builder(
+                FEATURE_HVAC_MAX_DEFROSTER);
+        mCarClimateBuilder.addCarZones(frontLeft);
+        mCarClimateBuilder.addCarZones(frontRight);
+
+        CarClimateFeature mCarClimateFeature = new CarClimateFeature(mCarClimateBuilder);
+        ClimateProfileRequest.Builder builder =
+                new ClimateProfileRequest.Builder();
+        builder.addClimateProfileFeatures(mCarClimateFeature);
+        mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
+        verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
+                eq(propertyIds),
+                eq(mExecutor));
+        mCountDownLatch.await();
+
+        assertThat(loadedResult.get().getSupportedCarZoneSets()).isEqualTo(carZones);
+    }
+
+    @Test
+    public void fetchHvacAc_verifyResponse() throws InterruptedException {
+        CarZone frontLeft = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_LEFT).build();
+        CarZone frontRight = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_RIGHT).build();
+        List<Set<CarZone>> carZones = new ArrayList<>();
+        carZones.add(Collections.singleton(frontLeft));
+        carZones.add(Collections.singleton(frontRight));
+        List<Integer> propertyIds = Collections.singletonList(HVAC_AC_ON);
+        mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_AC_ON)
+                .setCarZones(carZones).setStatus(STATUS_SUCCESS).build());
+        ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
+                Futures.immediateFuture(mCarPropertyProfiles);
+        when(mPropertyManager.fetchSupportedZonesResponse(
+                eq(propertyIds), eq(mExecutor))).thenReturn(
+                listenableCarPropertyProfile);
+
+        AtomicReference<HvacAcProfile> loadedResult = new AtomicReference<>();
+        CarClimateProfileCallback listener = new CarClimateProfileCallback() {
+            @Override
+            public void onHvacAcProfileAvailable(@NonNull HvacAcProfile
+                    hvacAcProfile) {
+                loadedResult.set(hvacAcProfile);
+                mCountDownLatch.countDown();
+            }
+        };
+
+        CarClimateFeature.Builder mCarClimateBuilder = new CarClimateFeature.Builder(
+                FEATURE_HVAC_AC);
+        mCarClimateBuilder.addCarZones(frontLeft);
+        mCarClimateBuilder.addCarZones(frontRight);
+
+        CarClimateFeature mCarClimateFeature = new CarClimateFeature(mCarClimateBuilder);
+        ClimateProfileRequest.Builder builder =
+                new ClimateProfileRequest.Builder();
+        builder.addClimateProfileFeatures(mCarClimateFeature);
+        mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
+        verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
+                eq(propertyIds),
+                eq(mExecutor));
+        mCountDownLatch.await();
+
+        assertThat(loadedResult.get().getSupportedCarZoneSets()).isEqualTo(carZones);
+    }
+
+    @Test
+    public void fetchHvacMaxAc_verifyResponse() throws InterruptedException {
+        CarZone frontLeft = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_LEFT).build();
+        CarZone frontRight = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_RIGHT).build();
+        List<Set<CarZone>> carZones = new ArrayList<>();
+        carZones.add(Collections.singleton(frontLeft));
+        carZones.add(Collections.singleton(frontRight));
+        List<Integer> propertyIds = Collections.singletonList(HVAC_MAX_AC_ON);
+        mCarPropertyProfiles.add(CarPropertyProfile.builder().setPropertyId(HVAC_MAX_AC_ON)
+                .setCarZones(carZones).setStatus(STATUS_SUCCESS).build());
+        ListenableFuture<List<CarPropertyProfile<?>>> listenableCarPropertyProfile =
+                Futures.immediateFuture(mCarPropertyProfiles);
+        when(mPropertyManager.fetchSupportedZonesResponse(
+                eq(propertyIds), eq(mExecutor))).thenReturn(
+                listenableCarPropertyProfile);
+
+        AtomicReference<HvacMaxAcModeProfile> loadedResult = new AtomicReference<>();
+        CarClimateProfileCallback listener = new CarClimateProfileCallback() {
+            @Override
+            public void onHvacMaxAcModeProfileAvailable(@NonNull HvacMaxAcModeProfile
+                    hvacMaxAcModeProfile) {
+                loadedResult.set(hvacMaxAcModeProfile);
+                mCountDownLatch.countDown();
+            }
+        };
+
+        CarClimateFeature.Builder mCarClimateBuilder = new CarClimateFeature.Builder(
+                FEATURE_HVAC_MAX_AC);
+        mCarClimateBuilder.addCarZones(frontLeft);
+        mCarClimateBuilder.addCarZones(frontRight);
+
+        CarClimateFeature mCarClimateFeature = new CarClimateFeature(mCarClimateBuilder);
+        ClimateProfileRequest.Builder builder =
+                new ClimateProfileRequest.Builder();
+        builder.addClimateProfileFeatures(mCarClimateFeature);
+        mAutomotiveCarClimate.fetchClimateProfile(mExecutor, builder.build(), listener);
+        verify(mPropertyManager, times(1)).fetchSupportedZonesResponse(
+                eq(propertyIds),
+                eq(mExecutor));
+        mCountDownLatch.await();
+
+        assertThat(loadedResult.get().getSupportedCarZoneSets()).isEqualTo(carZones);
+    }
 }
diff --git a/car/app/app-automotive/src/test/java/androidx/car/app/hardware/common/CarZoneUtilsTest.java b/car/app/app-automotive/src/test/java/androidx/car/app/hardware/common/CarZoneUtilsTest.java
new file mode 100644
index 0000000..98da1e4
--- /dev/null
+++ b/car/app/app-automotive/src/test/java/androidx/car/app/hardware/common/CarZoneUtilsTest.java
@@ -0,0 +1,60 @@
+/*
+ * 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.car.app.hardware.common;
+
+import static androidx.car.app.hardware.common.CarZone.CAR_ZONE_COLUMN_LEFT;
+import static androidx.car.app.hardware.common.CarZone.CAR_ZONE_ROW_SECOND;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.car.VehicleAreaSeat;
+
+import com.google.common.collect.ImmutableSet;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+import java.lang.reflect.Modifier;
+
+@RunWith(RobolectricTestRunner.class)
+public final class CarZoneUtilsTest {
+
+    @Test
+    public void finalModifier() {
+        assertThat(Modifier.isFinal(CarZoneUtils.class.getModifiers())).isTrue();
+    }
+
+    @Test
+    public void convertAreaIdToCarZones_areaNone_success() {
+        ImmutableSet<CarZone> result =
+                CarZoneUtils.convertAreaIdToCarZones(
+                        CarZoneUtils.AreaType.NONE, CarZoneAreaIdConstants.AREA_ID_GLOBAL);
+        assertThat(result).containsExactly(CarZone.CAR_ZONE_GLOBAL);
+    }
+
+    @Test
+    public void convertAreaIdToCarZones_areaSeat_success() {
+        ImmutableSet<CarZone> result =
+                CarZoneUtils.convertAreaIdToCarZones(
+                        CarZoneUtils.AreaType.SEAT, VehicleAreaSeat.SEAT_ROW_2_LEFT);
+        assertThat(result)
+                .containsExactly(
+                        new CarZone.Builder().setRow(CAR_ZONE_ROW_SECOND)
+                                .setColumn(CAR_ZONE_COLUMN_LEFT).build());
+    }
+}
diff --git a/car/app/app-automotive/src/test/java/androidx/car/app/hardware/common/MockedCarTestBase.java b/car/app/app-automotive/src/test/java/androidx/car/app/hardware/common/MockedCarTestBase.java
index e6cb9f1..ac8fbf2 100644
--- a/car/app/app-automotive/src/test/java/androidx/car/app/hardware/common/MockedCarTestBase.java
+++ b/car/app/app-automotive/src/test/java/androidx/car/app/hardware/common/MockedCarTestBase.java
@@ -16,6 +16,8 @@
 
 package androidx.car.app.hardware.common;
 
+import static android.car.VehicleAreaType.VEHICLE_AREA_TYPE_SEAT;
+
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyString;
@@ -30,9 +32,13 @@
 import android.car.hardware.CarPropertyValue;
 import android.car.hardware.property.CarPropertyManager;
 import android.os.SystemClock;
+import android.util.Pair;
 
 import androidx.car.app.shadows.car.ShadowCar;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+
 import org.junit.Before;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
@@ -40,6 +46,7 @@
 import org.robolectric.annotation.internal.DoNotInstrument;
 
 import java.util.Collections;
+import java.util.Set;
 
 /**
  * Base class for testing with mocked car.
@@ -54,6 +61,18 @@
     public static final String MODEL_NAME = "car_name";
     public static final String MODEL_MAKER = "android";
     public static final boolean FUEL_DOOR_DEFAULT = true;
+    public static final int[] AREA_IDS = {1};
+    public static final int MIN_PROPERTY_VALUE = 1;
+    public static final int MAX_PROPERTY_VALUE = 7;
+    public static final ImmutableList<Set<CarZone>> CAR_ZONES =
+            ImmutableList.<Set<CarZone>>builder().add(Collections.singleton(
+                    new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                    .setColumn(CarZone.CAR_ZONE_COLUMN_LEFT).build())).build();
+    public static final ImmutableMap<Set<CarZone>, Pair<Integer, Integer>>
+            CAR_ZONE_SET_TO_MIN_MAX_RANGE = ImmutableMap.<Set<CarZone>,
+                    Pair<Integer, Integer>>builder()
+            .put(CAR_ZONES.get(0), new Pair<>(MIN_PROPERTY_VALUE,
+                    MAX_PROPERTY_VALUE)).buildKeepingLast();
 
     @Mock
     private CarPropertyValue<Integer> mModelYearValueMock;
@@ -72,6 +91,10 @@
     @Mock
     private CarPropertyValue<Boolean> mFuelDoorValueMock;
     @Mock
+    private CarPropertyConfig<Integer> mHvacPowerOnMinMaxConfigMock;
+    @Mock
+    private CarPropertyProfile<Integer> mHvacPowerOnMinMaxMock;
+    @Mock
     private Car mCarMock;
     @Mock
     private CarPropertyManager mCarPropertyManagerMock;
@@ -98,11 +121,19 @@
                 .getPropertyList(argThat((set) -> set.contains(VehiclePropertyIds.INFO_MODEL)));
         doReturn(mModelNameValueMock).when(mCarPropertyManagerMock).getProperty(
                 any(), eq(VehiclePropertyIds.INFO_MODEL), anyInt());
+        doReturn(Collections.singletonList(mHvacPowerOnMinMaxConfigMock))
+                .when(mCarPropertyManagerMock).getPropertyList(
+                        argThat((set) -> set.contains(VehiclePropertyIds.HVAC_POWER_ON)));
 
         // Sets up property configs
         when(mModelYearConfigMock.getPropertyType()).thenReturn(Integer.class);
         when(mModelNameConfigMock.getPropertyType()).thenReturn(String.class);
         when(mManufacturerConfigMock.getPropertyType()).thenReturn(String.class);
+        when(mHvacPowerOnMinMaxConfigMock.getAreaType()).thenReturn(VEHICLE_AREA_TYPE_SEAT);
+        when(mHvacPowerOnMinMaxConfigMock.getAreaIds()).thenReturn(AREA_IDS);
+        when(mHvacPowerOnMinMaxConfigMock.getMinValue(AREA_IDS[0])).thenReturn(MIN_PROPERTY_VALUE);
+        when(mHvacPowerOnMinMaxConfigMock.getMaxValue(AREA_IDS[0])).thenReturn(MAX_PROPERTY_VALUE);
+
 
         // Sets up property values
         when(mModelYearValueMock.getPropertyId()).thenReturn(VehiclePropertyIds.INFO_MODEL_YEAR);
@@ -117,6 +148,10 @@
         when(mManufacturerValueMock.getValue()).thenReturn(MODEL_MAKER);
         when(mManufacturerValueMock.getStatus()).thenReturn(CarPropertyValue.STATUS_UNAVAILABLE);
         when(mManufacturerValueMock.getTimestamp()).thenReturn(SystemClock.elapsedRealtimeNanos());
+        when(mHvacPowerOnMinMaxMock.getPropertyId()).thenReturn(VehiclePropertyIds.HVAC_POWER_ON);
+        when(mHvacPowerOnMinMaxMock.getCarZones()).thenReturn(CAR_ZONES);
+        when(mHvacPowerOnMinMaxMock.getCarZoneSetsToMinMaxRange())
+                .thenReturn(CAR_ZONE_SET_TO_MIN_MAX_RANGE);
 
         // Adds fuel_door config and value for testing permission
         doReturn(mFuelDoorConfigMock).when(mCarPropertyManagerMock)
diff --git a/car/app/app-automotive/src/test/java/androidx/car/app/hardware/common/PropertyRequestProcessorTest.java b/car/app/app-automotive/src/test/java/androidx/car/app/hardware/common/PropertyRequestProcessorTest.java
index 0bf766d..fb9fa86 100644
--- a/car/app/app-automotive/src/test/java/androidx/car/app/hardware/common/PropertyRequestProcessorTest.java
+++ b/car/app/app-automotive/src/test/java/androidx/car/app/hardware/common/PropertyRequestProcessorTest.java
@@ -16,6 +16,8 @@
 
 package androidx.car.app.hardware.common;
 
+import static android.car.VehiclePropertyIds.HVAC_POWER_ON;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import android.app.Application;
@@ -26,6 +28,8 @@
 
 import androidx.test.core.app.ApplicationProvider;
 
+import com.google.common.collect.ImmutableList;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -36,7 +40,9 @@
 import org.robolectric.shadows.ShadowApplication;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
@@ -88,6 +94,32 @@
                 VehiclePropertyIds.ENGINE_OIL_TEMP);
     }
 
+    /**
+     * Tests for
+     * {@link PropertyRequestProcessor#fetchCarPropertyProfiles(
+     * List, OnGetCarPropertyProfilesListener)}.
+     */
+    @Test
+    public void fetchCarPropertyProfilesTest() throws Exception {
+        TestPropertyProfileListener listener = new TestPropertyProfileListener();
+        List<Integer> propertyIds = new ArrayList<>();
+        ImmutableList<Set<CarZone>> carZones =
+                ImmutableList.<Set<CarZone>>builder().add(Collections.singleton(
+                        new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                                .setColumn(CarZone.CAR_ZONE_COLUMN_LEFT).build())).build();
+
+        propertyIds.add(HVAC_POWER_ON);
+        mRequestProcessor.fetchCarPropertyProfiles(propertyIds, listener);
+        listener.assertOnGetCarPropertyProfilesCalled();
+        List<CarPropertyProfile<?>> carPropertyProfiles = listener.getCarPropertyProfiles();
+
+        assertThat(carPropertyProfiles.size()).isEqualTo(1);
+        assertThat(carPropertyProfiles.get(0).getPropertyId()).isEqualTo(HVAC_POWER_ON);
+        assertThat(carPropertyProfiles.get(0).getCarZones()).isEqualTo(carZones);
+        assertThat(carPropertyProfiles.get(0).getCarZoneSetsToMinMaxRange())
+                .isEqualTo(CAR_ZONE_SET_TO_MIN_MAX_RANGE);
+    }
+
     private static class TestListener implements PropertyRequestProcessor.OnGetPropertiesListener {
         private final CountDownLatch mCountDownLatch = new CountDownLatch(1);
         private List<CarPropertyValue<?>> mCarPropertyValues = new ArrayList<>();
@@ -116,6 +148,28 @@
         }
     }
 
+    private static class TestPropertyProfileListener implements
+            PropertyRequestProcessor.OnGetCarPropertyProfilesListener {
+        private final CountDownLatch mCountDownLatch = new CountDownLatch(1);
+        private List<CarPropertyProfile<?>> mCarPropertyProfiles = new ArrayList<>();
+        @Override
+        public void onGetCarPropertyProfiles(List<CarPropertyProfile<?>> propertyProfiles) {
+            mCarPropertyProfiles = propertyProfiles;
+            mCountDownLatch.countDown();
+        }
+
+        public void assertOnGetCarPropertyProfilesCalled() throws InterruptedException {
+            if (!mCountDownLatch.await(WAIT_CALLBACK_MS, TimeUnit.MILLISECONDS)) {
+                throw new IllegalStateException("Callback is not called in ms: "
+                        + WAIT_CALLBACK_MS);
+            }
+        }
+
+        public List<CarPropertyProfile<?>> getCarPropertyProfiles() {
+            return mCarPropertyProfiles;
+        }
+    }
+
     private static class DefaultCallback extends PropertyRequestProcessor.PropertyEventCallback {
 
         @Override
diff --git a/car/app/app-automotive/src/test/java/androidx/car/app/hardware/common/PropertyUtilsTest.java b/car/app/app-automotive/src/test/java/androidx/car/app/hardware/common/PropertyUtilsTest.java
index e7d9a49..f1b806b 100644
--- a/car/app/app-automotive/src/test/java/androidx/car/app/hardware/common/PropertyUtilsTest.java
+++ b/car/app/app-automotive/src/test/java/androidx/car/app/hardware/common/PropertyUtilsTest.java
@@ -23,6 +23,7 @@
 import static org.mockito.Mockito.when;
 
 import android.car.hardware.CarPropertyValue;
+import android.util.Pair;
 
 import com.google.common.collect.ImmutableMap;
 
@@ -38,8 +39,10 @@
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 
 @RunWith(RobolectricTestRunner.class)
@@ -109,4 +112,17 @@
                 PropertyUtils.getPropertyIdWithAreaIds(propertyIdsWithCarZones)).isEqualTo(
                         propertyIdAreaIds);
     }
+
+    @Test
+    public void successfulGetMinMaxProfileIntegerMap() {
+        Map<Set<CarZone>, Pair<?, ?>> actualMinMaxRange = new HashMap<>();
+        Map<Set<CarZone>, Pair<Integer, Integer>> expectedMinMaxRange = new HashMap<>();
+        CarZone frontLeft = new CarZone.Builder().setRow(CarZone.CAR_ZONE_ROW_FIRST)
+                .setColumn(CarZone.CAR_ZONE_COLUMN_LEFT).build();
+
+        actualMinMaxRange.put(Collections.singleton(frontLeft), new Pair<>(1, 7));
+        expectedMinMaxRange.put(Collections.singleton(frontLeft), new Pair<>(1, 7));
+        assertThat(PropertyUtils.getMinMaxProfileIntegerMap(actualMinMaxRange)).isEqualTo(
+                expectedMinMaxRange);
+    }
 }
diff --git a/car/app/app-automotive/src/test/java/androidx/car/app/hardware/common/SeatCarZoneAreaIdConverterTest.java b/car/app/app-automotive/src/test/java/androidx/car/app/hardware/common/SeatCarZoneAreaIdConverterTest.java
new file mode 100644
index 0000000..51e1824
--- /dev/null
+++ b/car/app/app-automotive/src/test/java/androidx/car/app/hardware/common/SeatCarZoneAreaIdConverterTest.java
@@ -0,0 +1,188 @@
+/*
+ * 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.car.app.hardware.common;
+
+import static androidx.car.app.hardware.common.CarZone.CAR_ZONE_COLUMN_CENTER;
+import static androidx.car.app.hardware.common.CarZone.CAR_ZONE_COLUMN_LEFT;
+import static androidx.car.app.hardware.common.CarZone.CAR_ZONE_COLUMN_RIGHT;
+import static androidx.car.app.hardware.common.CarZone.CAR_ZONE_ROW_FIRST;
+import static androidx.car.app.hardware.common.CarZone.CAR_ZONE_ROW_SECOND;
+import static androidx.car.app.hardware.common.CarZone.CAR_ZONE_ROW_THIRD;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.car.VehicleAreaSeat;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+@RunWith(RobolectricTestRunner.class)
+public class SeatCarZoneAreaIdConverterTest {
+
+    private SeatCarZoneAreaIdConverter mSeatCarZoneAreaIdConverter;
+
+    private static final int sRow1SeatAreaId = VehicleAreaSeat.SEAT_ROW_1_LEFT
+            | VehicleAreaSeat.SEAT_ROW_1_CENTER
+            | VehicleAreaSeat.SEAT_ROW_1_RIGHT;
+    private static final int sRow2SeatAreaId = VehicleAreaSeat.SEAT_ROW_2_LEFT
+            | VehicleAreaSeat.SEAT_ROW_2_CENTER
+            | VehicleAreaSeat.SEAT_ROW_2_RIGHT;
+    private static final int sRow3SeatAreaId =
+            VehicleAreaSeat.SEAT_ROW_3_LEFT
+                    | VehicleAreaSeat.SEAT_ROW_3_CENTER
+                    | VehicleAreaSeat.SEAT_ROW_3_RIGHT;
+
+
+    @Before
+    public void setUp() {
+        mSeatCarZoneAreaIdConverter = new SeatCarZoneAreaIdConverter();
+    }
+
+    @Test
+    public void convertAreaIdToCarZones_singleZone_returnsCorrectZone() {
+        List<CarZone> zonesRow2Left =
+                new ArrayList<>(
+                        mSeatCarZoneAreaIdConverter.convertAreaIdToCarZones(
+                                VehicleAreaSeat.SEAT_ROW_2_LEFT));
+        List<CarZone> zonesRow2Center =
+                new ArrayList<>(
+                        mSeatCarZoneAreaIdConverter.convertAreaIdToCarZones(
+                                VehicleAreaSeat.SEAT_ROW_2_CENTER));
+        List<CarZone> zonesRow2Right =
+                new ArrayList<>(
+                        mSeatCarZoneAreaIdConverter.convertAreaIdToCarZones(
+                                VehicleAreaSeat.SEAT_ROW_2_RIGHT));
+
+        assertThat(zonesRow2Left).hasSize(1);
+        assertThat(zonesRow2Left.get(0).getRow()).isEqualTo(CAR_ZONE_ROW_SECOND);
+        assertThat(zonesRow2Left.get(0).getColumn()).isEqualTo(CAR_ZONE_COLUMN_LEFT);
+
+        assertThat(zonesRow2Center).hasSize(1);
+        assertThat(zonesRow2Center.get(0).getRow()).isEqualTo(CAR_ZONE_ROW_SECOND);
+        assertThat(zonesRow2Center.get(0).getColumn()).isEqualTo(CAR_ZONE_COLUMN_CENTER);
+
+        assertThat(zonesRow2Right).hasSize(1);
+        assertThat(zonesRow2Right.get(0).getRow()).isEqualTo(CAR_ZONE_ROW_SECOND);
+        assertThat(zonesRow2Right.get(0).getColumn()).isEqualTo(CAR_ZONE_COLUMN_RIGHT);
+    }
+
+    @Test
+    public void convertAreaIdToCarZones_row1_returnsCorrectZones() {
+        Set<CarZone> actualZones = mSeatCarZoneAreaIdConverter.convertAreaIdToCarZones(
+                sRow1SeatAreaId);
+        Set<CarZone> expectedZones = new HashSet<>();
+        expectedZones.add(
+                new CarZone.Builder()
+                        .setRow(CAR_ZONE_ROW_FIRST)
+                        .setColumn(CAR_ZONE_COLUMN_LEFT)
+                        .build());
+        expectedZones.add(
+                new CarZone.Builder()
+                        .setRow(CAR_ZONE_ROW_FIRST)
+                        .setColumn(CAR_ZONE_COLUMN_CENTER)
+                        .build());
+        expectedZones.add(
+                new CarZone.Builder()
+                        .setRow(CAR_ZONE_ROW_FIRST)
+                        .setColumn(CAR_ZONE_COLUMN_RIGHT)
+                        .build());
+
+        assertThat(areSame(expectedZones, actualZones)).isTrue();
+    }
+
+    @Test
+    public void convertAreaIdToCarZones_row2_returnsCorrectZones() {
+        Set<CarZone> actualZones =
+                mSeatCarZoneAreaIdConverter.convertAreaIdToCarZones(sRow2SeatAreaId);
+        Set<CarZone> expectedZones = new HashSet<>();
+        expectedZones.add(
+                new CarZone.Builder()
+                        .setRow(CAR_ZONE_ROW_SECOND)
+                        .setColumn(CAR_ZONE_COLUMN_LEFT)
+                        .build());
+        expectedZones.add(
+                new CarZone.Builder()
+                        .setRow(CAR_ZONE_ROW_SECOND)
+                        .setColumn(CAR_ZONE_COLUMN_CENTER)
+                        .build());
+        expectedZones.add(
+                new CarZone.Builder()
+                        .setRow(CAR_ZONE_ROW_SECOND)
+                        .setColumn(CAR_ZONE_COLUMN_RIGHT)
+                        .build());
+
+        assertThat(areSame(expectedZones, actualZones)).isTrue();
+    }
+
+    @Test
+    public void convertAreaIdToCarZones_row3_returnsCorrectZones() {
+        Set<CarZone> actualZones = mSeatCarZoneAreaIdConverter.convertAreaIdToCarZones(
+                sRow3SeatAreaId);
+        Set<CarZone> expectedZones = new HashSet<>();
+        expectedZones.add(
+                new CarZone.Builder()
+                        .setRow(CAR_ZONE_ROW_THIRD)
+                        .setColumn(CAR_ZONE_COLUMN_LEFT)
+                        .build());
+        expectedZones.add(
+                new CarZone.Builder()
+                        .setRow(CAR_ZONE_ROW_THIRD)
+                        .setColumn(CAR_ZONE_COLUMN_CENTER)
+                        .build());
+        expectedZones.add(
+                new CarZone.Builder()
+                        .setRow(CAR_ZONE_ROW_THIRD)
+                        .setColumn(CAR_ZONE_COLUMN_RIGHT)
+                        .build());
+
+        assertThat(areSame(expectedZones, actualZones)).isTrue();
+    }
+
+    @Test
+    public void convertAreaIdToCarZones_invalidAreaId_returnsEmptyList() {
+        int seatAreaId = 0x0000; // invalid
+        Set<CarZone> zones = mSeatCarZoneAreaIdConverter.convertAreaIdToCarZones(seatAreaId);
+        assertThat(zones).isEmpty();
+    }
+
+    private static boolean areSame(Set<CarZone> expectedZones, Set<CarZone> actualZones) {
+        if (expectedZones.size() != actualZones.size()) {
+            return false;
+        }
+        for (CarZone expectedZone : expectedZones) {
+            boolean foundExpectedZone = false;
+            for (CarZone actualZone : actualZones) {
+                if (expectedZone.getRow() == actualZone.getRow()
+                        && expectedZone.getColumn() == actualZone.getColumn()) {
+                    foundExpectedZone = true;
+                    break;
+                }
+            }
+            if (!foundExpectedZone) {
+                return false;
+            }
+        }
+        return true;
+    }
+}
diff --git a/car/app/app-projected/build.gradle b/car/app/app-projected/build.gradle
index f14b678..bac1356 100644
--- a/car/app/app-projected/build.gradle
+++ b/car/app/app-projected/build.gradle
@@ -39,7 +39,7 @@
 
 android {
     defaultConfig {
-        minSdkVersion 23
+        minSdkVersion 21
         multiDexEnabled = true
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
     }
diff --git a/car/app/app-samples/navigation/automotive/src/main/AndroidManifest.xml b/car/app/app-samples/navigation/automotive/src/main/AndroidManifest.xml
index 0744891..df83e57 100644
--- a/car/app/app-samples/navigation/automotive/src/main/AndroidManifest.xml
+++ b/car/app/app-samples/navigation/automotive/src/main/AndroidManifest.xml
@@ -67,6 +67,7 @@
       <intent-filter>
         <action android:name="androidx.car.app.CarAppService" />
         <category android:name="androidx.car.app.category.NAVIGATION"/>
+        <category android:name="androidx.car.app.category.FEATURE_CLUSTER"/>
       </intent-filter>
     </service>
     <service
diff --git a/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java b/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java
index c0a51ae..84dcbfe 100644
--- a/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java
+++ b/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java
@@ -26,6 +26,7 @@
 import androidx.annotation.NonNull;
 import androidx.car.app.CarAppService;
 import androidx.car.app.Session;
+import androidx.car.app.SessionInfo;
 import androidx.car.app.sample.navigation.common.R;
 import androidx.car.app.validation.HostValidator;
 import androidx.core.app.NotificationCompat;
@@ -56,7 +57,7 @@
     @SuppressWarnings("deprecation")
     @Override
     @NonNull
-    public Session onCreateSession() {
+    public Session onCreateSession(@NonNull SessionInfo sessionInfo) {
         createNotificationChannel();
 
         // Turn the car app service into a foreground service in order to make sure we can use all
@@ -70,7 +71,7 @@
         // See https://developer.android.com/reference/com/google/android/libraries/car/app
         // /CarAppService#accessing-location for more details.
         startForeground(NOTIFICATION_ID, getNotification());
-        NavigationSession session = new NavigationSession();
+        NavigationSession session = new NavigationSession(sessionInfo);
         session.getLifecycle()
                 .addObserver(
                         new DefaultLifecycleObserver() {
diff --git a/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationSession.java b/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationSession.java
index 14dcab9..4fe2428 100644
--- a/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationSession.java
+++ b/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationSession.java
@@ -37,6 +37,7 @@
 import androidx.car.app.Screen;
 import androidx.car.app.ScreenManager;
 import androidx.car.app.Session;
+import androidx.car.app.SessionInfo;
 import androidx.car.app.model.Action;
 import androidx.car.app.model.CarIcon;
 import androidx.car.app.model.Distance;
@@ -174,9 +175,11 @@
                 }
             };
 
-    NavigationSession() {
-        Lifecycle lifecycle = getLifecycle();
-        lifecycle.addObserver(mLifeCycleObserver);
+    NavigationSession(@NonNull SessionInfo sessionInfo) {
+        if (sessionInfo.getDisplayType() == SessionInfo.DISPLAY_TYPE_MAIN) {
+            Lifecycle lifecycle = getLifecycle();
+            lifecycle.addObserver(mLifeCycleObserver);
+        }
     }
 
     @Override
diff --git a/car/app/app-samples/navigation/mobile/src/main/AndroidManifest.xml b/car/app/app-samples/navigation/mobile/src/main/AndroidManifest.xml
index 77fc340..b9ba68b 100644
--- a/car/app/app-samples/navigation/mobile/src/main/AndroidManifest.xml
+++ b/car/app/app-samples/navigation/mobile/src/main/AndroidManifest.xml
@@ -58,6 +58,7 @@
       <intent-filter>
         <action android:name="androidx.car.app.CarAppService" />
         <category android:name="androidx.car.app.category.NAVIGATION"/>
+        <category android:name="androidx.car.app.category.FEATURE_CLUSTER"/>
       </intent-filter>
       <intent-filter>
         <action android:name="androidx.car.app.action.NAVIGATE" />
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/templates/ListTemplateDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/templates/ListTemplateDemoScreen.java
index 45d7c52..45fa97a 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/templates/ListTemplateDemoScreen.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/templates/ListTemplateDemoScreen.java
@@ -81,14 +81,18 @@
                                 .build();
                 final String onClickText = getCarContext().getString(R.string.clicked_row_prefix)
                         + ": " + i;
-                listBuilder.addItem(
-                        new Row.Builder()
-                                .setOnClickListener(() -> onClick(onClickText))
-                                .setTitle(
-                                        getCarContext().getString(R.string.title_prefix) + " " + i)
-                                .addText(getCarContext().getString(R.string.first_line_text))
-                                .addText(secondText)
-                                .build());
+                Row.Builder rowBuilder = new Row.Builder()
+                        .setOnClickListener(() -> onClick(onClickText))
+                        .setTitle(
+                                getCarContext().getString(R.string.title_prefix) + " " + i);
+                if (i % 2 == 0) {
+                    rowBuilder.addText(getCarContext().getString(R.string.long_line_text));
+                } else {
+                    rowBuilder
+                            .addText(getCarContext().getString(R.string.first_line_text))
+                            .addText(secondText);
+                }
+                listBuilder.addItem(rowBuilder.build());
             }
         }
 
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 6ff5447..c4d6f70 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
@@ -276,6 +276,7 @@
   <string name="clicked_row_prefix">Clicked row</string>
   <string name="first_line_text">First line of text</string>
   <string name="second_line_text">Second line of text</string>
+  <string name="long_line_text">This subtext can fully display in unrestricted mode (ex. parking mode, restricted low speed mode). But this will truncate to only two lines while in restricted mode (ex. driving mode). For testing purposes, this subtext is super super super super super long</string>
   <string name="title_prefix">Title</string>
   <string name="list_template_demo_title">List Template Demo</string>
 
diff --git a/car/app/app-testing/build.gradle b/car/app/app-testing/build.gradle
index 5fb829e..1458882 100644
--- a/car/app/app-testing/build.gradle
+++ b/car/app/app-testing/build.gradle
@@ -46,7 +46,7 @@
 
 android {
     defaultConfig {
-        minSdkVersion 23
+        minSdkVersion 21
         multiDexEnabled = true
     }
     lintOptions {
diff --git a/car/app/app/api/current.txt b/car/app/app/api/current.txt
index 34cfdbc..919b746 100644
--- a/car/app/app/api/current.txt
+++ b/car/app/app/api/current.txt
@@ -162,6 +162,7 @@
     ctor public SessionInfo(int, String);
     method public int getDisplayType();
     method public String getSessionId();
+    method public java.util.Set<java.lang.Class<? extends androidx.car.app.model.Template>!>? getSupportedTemplates(int);
     field public static final androidx.car.app.SessionInfo DEFAULT_SESSION_INFO;
     field public static final int DISPLAY_TYPE_CLUSTER = 1; // 0x1
     field public static final int DISPLAY_TYPE_MAIN = 0; // 0x0
@@ -977,9 +978,9 @@
 
   @androidx.car.app.annotations.CarProtocol public final class Row implements androidx.car.app.model.Item {
     method public java.util.List<androidx.car.app.model.Action!> getActions();
-    method public androidx.car.app.model.CarIcon? getDecoration();
     method public androidx.car.app.model.CarIcon? getImage();
     method public androidx.car.app.model.Metadata? getMetadata();
+    method public int getNumericDecoration();
     method public androidx.car.app.model.OnClickDelegate? getOnClickDelegate();
     method public int getRowImageType();
     method public java.util.List<androidx.car.app.model.CarText!> getTexts();
@@ -992,6 +993,7 @@
     field public static final int IMAGE_TYPE_ICON = 4; // 0x4
     field public static final int IMAGE_TYPE_LARGE = 2; // 0x2
     field public static final int IMAGE_TYPE_SMALL = 1; // 0x1
+    field public static final int NO_DECORATION = -1; // 0xffffffff
   }
 
   public static final class Row.Builder {
@@ -1001,11 +1003,11 @@
     method public androidx.car.app.model.Row.Builder addText(androidx.car.app.model.CarText);
     method public androidx.car.app.model.Row build();
     method public androidx.car.app.model.Row.Builder setBrowsable(boolean);
-    method public androidx.car.app.model.Row.Builder setDecoration(androidx.car.app.model.CarIcon);
     method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.Row.Builder setEnabled(boolean);
     method public androidx.car.app.model.Row.Builder setImage(androidx.car.app.model.CarIcon);
     method public androidx.car.app.model.Row.Builder setImage(androidx.car.app.model.CarIcon, int);
     method public androidx.car.app.model.Row.Builder setMetadata(androidx.car.app.model.Metadata);
+    method public androidx.car.app.model.Row.Builder setNumericDecoration(int);
     method public androidx.car.app.model.Row.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
     method public androidx.car.app.model.Row.Builder setTitle(CharSequence);
     method public androidx.car.app.model.Row.Builder setTitle(androidx.car.app.model.CarText);
@@ -1640,6 +1642,7 @@
     field public static final int LEVEL_3 = 3; // 0x3
     field public static final int LEVEL_4 = 4; // 0x4
     field public static final int LEVEL_5 = 5; // 0x5
+    field public static final int LEVEL_6 = 6; // 0x6
   }
 
 }
diff --git a/car/app/app/api/public_plus_experimental_current.txt b/car/app/app/api/public_plus_experimental_current.txt
index 2062816..41b5994 100644
--- a/car/app/app/api/public_plus_experimental_current.txt
+++ b/car/app/app/api/public_plus_experimental_current.txt
@@ -163,7 +163,7 @@
     ctor public SessionInfo(int, String);
     method public int getDisplayType();
     method public String getSessionId();
-    method @androidx.car.app.annotations.ExperimentalCarApi public java.util.Set<java.lang.Class<? extends androidx.car.app.model.Template>!>? getSupportedTemplates(int);
+    method public java.util.Set<java.lang.Class<? extends androidx.car.app.model.Template>!>? getSupportedTemplates(int);
     field public static final androidx.car.app.SessionInfo DEFAULT_SESSION_INFO;
     field public static final int DISPLAY_TYPE_CLUSTER = 1; // 0x1
     field public static final int DISPLAY_TYPE_MAIN = 0; // 0x0
@@ -252,17 +252,15 @@
   @androidx.car.app.annotations.ExperimentalCarApi public final class CabinTemperatureProfile {
     method public float getCelsiusSupportedIncrement();
     method public float getFahrenheitSupportedIncrement();
-    method public java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,android.util.Pair<java.lang.Float!,java.lang.Float!>!> getSupportedCarZoneSetsToCelsiusRange();
-    method public java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,android.util.Pair<java.lang.Float!,java.lang.Float!>!> getSupportedCarZoneSetsToFahrenheitRange();
+    method public android.util.Pair<java.lang.Float!,java.lang.Float!> getSupportedMinMaxCelsiusRange();
+    method public android.util.Pair<java.lang.Float!,java.lang.Float!> getSupportedMinMaxFahrenheitRange();
     method public boolean hasCelsiusSupportedIncrement();
     method public boolean hasFahrenheitSupportedIncrement();
   }
 
   public static final class CabinTemperatureProfile.Builder {
-    ctor public CabinTemperatureProfile.Builder(java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,android.util.Pair<java.lang.Float!,java.lang.Float!>!>, java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,android.util.Pair<java.lang.Float!,java.lang.Float!>!>);
+    ctor public CabinTemperatureProfile.Builder(android.util.Pair<java.lang.Float!,java.lang.Float!>, android.util.Pair<java.lang.Float!,java.lang.Float!>, float, float);
     method public androidx.car.app.hardware.climate.CabinTemperatureProfile build();
-    method public androidx.car.app.hardware.climate.CabinTemperatureProfile.Builder setCelsiusSupportedIncrement(float);
-    method public androidx.car.app.hardware.climate.CabinTemperatureProfile.Builder setFahrenheitSupportedIncrement(float);
   }
 
   @MainThread @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(5) public interface CarClimate {
@@ -391,20 +389,20 @@
   }
 
   @androidx.car.app.annotations.ExperimentalCarApi public final class FanDirectionProfile {
-    method public java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,java.util.List<java.lang.Integer!>!> getCarZoneSetsToFanDirectionValues();
+    method public java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,android.util.Pair<java.lang.Integer!,java.lang.Integer!>!> getCarZoneSetsToFanDirectionValues();
   }
 
   public static final class FanDirectionProfile.Builder {
-    ctor public FanDirectionProfile.Builder(java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,java.util.List<java.lang.Integer!>!>);
+    ctor public FanDirectionProfile.Builder(java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,android.util.Pair<java.lang.Integer!,java.lang.Integer!>!>);
     method public androidx.car.app.hardware.climate.FanDirectionProfile build();
   }
 
   @androidx.car.app.annotations.ExperimentalCarApi public final class FanSpeedLevelProfile {
-    method public java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,java.util.List<java.lang.Integer!>!> getCarZoneSetsToFanSpeedLevelValues();
+    method public java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,android.util.Pair<java.lang.Integer!,java.lang.Integer!>!> getCarZoneSetsToFanSpeedLevelRanges();
   }
 
   public static final class FanSpeedLevelProfile.Builder {
-    ctor public FanSpeedLevelProfile.Builder(java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,java.util.List<java.lang.Integer!>!>);
+    ctor public FanSpeedLevelProfile.Builder(java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,android.util.Pair<java.lang.Integer!,java.lang.Integer!>!>);
     method public androidx.car.app.hardware.climate.FanSpeedLevelProfile build();
   }
 
@@ -491,29 +489,29 @@
   }
 
   @androidx.car.app.annotations.ExperimentalCarApi public final class SeatTemperatureProfile {
-    method public java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,java.util.List<java.lang.Integer!>!> getCarZoneSetsToSeatTemperatureValues();
+    method public java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,android.util.Pair<java.lang.Integer!,java.lang.Integer!>!> getCarZoneSetsToSeatTemperatureValues();
   }
 
   public static final class SeatTemperatureProfile.Builder {
-    ctor public SeatTemperatureProfile.Builder(java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,java.util.List<java.lang.Integer!>!>);
+    ctor public SeatTemperatureProfile.Builder(java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,android.util.Pair<java.lang.Integer!,java.lang.Integer!>!>);
     method public androidx.car.app.hardware.climate.SeatTemperatureProfile build();
   }
 
   @androidx.car.app.annotations.ExperimentalCarApi public final class SeatVentilationProfile {
-    method public java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,java.util.List<java.lang.Integer!>!> getCarZoneSetsToSeatVentilationValues();
+    method public java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,android.util.Pair<java.lang.Integer!,java.lang.Integer!>!> getCarZoneSetsToSeatVentilationValues();
   }
 
   public static final class SeatVentilationProfile.Builder {
-    ctor public SeatVentilationProfile.Builder(java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,java.util.List<java.lang.Integer!>!>);
+    ctor public SeatVentilationProfile.Builder(java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,android.util.Pair<java.lang.Integer!,java.lang.Integer!>!>);
     method public androidx.car.app.hardware.climate.SeatVentilationProfile build();
   }
 
   @androidx.car.app.annotations.ExperimentalCarApi public final class SteeringWheelHeatProfile {
-    method public java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,java.util.List<java.lang.Integer!>!> getCarZoneSetsToSteeringWheelHeatValues();
+    method public java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,android.util.Pair<java.lang.Integer!,java.lang.Integer!>!> getCarZoneSetsToSteeringWheelHeatValues();
   }
 
   public static final class SteeringWheelHeatProfile.Builder {
-    ctor public SteeringWheelHeatProfile.Builder(java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,java.util.List<java.lang.Integer!>!>);
+    ctor public SteeringWheelHeatProfile.Builder(java.util.Map<java.util.Set<androidx.car.app.hardware.common.CarZone!>!,android.util.Pair<java.lang.Integer!,java.lang.Integer!>!>);
     method public androidx.car.app.hardware.climate.SteeringWheelHeatProfile build();
   }
 
@@ -1330,9 +1328,9 @@
 
   @androidx.car.app.annotations.CarProtocol public final class Row implements androidx.car.app.model.Item {
     method public java.util.List<androidx.car.app.model.Action!> getActions();
-    method public androidx.car.app.model.CarIcon? getDecoration();
     method public androidx.car.app.model.CarIcon? getImage();
     method public androidx.car.app.model.Metadata? getMetadata();
+    method public int getNumericDecoration();
     method public androidx.car.app.model.OnClickDelegate? getOnClickDelegate();
     method public int getRowImageType();
     method public java.util.List<androidx.car.app.model.CarText!> getTexts();
@@ -1345,6 +1343,7 @@
     field public static final int IMAGE_TYPE_ICON = 4; // 0x4
     field public static final int IMAGE_TYPE_LARGE = 2; // 0x2
     field public static final int IMAGE_TYPE_SMALL = 1; // 0x1
+    field public static final int NO_DECORATION = -1; // 0xffffffff
   }
 
   public static final class Row.Builder {
@@ -1354,11 +1353,11 @@
     method public androidx.car.app.model.Row.Builder addText(androidx.car.app.model.CarText);
     method public androidx.car.app.model.Row build();
     method public androidx.car.app.model.Row.Builder setBrowsable(boolean);
-    method public androidx.car.app.model.Row.Builder setDecoration(androidx.car.app.model.CarIcon);
     method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.Row.Builder setEnabled(boolean);
     method public androidx.car.app.model.Row.Builder setImage(androidx.car.app.model.CarIcon);
     method public androidx.car.app.model.Row.Builder setImage(androidx.car.app.model.CarIcon, int);
     method public androidx.car.app.model.Row.Builder setMetadata(androidx.car.app.model.Metadata);
+    method public androidx.car.app.model.Row.Builder setNumericDecoration(int);
     method public androidx.car.app.model.Row.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
     method public androidx.car.app.model.Row.Builder setTitle(CharSequence);
     method public androidx.car.app.model.Row.Builder setTitle(androidx.car.app.model.CarText);
@@ -1993,6 +1992,7 @@
     field public static final int LEVEL_3 = 3; // 0x3
     field public static final int LEVEL_4 = 4; // 0x4
     field public static final int LEVEL_5 = 5; // 0x5
+    field public static final int LEVEL_6 = 6; // 0x6
   }
 
 }
diff --git a/car/app/app/api/restricted_current.txt b/car/app/app/api/restricted_current.txt
index 34cfdbc..919b746 100644
--- a/car/app/app/api/restricted_current.txt
+++ b/car/app/app/api/restricted_current.txt
@@ -162,6 +162,7 @@
     ctor public SessionInfo(int, String);
     method public int getDisplayType();
     method public String getSessionId();
+    method public java.util.Set<java.lang.Class<? extends androidx.car.app.model.Template>!>? getSupportedTemplates(int);
     field public static final androidx.car.app.SessionInfo DEFAULT_SESSION_INFO;
     field public static final int DISPLAY_TYPE_CLUSTER = 1; // 0x1
     field public static final int DISPLAY_TYPE_MAIN = 0; // 0x0
@@ -977,9 +978,9 @@
 
   @androidx.car.app.annotations.CarProtocol public final class Row implements androidx.car.app.model.Item {
     method public java.util.List<androidx.car.app.model.Action!> getActions();
-    method public androidx.car.app.model.CarIcon? getDecoration();
     method public androidx.car.app.model.CarIcon? getImage();
     method public androidx.car.app.model.Metadata? getMetadata();
+    method public int getNumericDecoration();
     method public androidx.car.app.model.OnClickDelegate? getOnClickDelegate();
     method public int getRowImageType();
     method public java.util.List<androidx.car.app.model.CarText!> getTexts();
@@ -992,6 +993,7 @@
     field public static final int IMAGE_TYPE_ICON = 4; // 0x4
     field public static final int IMAGE_TYPE_LARGE = 2; // 0x2
     field public static final int IMAGE_TYPE_SMALL = 1; // 0x1
+    field public static final int NO_DECORATION = -1; // 0xffffffff
   }
 
   public static final class Row.Builder {
@@ -1001,11 +1003,11 @@
     method public androidx.car.app.model.Row.Builder addText(androidx.car.app.model.CarText);
     method public androidx.car.app.model.Row build();
     method public androidx.car.app.model.Row.Builder setBrowsable(boolean);
-    method public androidx.car.app.model.Row.Builder setDecoration(androidx.car.app.model.CarIcon);
     method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.Row.Builder setEnabled(boolean);
     method public androidx.car.app.model.Row.Builder setImage(androidx.car.app.model.CarIcon);
     method public androidx.car.app.model.Row.Builder setImage(androidx.car.app.model.CarIcon, int);
     method public androidx.car.app.model.Row.Builder setMetadata(androidx.car.app.model.Metadata);
+    method public androidx.car.app.model.Row.Builder setNumericDecoration(int);
     method public androidx.car.app.model.Row.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
     method public androidx.car.app.model.Row.Builder setTitle(CharSequence);
     method public androidx.car.app.model.Row.Builder setTitle(androidx.car.app.model.CarText);
@@ -1640,6 +1642,7 @@
     field public static final int LEVEL_3 = 3; // 0x3
     field public static final int LEVEL_4 = 4; // 0x4
     field public static final int LEVEL_5 = 5; // 0x5
+    field public static final int LEVEL_6 = 6; // 0x6
   }
 
 }
diff --git a/car/app/app/build.gradle b/car/app/app/build.gradle
index a261df3..af7c27a 100644
--- a/car/app/app/build.gradle
+++ b/car/app/app/build.gradle
@@ -84,7 +84,7 @@
         aidl = true
     }
     defaultConfig {
-        minSdkVersion 23
+        minSdkVersion 21
         multiDexEnabled = true
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
 
diff --git a/car/app/app/lint-baseline.xml b/car/app/app/lint-baseline.xml
index 1ee1cdd..6f805be 100644
--- a/car/app/app/lint-baseline.xml
+++ b/car/app/app/lint-baseline.xml
@@ -2,26 +2,17 @@
 <issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
 
     <issue
-        id="NewApi"
-        message="Call requires API level 28 (current min is 23): `android.graphics.drawable.Icon#getResId`"
-        errorLine1="        assertThat(actions.get(0).getIcon().getResId()).isEqualTo(icon1);"
-        errorLine2="                                            ~~~~~~~~">
+        id="MissingPermission"
+        message="Missing permissions required by LocationManager.removeUpdates: 1..22;android.permission.ACCESS_COARSE_LOCATION or 1..22;android.permission.ACCESS_FINE_LOCATION"
+        errorLine1="        locationManager.removeUpdates(mLocationListener);"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/test/java/androidx/car/app/notification/CarAppExtenderTest.java"/>
+            file="src/main/java/androidx/car/app/AppManager.java"/>
     </issue>
 
     <issue
         id="NewApi"
-        message="Call requires API level 28 (current min is 23): `android.graphics.drawable.Icon#getResId`"
-        errorLine1="        assertThat(actions.get(1).getIcon().getResId()).isEqualTo(icon2);"
-        errorLine2="                                            ~~~~~~~~">
-        <location
-            file="src/test/java/androidx/car/app/notification/CarAppExtenderTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 24 (current min is 23): `android.content.res.Configuration#getLocales`"
+        message="Call requires API level 24 (current min is 21): `android.content.res.Configuration#getLocales`"
         errorLine1="        assertThat(mCarContext.getResources().getConfiguration().getLocales().get(0)).isEqualTo("
         errorLine2="                                                                 ~~~~~~~~~~">
         <location
@@ -30,7 +21,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 24 (current min is 23): `android.os.LocaleList#get`"
+        message="Call requires API level 24 (current min is 21): `android.os.LocaleList#get`"
         errorLine1="        assertThat(mCarContext.getResources().getConfiguration().getLocales().get(0)).isEqualTo("
         errorLine2="                                                                              ~~~">
         <location
@@ -39,7 +30,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 23): `android.app.Notification#getChannelId`"
+        message="Call requires API level 26 (current min is 21): `android.app.Notification#getChannelId`"
         errorLine1="        assertThat(changed.getChannelId()).isEqualTo(EXTENDED_CHANNEL);"
         errorLine2="                           ~~~~~~~~~~~~">
         <location
@@ -48,7 +39,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 23): `android.app.Notification#getChannelId`"
+        message="Call requires API level 26 (current min is 21): `android.app.Notification#getChannelId`"
         errorLine1="        assertThat(output.getChannelId()).isEqualTo(DEFAULT_CHANNEL);"
         errorLine2="                          ~~~~~~~~~~~~">
         <location
@@ -57,7 +48,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 23): `android.app.Notification#getChannelId`"
+        message="Call requires API level 26 (current min is 21): `android.app.Notification#getChannelId`"
         errorLine1="        assertThat(output.getChannelId()).isEqualTo(DEFAULT_CHANNEL);"
         errorLine2="                          ~~~~~~~~~~~~">
         <location
@@ -66,7 +57,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 23): `java.time.ZonedDateTime#parse`"
+        message="Call requires API level 26 (current min is 21): `java.time.ZonedDateTime#parse`"
         errorLine1="        ZonedDateTime zonedDateTime = ZonedDateTime.parse(&quot;2020-05-14T19:57:00-07:00[US/Pacific]&quot;);"
         errorLine2="                                                    ~~~~~">
         <location
@@ -75,7 +66,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 23): `create`"
+        message="Call requires API level 26 (current min is 21): `create`"
         errorLine1="        DateTimeWithZone dateTimeWithZone = DateTimeWithZone.create(zonedDateTime);"
         errorLine2="                                                             ~~~~~~">
         <location
@@ -84,7 +75,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 23): `assertDateTimeWithZoneEquals`"
+        message="Call requires API level 26 (current min is 21): `assertDateTimeWithZoneEquals`"
         errorLine1="        assertDateTimeWithZoneEquals(zonedDateTime, dateTimeWithZone);"
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -93,7 +84,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 23): `create`"
+        message="Call requires API level 26 (current min is 21): `create`"
         errorLine1="                    DateTimeWithZone.create(null);"
         errorLine2="                                     ~~~~~~">
         <location
@@ -102,7 +93,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 23): `java.time.Duration#getSeconds`"
+        message="Call requires API level 26 (current min is 21): `java.time.Duration#getSeconds`"
         errorLine1="                Duration.ofMillis(timeZone.getOffset(timeSinceEpochMillis)).getSeconds();"
         errorLine2="                                                                            ~~~~~~~~~~">
         <location
@@ -111,7 +102,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 23): `java.time.Duration#ofMillis`"
+        message="Call requires API level 26 (current min is 21): `java.time.Duration#ofMillis`"
         errorLine1="                Duration.ofMillis(timeZone.getOffset(timeSinceEpochMillis)).getSeconds();"
         errorLine2="                         ~~~~~~~~">
         <location
@@ -120,7 +111,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 23): `java.time.Duration#getSeconds`"
+        message="Call requires API level 26 (current min is 21): `java.time.Duration#getSeconds`"
         errorLine1="                Duration.ofMillis(timeZone.getOffset(timeSinceEpochMillis)).getSeconds();"
         errorLine2="                                                                            ~~~~~~~~~~">
         <location
@@ -129,7 +120,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 23): `java.time.Duration#ofMillis`"
+        message="Call requires API level 26 (current min is 21): `java.time.Duration#ofMillis`"
         errorLine1="                Duration.ofMillis(timeZone.getOffset(timeSinceEpochMillis)).getSeconds();"
         errorLine2="                         ~~~~~~~~">
         <location
@@ -138,7 +129,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 23): `java.time.Duration#getSeconds`"
+        message="Call requires API level 26 (current min is 21): `java.time.Duration#getSeconds`"
         errorLine1="                Duration.ofMillis(timeZone.getOffset(timeSinceEpochMillis)).getSeconds();"
         errorLine2="                                                                            ~~~~~~~~~~">
         <location
@@ -147,7 +138,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 23): `java.time.Duration#ofMillis`"
+        message="Call requires API level 26 (current min is 21): `java.time.Duration#ofMillis`"
         errorLine1="                Duration.ofMillis(timeZone.getOffset(timeSinceEpochMillis)).getSeconds();"
         errorLine2="                         ~~~~~~~~">
         <location
@@ -156,7 +147,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 23): `java.time.Duration#getSeconds`"
+        message="Call requires API level 26 (current min is 21): `java.time.Duration#getSeconds`"
         errorLine1="                Duration.ofMillis(timeZone.getOffset(timeSinceEpochMillis)).getSeconds();"
         errorLine2="                                                                            ~~~~~~~~~~">
         <location
@@ -165,7 +156,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 23): `java.time.Duration#ofMillis`"
+        message="Call requires API level 26 (current min is 21): `java.time.Duration#ofMillis`"
         errorLine1="                Duration.ofMillis(timeZone.getOffset(timeSinceEpochMillis)).getSeconds();"
         errorLine2="                         ~~~~~~~~">
         <location
@@ -174,7 +165,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 24 (current min is 23): `java.util.Collection#stream`"
+        message="Call requires API level 24 (current min is 21): `java.util.Collection#stream`"
         errorLine1="                .stream()"
         errorLine2="                 ~~~~~~">
         <location
@@ -183,7 +174,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 24 (current min is 23): `java.util.stream.Stream#mapToLong`"
+        message="Call requires API level 24 (current min is 21): `java.util.stream.Stream#mapToLong`"
         errorLine1="                .mapToLong(List::size)"
         errorLine2="                 ~~~~~~~~~">
         <location
@@ -192,7 +183,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 24 (current min is 23): `java.util.stream.LongStream#sum`"
+        message="Call requires API level 24 (current min is 21): `java.util.stream.LongStream#sum`"
         errorLine1="                .sum()).isEqualTo(6);"
         errorLine2="                 ~~~">
         <location
@@ -201,7 +192,7 @@
 
     <issue
         id="NewApi"
-        message="Class requires API level 28 (current min is 23): `android.content.pm.SigningInfo`"
+        message="Class requires API level 28 (current min is 21): `android.content.pm.SigningInfo`"
         errorLine1="        packageInfo.signingInfo = mock(SigningInfo.class);"
         errorLine2="                                       ~~~~~~~~~~~">
         <location
@@ -210,7 +201,7 @@
 
     <issue
         id="NewApi"
-        message="Field requires API level 28 (current min is 23): `android.content.pm.PackageInfo#signingInfo`"
+        message="Field requires API level 28 (current min is 21): `android.content.pm.PackageInfo#signingInfo`"
         errorLine1="        packageInfo.signingInfo = mock(SigningInfo.class);"
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -219,7 +210,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 28 (current min is 23): `android.content.pm.SigningInfo#getSigningCertificateHistory`"
+        message="Call requires API level 28 (current min is 21): `android.content.pm.SigningInfo#getSigningCertificateHistory`"
         errorLine1="        when(packageInfo.signingInfo.getSigningCertificateHistory()).thenReturn(signatures);"
         errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -228,7 +219,7 @@
 
     <issue
         id="NewApi"
-        message="Field requires API level 28 (current min is 23): `android.content.pm.PackageInfo#signingInfo`"
+        message="Field requires API level 28 (current min is 21): `android.content.pm.PackageInfo#signingInfo`"
         errorLine1="        when(packageInfo.signingInfo.getSigningCertificateHistory()).thenReturn(signatures);"
         errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -237,7 +228,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 23): `java.time.ZonedDateTime#parse`"
+        message="Call requires API level 26 (current min is 21): `java.time.ZonedDateTime#parse`"
         errorLine1="        ZonedDateTime arrivalTime = ZonedDateTime.parse(&quot;2020-05-14T19:57:00-07:00[US/Pacific]&quot;);"
         errorLine2="                                                  ~~~~~">
         <location
@@ -246,7 +237,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 23): `java.time.Duration#ofHours`"
+        message="Call requires API level 26 (current min is 21): `java.time.Duration#ofHours`"
         errorLine1="        Duration remainingTime = Duration.ofHours(10);"
         errorLine2="                                          ~~~~~~~">
         <location
@@ -255,7 +246,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 23): `Builder`"
+        message="Call requires API level 26 (current min is 21): `Builder`"
         errorLine1="                new TravelEstimate.Builder(mRemainingDistance, arrivalTime).setRemainingTime("
         errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -264,7 +255,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 23): `setRemainingTime`"
+        message="Call requires API level 26 (current min is 21): `setRemainingTime`"
         errorLine1="                new TravelEstimate.Builder(mRemainingDistance, arrivalTime).setRemainingTime("
         errorLine2="                                                                            ~~~~~~~~~~~~~~~~">
         <location
@@ -273,7 +264,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 23): `java.time.Duration#getSeconds`"
+        message="Call requires API level 26 (current min is 21): `java.time.Duration#getSeconds`"
         errorLine1="        assertThat(travelEstimate.getRemainingTimeSeconds()).isEqualTo(remainingTime.getSeconds());"
         errorLine2="                                                                                     ~~~~~~~~~~">
         <location
@@ -282,7 +273,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 23): `assertDateTimeWithZoneEquals`"
+        message="Call requires API level 26 (current min is 21): `assertDateTimeWithZoneEquals`"
         errorLine1="        assertDateTimeWithZoneEquals(arrivalTime, travelEstimate.getArrivalTimeAtDestination());"
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -291,7 +282,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 23): `java.time.ZonedDateTime#parse`"
+        message="Call requires API level 26 (current min is 21): `java.time.ZonedDateTime#parse`"
         errorLine1="        ZonedDateTime arrivalTime = ZonedDateTime.parse(&quot;2020-05-14T19:57:00-07:00[US/Pacific]&quot;);"
         errorLine2="                                                  ~~~~~">
         <location
@@ -300,7 +291,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 23): `Builder`"
+        message="Call requires API level 26 (current min is 21): `Builder`"
         errorLine1="                new TravelEstimate.Builder("
         errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -309,7 +300,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 23): `setRemainingTime`"
+        message="Call requires API level 26 (current min is 21): `setRemainingTime`"
         errorLine1="                        remainingDistance, arrivalTime).setRemainingTime("
         errorLine2="                                                        ~~~~~~~~~~~~~~~~">
         <location
@@ -318,7 +309,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 23): `java.time.Duration#ofSeconds`"
+        message="Call requires API level 26 (current min is 21): `java.time.Duration#ofSeconds`"
         errorLine1="                        Duration.ofSeconds(REMAINING_TIME_UNKNOWN)).build();"
         errorLine2="                                 ~~~~~~~~~">
         <location
@@ -327,7 +318,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 23): `assertDateTimeWithZoneEquals`"
+        message="Call requires API level 26 (current min is 21): `assertDateTimeWithZoneEquals`"
         errorLine1="        assertDateTimeWithZoneEquals(arrivalTime, travelEstimate.getArrivalTimeAtDestination());"
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
diff --git a/car/app/app/src/main/java/androidx/car/app/AppManager.java b/car/app/app/src/main/java/androidx/car/app/AppManager.java
index f90c9de..ad0d40a 100644
--- a/car/app/app/src/main/java/androidx/car/app/AppManager.java
+++ b/car/app/app/src/main/java/androidx/car/app/AppManager.java
@@ -25,6 +25,7 @@
 import static java.util.Objects.requireNonNull;
 
 import android.annotation.SuppressLint;
+import android.content.Context;
 import android.content.pm.PackageManager;
 import android.location.LocationManager;
 import android.os.HandlerThread;
@@ -237,7 +238,8 @@
     @SuppressLint("MissingPermission")
     void startLocationUpdates() {
         stopLocationUpdates();
-        LocationManager locationManager = mCarContext.getSystemService(LocationManager.class);
+        LocationManager locationManager =
+                (LocationManager) mCarContext.getSystemService(Context.LOCATION_SERVICE);
         locationManager.requestLocationUpdates(LocationManager.FUSED_PROVIDER,
                 LOCATION_UPDATE_MIN_INTERVAL_MILLIS,
                 LOCATION_UPDATE_MIN_DISTANCE_METER,
@@ -249,7 +251,8 @@
      * Stops requesting location updates from the app.
      */
     void stopLocationUpdates() {
-        LocationManager locationManager = mCarContext.getSystemService(LocationManager.class);
+        LocationManager locationManager =
+                (LocationManager) mCarContext.getSystemService(Context.LOCATION_SERVICE);
         locationManager.removeUpdates(mLocationListener);
     }
 
@@ -289,10 +292,15 @@
 
             @Override
             public void startLocationUpdates(IOnDoneCallback callback) {
-                if (carContext.checkSelfPermission(ACCESS_FINE_LOCATION)
-                        == PackageManager.PERMISSION_DENIED && carContext.checkSelfPermission(
-                        ACCESS_COARSE_LOCATION)
-                        == PackageManager.PERMISSION_DENIED) {
+                PackageManager packageManager = carContext.getPackageManager();
+                boolean accessFineDenied =
+                        packageManager.checkPermission(ACCESS_FINE_LOCATION,
+                        carContext.getPackageName()) == PackageManager.PERMISSION_DENIED;
+                boolean accessCoarseDenied =
+                        packageManager.checkPermission(ACCESS_COARSE_LOCATION,
+                        carContext.getPackageName()) == PackageManager.PERMISSION_DENIED;
+
+                if (accessFineDenied && accessCoarseDenied) {
                     RemoteUtils.sendFailureResponseToHost(callback, "startLocationUpdates",
                             new SecurityException("Location permission(s) not granted."));
                 }
diff --git a/car/app/app/src/main/java/androidx/car/app/SessionInfo.java b/car/app/app/src/main/java/androidx/car/app/SessionInfo.java
index ce2f647..a971ce2 100644
--- a/car/app/app/src/main/java/androidx/car/app/SessionInfo.java
+++ b/car/app/app/src/main/java/androidx/car/app/SessionInfo.java
@@ -22,7 +22,6 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
-import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.model.Template;
 import androidx.car.app.navigation.model.NavigationTemplate;
@@ -42,15 +41,17 @@
     private static final char DIVIDER = '/';
 
     /** The primary infotainment display usually in the center column of the vehicle. */
+    @DisplayType
     public static final int DISPLAY_TYPE_MAIN = 0;
 
     /** The cluster display, usually located behind the steering wheel. */
+    @DisplayType
     public static final int DISPLAY_TYPE_CLUSTER = 1;
 
-    private static final ImmutableSet<Class<? extends Template>> CLUSTER_SUPPORTED_TEMPLATES_API_5 =
+    private static final ImmutableSet<Class<? extends Template>> CLUSTER_SUPPORTED_TEMPLATES_API_6 =
             ImmutableSet.of(NavigationTemplate.class);
     private static final ImmutableSet<Class<? extends Template>>
-            CLUSTER_SUPPORTED_TEMPLATES_LESS_THAN_API_5 = ImmutableSet.of();
+            CLUSTER_SUPPORTED_TEMPLATES_LESS_THAN_API_6 = ImmutableSet.of();
 
     /**
      * @hide
@@ -68,6 +69,21 @@
     public static final SessionInfo DEFAULT_SESSION_INFO = new SessionInfo(
             DISPLAY_TYPE_MAIN, "main");
 
+    /**
+     * Creates a new {@link SessionInfo} with the provided {@code displayType} and {@code
+     * sessionId}.
+     */
+    public SessionInfo(@DisplayType int displayType, @NonNull String sessionId) {
+        mDisplayType = displayType;
+        mSessionId = sessionId;
+    }
+
+    // Required for Bundler
+    private SessionInfo() {
+        mSessionId = "main";
+        mDisplayType = DISPLAY_TYPE_MAIN;
+    }
+
     /** A string identifier unique per physical display. */
     @Keep
     @NonNull
@@ -93,35 +109,19 @@
     }
 
     /**
-     * Creates a new {@link SessionInfo} with the provided {@code displayType} and {@code
-     * sessionId}.
-     */
-    public SessionInfo(@DisplayType int displayType, @NonNull String sessionId) {
-        mDisplayType = displayType;
-        mSessionId = sessionId;
-    }
-
-    // Required for Bundler
-    private SessionInfo() {
-        mSessionId = "main";
-        mDisplayType = DISPLAY_TYPE_MAIN;
-    }
-
-    /**
      * Returns the set of templates that are allowed for this {@link Session}, or {@code null} if
      * there are no restrictions (ie. all templates are allowed).
      */
     @Nullable
     @SuppressWarnings("NullableCollection") // Set does not contain nulls
-    @ExperimentalCarApi
     public Set<Class<? extends Template>> getSupportedTemplates(
             @CarAppApiLevel int carAppApiLevel) {
         if (mDisplayType == DISPLAY_TYPE_CLUSTER) {
-            if (carAppApiLevel >= CarAppApiLevels.LEVEL_5) {
-                return CLUSTER_SUPPORTED_TEMPLATES_API_5;
+            if (carAppApiLevel >= CarAppApiLevels.LEVEL_6) {
+                return CLUSTER_SUPPORTED_TEMPLATES_API_6;
             }
 
-            return CLUSTER_SUPPORTED_TEMPLATES_LESS_THAN_API_5;
+            return CLUSTER_SUPPORTED_TEMPLATES_LESS_THAN_API_6;
         }
 
         return null;
diff --git a/car/app/app/src/main/java/androidx/car/app/SessionInfoIntentEncoder.java b/car/app/app/src/main/java/androidx/car/app/SessionInfoIntentEncoder.java
index 23850f4..0ee4c24 100644
--- a/car/app/app/src/main/java/androidx/car/app/SessionInfoIntentEncoder.java
+++ b/car/app/app/src/main/java/androidx/car/app/SessionInfoIntentEncoder.java
@@ -23,8 +23,6 @@
 import androidx.annotation.DoNotInline;
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
-import androidx.car.app.serialization.Bundleable;
-import androidx.car.app.serialization.BundlerException;
 
 /** Helper to encode and decode a {@link SessionInfo} from an {@link Intent} */
 public class SessionInfoIntentEncoder {
@@ -32,8 +30,13 @@
     private SessionInfoIntentEncoder() {
     }
 
-    /** The key for a {@link Bundleable} extra containing the {@link SessionInfo} for a bind. */
-    private static final String EXTRA_SESSION_INFO = "androidx.car.app.extra.SESSION_INFO";
+    /** The key for a {@link Bundle} extra containing the {@link SessionInfo} for a bind. */
+    private static final String EXTRA_SESSION_INFO = "androidx.car.app.extra.SESSION_INFO_BUNDLE";
+
+    /** Key for {@link SessionInfo#mDisplayType}. */
+    private static final String KEY_DISPLAY_TYPE = "display-type";
+    /** Key for {@link SessionInfo#mSessionId}. */
+    private static final String KEY_SESSION_ID = "session-id";
 
     /**
      * Sets the unique identifier for the given {@code intent} and encodes the passed
@@ -49,18 +52,17 @@
         } else {
             intent.setData(new Uri.Builder().path(sessionInfo.toString()).build());
         }
-        try {
-            intent.putExtra(EXTRA_SESSION_INFO, Bundleable.create(sessionInfo));
-        } catch (BundlerException e) {
-            throw new RuntimeException(e);
-        }
+
+        Bundle sessionInfoBundle = new Bundle();
+        sessionInfoBundle.putInt(KEY_DISPLAY_TYPE, sessionInfo.getDisplayType());
+        sessionInfoBundle.putString(KEY_SESSION_ID, sessionInfo.getSessionId());
+        intent.putExtra(EXTRA_SESSION_INFO, sessionInfoBundle);
     }
 
     /**
      * Decodes a new {@link SessionInfo} for a given {@code intent}
      */
     @NonNull
-    @SuppressWarnings("deprecation")  /* getParcelable deprecation */
     public static SessionInfo decode(@NonNull Intent intent) {
         Bundle extras = intent.getExtras();
         if (extras == null) {
@@ -68,20 +70,11 @@
                     "Expected the SessionInfo to be encoded in the bind intent extras, but the "
                             + "extras were null.");
         }
-        extras.setClassLoader(Bundleable.class.getClassLoader());
-        Bundleable sessionInfoBundleable = extras.getParcelable(EXTRA_SESSION_INFO);
-        if (sessionInfoBundleable == null) {
-            throw new IllegalArgumentException(
-                    "Expected the SessionInfo to be encoded in the bind intent extras, but they "
-                            + "couldn't be found in the extras.");
-        }
-        try {
-            return (SessionInfo) sessionInfoBundleable.get();
-        } catch (BundlerException e) {
-            throw new IllegalArgumentException(
-                    "Expected the SessionInfo to be encoded in the bind intent extras, but they "
-                            + "were encoded improperly", e);
-        }
+
+        Bundle sessionInfoBundle = extras.getBundle(EXTRA_SESSION_INFO);
+        int displayType = sessionInfoBundle.getInt(KEY_DISPLAY_TYPE);
+        String sessionId = sessionInfoBundle.getString(KEY_SESSION_ID);
+        return new SessionInfo(displayType, sessionId);
     }
 
     /** Returns whether or not the given {@code intent} contains an encoded {@link SessionInfo}. */
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/climate/CabinTemperatureProfile.java b/car/app/app/src/main/java/androidx/car/app/hardware/climate/CabinTemperatureProfile.java
index 3ded402..d1837a4 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/climate/CabinTemperatureProfile.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/climate/CabinTemperatureProfile.java
@@ -20,50 +20,39 @@
 
 import androidx.annotation.NonNull;
 import androidx.car.app.annotations.ExperimentalCarApi;
-import androidx.car.app.hardware.common.CarZone;
-
-import java.util.Collections;
-import java.util.Map;
-import java.util.Set;
 
 /**
  * Container class for information about the {@link
- * ClimateProfileRequest#FEATURE_CABIN_TEMPERATURE} feature such as feature Id and supported
- * values for the feature.
+ * ClimateProfileRequest#FEATURE_CABIN_TEMPERATURE} feature such as supported min/max values and
+ * increments for the feature.
  */
 @ExperimentalCarApi
 public final class CabinTemperatureProfile {
 
     @NonNull
-    private final Map<Set<CarZone>, Pair<Float, Float>> mSupportedCarZoneSetsToCelsiusRange;
+    private final Pair<Float, Float> mSupportedMinMaxCelsiusRange;
 
     @NonNull
-    private final Map<Set<CarZone>, Pair<Float, Float>> mSupportedCarZoneSetsToFahrenheitRange;
+    private final Pair<Float, Float> mSupportedMinMaxFahrenheitRange;
 
     private final float mCelsiusSupportedIncrement;
 
     private final float mFahrenheitSupportedIncrement;
 
     /**
-     * Returns a min/max range for the values of the property in Celsius, mapped to the set of car
-     * zones.
-     *
-     * <p>The values that can be regulated together for a set of car zones are combined together.
+     * Returns a pair of min and max range for the values of the property in Celsius.
      */
     @NonNull
-    public Map<Set<CarZone>, Pair<Float, Float>> getSupportedCarZoneSetsToCelsiusRange() {
-        return mSupportedCarZoneSetsToCelsiusRange;
+    public Pair<Float, Float> getSupportedMinMaxCelsiusRange() {
+        return mSupportedMinMaxCelsiusRange;
     }
 
     /**
-     * Returns a min/max range for the values of the property in Fahrenheit, mapped to the set of
-     * car zones.
-     *
-     * <p>The values that can be regulated together for a set of car zones are combined together.
+     * Returns a pair of min and max range for the values of the property in Fahrenheit.
      */
     @NonNull
-    public Map<Set<CarZone>, Pair<Float, Float>> getSupportedCarZoneSetsToFahrenheitRange() {
-        return mSupportedCarZoneSetsToFahrenheitRange;
+    public Pair<Float, Float> getSupportedMinMaxFahrenheitRange() {
+        return mSupportedMinMaxFahrenheitRange;
     }
 
     /** Reports whether the increment value in Celsius is available or not. */
@@ -107,67 +96,37 @@
     }
 
     CabinTemperatureProfile(Builder builder) {
-        mSupportedCarZoneSetsToCelsiusRange = Collections.unmodifiableMap(
-                builder.mSupportedCarZoneSetsToCelsiusRange);
-        mSupportedCarZoneSetsToFahrenheitRange = Collections.unmodifiableMap(
-                builder.mSupportedCarZoneSetsToFahrenheitRange);
+        mSupportedMinMaxCelsiusRange = builder.mSupportedMinMaxCelsiusRange;
+        mSupportedMinMaxFahrenheitRange = builder.mSupportedMinMaxFahrenheitRange;
         mCelsiusSupportedIncrement = builder.mCelsiusSupportedIncrement;
         mFahrenheitSupportedIncrement = builder.mFahrenheitSupportedIncrement;
     }
 
     /** A builder for CabinTemperatureProfile. */
     public static final class Builder {
-        final Map<Set<CarZone>, Pair<Float, Float>> mSupportedCarZoneSetsToCelsiusRange;
-        final Map<Set<CarZone>, Pair<Float, Float>> mSupportedCarZoneSetsToFahrenheitRange;
+        final Pair<Float, Float> mSupportedMinMaxCelsiusRange;
+        final Pair<Float, Float> mSupportedMinMaxFahrenheitRange;
         float mCelsiusSupportedIncrement;
         float mFahrenheitSupportedIncrement;
 
         /**
          * Creates an instance of builder.
          *
-         * @param supportedCarZoneSetsToCelsiusRange   map of possible Celsius value range to the
-         *                                             set of car zones.
-         * @param supportedCarZoneSetsToFahrenheitRange   map of possible Fahrenheit value range to
-         *                                                the set of car zones.
+         * @param supportedMinMaxCelsiusRange   a pair of min and max range values in Celsius
+         * @param supportedMinMaxFahrenheitRange   a pair of min and max range values in
+         *                                                Fahrenheit
+         * @param celsiusSupportedIncrement   increment number for the temperature values in
+         *                                    Celsius
+         * @param fahrenheitSupportedIncrement   increment number for the temperature values in
+         *                                       Fahrenheit
          */
-        public Builder(@NonNull Map<Set<CarZone>, Pair<Float, Float>>
-                supportedCarZoneSetsToCelsiusRange,
-                @NonNull Map<Set<CarZone>, Pair<Float, Float>>
-                        supportedCarZoneSetsToFahrenheitRange) {
-            mSupportedCarZoneSetsToCelsiusRange = Collections.unmodifiableMap(
-                    supportedCarZoneSetsToCelsiusRange);
-            mSupportedCarZoneSetsToFahrenheitRange = Collections.unmodifiableMap(
-                    supportedCarZoneSetsToFahrenheitRange);
-            mCelsiusSupportedIncrement = -1.0f;
-            mFahrenheitSupportedIncrement = -1.0f;
-        }
-
-        /**
-         * Set the increment for supported Celsius values range.
-         *
-         * <p>If increment is not set for the feature, the Builder will create the feature
-         * with aan empty increment.
-         *
-         * @param celsiusSupportedIncrement Increment value for the Celsius value range
-         */
-        @NonNull
-        public Builder setCelsiusSupportedIncrement(float celsiusSupportedIncrement) {
+        public Builder(@NonNull Pair<Float, Float> supportedMinMaxCelsiusRange,
+                @NonNull Pair<Float, Float> supportedMinMaxFahrenheitRange,
+                float celsiusSupportedIncrement, float fahrenheitSupportedIncrement) {
+            mSupportedMinMaxCelsiusRange = supportedMinMaxCelsiusRange;
+            mSupportedMinMaxFahrenheitRange = supportedMinMaxFahrenheitRange;
             mCelsiusSupportedIncrement = celsiusSupportedIncrement;
-            return this;
-        }
-
-        /**
-         * Set the increment for supported Fahrenheit values range.
-         *
-         * <p>If increment is not set for the feature, the Builder will create the feature
-         * with aan empty increment.
-         *
-         * @param fahrenheitSupportedIncrement Increment value for the Fahrenheit value range
-         */
-        @NonNull
-        public Builder setFahrenheitSupportedIncrement(float fahrenheitSupportedIncrement) {
             mFahrenheitSupportedIncrement = fahrenheitSupportedIncrement;
-            return this;
         }
 
         /** Create a CabinTemperatureProfile. */
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/climate/CarZoneMappingInfoProfile.java b/car/app/app/src/main/java/androidx/car/app/hardware/climate/CarZoneMappingInfoProfile.java
index 318f157..97f7b34 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/climate/CarZoneMappingInfoProfile.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/climate/CarZoneMappingInfoProfile.java
@@ -25,8 +25,7 @@
 
 /**
  * Container class for information about the {@link
- * ClimateProfileRequest#FEATURE_CAR_ZONE_MAPPING} feature such as feature Id and supported
- * values for the feature.
+ * ClimateProfileRequest#FEATURE_CAR_ZONE_MAPPING} feature such as supported values for the feature.
  */
 @ExperimentalCarApi
 public final class CarZoneMappingInfoProfile {
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/climate/DefrosterProfile.java b/car/app/app/src/main/java/androidx/car/app/hardware/climate/DefrosterProfile.java
index 836806e..93274b3 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/climate/DefrosterProfile.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/climate/DefrosterProfile.java
@@ -25,8 +25,7 @@
 
 /**
  * Container class for information about the {@link
- * ClimateProfileRequest#FEATURE_HVAC_DEFROSTER} feature such as feature Id and supported
- * values for the feature.
+ * ClimateProfileRequest#FEATURE_HVAC_DEFROSTER} feature such as supported values for the feature.
  */
 @ExperimentalCarApi
 public final class DefrosterProfile {
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/climate/ElectricDefrosterProfile.java b/car/app/app/src/main/java/androidx/car/app/hardware/climate/ElectricDefrosterProfile.java
index 44ab942..d4dafe7 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/climate/ElectricDefrosterProfile.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/climate/ElectricDefrosterProfile.java
@@ -25,8 +25,8 @@
 
 /**
  * Container class for information about the {@link
- * ClimateProfileRequest#FEATURE_HVAC_ELECTRIC_DEFROSTER} feature such as feature Id and supported
- * values for the feature.
+ * ClimateProfileRequest#FEATURE_HVAC_ELECTRIC_DEFROSTER} feature such as supported values for
+ * the feature.
  */
 @ExperimentalCarApi
 public final class ElectricDefrosterProfile {
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/climate/FanDirectionProfile.java b/car/app/app/src/main/java/androidx/car/app/hardware/climate/FanDirectionProfile.java
index e047ad5..618a190 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/climate/FanDirectionProfile.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/climate/FanDirectionProfile.java
@@ -16,33 +16,35 @@
 
 package androidx.car.app.hardware.climate;
 
+import android.util.Pair;
+
 import androidx.annotation.NonNull;
 import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.hardware.common.CarZone;
 
 import java.util.Collections;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 /**
  * Container class for information about the {@link
- * ClimateProfileRequest#FEATURE_FAN_DIRECTION} feature such as feature Id and supported
- * values for the feature.
+ * ClimateProfileRequest#FEATURE_FAN_DIRECTION} feature such as supported min/max range values
+ * for the feature.
  */
 @ExperimentalCarApi
 public final class FanDirectionProfile {
 
     @NonNull
-    private final Map<Set<CarZone>, List<Integer>> mCarZoneSetsToFanDirectionValues;
+    private final Map<Set<CarZone>, Pair<Integer, Integer>> mCarZoneSetsToFanDirectionValues;
 
     /**
-     * Returns a list of supported values for the feature mapped to the set of car zones.
+     * Returns a pair of supported min/max range values for the feature mapped to the set of car
+     * zones.
      *
      * <p>The values that can be regulated together for a set of car zones are combined together.
      */
     @NonNull
-    public Map<Set<CarZone>, List<Integer>> getCarZoneSetsToFanDirectionValues() {
+    public Map<Set<CarZone>, Pair<Integer, Integer>> getCarZoneSetsToFanDirectionValues() {
         return mCarZoneSetsToFanDirectionValues;
     }
 
@@ -53,15 +55,23 @@
 
     /** A builder for FanDirectionProfile. */
     public static final class Builder {
-        Map<Set<CarZone>, List<Integer>> mCarZoneSetsToFanDirectionValues;
+        Map<Set<CarZone>, Pair<Integer, Integer>> mCarZoneSetsToFanDirectionValues;
 
         /**
          * Creates an instance of builder.
          *
-         * @param carZoneSetsToFanDirectionValues   map of possible values for the property
-         *                                          corresponding to the set of car zones.
+         * @param carZoneSetsToFanDirectionValues   map of min/max range values for the property
+         *                                          corresponding to the set of car zones. The
+         *                                          range values could be one of the values
+         *                                          from [0,6] specified in {@link
+         *                                          android.car.VehicleHvacFanDirection
+         *                                          #VehicleHvacFanDirection}
+         *                                          and are obtained from property {@link
+         *                                          android.car.VehiclePropertyIds
+         *                                          #HVAC_FAN_DIRECTION_AVAILABLE}.
          */
-        public Builder(@NonNull Map<Set<CarZone>, List<Integer>> carZoneSetsToFanDirectionValues) {
+        public Builder(@NonNull Map<Set<CarZone>, Pair<Integer, Integer>>
+                carZoneSetsToFanDirectionValues) {
             mCarZoneSetsToFanDirectionValues = Collections.unmodifiableMap(
                     carZoneSetsToFanDirectionValues);
         }
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/climate/FanSpeedLevelProfile.java b/car/app/app/src/main/java/androidx/car/app/hardware/climate/FanSpeedLevelProfile.java
index 821fec3..835ee17 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/climate/FanSpeedLevelProfile.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/climate/FanSpeedLevelProfile.java
@@ -16,54 +16,62 @@
 
 package androidx.car.app.hardware.climate;
 
+import android.util.Pair;
+
 import androidx.annotation.NonNull;
 import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.hardware.common.CarZone;
 
 import java.util.Collections;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 /**
  * Container class for information about the {@link
- * ClimateProfileRequest#FEATURE_FAN_SPEED} feature such as feature Id and supported
- * values for the feature.
+ * ClimateProfileRequest#FEATURE_FAN_SPEED} feature such as supported min/max range values for
+ * the feature.
  */
 @ExperimentalCarApi
 public final class FanSpeedLevelProfile {
 
     @NonNull
-    private final Map<Set<CarZone>, List<Integer>> mCarZoneSetsToFanSpeedLevelValues;
+    private final Map<Set<CarZone>, Pair<Integer, Integer>> mCarZoneSetsToFanSpeedLevelRanges;
 
     /**
-     * Returns a list of supported values for the feature mapped to the set of car zones.
+     * Returns a pair of supported min/max range values for the feature mapped to the set of car
+     * zones.
      *
      * <p>The values that can be regulated together for a set of car zones are combined together.
      */
     @NonNull
-    public Map<Set<CarZone>, List<Integer>> getCarZoneSetsToFanSpeedLevelValues() {
-        return mCarZoneSetsToFanSpeedLevelValues;
+    public Map<Set<CarZone>, Pair<Integer, Integer>> getCarZoneSetsToFanSpeedLevelRanges() {
+        return mCarZoneSetsToFanSpeedLevelRanges;
     }
 
     FanSpeedLevelProfile(FanSpeedLevelProfile.Builder builder) {
-        mCarZoneSetsToFanSpeedLevelValues = Collections.unmodifiableMap(
-                builder.mCarZoneSetsToFanSpeedLevelValues);
+        mCarZoneSetsToFanSpeedLevelRanges = Collections.unmodifiableMap(
+                builder.mCarZoneSetsToFanSpeedLevelRanges);
     }
 
     /** A builder for FanSpeedLevelProfile. */
     public static final class Builder {
-        Map<Set<CarZone>, List<Integer>> mCarZoneSetsToFanSpeedLevelValues;
+        Map<Set<CarZone>, Pair<Integer, Integer>> mCarZoneSetsToFanSpeedLevelRanges;
 
         /**
          * Creates an instance of builder.
          *
-         * @param carZoneSetsToFanSpeedLevelValues   map of possible values for the property
-         *                                           corresponding to the set of car zones.
+         * @param carZoneSetsToFanSpeedLevelRanges   map of min/max range values in meters per
+         *                                           second for the property corresponding to the
+         *                                           set of car zones. The min/max values are
+         *                                           not in a specific unit but represent fan
+         *                                           speed level settings. They can take
+         *                                           values in the range [1,7] but always greater
+         *                                           than 0.
          */
-        public Builder(@NonNull Map<Set<CarZone>, List<Integer>> carZoneSetsToFanSpeedLevelValues) {
-            mCarZoneSetsToFanSpeedLevelValues = Collections.unmodifiableMap(
-                    carZoneSetsToFanSpeedLevelValues);
+        public Builder(@NonNull Map<Set<CarZone>, Pair<Integer, Integer>>
+                carZoneSetsToFanSpeedLevelRanges) {
+            mCarZoneSetsToFanSpeedLevelRanges = Collections.unmodifiableMap(
+                    carZoneSetsToFanSpeedLevelRanges);
         }
 
         /** Create a FanSpeedLevelProfile. */
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/climate/HvacAcProfile.java b/car/app/app/src/main/java/androidx/car/app/hardware/climate/HvacAcProfile.java
index 75e9a8c..5ac99e0 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/climate/HvacAcProfile.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/climate/HvacAcProfile.java
@@ -25,8 +25,7 @@
 
 /**
  * Container class for information about the {@link
- * ClimateProfileRequest#FEATURE_HVAC_AC} feature such as feature Id and supported
- * values for the feature.
+ * ClimateProfileRequest#FEATURE_HVAC_AC} feature such as supported values for the feature.
  */
 @ExperimentalCarApi
 public final class HvacAcProfile {
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/climate/HvacAutoModeProfile.java b/car/app/app/src/main/java/androidx/car/app/hardware/climate/HvacAutoModeProfile.java
index 37701aa..7af8f31 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/climate/HvacAutoModeProfile.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/climate/HvacAutoModeProfile.java
@@ -25,8 +25,7 @@
 
 /**
  * Container class for information about the {@link
- * ClimateProfileRequest#FEATURE_HVAC_AUTO_MODE} feature such as feature Id and supported
- * values for the feature.
+ * ClimateProfileRequest#FEATURE_HVAC_AUTO_MODE} feature such as supported values for the feature.
  */
 @ExperimentalCarApi
 public final class HvacAutoModeProfile {
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/climate/HvacAutoRecirculationProfile.java b/car/app/app/src/main/java/androidx/car/app/hardware/climate/HvacAutoRecirculationProfile.java
index c38c55d..1ca3a06 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/climate/HvacAutoRecirculationProfile.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/climate/HvacAutoRecirculationProfile.java
@@ -25,8 +25,8 @@
 
 /**
  * Container class for information about the {@link
- * ClimateProfileRequest#FEATURE_HVAC_AUTO_RECIRCULATION} feature such as feature Id and supported
- * values for the feature.
+ * ClimateProfileRequest#FEATURE_HVAC_AUTO_RECIRCULATION} feature such as supported values for
+ * the feature.
  */
 @ExperimentalCarApi
 public final class HvacAutoRecirculationProfile{
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/climate/HvacDualModeProfile.java b/car/app/app/src/main/java/androidx/car/app/hardware/climate/HvacDualModeProfile.java
index add097f..1641467 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/climate/HvacDualModeProfile.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/climate/HvacDualModeProfile.java
@@ -25,8 +25,7 @@
 
 /**
  * Container class for information about the {@link
- * ClimateProfileRequest#FEATURE_HVAC_DUAL_MODE} feature such as feature Id and supported
- * values for the feature.
+ * ClimateProfileRequest#FEATURE_HVAC_DUAL_MODE} feature such as supported values for the feature.
  */
 @ExperimentalCarApi
 public final class HvacDualModeProfile {
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/climate/HvacMaxAcModeProfile.java b/car/app/app/src/main/java/androidx/car/app/hardware/climate/HvacMaxAcModeProfile.java
index f131678..421259c 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/climate/HvacMaxAcModeProfile.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/climate/HvacMaxAcModeProfile.java
@@ -25,8 +25,7 @@
 
 /**
  * Container class for information about the {@link
- * ClimateProfileRequest#FEATURE_HVAC_MAX_AC} feature such as feature Id and supported
- * values for the feature.
+ * ClimateProfileRequest#FEATURE_HVAC_MAX_AC} feature such as supported values for the feature.
  */
 @ExperimentalCarApi
 public final class HvacMaxAcModeProfile {
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/climate/HvacPowerProfile.java b/car/app/app/src/main/java/androidx/car/app/hardware/climate/HvacPowerProfile.java
index 59bdd8e..95c9291 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/climate/HvacPowerProfile.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/climate/HvacPowerProfile.java
@@ -25,8 +25,7 @@
 
 /**
  * Container class for information about the {@link
- * ClimateProfileRequest#FEATURE_HVAC_POWER} feature such as feature Id and supported
- * values for the feature.
+ * ClimateProfileRequest#FEATURE_HVAC_POWER} feature such as supported values for the feature.
  */
 @ExperimentalCarApi
 public final class HvacPowerProfile{
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/climate/HvacRecirculationProfile.java b/car/app/app/src/main/java/androidx/car/app/hardware/climate/HvacRecirculationProfile.java
index 60cc28b..2ce49be 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/climate/HvacRecirculationProfile.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/climate/HvacRecirculationProfile.java
@@ -25,8 +25,8 @@
 
 /**
  * Container class for information about the {@link
- * ClimateProfileRequest#FEATURE_HVAC_RECIRCULATION} feature such as feature Id and supported
- * values for the feature.
+ * ClimateProfileRequest#FEATURE_HVAC_RECIRCULATION} feature such as supported values for the
+ * feature.
  */
 @ExperimentalCarApi
 public final class HvacRecirculationProfile {
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/climate/MaxDefrosterProfile.java b/car/app/app/src/main/java/androidx/car/app/hardware/climate/MaxDefrosterProfile.java
index 728e0bd..d294423 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/climate/MaxDefrosterProfile.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/climate/MaxDefrosterProfile.java
@@ -25,8 +25,8 @@
 
 /**
  * Container class for information about the {@link
- * ClimateProfileRequest#FEATURE_HVAC_MAX_DEFROSTER} feature such as feature Id and supported
- * values for the feature.
+ * ClimateProfileRequest#FEATURE_HVAC_MAX_DEFROSTER} feature such as supported values for the
+ * feature.
  */
 @ExperimentalCarApi
 public final class MaxDefrosterProfile {
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/climate/SeatTemperatureProfile.java b/car/app/app/src/main/java/androidx/car/app/hardware/climate/SeatTemperatureProfile.java
index 779c95c..e87a9e6 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/climate/SeatTemperatureProfile.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/climate/SeatTemperatureProfile.java
@@ -16,33 +16,35 @@
 
 package androidx.car.app.hardware.climate;
 
+import android.util.Pair;
+
 import androidx.annotation.NonNull;
 import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.hardware.common.CarZone;
 
 import java.util.Collections;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 /**
  * Container class for information about the {@link
- * ClimateProfileRequest#FEATURE_SEAT_TEMPERATURE_LEVEL} feature such as feature Id and supported
+ * ClimateProfileRequest#FEATURE_SEAT_TEMPERATURE_LEVEL} feature such as supported min/max range
  * values for the feature.
  */
 @ExperimentalCarApi
 public final class SeatTemperatureProfile {
 
     @NonNull
-    private final Map<Set<CarZone>, List<Integer>> mCarZoneSetsToSeatTemperatureValues;
+    private final Map<Set<CarZone>, Pair<Integer, Integer>> mCarZoneSetsToSeatTemperatureValues;
 
     /**
-     * Returns a list of supported values for the feature mapped to the set of car zones.
+     * Returns a list of supported min/max range values for the feature mapped to the set of car
+     * zones.
      *
      * <p>The values that can be regulated together for a set of car zones are combined together.
      */
     @NonNull
-    public Map<Set<CarZone>, List<Integer>> getCarZoneSetsToSeatTemperatureValues() {
+    public Map<Set<CarZone>, Pair<Integer, Integer>> getCarZoneSetsToSeatTemperatureValues() {
         return mCarZoneSetsToSeatTemperatureValues;
     }
 
@@ -53,16 +55,24 @@
 
     /** A builder for SeatTemperatureProfile. */
     public static final class Builder {
-        Map<Set<CarZone>, List<Integer>> mCarZoneSetsToSeatTemperatureValues;
+        Map<Set<CarZone>, Pair<Integer, Integer>> mCarZoneSetsToSeatTemperatureValues;
 
         /**
          * Creates an instance of builder.
          *
-         * @param carZoneSetsToSeatTemperatureValues   map of possible values for the property
+         * @param carZoneSetsToSeatTemperatureValues   map of min/max range values for the property
          *                                             corresponding to the set of car zones.
+         *                                             Min/max range defines the allowable range
+         *                                             and number of steps in each direction. The
+         *                                             values are not in any specific units, they
+         *                                             represent seat temperature setting instead.
+         *                                             Negative values indicate cooling.
+         *                                             0 indicates off.
+         *                                             Positive values indicate heating.
          */
         public Builder(
-                @NonNull Map<Set<CarZone>, List<Integer>> carZoneSetsToSeatTemperatureValues) {
+                @NonNull Map<Set<CarZone>, Pair<Integer, Integer>>
+                        carZoneSetsToSeatTemperatureValues) {
             mCarZoneSetsToSeatTemperatureValues = Collections.unmodifiableMap(
                     carZoneSetsToSeatTemperatureValues);
         }
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/climate/SeatVentilationProfile.java b/car/app/app/src/main/java/androidx/car/app/hardware/climate/SeatVentilationProfile.java
index 77b2f65f..4a8675f 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/climate/SeatVentilationProfile.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/climate/SeatVentilationProfile.java
@@ -16,33 +16,35 @@
 
 package androidx.car.app.hardware.climate;
 
+import android.util.Pair;
+
 import androidx.annotation.NonNull;
 import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.hardware.common.CarZone;
 
 import java.util.Collections;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 /**
  * Container class for information about the {@link
- * ClimateProfileRequest#FEATURE_SEAT_VENTILATION_LEVEL} feature such as feature Id and supported
+ * ClimateProfileRequest#FEATURE_SEAT_VENTILATION_LEVEL} feature such as supported min/max range
  * values for the feature.
  */
 @ExperimentalCarApi
 public final class SeatVentilationProfile {
 
     @NonNull
-    private final Map<Set<CarZone>, List<Integer>> mCarZoneSetsToSeatVentilationValues;
+    private final Map<Set<CarZone>, Pair<Integer, Integer>> mCarZoneSetsToSeatVentilationValues;
 
     /**
-     * Returns a list of supported values for the feature mapped to the set of car zones.
+     * Returns a list of supported min/max range values for the feature mapped to the set of car
+     * zones.
      *
      * <p>The values that can be regulated together for a set of car zones are combined together.
      */
     @NonNull
-    public Map<Set<CarZone>, List<Integer>> getCarZoneSetsToSeatVentilationValues() {
+    public Map<Set<CarZone>, Pair<Integer, Integer>> getCarZoneSetsToSeatVentilationValues() {
         return mCarZoneSetsToSeatVentilationValues;
     }
 
@@ -53,16 +55,23 @@
 
     /** A builder for SeatVentilationProfile. */
     public static final class Builder {
-        Map<Set<CarZone>, List<Integer>> mCarZoneSetsToSeatVentilationValues;
+        Map<Set<CarZone>, Pair<Integer, Integer>> mCarZoneSetsToSeatVentilationValues;
 
         /**
          * Creates an instance of builder.
          *
-         * @param carZoneSetsToSeatVentilationValues   map of possible values for the property
+         * @param carZoneSetsToSeatVentilationValues   map of min/max range values for the property
          *                                             corresponding to the set of car zones.
+         *                                             Min/max values represent seat ventilation
+         *                                             levels that are not defined in a specific
+         *                                             unit but instead as settings for the levels.
+         *                                             The min value is always 0 and
+         *                                             indicates off.
+         *                                             Positive values indicates ventilation level.
          */
         public Builder(
-                @NonNull Map<Set<CarZone>, List<Integer>> carZoneSetsToSeatVentilationValues) {
+                @NonNull Map<Set<CarZone>, Pair<Integer, Integer>>
+                        carZoneSetsToSeatVentilationValues) {
             mCarZoneSetsToSeatVentilationValues = Collections.unmodifiableMap(
                     carZoneSetsToSeatVentilationValues);
         }
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/climate/SteeringWheelHeatProfile.java b/car/app/app/src/main/java/androidx/car/app/hardware/climate/SteeringWheelHeatProfile.java
index 90f2389..d78d3be 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/climate/SteeringWheelHeatProfile.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/climate/SteeringWheelHeatProfile.java
@@ -16,33 +16,35 @@
 
 package androidx.car.app.hardware.climate;
 
+import android.util.Pair;
+
 import androidx.annotation.NonNull;
 import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.hardware.common.CarZone;
 
 import java.util.Collections;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 /**
  * Container class for information about the {@link
- * ClimateProfileRequest#FEATURE_STEERING_WHEEL_HEAT} feature such as feature Id and supported
+ * ClimateProfileRequest#FEATURE_STEERING_WHEEL_HEAT} feature such as supported min/max range
  * values for the feature.
  */
 @ExperimentalCarApi
 public final class SteeringWheelHeatProfile {
 
     @NonNull
-    private final Map<Set<CarZone>, List<Integer>> mCarZoneSetsToSteeringWheelHeatValues;
+    private final Map<Set<CarZone>, Pair<Integer, Integer>> mCarZoneSetsToSteeringWheelHeatValues;
 
     /**
-     * Returns a list of supported values for the feature mapped to the set of car zones.
+     * Returns a list of supported min/max range values for the feature mapped to the set of car
+     * zones.
      *
      * <p>The values that can be regulated together for a set of car zones are combined together.
      */
     @NonNull
-    public Map<Set<CarZone>, List<Integer>> getCarZoneSetsToSteeringWheelHeatValues() {
+    public Map<Set<CarZone>, Pair<Integer, Integer>> getCarZoneSetsToSteeringWheelHeatValues() {
         return mCarZoneSetsToSteeringWheelHeatValues;
     }
 
@@ -53,16 +55,26 @@
 
     /** A builder for SteeringWheelHeatProfile. */
     public static final class Builder {
-        Map<Set<CarZone>, List<Integer>> mCarZoneSetsToSteeringWheelHeatValues;
+        Map<Set<CarZone>, Pair<Integer, Integer>> mCarZoneSetsToSteeringWheelHeatValues;
 
         /**
          * Creates an instance of builder.
          *
-         * @param carZoneSetsToSteeringWheelHeatValues   map of possible values for the property
-         *                                               corresponding to the set of car zones.
+         * @param carZoneSetsToSteeringWheelHeatValues   map of min/max range values for the
+         *                                               property corresponding to the set of car
+         *                                               zones.
+         *                                               Min/max values indicate heating or
+         *                                               cooling for the steering wheel. The
+         *                                               values are not in any specific units,
+         *                                               they represent steering wheel heat setting
+         *                                               modes instead.
+         *                                               0 indicates temperature control is off.
+         *                                               Negative value indicates cooling.
+         *                                               Positive value indicates heating.
          */
         public Builder(
-                @NonNull Map<Set<CarZone>, List<Integer>> carZoneSetsToSteeringWheelHeatValues) {
+                @NonNull Map<Set<CarZone>, Pair<Integer, Integer>>
+                        carZoneSetsToSteeringWheelHeatValues) {
             mCarZoneSetsToSteeringWheelHeatValues = Collections.unmodifiableMap(
                     carZoneSetsToSteeringWheelHeatValues);
         }
diff --git a/car/app/app/src/main/java/androidx/car/app/model/Row.java b/car/app/app/src/main/java/androidx/car/app/model/Row.java
index 6c1c1ca..09805cc 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/Row.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/Row.java
@@ -52,6 +52,9 @@
     /** A boat that belongs to you. */
     private static final String YOUR_BOAT = "\uD83D\uDEA3"; // 🚣
 
+    /** An integer value indicating no decoration should be shown. */
+    public static final int NO_DECORATION = -1;
+
     /**
      * The type of images supported within rows.
      *
@@ -106,8 +109,7 @@
     @Keep
     private final List<Action> mActions;
     @Keep
-    @Nullable
-    private final CarIcon mDecoration;
+    private final int mDecoration;
     @Keep
     @Nullable
     private final Toggle mToggle;
@@ -171,13 +173,15 @@
     }
 
     /**
-     * Returns the decoration to display the end of the row, but before any actions or {@code null}
-     * if the row does not contain a decoration
+     * Returns the numeric decoration.
      *
-     * @see Builder#setDecoration(CarIcon)
+     * <p> Numeric decorations are displayed at the end of the row, but before any actions.
+     *
+     * <p> {@link Row#NO_DECORATION} will be returned if the row does not contain a decoration.
+     *
+     * @see Builder#setNumericDecoration(int)
      */
-    @Nullable
-    public CarIcon getDecoration() {
+    public int getNumericDecoration() {
         return mDecoration;
     }
 
@@ -321,7 +325,7 @@
         mTexts = Collections.emptyList();
         mImage = null;
         mActions = Collections.emptyList();
-        mDecoration = null;
+        mDecoration = NO_DECORATION;
         mToggle = null;
         mOnClickDelegate = null;
         mMetadata = EMPTY_METADATA;
@@ -339,8 +343,7 @@
         @Nullable
         CarIcon mImage;
         final List<Action> mActions = new ArrayList<>();
-        @Nullable
-        CarIcon mDecoration;
+        int mDecoration;
         @Nullable
         Toggle mToggle;
         @Nullable
@@ -540,15 +543,30 @@
         }
 
         /**
-         * Sets a decoration the end of the row, but before any actions with the default size
-         * {@link #IMAGE_TYPE_SMALL}.
+         * Sets a numeric decoration to display in the row.
          *
-         * @param decoration the {@link CarIcon} to display
-         * @throws NullPointerException if {@code decoration} is {@code null}
+         * <p> Numeric decorations are displayed at the end of the row, but before any actions.
+         *
+         * <p> Numeric decorations typically represent a quantity of unseen content. For example, a
+         * decoration might represent a number of missed notifications, or a number of unread
+         * messages in a conversation.
+         *
+         * @param decoration the {@code int} to display. Must be positive, zero, or equal to
+         * {@link Row#NO_DECORATION}.
+         * @throws IllegalArgumentException if {@code decoration} is invalid
          */
         @NonNull
-        public Builder setDecoration(@NonNull CarIcon decoration) {
-            CarIconConstraints.UNCONSTRAINED.validateOrThrow(requireNonNull(decoration));
+        public Builder setNumericDecoration(int decoration) {
+            if (decoration < 0 && decoration != NO_DECORATION) {
+                throw new IllegalArgumentException(
+                        String.format(
+                                "Decoration should be positive, zero, or equal to NO_DECORATION. "
+                                        + "Instead, was %d",
+                                decoration
+                        )
+                );
+            }
+
             mDecoration = decoration;
             return this;
         }
diff --git a/car/app/app/src/main/java/androidx/car/app/notification/CarNotificationManager.java b/car/app/app/src/main/java/androidx/car/app/notification/CarNotificationManager.java
index 2a9c643..840a3d7 100644
--- a/car/app/app/src/main/java/androidx/car/app/notification/CarNotificationManager.java
+++ b/car/app/app/src/main/java/androidx/car/app/notification/CarNotificationManager.java
@@ -406,6 +406,7 @@
     @VisibleForTesting
     @ColorInt
     @Nullable
+    @SuppressWarnings("deprecation") // getColor(int id)
     Integer getColorInt(CarColor carColor) {
         boolean isDarkMode =
                 (mContext.getResources().getConfiguration().uiMode
@@ -420,13 +421,13 @@
             case TYPE_SECONDARY:
                 return isDarkMode ? mSecondaryColorDark : mSecondaryColor;
             case TYPE_RED:
-                return mContext.getColor(R.color.carColorRed);
+                return mContext.getResources().getColor(R.color.carColorRed);
             case TYPE_GREEN:
-                return mContext.getColor(R.color.carColorGreen);
+                return mContext.getResources().getColor(R.color.carColorGreen);
             case TYPE_BLUE:
-                return mContext.getColor(R.color.carColorBlue);
+                return mContext.getResources().getColor(R.color.carColorBlue);
             case TYPE_YELLOW:
-                return mContext.getColor(R.color.carColorYellow);
+                return mContext.getResources().getColor(R.color.carColorYellow);
             case TYPE_DEFAULT:
             default:
                 return null;
diff --git a/car/app/app/src/main/java/androidx/car/app/versioning/CarAppApiLevel.java b/car/app/app/src/main/java/androidx/car/app/versioning/CarAppApiLevel.java
index 4679c0a..9e09fd7 100644
--- a/car/app/app/src/main/java/androidx/car/app/versioning/CarAppApiLevel.java
+++ b/car/app/app/src/main/java/androidx/car/app/versioning/CarAppApiLevel.java
@@ -24,8 +24,14 @@
 
 /** @hide */
 @RestrictTo(RestrictTo.Scope.LIBRARY)
-@IntDef(value = {CarAppApiLevels.UNKNOWN, CarAppApiLevels.LEVEL_1, CarAppApiLevels.LEVEL_2,
-        CarAppApiLevels.LEVEL_3, CarAppApiLevels.LEVEL_4, CarAppApiLevels.LEVEL_5})
+@IntDef(value = {
+        CarAppApiLevels.UNKNOWN,
+        CarAppApiLevels.LEVEL_1,
+        CarAppApiLevels.LEVEL_2,
+        CarAppApiLevels.LEVEL_3,
+        CarAppApiLevels.LEVEL_4,
+        CarAppApiLevels.LEVEL_5,
+        CarAppApiLevels.LEVEL_6})
 @Retention(RetentionPolicy.SOURCE)
 public @interface CarAppApiLevel {
 }
diff --git a/car/app/app/src/main/java/androidx/car/app/versioning/CarAppApiLevels.java b/car/app/app/src/main/java/androidx/car/app/versioning/CarAppApiLevels.java
index b5e9666..11cee22 100644
--- a/car/app/app/src/main/java/androidx/car/app/versioning/CarAppApiLevels.java
+++ b/car/app/app/src/main/java/androidx/car/app/versioning/CarAppApiLevels.java
@@ -37,6 +37,12 @@
  */
 public final class CarAppApiLevels {
     /**
+     * API level 6.
+     */
+    @CarAppApiLevel
+    public static final int LEVEL_6 = 6;
+
+    /**
      * API level 5.
      *
      * <p>Includes features such as voice access, alerters, map-pane template details view,
@@ -128,7 +134,7 @@
 
 
             int apiLevel = Integer.parseInt(line);
-            if (apiLevel < LEVEL_1 || apiLevel > LEVEL_5) {
+            if (apiLevel < LEVEL_1 || apiLevel > LEVEL_6) {
                 throw new IllegalStateException("Unrecognized Car API level: " + line);
             }
             return apiLevel;
diff --git a/car/app/app/src/test/java/androidx/car/app/AppManagerTest.java b/car/app/app/src/test/java/androidx/car/app/AppManagerTest.java
index 787a928..dea3532 100644
--- a/car/app/app/src/test/java/androidx/car/app/AppManagerTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/AppManagerTest.java
@@ -23,6 +23,7 @@
 import static org.mockito.ArgumentMatchers.anyFloat;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
@@ -521,7 +522,7 @@
 
         mAppManager.getIInterface().startLocationUpdates(mMockOnDoneCallback);
 
-        verify(mMockOnDoneCallback).onFailure(any());
+        verify(mMockOnDoneCallback, atLeastOnce()).onFailure(any());
     }
 
     @Test
diff --git a/car/app/app/src/test/java/androidx/car/app/CarAppPermissionActivityTest.java b/car/app/app/src/test/java/androidx/car/app/CarAppPermissionActivityTest.java
index f70bd7f8..3ef8603 100644
--- a/car/app/app/src/test/java/androidx/car/app/CarAppPermissionActivityTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/CarAppPermissionActivityTest.java
@@ -37,6 +37,7 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
 import org.robolectric.annotation.internal.DoNotInstrument;
 import org.robolectric.shadows.ShadowActivity;
 
@@ -51,7 +52,7 @@
     @Mock
     private OnRequestPermissionsListener mMockListener;
 
-    private final List<String> mPermisssionsRequested = new ArrayList<>();
+    private final List<String> mPermissionsRequested = new ArrayList<>();
 
     private ActivityScenario<CarAppPermissionActivity> mActivity;
     private Application mApplication;
@@ -61,11 +62,12 @@
         MockitoAnnotations.initMocks(this);
         mApplication = ApplicationProvider.getApplicationContext();
 
-        mPermisssionsRequested.add("foo");
-        mPermisssionsRequested.add("bar");
+        mPermissionsRequested.add("foo");
+        mPermissionsRequested.add("bar");
     }
 
     @Test
+    @Config(sdk = 23) // Note that while the app module minSDK is 21, the minSDK for hosts is 23
     public void onCreate_requestPermissionAction_requestsPermissions() {
         setupActivity(CarContext.REQUEST_PERMISSIONS_ACTION);
 
@@ -73,7 +75,7 @@
             ShadowActivity shadowActivity = shadowOf(activity);
             ShadowActivity.PermissionsRequest request = shadowActivity.getLastRequestedPermission();
             assertThat(request.requestedPermissions).isEqualTo(
-                    mPermisssionsRequested.toArray(new String[0]));
+                    mPermissionsRequested.toArray(new String[0]));
         });
     }
 
@@ -87,7 +89,7 @@
     private Intent createLaunchIntent(String action) {
         Bundle extras = new Bundle(2);
         extras.putStringArray(CarContext.EXTRA_PERMISSIONS_KEY,
-                mPermisssionsRequested.toArray(new String[0]));
+                mPermissionsRequested.toArray(new String[0]));
         extras.putBinder(CarContext.EXTRA_ON_REQUEST_PERMISSIONS_RESULT_LISTENER_KEY,
                 new IOnRequestPermissionsListener.Stub() {
                     @SuppressWarnings("unckecked")
diff --git a/car/app/app/src/test/java/androidx/car/app/CarContextTest.java b/car/app/app/src/test/java/androidx/car/app/CarContextTest.java
index bb49c17..f3e6583 100644
--- a/car/app/app/src/test/java/androidx/car/app/CarContextTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/CarContextTest.java
@@ -345,8 +345,8 @@
 
         Context applicationContext = mCarContext.getApplicationContext();
 
-        VirtualDisplay display = applicationContext.getSystemService(
-                DisplayManager.class).createVirtualDisplay("CarAppService",
+        VirtualDisplay display = ((DisplayManager) applicationContext.getSystemService(
+                Context.DISPLAY_SERVICE)).createVirtualDisplay("CarAppService",
                 mdpiConfig.screenWidthDp, mdpiConfig.screenHeightDp, 5, null,
                 VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY);
         DisplayMetrics newDisplayMetrics = new DisplayMetrics();
diff --git a/car/app/app/src/test/java/androidx/car/app/SessionInfoIntentEncoderTest.java b/car/app/app/src/test/java/androidx/car/app/SessionInfoIntentEncoderTest.java
index cc5079d..17fe0d3 100644
--- a/car/app/app/src/test/java/androidx/car/app/SessionInfoIntentEncoderTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/SessionInfoIntentEncoderTest.java
@@ -33,7 +33,7 @@
 @RunWith(RobolectricTestRunner.class)
 @DoNotInstrument
 public class SessionInfoIntentEncoderTest {
-    private static final String EXTRA_SESSION_INFO = "androidx.car.app.extra.SESSION_INFO";
+    private static final String EXTRA_SESSION_INFO = "androidx.car.app.extra.SESSION_INFO_BUNDLE";
 
     @Test
     public void encode_insertsExtra() {
@@ -41,7 +41,7 @@
 
         SessionInfoIntentEncoder.encode(DEFAULT_SESSION_INFO, intent);
 
-        assertThat(intent.hasExtra(EXTRA_SESSION_INFO));
+        assertThat(intent.hasExtra(EXTRA_SESSION_INFO)).isTrue();
     }
 
     @Test
diff --git a/car/app/app/src/test/java/androidx/car/app/SessionInfoTest.java b/car/app/app/src/test/java/androidx/car/app/SessionInfoTest.java
index ce54864..d4114f5 100644
--- a/car/app/app/src/test/java/androidx/car/app/SessionInfoTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/SessionInfoTest.java
@@ -13,7 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package androidx.car.app;
 
 import static androidx.car.app.SessionInfo.DISPLAY_TYPE_CLUSTER;
@@ -49,7 +48,7 @@
         SessionInfo sessionInfo = new SessionInfo(DISPLAY_TYPE_MAIN, TEST_SESSION_ID);
 
         Set<Class<? extends Template>> result =
-                sessionInfo.getSupportedTemplates(CarAppApiLevels.LEVEL_5);
+                sessionInfo.getSupportedTemplates(CarAppApiLevels.LEVEL_6);
 
         assertThat(result).isNull();
     }
@@ -60,18 +59,18 @@
                 new SessionInfo(DISPLAY_TYPE_CLUSTER, TEST_SESSION_ID);
 
         Set<Class<? extends Template>> result =
-                sessionInfo.getSupportedTemplates(CarAppApiLevels.LEVEL_5);
+                sessionInfo.getSupportedTemplates(CarAppApiLevels.LEVEL_6);
 
         assertThat(result).isNotEmpty();
     }
 
     @Test
-    public void getSupportedTemplates_displayTypeCluster_apiLessThan5() {
+    public void getSupportedTemplates_displayTypeCluster_apiLessThan6() {
         SessionInfo sessionInfo =
                 new SessionInfo(DISPLAY_TYPE_CLUSTER, TEST_SESSION_ID);
 
         Set<Class<? extends Template>> result =
-                sessionInfo.getSupportedTemplates(CarAppApiLevels.LEVEL_4);
+                sessionInfo.getSupportedTemplates(CarAppApiLevels.LEVEL_5);
 
         assertThat(result).isEmpty();
     }
diff --git a/car/app/app/src/test/java/androidx/car/app/model/RowTest.java b/car/app/app/src/test/java/androidx/car/app/model/RowTest.java
index 040558c4..c745f1a 100644
--- a/car/app/app/src/test/java/androidx/car/app/model/RowTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/model/RowTest.java
@@ -132,11 +132,35 @@
     }
 
     @Test
-    public void setDecoration() {
-        CarIcon decoration = TestUtils.getTestCarIcon(ApplicationProvider.getApplicationContext(),
-                "ic_test_1");
-        Row row = new Row.Builder().setTitle("Title").setDecoration(decoration).build();
-        assertThat(decoration).isEqualTo(row.getDecoration());
+    public void setDecoration_positiveValue() {
+        int decoration = 5;
+        Row row = new Row.Builder().setTitle("Title").setNumericDecoration(decoration).build();
+        assertThat(decoration).isEqualTo(row.getNumericDecoration());
+    }
+
+    @Test
+    public void setDecoration_zero() {
+        int decoration = 0;
+        Row row = new Row.Builder().setTitle("Title").setNumericDecoration(decoration).build();
+        assertThat(decoration).isEqualTo(row.getNumericDecoration());
+    }
+
+    @Test
+    public void setDecoration_noDecoration() {
+        int decoration = Row.NO_DECORATION;
+        Row row = new Row.Builder().setTitle("Title").setNumericDecoration(decoration).build();
+        assertThat(decoration).isEqualTo(row.getNumericDecoration());
+    }
+
+    @Test
+    public void setDecoration_negative_throws() {
+        int decoration = -123;
+        Row.Builder rowBuilder =
+                new Row.Builder().setTitle("Title");
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> rowBuilder.setNumericDecoration(decoration)
+        );
     }
 
     @Test
diff --git a/car/app/app/src/test/java/androidx/car/app/notification/CarAppExtenderTest.java b/car/app/app/src/test/java/androidx/car/app/notification/CarAppExtenderTest.java
index fa6020b..7d59e0c 100644
--- a/car/app/app/src/test/java/androidx/car/app/notification/CarAppExtenderTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/notification/CarAppExtenderTest.java
@@ -49,7 +49,6 @@
             "androidx.car.app.INTENT_PRIMARY_ACTION";
     private static final String INTENT_SECONDARY_ACTION =
             "androidx.car.app.INTENT_SECONDARY_ACTION";
-
     private final Context mContext = ApplicationProvider.getApplicationContext();
 
     @Test
@@ -183,6 +182,7 @@
     }
 
     @Test
+    @SuppressWarnings("deprecation") // Action.icon
     public void notification_extended_addActions() {
         int icon1 = TestUtils.getTestDrawableResId(mContext, "ic_test_1");
         CharSequence title1 = "FirstAction";
@@ -206,10 +206,10 @@
 
         List<Action> actions = new CarAppExtender(builder.build()).getActions();
         assertThat(actions).hasSize(2);
-        assertThat(actions.get(0).getIcon().getResId()).isEqualTo(icon1);
+        assertThat(actions.get(0).icon).isEqualTo(icon1);
         assertThat(title1.toString().contentEquals(actions.get(0).title)).isTrue();
         assertThat(actions.get(0).actionIntent).isEqualTo(actionIntent1);
-        assertThat(actions.get(1).getIcon().getResId()).isEqualTo(icon2);
+        assertThat(actions.get(1).icon).isEqualTo(icon2);
         assertThat(title2.toString().contentEquals(actions.get(1).title)).isTrue();
         assertThat(actions.get(1).actionIntent).isEqualTo(actionIntent2);
     }
diff --git a/car/app/app/src/test/java/androidx/car/app/notification/CarNotificationManagerTest.java b/car/app/app/src/test/java/androidx/car/app/notification/CarNotificationManagerTest.java
index 46ae9a4..9777279 100644
--- a/car/app/app/src/test/java/androidx/car/app/notification/CarNotificationManagerTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/notification/CarNotificationManagerTest.java
@@ -110,7 +110,7 @@
                 EXTENDED_TEXT);
         assertThat(changed.contentIntent).isSameInstanceAs(mExtendedPendingIntent);
         assertThat(changed.deleteIntent).isSameInstanceAs(mExtendedPendingIntent);
-        assertThat(changed.color).isEqualTo(mContext.getColor(R.color.carColorBlue));
+        assertThat(changed.color).isEqualTo(mContext.getResources().getColor(R.color.carColorBlue));
         assertThat(changed.getChannelId()).isEqualTo(EXTENDED_CHANNEL);
         assertThat(changed.icon).isEqualTo(mExtendedIcon);
         // Comparing the largeIcon does not work due to internally it creating another Bitmap and
@@ -180,55 +180,63 @@
     }
 
     @Test
+    @SuppressWarnings("deprecation") // getColor(int id)
     public void getColorInt_red() {
         assertThat(mCarNotificationManager.getColorInt(CarColor.RED)).isEqualTo(
-                mContext.getColor(R.color.carColorRed));
+                mContext.getResources().getColor(R.color.carColorRed));
     }
 
     @Test
+    @SuppressWarnings("deprecation") // getColor(int id)
     public void getColorInt_red_dark() {
         setDarkMode();
         assertThat(mCarNotificationManager.getColorInt(CarColor.RED)).isEqualTo(
-                mContext.getColor(R.color.carColorRed));
+                mContext.getResources().getColor(R.color.carColorRed));
     }
 
     @Test
+    @SuppressWarnings("deprecation") // getColor(int id)
     public void getColorInt_blue() {
         assertThat(mCarNotificationManager.getColorInt(CarColor.BLUE)).isEqualTo(
-                mContext.getColor(R.color.carColorBlue));
+                mContext.getResources().getColor(R.color.carColorBlue));
     }
 
     @Test
+    @SuppressWarnings("deprecation") // getColor(int id)
     public void getColorInt_blue_dark() {
         setDarkMode();
         assertThat(mCarNotificationManager.getColorInt(CarColor.BLUE)).isEqualTo(
-                mContext.getColor(R.color.carColorBlue));
+                mContext.getResources().getColor(R.color.carColorBlue));
     }
 
     @Test
+    @SuppressWarnings("deprecation") // getColor(int id)
     public void getColorInt_green() {
         assertThat(mCarNotificationManager.getColorInt(CarColor.GREEN)).isEqualTo(
-                mContext.getColor(R.color.carColorGreen));
+                mContext.getResources().getColor(R.color.carColorGreen));
     }
 
     @Test
+    @SuppressWarnings("deprecation") // getColor(int id)
     public void getColorInt_green_dark() {
         setDarkMode();
         assertThat(mCarNotificationManager.getColorInt(CarColor.GREEN)).isEqualTo(
-                mContext.getColor(R.color.carColorGreen));
+                mContext.getResources().getColor(R.color.carColorGreen));
     }
 
     @Test
+    @SuppressWarnings("deprecation") // getColor(int id)
     public void getColorInt_yellow() {
         assertThat(mCarNotificationManager.getColorInt(CarColor.YELLOW)).isEqualTo(
-                mContext.getColor(R.color.carColorYellow));
+                mContext.getResources().getColor(R.color.carColorYellow));
     }
 
     @Test
+    @SuppressWarnings("deprecation") // getColor(int id)
     public void getColorInt_yellow_dark() {
         setDarkMode();
         assertThat(mCarNotificationManager.getColorInt(CarColor.YELLOW)).isEqualTo(
-                mContext.getColor(R.color.carColorYellow));
+                mContext.getResources().getColor(R.color.carColorYellow));
     }
 
     @Test
diff --git a/car/app/app/src/test/java/androidx/car/app/serialization/BundlerTest.java b/car/app/app/src/test/java/androidx/car/app/serialization/BundlerTest.java
index a7915ef..006cc0e 100644
--- a/car/app/app/src/test/java/androidx/car/app/serialization/BundlerTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/serialization/BundlerTest.java
@@ -324,7 +324,7 @@
             assertThat(
                     new CarIcon.Builder((IconCompat) Bundler.fromBundle(bundle)).build()).isEqualTo(
                     new CarIcon.Builder(image).build());
-            Drawable drawable = readImage.toIcon(mContext).loadDrawable(mContext);
+            Drawable drawable = readImage.loadDrawable(mContext);
             assertThat(drawable).isNotNull();
         } finally {
             bitmap.recycle();
diff --git a/collection/collection/build.gradle b/collection/collection/build.gradle
index fa9b24f..8bd119ab 100644
--- a/collection/collection/build.gradle
+++ b/collection/collection/build.gradle
@@ -16,7 +16,6 @@
 
 
 import androidx.build.KmpPlatformsKt
-import androidx.build.Publish
 import androidx.build.LibraryType
 import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
 import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
@@ -27,7 +26,8 @@
     id("AndroidXPlugin")
 }
 
-def enableNative = KmpPlatformsKt.enableNative(project)
+def macEnabled = KmpPlatformsKt.enableMac(project)
+def linuxEnabled = KmpPlatformsKt.enableLinux(project)
 
 androidXMultiplatform {
     jvm {
@@ -38,11 +38,17 @@
     ios()
 
     sourceSets {
+        all {
+            languageSettings.optIn("kotlin.RequiresOptIn")
+            languageSettings.optIn("kotlin.contracts.ExperimentalContracts")
+        }
+
         commonMain {
             dependencies {
                 api(libs.kotlinStdlib)
             }
         }
+
         commonTest {
             dependencies {
                 implementation(libs.kotlinTest)
@@ -51,51 +57,12 @@
             }
         }
 
-        if (enableNative) {
-            nativeMain {
-                dependsOn commonMain
-            }
-
-            nativeTest {
-                dependsOn commonTest
-            }
-
-            darwinMain {
-                dependsOn(nativeMain)
-            }
-            linuxMain {
-                dependsOn(nativeMain)
-            }
-        }
-
-        targets.all { target ->
-            if (target.platformType == KotlinPlatformType.native) {
-                target.compilations["main"].defaultSourceSet {
-                    if (target.konanTarget.family == Family.OSX ||
-                        target.konanTarget.family == Family.IOS) {
-                        dependsOn(darwinMain)
-                    } else if (target.konanTarget.family == Family.LINUX) {
-                        dependsOn(linuxMain)
-                    } else {
-                        throw new GradleException("unknown native target ${target}")
-                    }
-                }
-                target.compilations["test"].defaultSourceSet {
-                    dependsOn(nativeTest)
-                }
-            }
-        }
-        // Workaround for https://youtrack.jetbrains.com/issue/KT-51763
-        // Make sure commonization runs before any compilation task.
-        tasks.withType(KotlinNativeCompile).configureEach {
-            it.dependsOn(tasks.named("commonize"))
-        }
-
         jvmMain {
             dependencies {
                 api("androidx.annotation:annotation:1.3.0")
             }
         }
+
         jvmTest {
             dependencies {
                 implementation(libs.kotlinTestJunit)
@@ -104,9 +71,57 @@
             }
         }
 
-        all {
-            languageSettings.optIn("kotlin.RequiresOptIn")
-            languageSettings.optIn("kotlin.contracts.ExperimentalContracts")
+        if (macEnabled || linuxEnabled) {
+            nativeMain {
+                dependsOn(commonMain)
+            }
+
+            nativeTest {
+                dependsOn(commonTest)
+            }
+        }
+
+        if (macEnabled) {
+            darwinMain {
+                dependsOn(nativeMain)
+            }
+        }
+
+        if (linuxEnabled) {
+            linuxMain {
+                dependsOn(nativeMain)
+            }
+        }
+
+        targets.withType(KotlinNativeTarget.class) {
+            binaries.all {
+                binaryOptions["memoryModel"] = "experimental"
+            }
+        }
+
+        targets.all { target ->
+            if (target.platformType == KotlinPlatformType.native) {
+                target.compilations["main"].defaultSourceSet {
+                    def konanTargetFamily = target.konanTarget.family
+                    if (konanTargetFamily == Family.OSX || konanTargetFamily == Family.IOS) {
+                        dependsOn(darwinMain)
+                    } else if (konanTargetFamily == Family.LINUX) {
+                        dependsOn(linuxMain)
+                    } else {
+                        throw new GradleException("unknown native target ${target}")
+                    }
+                }
+
+                target.compilations["test"].defaultSourceSet {
+                    dependsOn(nativeTest)
+                }
+            }
+        }
+
+        // Workaround for https://youtrack.jetbrains.com/issue/KT-51763
+        // Make sure commonization runs before any compilation task.
+        tasks.withType(KotlinNativeCompile).configureEach {
+            it.dependsOn(tasks.named("commonize"))
         }
     }
 }
@@ -127,9 +142,3 @@
     inceptionYear = "2018"
     description = "Standalone efficient collections."
 }
-
-kotlin.targets.withType(KotlinNativeTarget.class) {
-    binaries.all {
-        binaryOptions["memoryModel"] = "experimental"
-    }
-}
diff --git a/compose/animation/animation-core/api/1.3.0-beta01.txt b/compose/animation/animation-core/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..a6d5503
--- /dev/null
+++ b/compose/animation/animation-core/api/1.3.0-beta01.txt
@@ -0,0 +1,763 @@
+// 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);
+    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);
+  }
+
+  public final class ComplexDoubleKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class CubicBezierEasing implements androidx.compose.animation.core.Easing {
+    ctor public CubicBezierEasing(float a, float b, float c, float d);
+    method public float transform(float fraction);
+  }
+
+  public final class DecayAnimation<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.Animation<T,V> {
+    ctor public DecayAnimation(androidx.compose.animation.core.VectorizedDecayAnimationSpec<V> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, V initialVelocityVector);
+    ctor public DecayAnimation(androidx.compose.animation.core.DecayAnimationSpec<T> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, V initialVelocityVector);
+    ctor public DecayAnimation(androidx.compose.animation.core.DecayAnimationSpec<T> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? initialVelocity);
+    method public long getDurationNanos();
+    method public T! getInitialValue();
+    method public V getInitialVelocityVector();
+    method public T! getTargetValue();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValueFromNanos(long playTimeNanos);
+    method public V getVelocityVectorFromNanos(long playTimeNanos);
+    method public boolean isInfinite();
+    property public long durationNanos;
+    property public final T! initialValue;
+    property public final V initialVelocityVector;
+    property public boolean isInfinite;
+    property public T! targetValue;
+    property public androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+  }
+
+  public interface DecayAnimationSpec<T> {
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedDecayAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter);
+  }
+
+  public final class DecayAnimationSpecKt {
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> T! calculateTargetValue(androidx.compose.animation.core.DecayAnimationSpec<T>, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? initialVelocity);
+    method public static float calculateTargetValue(androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float>, float initialValue, float initialVelocity);
+    method public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> exponentialDecay(optional float frictionMultiplier, optional float absVelocityThreshold);
+    method public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> generateDecayAnimationSpec(androidx.compose.animation.core.FloatDecayAnimationSpec);
+  }
+
+  public interface DurationBasedAnimationSpec<T> extends androidx.compose.animation.core.FiniteAnimationSpec<T> {
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+  }
+
+  @androidx.compose.runtime.Stable public fun interface Easing {
+    method public float transform(float fraction);
+  }
+
+  public final class 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 FloatDecayAnimationSpecKt {
+  }
+
+  public final class FloatExponentialDecaySpec implements androidx.compose.animation.core.FloatDecayAnimationSpec {
+    ctor public FloatExponentialDecaySpec(optional float frictionMultiplier, optional float absVelocityThreshold);
+    method public float getAbsVelocityThreshold();
+    method public long getDurationNanos(float initialValue, float initialVelocity);
+    method public float getTargetValue(float initialValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    property public float absVelocityThreshold;
+  }
+
+  public final class FloatSpringSpec implements androidx.compose.animation.core.FloatAnimationSpec {
+    ctor public FloatSpringSpec(optional float dampingRatio, optional float stiffness, optional float visibilityThreshold);
+    method public float getDampingRatio();
+    method public long getDurationNanos(float initialValue, float targetValue, float initialVelocity);
+    method public float getStiffness();
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    property public final float dampingRatio;
+    property public final float stiffness;
+  }
+
+  public final class FloatTweenSpec implements androidx.compose.animation.core.FloatAnimationSpec {
+    ctor public FloatTweenSpec(optional int duration, optional int delay, optional androidx.compose.animation.core.Easing easing);
+    method public int getDelay();
+    method public int getDuration();
+    method public long getDurationNanos(float initialValue, float targetValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    property public final int delay;
+    property public final int duration;
+  }
+
+  public final class InfiniteAnimationPolicyKt {
+    method public static suspend inline <R> Object? withInfiniteAnimationFrameMillis(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R>);
+    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 {
+  }
+
+  public final class InfiniteTransitionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Float> animateFloat(androidx.compose.animation.core.InfiniteTransition, float initialValue, float targetValue, androidx.compose.animation.core.InfiniteRepeatableSpec<java.lang.Float> animationSpec);
+    method @androidx.compose.runtime.Composable public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.runtime.State<T> animateValue(androidx.compose.animation.core.InfiniteTransition, T? initialValue, T? targetValue, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, androidx.compose.animation.core.InfiniteRepeatableSpec<T> animationSpec);
+    method @androidx.compose.runtime.Composable public static androidx.compose.animation.core.InfiniteTransition rememberInfiniteTransition();
+  }
+
+  @androidx.compose.runtime.Immutable public final class KeyframesSpec<T> implements androidx.compose.animation.core.DurationBasedAnimationSpec<T> {
+    ctor public KeyframesSpec(androidx.compose.animation.core.KeyframesSpec.KeyframesSpecConfig<T> config);
+    method public androidx.compose.animation.core.KeyframesSpec.KeyframesSpecConfig<T> getConfig();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedKeyframesSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final androidx.compose.animation.core.KeyframesSpec.KeyframesSpecConfig<T> config;
+  }
+
+  public static final class KeyframesSpec.KeyframeEntity<T> {
+  }
+
+  public static final class KeyframesSpec.KeyframesSpecConfig<T> {
+    ctor public KeyframesSpec.KeyframesSpecConfig();
+    method public infix androidx.compose.animation.core.KeyframesSpec.KeyframeEntity<T> at(T?, int timeStamp);
+    method public 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 {
+  }
+
+  public final class SpringSimulationKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class SpringSpec<T> implements androidx.compose.animation.core.FiniteAnimationSpec<T> {
+    ctor public SpringSpec(optional float dampingRatio, optional float stiffness, optional T? visibilityThreshold);
+    method public float getDampingRatio();
+    method public float getStiffness();
+    method public T? getVisibilityThreshold();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedSpringSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final float dampingRatio;
+    property public final float stiffness;
+    property public final T? visibilityThreshold;
+  }
+
+  @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 final class VectorizedAnimationSpecKt {
+  }
+
+  public interface VectorizedDecayAnimationSpec<V extends androidx.compose.animation.core.AnimationVector> {
+    method public float getAbsVelocityThreshold();
+    method public long getDurationNanos(V initialValue, V initialVelocity);
+    method public V getTargetValue(V initialValue, V initialVelocity);
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V initialVelocity);
+    property public abstract float absVelocityThreshold;
+  }
+
+  @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);
+  }
+
+}
+
+package androidx.compose.animation.core.internal {
+
+  public final class JvmDefaultWithCompatibility_jvmKt {
+  }
+
+}
+
diff --git a/compose/animation/animation-core/api/public_plus_experimental_1.3.0-beta01.txt b/compose/animation/animation-core/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..1fd90c0
--- /dev/null
+++ b/compose/animation/animation-core/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,770 @@
+// 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);
+    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);
+  }
+
+  public final class ComplexDoubleKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class CubicBezierEasing implements androidx.compose.animation.core.Easing {
+    ctor public CubicBezierEasing(float a, float b, float c, float d);
+    method public float transform(float fraction);
+  }
+
+  public final class DecayAnimation<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.Animation<T,V> {
+    ctor public DecayAnimation(androidx.compose.animation.core.VectorizedDecayAnimationSpec<V> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, V initialVelocityVector);
+    ctor public DecayAnimation(androidx.compose.animation.core.DecayAnimationSpec<T> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, V initialVelocityVector);
+    ctor public DecayAnimation(androidx.compose.animation.core.DecayAnimationSpec<T> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? initialVelocity);
+    method public long getDurationNanos();
+    method public T! getInitialValue();
+    method public V getInitialVelocityVector();
+    method public T! getTargetValue();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValueFromNanos(long playTimeNanos);
+    method public V getVelocityVectorFromNanos(long playTimeNanos);
+    method public boolean isInfinite();
+    property public long durationNanos;
+    property public final T! initialValue;
+    property public final V initialVelocityVector;
+    property public boolean isInfinite;
+    property public T! targetValue;
+    property public androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+  }
+
+  public interface DecayAnimationSpec<T> {
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedDecayAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter);
+  }
+
+  public final class DecayAnimationSpecKt {
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> T! calculateTargetValue(androidx.compose.animation.core.DecayAnimationSpec<T>, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? initialVelocity);
+    method public static float calculateTargetValue(androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float>, float initialValue, float initialVelocity);
+    method public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> exponentialDecay(optional float frictionMultiplier, optional float absVelocityThreshold);
+    method public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> generateDecayAnimationSpec(androidx.compose.animation.core.FloatDecayAnimationSpec);
+  }
+
+  public interface DurationBasedAnimationSpec<T> extends androidx.compose.animation.core.FiniteAnimationSpec<T> {
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+  }
+
+  @androidx.compose.runtime.Stable public fun interface Easing {
+    method public float transform(float fraction);
+  }
+
+  public final class 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.") 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 FloatDecayAnimationSpecKt {
+  }
+
+  public final class FloatExponentialDecaySpec implements androidx.compose.animation.core.FloatDecayAnimationSpec {
+    ctor public FloatExponentialDecaySpec(optional float frictionMultiplier, optional float absVelocityThreshold);
+    method public float getAbsVelocityThreshold();
+    method public long getDurationNanos(float initialValue, float initialVelocity);
+    method public float getTargetValue(float initialValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    property public float absVelocityThreshold;
+  }
+
+  public final class FloatSpringSpec implements androidx.compose.animation.core.FloatAnimationSpec {
+    ctor public FloatSpringSpec(optional float dampingRatio, optional float stiffness, optional float visibilityThreshold);
+    method public float getDampingRatio();
+    method public long getDurationNanos(float initialValue, float targetValue, float initialVelocity);
+    method public float getStiffness();
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    property public final float dampingRatio;
+    property public final float stiffness;
+  }
+
+  public final class FloatTweenSpec implements androidx.compose.animation.core.FloatAnimationSpec {
+    ctor public FloatTweenSpec(optional int duration, optional int delay, optional androidx.compose.animation.core.Easing easing);
+    method public int getDelay();
+    method public int getDuration();
+    method public long getDurationNanos(float initialValue, float targetValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    property public final int delay;
+    property public final int duration;
+  }
+
+  public final class InfiniteAnimationPolicyKt {
+    method public static suspend inline <R> Object? withInfiniteAnimationFrameMillis(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R>);
+    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 {
+  }
+
+  public final class InfiniteTransitionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Float> animateFloat(androidx.compose.animation.core.InfiniteTransition, float initialValue, float targetValue, androidx.compose.animation.core.InfiniteRepeatableSpec<java.lang.Float> animationSpec);
+    method @androidx.compose.runtime.Composable public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.runtime.State<T> animateValue(androidx.compose.animation.core.InfiniteTransition, T? initialValue, T? targetValue, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, androidx.compose.animation.core.InfiniteRepeatableSpec<T> animationSpec);
+    method @androidx.compose.runtime.Composable public static androidx.compose.animation.core.InfiniteTransition rememberInfiniteTransition();
+  }
+
+  @kotlin.RequiresOptIn(message="This API is internal to library.") @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.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 {
+  }
+
+  public final class SpringSimulationKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class SpringSpec<T> implements androidx.compose.animation.core.FiniteAnimationSpec<T> {
+    ctor public SpringSpec(optional float dampingRatio, optional float stiffness, optional T? visibilityThreshold);
+    method public float getDampingRatio();
+    method public float getStiffness();
+    method public T? getVisibilityThreshold();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedSpringSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final float dampingRatio;
+    property public final float stiffness;
+    property public final T? visibilityThreshold;
+  }
+
+  @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 final class VectorizedAnimationSpecKt {
+  }
+
+  public interface VectorizedDecayAnimationSpec<V extends androidx.compose.animation.core.AnimationVector> {
+    method public float getAbsVelocityThreshold();
+    method public long getDurationNanos(V initialValue, V initialVelocity);
+    method public V getTargetValue(V initialValue, V initialVelocity);
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V initialVelocity);
+    property public abstract float absVelocityThreshold;
+  }
+
+  @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);
+  }
+
+}
+
+package androidx.compose.animation.core.internal {
+
+  public final class JvmDefaultWithCompatibility_jvmKt {
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/compose/animation/animation-core/api/res-1.3.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/animation/animation-core/api/res-1.3.0-beta01.txt
diff --git a/compose/animation/animation-core/api/restricted_1.3.0-beta01.txt b/compose/animation/animation-core/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..e47f955
--- /dev/null
+++ b/compose/animation/animation-core/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,766 @@
+// 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);
+    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);
+  }
+
+  public final class ComplexDoubleKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class CubicBezierEasing implements androidx.compose.animation.core.Easing {
+    ctor public CubicBezierEasing(float a, float b, float c, float d);
+    method public float transform(float fraction);
+  }
+
+  public final class DecayAnimation<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.Animation<T,V> {
+    ctor public DecayAnimation(androidx.compose.animation.core.VectorizedDecayAnimationSpec<V> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, V initialVelocityVector);
+    ctor public DecayAnimation(androidx.compose.animation.core.DecayAnimationSpec<T> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, V initialVelocityVector);
+    ctor public DecayAnimation(androidx.compose.animation.core.DecayAnimationSpec<T> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? initialVelocity);
+    method public long getDurationNanos();
+    method public T! getInitialValue();
+    method public V getInitialVelocityVector();
+    method public T! getTargetValue();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValueFromNanos(long playTimeNanos);
+    method public V getVelocityVectorFromNanos(long playTimeNanos);
+    method public boolean isInfinite();
+    property public long durationNanos;
+    property public final T! initialValue;
+    property public final V initialVelocityVector;
+    property public boolean isInfinite;
+    property public T! targetValue;
+    property public androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+  }
+
+  public interface DecayAnimationSpec<T> {
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedDecayAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter);
+  }
+
+  public final class DecayAnimationSpecKt {
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> T! calculateTargetValue(androidx.compose.animation.core.DecayAnimationSpec<T>, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? initialVelocity);
+    method public static float calculateTargetValue(androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float>, float initialValue, float initialVelocity);
+    method public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> exponentialDecay(optional float frictionMultiplier, optional float absVelocityThreshold);
+    method public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> generateDecayAnimationSpec(androidx.compose.animation.core.FloatDecayAnimationSpec);
+  }
+
+  public interface DurationBasedAnimationSpec<T> extends androidx.compose.animation.core.FiniteAnimationSpec<T> {
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+  }
+
+  @androidx.compose.runtime.Stable public fun interface Easing {
+    method public float transform(float fraction);
+  }
+
+  public final class 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 FloatDecayAnimationSpecKt {
+  }
+
+  public final class FloatExponentialDecaySpec implements androidx.compose.animation.core.FloatDecayAnimationSpec {
+    ctor public FloatExponentialDecaySpec(optional float frictionMultiplier, optional float absVelocityThreshold);
+    method public float getAbsVelocityThreshold();
+    method public long getDurationNanos(float initialValue, float initialVelocity);
+    method public float getTargetValue(float initialValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    property public float absVelocityThreshold;
+  }
+
+  public final class FloatSpringSpec implements androidx.compose.animation.core.FloatAnimationSpec {
+    ctor public FloatSpringSpec(optional float dampingRatio, optional float stiffness, optional float visibilityThreshold);
+    method public float getDampingRatio();
+    method public long getDurationNanos(float initialValue, float targetValue, float initialVelocity);
+    method public float getStiffness();
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    property public final float dampingRatio;
+    property public final float stiffness;
+  }
+
+  public final class FloatTweenSpec implements androidx.compose.animation.core.FloatAnimationSpec {
+    ctor public FloatTweenSpec(optional int duration, optional int delay, optional androidx.compose.animation.core.Easing easing);
+    method public int getDelay();
+    method public int getDuration();
+    method public long getDurationNanos(float initialValue, float targetValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    property public final int delay;
+    property public final int duration;
+  }
+
+  public final class InfiniteAnimationPolicyKt {
+    method public static suspend inline <R> Object? withInfiniteAnimationFrameMillis(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R>);
+    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 {
+  }
+
+  public final class InfiniteTransitionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Float> animateFloat(androidx.compose.animation.core.InfiniteTransition, float initialValue, float targetValue, androidx.compose.animation.core.InfiniteRepeatableSpec<java.lang.Float> animationSpec);
+    method @androidx.compose.runtime.Composable public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.runtime.State<T> animateValue(androidx.compose.animation.core.InfiniteTransition, T? initialValue, T? targetValue, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, androidx.compose.animation.core.InfiniteRepeatableSpec<T> animationSpec);
+    method @androidx.compose.runtime.Composable public static androidx.compose.animation.core.InfiniteTransition rememberInfiniteTransition();
+  }
+
+  @androidx.compose.runtime.Immutable public final class KeyframesSpec<T> implements androidx.compose.animation.core.DurationBasedAnimationSpec<T> {
+    ctor public KeyframesSpec(androidx.compose.animation.core.KeyframesSpec.KeyframesSpecConfig<T> config);
+    method public androidx.compose.animation.core.KeyframesSpec.KeyframesSpecConfig<T> getConfig();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedKeyframesSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final androidx.compose.animation.core.KeyframesSpec.KeyframesSpecConfig<T> config;
+  }
+
+  public static final class KeyframesSpec.KeyframeEntity<T> {
+  }
+
+  public static final class KeyframesSpec.KeyframesSpecConfig<T> {
+    ctor public KeyframesSpec.KeyframesSpecConfig();
+    method public infix androidx.compose.animation.core.KeyframesSpec.KeyframeEntity<T> at(T?, int timeStamp);
+    method public 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 {
+  }
+
+  public final class SpringSimulationKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class SpringSpec<T> implements androidx.compose.animation.core.FiniteAnimationSpec<T> {
+    ctor public SpringSpec(optional float dampingRatio, optional float stiffness, optional T? visibilityThreshold);
+    method public float getDampingRatio();
+    method public float getStiffness();
+    method public T? getVisibilityThreshold();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedSpringSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final float dampingRatio;
+    property public final float stiffness;
+    property public final T? visibilityThreshold;
+  }
+
+  @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 final class VectorizedAnimationSpecKt {
+  }
+
+  public interface VectorizedDecayAnimationSpec<V extends androidx.compose.animation.core.AnimationVector> {
+    method public float getAbsVelocityThreshold();
+    method public long getDurationNanos(V initialValue, V initialVelocity);
+    method public V getTargetValue(V initialValue, V initialVelocity);
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V initialVelocity);
+    property public abstract float absVelocityThreshold;
+  }
+
+  @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);
+  }
+
+}
+
+package androidx.compose.animation.core.internal {
+
+  public final class JvmDefaultWithCompatibility_jvmKt {
+  }
+
+}
+
diff --git a/compose/animation/animation-graphics/api/1.3.0-beta01.txt b/compose/animation/animation-graphics/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..9c4ad0e
--- /dev/null
+++ b/compose/animation/animation-graphics/api/1.3.0-beta01.txt
@@ -0,0 +1,37 @@
+// 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.3.0-beta01.txt b/compose/animation/animation-graphics/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..f650e30
--- /dev/null
+++ b/compose/animation/animation-graphics/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,57 @@
+// Signature format: 4.0
+package androidx.compose.animation.graphics {
+
+  @kotlin.RequiresOptIn(message="This is an experimental animation graphics API.") @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.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);
+  }
+
+  public final class AnimatorResources_androidKt {
+  }
+
+}
+
+package androidx.compose.animation.graphics.vector {
+
+  @androidx.compose.animation.graphics.ExperimentalAnimationGraphicsApi @androidx.compose.runtime.Immutable public final class AnimatedImageVector {
+    method public androidx.compose.ui.graphics.vector.ImageVector getImageVector();
+    method public int getTotalDuration();
+    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 {
+  }
+
+  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/health/health-connect-client/api/res-current.txt b/compose/animation/animation-graphics/api/res-1.3.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/animation/animation-graphics/api/res-1.3.0-beta01.txt
diff --git a/compose/animation/animation-graphics/api/restricted_1.3.0-beta01.txt b/compose/animation/animation-graphics/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..9c4ad0e
--- /dev/null
+++ b/compose/animation/animation-graphics/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,37 @@
+// 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-tooling-internal/api/1.3.0-beta01.txt b/compose/animation/animation-tooling-internal/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..dc21e7e
--- /dev/null
+++ b/compose/animation/animation-tooling-internal/api/1.3.0-beta01.txt
@@ -0,0 +1,57 @@
+// Signature format: 4.0
+package androidx.compose.animation.tooling {
+
+  public final class ComposeAnimatedProperty {
+    ctor public ComposeAnimatedProperty(String label, Object value);
+    method public String component1();
+    method public Object component2();
+    method public androidx.compose.animation.tooling.ComposeAnimatedProperty copy(String label, Object value);
+    method public String getLabel();
+    method public Object getValue();
+    property public final String label;
+    property public final Object value;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface ComposeAnimation {
+    method public Object getAnimationObject();
+    method public default String? getLabel();
+    method public default java.util.Set<java.lang.Object> getStates();
+    method public androidx.compose.animation.tooling.ComposeAnimationType getType();
+    property public abstract Object animationObject;
+    property public default String? label;
+    property public default java.util.Set<java.lang.Object> states;
+    property public abstract androidx.compose.animation.tooling.ComposeAnimationType type;
+  }
+
+  public enum ComposeAnimationType {
+    method public static androidx.compose.animation.tooling.ComposeAnimationType valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.animation.tooling.ComposeAnimationType[] values();
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATABLE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_CONTENT;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_VALUE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_VISIBILITY;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATE_CONTENT_SIZE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATE_X_AS_STATE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType DECAY_ANIMATION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType INFINITE_TRANSITION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType TARGET_BASED_ANIMATION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType TRANSITION_ANIMATION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType UNSUPPORTED;
+  }
+
+  public final class TransitionInfo {
+    ctor public TransitionInfo(String label, String specType, long startTimeMillis, long endTimeMillis, java.util.Map<java.lang.Long,?> values);
+    method public long getEndTimeMillis();
+    method public String getLabel();
+    method public String getSpecType();
+    method public long getStartTimeMillis();
+    method public java.util.Map<java.lang.Long,java.lang.Object> getValues();
+    property public final long endTimeMillis;
+    property public final String label;
+    property public final String specType;
+    property public final long startTimeMillis;
+    property public final java.util.Map<java.lang.Long,java.lang.Object> values;
+  }
+
+}
+
diff --git a/compose/animation/animation-tooling-internal/api/public_plus_experimental_1.3.0-beta01.txt b/compose/animation/animation-tooling-internal/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..dc21e7e
--- /dev/null
+++ b/compose/animation/animation-tooling-internal/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,57 @@
+// Signature format: 4.0
+package androidx.compose.animation.tooling {
+
+  public final class ComposeAnimatedProperty {
+    ctor public ComposeAnimatedProperty(String label, Object value);
+    method public String component1();
+    method public Object component2();
+    method public androidx.compose.animation.tooling.ComposeAnimatedProperty copy(String label, Object value);
+    method public String getLabel();
+    method public Object getValue();
+    property public final String label;
+    property public final Object value;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface ComposeAnimation {
+    method public Object getAnimationObject();
+    method public default String? getLabel();
+    method public default java.util.Set<java.lang.Object> getStates();
+    method public androidx.compose.animation.tooling.ComposeAnimationType getType();
+    property public abstract Object animationObject;
+    property public default String? label;
+    property public default java.util.Set<java.lang.Object> states;
+    property public abstract androidx.compose.animation.tooling.ComposeAnimationType type;
+  }
+
+  public enum ComposeAnimationType {
+    method public static androidx.compose.animation.tooling.ComposeAnimationType valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.animation.tooling.ComposeAnimationType[] values();
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATABLE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_CONTENT;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_VALUE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_VISIBILITY;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATE_CONTENT_SIZE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATE_X_AS_STATE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType DECAY_ANIMATION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType INFINITE_TRANSITION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType TARGET_BASED_ANIMATION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType TRANSITION_ANIMATION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType UNSUPPORTED;
+  }
+
+  public final class TransitionInfo {
+    ctor public TransitionInfo(String label, String specType, long startTimeMillis, long endTimeMillis, java.util.Map<java.lang.Long,?> values);
+    method public long getEndTimeMillis();
+    method public String getLabel();
+    method public String getSpecType();
+    method public long getStartTimeMillis();
+    method public java.util.Map<java.lang.Long,java.lang.Object> getValues();
+    property public final long endTimeMillis;
+    property public final String label;
+    property public final String specType;
+    property public final long startTimeMillis;
+    property public final java.util.Map<java.lang.Long,java.lang.Object> values;
+  }
+
+}
+
diff --git a/compose/animation/animation-tooling-internal/api/restricted_1.3.0-beta01.txt b/compose/animation/animation-tooling-internal/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..dc21e7e
--- /dev/null
+++ b/compose/animation/animation-tooling-internal/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,57 @@
+// Signature format: 4.0
+package androidx.compose.animation.tooling {
+
+  public final class ComposeAnimatedProperty {
+    ctor public ComposeAnimatedProperty(String label, Object value);
+    method public String component1();
+    method public Object component2();
+    method public androidx.compose.animation.tooling.ComposeAnimatedProperty copy(String label, Object value);
+    method public String getLabel();
+    method public Object getValue();
+    property public final String label;
+    property public final Object value;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface ComposeAnimation {
+    method public Object getAnimationObject();
+    method public default String? getLabel();
+    method public default java.util.Set<java.lang.Object> getStates();
+    method public androidx.compose.animation.tooling.ComposeAnimationType getType();
+    property public abstract Object animationObject;
+    property public default String? label;
+    property public default java.util.Set<java.lang.Object> states;
+    property public abstract androidx.compose.animation.tooling.ComposeAnimationType type;
+  }
+
+  public enum ComposeAnimationType {
+    method public static androidx.compose.animation.tooling.ComposeAnimationType valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.animation.tooling.ComposeAnimationType[] values();
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATABLE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_CONTENT;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_VALUE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_VISIBILITY;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATE_CONTENT_SIZE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATE_X_AS_STATE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType DECAY_ANIMATION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType INFINITE_TRANSITION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType TARGET_BASED_ANIMATION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType TRANSITION_ANIMATION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType UNSUPPORTED;
+  }
+
+  public final class TransitionInfo {
+    ctor public TransitionInfo(String label, String specType, long startTimeMillis, long endTimeMillis, java.util.Map<java.lang.Long,?> values);
+    method public long getEndTimeMillis();
+    method public String getLabel();
+    method public String getSpecType();
+    method public long getStartTimeMillis();
+    method public java.util.Map<java.lang.Long,java.lang.Object> getValues();
+    property public final long endTimeMillis;
+    property public final String label;
+    property public final String specType;
+    property public final long startTimeMillis;
+    property public final java.util.Map<java.lang.Long,java.lang.Object> values;
+  }
+
+}
+
diff --git a/compose/animation/animation/api/1.3.0-beta01.txt b/compose/animation/animation/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..aa39354
--- /dev/null
+++ b/compose/animation/animation/api/1.3.0-beta01.txt
@@ -0,0 +1,114 @@
+// Signature format: 4.0
+package androidx.compose.animation {
+
+  public final class AndroidActualDefaultDecayAnimationSpec_androidKt {
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float> defaultDecayAnimationSpec();
+  }
+
+  public final class AnimatedContentKt {
+  }
+
+  public final class AnimatedVisibilityKt {
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.RowScope, boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.ColumnScope, boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> visibleState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.RowScope, androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> visibleState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.ColumnScope, androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> visibleState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+  }
+
+  @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 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);
+    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);
+  }
+
+}
+
+package androidx.compose.animation.internal {
+
+  public final class JvmDefaultWithCompatibility_jvmKt {
+  }
+
+}
+
diff --git a/compose/animation/animation/api/public_plus_experimental_1.3.0-beta01.txt b/compose/animation/animation/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..90ce764
--- /dev/null
+++ b/compose/animation/animation/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,185 @@
+// Signature format: 4.0
+package androidx.compose.animation {
+
+  public final class AndroidActualDefaultDecayAnimationSpec_androidKt {
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float> defaultDecayAnimationSpec();
+  }
+
+  public final class AnimatedContentKt {
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Composable public static <S> void AnimatedContent(S? targetState, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedContentScope<S>,androidx.compose.animation.ContentTransform> transitionSpec, optional androidx.compose.ui.Alignment contentAlignment, kotlin.jvm.functions.Function2<? super androidx.compose.animation.AnimatedVisibilityScope,? super S,kotlin.Unit> content);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Composable public static <S> void AnimatedContent(androidx.compose.animation.core.Transition<S>, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedContentScope<S>,androidx.compose.animation.ContentTransform> transitionSpec, optional androidx.compose.ui.Alignment contentAlignment, optional kotlin.jvm.functions.Function1<? super S,?> contentKey, kotlin.jvm.functions.Function2<? super androidx.compose.animation.AnimatedVisibilityScope,? super S,kotlin.Unit> content);
+    method @androidx.compose.animation.ExperimentalAnimationApi public static androidx.compose.animation.SizeTransform SizeTransform(optional boolean clip, optional kotlin.jvm.functions.Function2<? super androidx.compose.ui.unit.IntSize,? super androidx.compose.ui.unit.IntSize,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize>> sizeAnimationSpec);
+    method @androidx.compose.animation.ExperimentalAnimationApi public static infix androidx.compose.animation.ContentTransform with(androidx.compose.animation.EnterTransition, androidx.compose.animation.ExitTransition exit);
+  }
+
+  @androidx.compose.animation.ExperimentalAnimationApi public final class AnimatedContentScope<S> implements androidx.compose.animation.core.Transition.Segment<S> {
+    method public S! getInitialState();
+    method public S! getTargetState();
+    method public androidx.compose.animation.EnterTransition slideIntoContainer(int towards, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialOffset);
+    method public androidx.compose.animation.ExitTransition slideOutOfContainer(int towards, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetOffset);
+    method @androidx.compose.animation.ExperimentalAnimationApi public infix androidx.compose.animation.ContentTransform using(androidx.compose.animation.ContentTransform, androidx.compose.animation.SizeTransform? sizeTransform);
+    property public S! initialState;
+    property public S! targetState;
+  }
+
+  @androidx.compose.runtime.Immutable @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.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);
+    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);
+  }
+
+}
+
+package androidx.compose.animation.internal {
+
+  public final class JvmDefaultWithCompatibility_jvmKt {
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/compose/animation/animation/api/res-1.3.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/animation/animation/api/res-1.3.0-beta01.txt
diff --git a/compose/animation/animation/api/restricted_1.3.0-beta01.txt b/compose/animation/animation/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..aa39354
--- /dev/null
+++ b/compose/animation/animation/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,114 @@
+// Signature format: 4.0
+package androidx.compose.animation {
+
+  public final class AndroidActualDefaultDecayAnimationSpec_androidKt {
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float> defaultDecayAnimationSpec();
+  }
+
+  public final class AnimatedContentKt {
+  }
+
+  public final class AnimatedVisibilityKt {
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.RowScope, boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.ColumnScope, boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> visibleState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.RowScope, androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> visibleState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.ColumnScope, androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> visibleState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+  }
+
+  @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 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);
+    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);
+  }
+
+}
+
+package androidx.compose.animation.internal {
+
+  public final class JvmDefaultWithCompatibility_jvmKt {
+  }
+
+}
+
diff --git a/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/BenchmarksExtensions.kt b/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/BenchmarksExtensions.kt
index ea64883..b0c29ab 100644
--- a/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/BenchmarksExtensions.kt
+++ b/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/BenchmarksExtensions.kt
@@ -154,7 +154,8 @@
  */
 fun <T> ComposeBenchmarkRule.toggleStateBenchmarkRecompose(
     caseFactory: () -> T,
-    assertOneRecomposition: Boolean = true
+    assertOneRecomposition: Boolean = true,
+    requireRecomposition: Boolean = true,
 ) where T : ComposeTestCase, T : ToggleableTestCase {
     runBenchmarkFor(caseFactory) {
         doFramesUntilNoChangesPending()
@@ -163,7 +164,11 @@
             runWithTimingDisabled {
                 getTestCase().toggleState()
             }
-            recomposeAssertHadChanges()
+            if (requireRecomposition) {
+                recomposeAssertHadChanges()
+            } else {
+                recompose()
+            }
             if (assertOneRecomposition) {
                 assertNoPendingChanges()
             }
@@ -352,14 +357,19 @@
  */
 fun <T> ComposeBenchmarkRule.toggleStateBenchmarkComposeMeasureLayout(
     caseFactory: () -> T,
-    assertOneRecomposition: Boolean = true
+    assertOneRecomposition: Boolean = true,
+    requireRecomposition: Boolean = true
 ) where T : ComposeTestCase, T : ToggleableTestCase {
     runBenchmarkFor(caseFactory) {
         doFramesUntilNoChangesPending()
 
         measureRepeated {
             getTestCase().toggleState()
-            recomposeAssertHadChanges()
+            if (requireRecomposition) {
+                recomposeAssertHadChanges()
+            } else {
+                recompose()
+            }
             if (assertOneRecomposition) {
                 assertNoPendingChanges()
             }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/SanityCheckCodegenTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/SanityCheckCodegenTests.kt
index 6c1f46b..45402ec 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/SanityCheckCodegenTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/SanityCheckCodegenTests.kt
@@ -90,4 +90,45 @@
         """
         )
     }
+
+    // Regression test for KT-52843
+    fun testParameterInlineCaptureLambda() = ensureSetup {
+        testCompile(
+            """
+            import androidx.compose.runtime.Composable
+            import androidx.compose.ui.graphics.Color
+
+            @Composable
+            inline fun InlineWidget(
+                propagateMinConstraints: Boolean = false,
+                content: () -> Unit
+            ) {
+            }
+
+            @Composable
+            fun DarkThemeSample() {
+                val color = Color.Black
+                InlineWidget {
+                    println(color)
+                }
+            }
+        """
+        )
+    }
+
+    // Regression validating b/237863365
+    fun testComposableAsLastStatementInUnitReturningLambda() {
+        testCompile(
+            """
+            import androidx.compose.runtime.Composable
+
+            fun foo(lambda: ()->Unit){}
+            fun main() {
+                foo {
+                    @Composable {}
+                }
+            }
+            """
+        )
+    }
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposePlugin.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposePlugin.kt
index ed94995..a3ebe87 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposePlugin.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposePlugin.kt
@@ -53,8 +53,9 @@
         CompilerConfigurationKey<String>("Directory to save compose build reports")
     val INTRINSIC_REMEMBER_OPTIMIZATION_ENABLED_KEY =
         CompilerConfigurationKey<Boolean>("Enable optimization to treat remember as an intrinsic")
-    val SUPPRESS_KOTLIN_VERSION_COMPATIBILITY_CHECK =
-        CompilerConfigurationKey<Boolean>("Suppress Kotlin version compatibility check")
+    val SUPPRESS_KOTLIN_VERSION_COMPATIBILITY_CHECK = CompilerConfigurationKey<String?>(
+            "Version of Kotlin for which version compatibility check should be suppressed"
+        )
     val DECOYS_ENABLED_KEY =
         CompilerConfigurationKey<Boolean>("Generate decoy methods in IR transform")
 }
@@ -176,7 +177,7 @@
         )
         SUPPRESS_KOTLIN_VERSION_CHECK_ENABLED_OPTION -> configuration.put(
             ComposeConfiguration.SUPPRESS_KOTLIN_VERSION_COMPATIBILITY_CHECK,
-            value == "true"
+            value
         )
         DECOYS_ENABLED_OPTION -> configuration.put(
             ComposeConfiguration.DECOYS_ENABLED_KEY,
@@ -206,20 +207,50 @@
         ) {
             val KOTLIN_VERSION_EXPECTATION = "1.7.10"
             KotlinCompilerVersion.getVersion()?.let { version ->
+                val msgCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY)
                 val suppressKotlinVersionCheck = configuration.get(
-                    ComposeConfiguration.SUPPRESS_KOTLIN_VERSION_COMPATIBILITY_CHECK,
-                    false
+                    ComposeConfiguration.SUPPRESS_KOTLIN_VERSION_COMPATIBILITY_CHECK
                 )
-                if (!suppressKotlinVersionCheck && version != KOTLIN_VERSION_EXPECTATION) {
-                    val msgCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY)
+                if (suppressKotlinVersionCheck != null && suppressKotlinVersionCheck != version) {
+                    if (suppressKotlinVersionCheck == "true") {
+                        msgCollector?.report(
+                            CompilerMessageSeverity.STRONG_WARNING,
+                            " `suppressKotlinVersionCompatibilityCheck` should" +
+                                " specify the version of Kotlin for which you want the" +
+                                " compatibility check to be disabled. For example," +
+                                " `suppressKotlinVersionCompatibilityCheck=$version`"
+                        )
+                    } else {
+                        msgCollector?.report(
+                            CompilerMessageSeverity.STRONG_WARNING,
+                            " `suppressKotlinVersionCompatibilityCheck` is set to a" +
+                                " version of Kotlin ($suppressKotlinVersionCheck) that you" +
+                                " are not using and should be set properly. (you are using" +
+                                " Kotlin $version)"
+                        )
+                    }
+                }
+                if (suppressKotlinVersionCheck == KOTLIN_VERSION_EXPECTATION) {
+                    msgCollector?.report(
+                        CompilerMessageSeverity.STRONG_WARNING,
+                        " `suppressKotlinVersionCompatibilityCheck` is set to the same" +
+                            " version of Kotlin that the Compose Compiler was already expecting" +
+                            " (Kotlin $suppressKotlinVersionCheck), and thus has no effect and" +
+                            " should be removed."
+                    )
+                }
+                if (suppressKotlinVersionCheck != "true" &&
+                    version != KOTLIN_VERSION_EXPECTATION &&
+                    version != suppressKotlinVersionCheck) {
                     msgCollector?.report(
                         CompilerMessageSeverity.ERROR,
-                        "This version (${VersionChecker.compilerVersion}) of the Compose" +
-                            " Compiler requires Kotlin version $KOTLIN_VERSION_EXPECTATION but" +
-                            " you appear to be using Kotlin version $version which is not known" +
-                            " to be compatible.  Please fix your configuration (or" +
-                            " `suppressKotlinVersionCompatibilityCheck` but don't say I didn't" +
-                            " warn you!)."
+                        "This version (${VersionChecker.compilerVersion}) of the" +
+                            " Compose Compiler requires Kotlin version" +
+                            " $KOTLIN_VERSION_EXPECTATION but you appear to be using Kotlin" +
+                            " version $version which is not known to be compatible.  Please" +
+                            " fix your configuration (or" +
+                            " `suppressKotlinVersionCompatibilityCheck` but don't say I" +
+                            " didn't warn you!)."
                     )
 
                     // Return without registering the Compose plugin because the registration
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposeTypeResolutionInterceptorExtension.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposeTypeResolutionInterceptorExtension.kt
index cc6f27f..b9912be 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposeTypeResolutionInterceptorExtension.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposeTypeResolutionInterceptorExtension.kt
@@ -60,6 +60,7 @@
         resultType: KotlinType
     ): KotlinType {
         if (resultType === TypeUtils.NO_EXPECTED_TYPE) return resultType
+        if (resultType === TypeUtils.UNIT_EXPECTED_TYPE) return resultType
         if (element !is KtLambdaExpression) return resultType
 
         if (
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/VersionChecker.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/VersionChecker.kt
index c3fb540..f0c30b3 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/VersionChecker.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/VersionChecker.kt
@@ -26,10 +26,11 @@
 
     companion object {
         /**
-         * A table of runtime version ints to version strings. This should be
-         * updated every time ComposeVersion.kt is updated.
+         * A table of runtime version ints to version strings for compose-runtime.
+         * This should be updated every time a new version of the Compose Runtime is released.
+         * Typically updated via update_versions_for_release.py
          */
-        private val versionTable = mapOf(
+        private val runtimeVersionToMavenVersionTable = mapOf(
             1600 to "0.1.0-dev16",
             1700 to "1.0.0-alpha06",
             1800 to "1.0.0-alpha07",
@@ -84,9 +85,11 @@
             7102 to "1.2.0-rc03",
             7103 to "1.2.0",
             7104 to "1.2.1",
+            7105 to "1.2.2",
             8000 to "1.3.0-alpha01",
             8100 to "1.3.0-alpha02",
             8200 to "1.3.0-alpha03",
+            8300 to "1.3.0-beta01",
         )
 
         /**
@@ -99,9 +102,9 @@
          * The maven version string of this compiler. This string should be updated before/after every
          * release.
          */
-        const val compilerVersion: String = "1.3.0-rc02"
+        const val compilerVersion: String = "1.3.1"
         private val minimumRuntimeVersion: String
-            get() = versionTable[minimumRuntimeVersionInt] ?: "unknown"
+            get() = runtimeVersionToMavenVersionTable[minimumRuntimeVersionInt] ?: "unknown"
     }
 
     fun check() {
@@ -135,7 +138,7 @@
         }
         val versionInt = versionExpr.value as Int
         if (versionInt < minimumRuntimeVersionInt) {
-            outdatedRuntime(versionTable[versionInt] ?: "<unknown>")
+            outdatedRuntime(runtimeVersionToMavenVersionTable[versionInt] ?: "<unknown>")
         }
         // success. We are compatible with this runtime version!
     }
diff --git a/compose/foundation/foundation-layout/api/1.3.0-beta01.txt b/compose/foundation/foundation-layout/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..cdcdeb20
--- /dev/null
+++ b/compose/foundation/foundation-layout/api/1.3.0-beta01.txt
@@ -0,0 +1,312 @@
+// 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 RowColumnImplKt {
+  }
+
+  public final class RowKt {
+    method @androidx.compose.runtime.Composable public static inline void Row(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.ui.Alignment.Vertical verticalAlignment, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.foundation.layout.LayoutScopeMarker @androidx.compose.runtime.Immutable @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 {
+  }
+
+  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 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);
+  }
+
+}
+
+package androidx.compose.foundation.layout.internal {
+
+  public final class JvmDefaultWithCompatibility_jvmKt {
+  }
+
+}
+
diff --git a/compose/foundation/foundation-layout/api/public_plus_experimental_1.3.0-beta01.txt b/compose/foundation/foundation-layout/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..22c3e20
--- /dev/null
+++ b/compose/foundation/foundation-layout/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,329 @@
+// 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.") public @interface ExperimentalLayoutApi {
+  }
+
+  public final class IntrinsicKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier height(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.IntrinsicSize intrinsicSize);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeight(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.IntrinsicSize intrinsicSize);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredWidth(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.IntrinsicSize intrinsicSize);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier width(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.IntrinsicSize intrinsicSize);
+  }
+
+  public enum IntrinsicSize {
+    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 RowColumnImplKt {
+  }
+
+  public final class RowKt {
+    method @androidx.compose.runtime.Composable public static inline void Row(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.ui.Alignment.Vertical verticalAlignment, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.foundation.layout.LayoutScopeMarker @androidx.compose.runtime.Immutable @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.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 @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 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.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.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);
+  }
+
+}
+
+package androidx.compose.foundation.layout.internal {
+
+  public final class JvmDefaultWithCompatibility_jvmKt {
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/compose/foundation/foundation-layout/api/res-1.3.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/foundation/foundation-layout/api/res-1.3.0-beta01.txt
diff --git a/compose/foundation/foundation-layout/api/restricted_1.3.0-beta01.txt b/compose/foundation/foundation-layout/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..5d57250
--- /dev/null
+++ b/compose/foundation/foundation-layout/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,317 @@
+// 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 RowColumnImplKt {
+  }
+
+  public final class RowKt {
+    method @androidx.compose.runtime.Composable public static inline void Row(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.ui.Alignment.Vertical verticalAlignment, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable @kotlin.PublishedApi internal static androidx.compose.ui.layout.MeasurePolicy rowMeasurePolicy(androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, androidx.compose.ui.Alignment.Vertical verticalAlignment);
+    field @kotlin.PublishedApi internal static final androidx.compose.ui.layout.MeasurePolicy DefaultRowMeasurePolicy;
+  }
+
+  @androidx.compose.foundation.layout.LayoutScopeMarker @androidx.compose.runtime.Immutable @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 {
+  }
+
+  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 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);
+  }
+
+}
+
+package androidx.compose.foundation.layout.internal {
+
+  public final class JvmDefaultWithCompatibility_jvmKt {
+  }
+
+}
+
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/SimpleColumnWithRowsBenchmark.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/SimpleColumnWithRowsBenchmark.kt
new file mode 100644
index 0000000..27e6d90
--- /dev/null
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/SimpleColumnWithRowsBenchmark.kt
@@ -0,0 +1,102 @@
+/*
+ * 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.layout.benchmark
+
+import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
+import androidx.compose.testutils.benchmark.benchmarkDrawPerf
+import androidx.compose.testutils.benchmark.benchmarkFirstCompose
+import androidx.compose.testutils.benchmark.benchmarkFirstDraw
+import androidx.compose.testutils.benchmark.benchmarkFirstLayout
+import androidx.compose.testutils.benchmark.benchmarkFirstMeasure
+import androidx.compose.testutils.benchmark.benchmarkLayoutPerf
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkDraw
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkLayout
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkMeasure
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkRecompose
+import androidx.test.filters.LargeTest
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@LargeTest
+@RunWith(Parameterized::class)
+class SimpleColumnWithRowsBenchmark(private val numberOfBoxes: Int) {
+
+    private val subLayouts = 5
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "numberOfBoxes={0}")
+        fun initParameters(): Array<Int> = arrayOf(10, 100)
+    }
+
+    @get:Rule
+    val benchmarkRule = ComposeBenchmarkRule()
+
+    private val simpleColumnWithRowsFactory =
+        { SimpleColumnWithRowsTestCase(subLayouts, numberOfBoxes) }
+
+    @Test
+    fun first_compose() {
+        benchmarkRule.benchmarkFirstCompose(simpleColumnWithRowsFactory)
+    }
+
+    @Test
+    fun first_measure() {
+        benchmarkRule.benchmarkFirstMeasure(simpleColumnWithRowsFactory)
+    }
+
+    @Test
+    fun first_layout() {
+        benchmarkRule.benchmarkFirstLayout(simpleColumnWithRowsFactory)
+    }
+
+    @Test
+    fun first_draw() {
+        benchmarkRule.benchmarkFirstDraw(simpleColumnWithRowsFactory)
+    }
+
+    @Test
+    fun toggleColor_recompose() {
+        benchmarkRule.toggleStateBenchmarkRecompose(simpleColumnWithRowsFactory)
+    }
+
+    @Test
+    fun toggleLayoutQuantity_measure() {
+        benchmarkRule.toggleStateBenchmarkMeasure(simpleColumnWithRowsFactory)
+    }
+
+    @Test
+    fun toggleLayoutQuantity_layout() {
+        benchmarkRule.toggleStateBenchmarkLayout(simpleColumnWithRowsFactory)
+    }
+
+    @Test
+    fun toggleLayoutQuantity_draw() {
+        benchmarkRule.toggleStateBenchmarkDraw(simpleColumnWithRowsFactory)
+    }
+
+    @Test
+    fun layout() {
+        benchmarkRule.benchmarkLayoutPerf(simpleColumnWithRowsFactory)
+    }
+
+    @Test
+    fun draw() {
+        benchmarkRule.benchmarkDrawPerf(simpleColumnWithRowsFactory)
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/SimpleColumnWithRowsTestCase.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/SimpleColumnWithRowsTestCase.kt
new file mode 100644
index 0000000..5b302fd
--- /dev/null
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/SimpleColumnWithRowsTestCase.kt
@@ -0,0 +1,57 @@
+/*
+ * 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.layout.benchmark
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.testutils.LayeredComposeTestCase
+import androidx.compose.testutils.ToggleableTestCase
+import androidx.compose.ui.Modifier
+
+class SimpleColumnWithRowsTestCase(
+    private val subLayouts: Int,
+    private val numberOfBoxes: Int
+) : LayeredComposeTestCase(), ToggleableTestCase {
+
+    private val numberOfSubLayouts = mutableStateOf(subLayouts)
+
+    @Composable
+    override fun MeasuredContent() {
+        Column(modifier = Modifier.fillMaxSize()) {
+            repeat(numberOfSubLayouts.value) {
+                Row(modifier = Modifier.fillMaxWidth()) {
+                    repeat(numberOfBoxes) {
+                        Box(modifier = Modifier.fillMaxSize())
+                    }
+                }
+            }
+        }
+    }
+
+    override fun toggleState() {
+        if (numberOfSubLayouts.value == subLayouts) {
+            numberOfSubLayouts.value = subLayouts - 1
+        } else {
+            numberOfSubLayouts.value = subLayouts
+        }
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/WeightedColumnWithRowsBenchmark.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/WeightedColumnWithRowsBenchmark.kt
new file mode 100644
index 0000000..2cd66ac
--- /dev/null
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/WeightedColumnWithRowsBenchmark.kt
@@ -0,0 +1,102 @@
+/*
+ * 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.layout.benchmark
+
+import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
+import androidx.compose.testutils.benchmark.benchmarkDrawPerf
+import androidx.compose.testutils.benchmark.benchmarkFirstCompose
+import androidx.compose.testutils.benchmark.benchmarkFirstDraw
+import androidx.compose.testutils.benchmark.benchmarkFirstLayout
+import androidx.compose.testutils.benchmark.benchmarkFirstMeasure
+import androidx.compose.testutils.benchmark.benchmarkLayoutPerf
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkDraw
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkLayout
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkMeasure
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkRecompose
+import androidx.test.filters.LargeTest
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@LargeTest
+@RunWith(Parameterized::class)
+class WeightedColumnWithRowsBenchmark(private val numberOfBoxes: Int) {
+
+    private val subLayouts = 5
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "numberOfBoxes={0}")
+        fun initParameters(): Array<Int> = arrayOf(10, 100)
+    }
+
+    @get:Rule
+    val benchmarkRule = ComposeBenchmarkRule()
+
+    private val simpleColumnWithRowsFactory =
+        { WeightedColumnWithRowsTestCase(subLayouts, numberOfBoxes) }
+
+    @Test
+    fun first_compose() {
+        benchmarkRule.benchmarkFirstCompose(simpleColumnWithRowsFactory)
+    }
+
+    @Test
+    fun first_measure() {
+        benchmarkRule.benchmarkFirstMeasure(simpleColumnWithRowsFactory)
+    }
+
+    @Test
+    fun first_layout() {
+        benchmarkRule.benchmarkFirstLayout(simpleColumnWithRowsFactory)
+    }
+
+    @Test
+    fun first_draw() {
+        benchmarkRule.benchmarkFirstDraw(simpleColumnWithRowsFactory)
+    }
+
+    @Test
+    fun toggleLayoutQuantity_recompose() {
+        benchmarkRule.toggleStateBenchmarkRecompose(simpleColumnWithRowsFactory)
+    }
+
+    @Test
+    fun toggleLayoutQuantity_measure() {
+        benchmarkRule.toggleStateBenchmarkMeasure(simpleColumnWithRowsFactory)
+    }
+
+    @Test
+    fun toggleLayoutQuantity_layout() {
+        benchmarkRule.toggleStateBenchmarkLayout(simpleColumnWithRowsFactory)
+    }
+
+    @Test
+    fun toggleColor_draw() {
+        benchmarkRule.toggleStateBenchmarkDraw(simpleColumnWithRowsFactory)
+    }
+
+    @Test
+    fun layout() {
+        benchmarkRule.benchmarkLayoutPerf(simpleColumnWithRowsFactory)
+    }
+
+    @Test
+    fun draw() {
+        benchmarkRule.benchmarkDrawPerf(simpleColumnWithRowsFactory)
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/WeightedColumnWithRowsTestCase.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/WeightedColumnWithRowsTestCase.kt
new file mode 100644
index 0000000..2632095
--- /dev/null
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/WeightedColumnWithRowsTestCase.kt
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.foundation.layout.benchmark
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.testutils.LayeredComposeTestCase
+import androidx.compose.testutils.ToggleableTestCase
+import androidx.compose.ui.Modifier
+
+class WeightedColumnWithRowsTestCase(
+    private val subLayouts: Int,
+    private val numberOfBoxes: Int
+) : LayeredComposeTestCase(), ToggleableTestCase {
+
+    private val numberOfSubLayouts = mutableStateOf(subLayouts)
+
+    @Composable
+    override fun MeasuredContent() {
+        Column(modifier = Modifier.fillMaxSize()) {
+            repeat(numberOfSubLayouts.value) {
+                Row(
+                    modifier = Modifier
+                        .fillMaxWidth()
+                        .weight(1 / numberOfSubLayouts.value.toFloat())
+                ) {
+                    repeat(numberOfBoxes) {
+                        Box(
+                            modifier = Modifier.weight(1 / numberOfBoxes.toFloat())
+                        )
+                    }
+                }
+            }
+        }
+    }
+
+    override fun toggleState() {
+        if (numberOfSubLayouts.value == subLayouts) {
+            numberOfSubLayouts.value = subLayouts - 1
+        } else {
+            numberOfSubLayouts.value = subLayouts
+        }
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/SimpleLinearLayoutBenchmark.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/SimpleLinearLayoutBenchmark.kt
new file mode 100644
index 0000000..be7f962
--- /dev/null
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/SimpleLinearLayoutBenchmark.kt
@@ -0,0 +1,96 @@
+/*
+ * 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.layout.benchmark.view
+
+import androidx.compose.testutils.benchmark.AndroidBenchmarkRule
+import androidx.compose.testutils.benchmark.benchmarkDrawPerf
+import androidx.compose.testutils.benchmark.benchmarkFirstDraw
+import androidx.compose.testutils.benchmark.benchmarkFirstLayout
+import androidx.compose.testutils.benchmark.benchmarkFirstMeasure
+import androidx.compose.testutils.benchmark.benchmarkFirstSetContent
+import androidx.compose.testutils.benchmark.benchmarkLayoutPerf
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkDraw
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkLayout
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkMeasure
+import androidx.test.filters.LargeTest
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@LargeTest
+@RunWith(Parameterized::class)
+class SimpleLinearLayoutBenchmark(private val numberOfBoxes: Int) {
+    private val subLayouts = 5
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "numberOfBoxes={0}")
+        fun initParameters(): Array<Int> = arrayOf(10, 100)
+    }
+
+    @get:Rule
+    val benchmarkRule = AndroidBenchmarkRule()
+
+    private val linearLayoutCaseFactory = {
+        SimpleLinearLayoutTestCase(subLayouts, numberOfBoxes)
+    }
+
+    @Test
+    fun first_setContent() {
+        benchmarkRule.benchmarkFirstSetContent(linearLayoutCaseFactory)
+    }
+
+    @Test
+    fun first_measure() {
+        benchmarkRule.benchmarkFirstMeasure(linearLayoutCaseFactory)
+    }
+
+    @Test
+    fun first_layout() {
+        benchmarkRule.benchmarkFirstLayout(linearLayoutCaseFactory)
+    }
+
+    @Test
+    fun first_draw() {
+        benchmarkRule.benchmarkFirstDraw(linearLayoutCaseFactory)
+    }
+
+    @Test
+    fun layout() {
+        benchmarkRule.benchmarkLayoutPerf(linearLayoutCaseFactory)
+    }
+
+    @Test
+    fun draw() {
+        benchmarkRule.benchmarkDrawPerf(linearLayoutCaseFactory)
+    }
+
+    @Test
+    fun changeLayoutContents_measure() {
+        benchmarkRule.toggleStateBenchmarkMeasure(linearLayoutCaseFactory)
+    }
+
+    @Test
+    fun changeLayoutContents_layout() {
+        benchmarkRule.toggleStateBenchmarkLayout(linearLayoutCaseFactory)
+    }
+
+    @Test
+    fun changeLayoutContents_draw() {
+        benchmarkRule.toggleStateBenchmarkDraw(linearLayoutCaseFactory)
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/SimpleLinearLayoutTestCase.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/SimpleLinearLayoutTestCase.kt
new file mode 100644
index 0000000..4b5f0f6
--- /dev/null
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/SimpleLinearLayoutTestCase.kt
@@ -0,0 +1,75 @@
+/*
+ * 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.layout.benchmark.view
+
+import android.app.Activity
+import android.graphics.Color
+import android.view.View
+import android.view.ViewGroup
+import android.widget.LinearLayout
+import androidx.compose.testutils.ToggleableTestCase
+import androidx.compose.testutils.benchmark.android.AndroidTestCase
+
+class SimpleLinearLayoutTestCase(
+    private val subLayouts: Int,
+    private val numberOfBoxes: Int
+) : AndroidTestCase, ToggleableTestCase {
+
+    private val rows = mutableListOf<LinearLayout>()
+    private var isToggled = false
+    private var linearLayout: LinearLayout? = null
+    override fun getContent(activity: Activity): ViewGroup {
+        val mainLayout = LinearLayout(activity).also { linearLayout = it }
+        mainLayout.orientation = LinearLayout.VERTICAL
+        mainLayout.layoutParams = ViewGroup.LayoutParams(
+            ViewGroup.LayoutParams.MATCH_PARENT,
+            ViewGroup.LayoutParams.MATCH_PARENT
+        )
+
+        repeat(subLayouts) {
+            val row = LinearLayout(activity)
+            row.orientation = LinearLayout.HORIZONTAL
+            row.layoutParams = ViewGroup.LayoutParams(
+                ViewGroup.LayoutParams.MATCH_PARENT,
+                ViewGroup.LayoutParams.WRAP_CONTENT
+            )
+
+            repeat(numberOfBoxes) {
+                val box = View(activity)
+                box.setBackgroundColor(Color.BLUE)
+                box.layoutParams = LinearLayout.LayoutParams(
+                    ViewGroup.LayoutParams.WRAP_CONTENT,
+                    ViewGroup.LayoutParams.WRAP_CONTENT
+                )
+                row.addView(box)
+            }
+            rows += row
+            mainLayout.addView(row)
+        }
+        return mainLayout
+    }
+
+    override fun toggleState() {
+        if (!isToggled) {
+            linearLayout?.removeView(rows.last())
+            isToggled = true
+        } else {
+            linearLayout?.addView(rows.last())
+            isToggled = false
+        }
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/WeightedLinearLayoutBenchmark.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/WeightedLinearLayoutBenchmark.kt
new file mode 100644
index 0000000..3d11935
--- /dev/null
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/WeightedLinearLayoutBenchmark.kt
@@ -0,0 +1,97 @@
+/*
+ * 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.layout.benchmark.view
+
+import androidx.compose.testutils.benchmark.AndroidBenchmarkRule
+import androidx.compose.testutils.benchmark.benchmarkDrawPerf
+import androidx.compose.testutils.benchmark.benchmarkFirstDraw
+import androidx.compose.testutils.benchmark.benchmarkFirstLayout
+import androidx.compose.testutils.benchmark.benchmarkFirstMeasure
+import androidx.compose.testutils.benchmark.benchmarkFirstSetContent
+import androidx.compose.testutils.benchmark.benchmarkLayoutPerf
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkDraw
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkLayout
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkMeasure
+import androidx.test.filters.LargeTest
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@LargeTest
+@RunWith(Parameterized::class)
+class WeightedLinearLayoutBenchmark(private val numberOfBoxes: Int) {
+
+    private val subLayouts = 5
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "numberOfBoxes={0}")
+        fun initParameters(): Array<Int> = arrayOf(10, 100)
+    }
+
+    @get:Rule
+    val benchmarkRule = AndroidBenchmarkRule()
+
+    private val linearLayoutCaseFactory = {
+        WeightedLinearLayoutTestCase(subLayouts, numberOfBoxes)
+    }
+
+    @Test
+    fun first_setContent() {
+        benchmarkRule.benchmarkFirstSetContent(linearLayoutCaseFactory)
+    }
+
+    @Test
+    fun first_measure() {
+        benchmarkRule.benchmarkFirstMeasure(linearLayoutCaseFactory)
+    }
+
+    @Test
+    fun first_layout() {
+        benchmarkRule.benchmarkFirstLayout(linearLayoutCaseFactory)
+    }
+
+    @Test
+    fun first_draw() {
+        benchmarkRule.benchmarkFirstDraw(linearLayoutCaseFactory)
+    }
+
+    @Test
+    fun layout() {
+        benchmarkRule.benchmarkLayoutPerf(linearLayoutCaseFactory)
+    }
+
+    @Test
+    fun draw() {
+        benchmarkRule.benchmarkDrawPerf(linearLayoutCaseFactory)
+    }
+
+    @Test
+    fun changeLayoutContents_measure() {
+        benchmarkRule.toggleStateBenchmarkMeasure(linearLayoutCaseFactory)
+    }
+
+    @Test
+    fun changeLayoutContents_layout() {
+        benchmarkRule.toggleStateBenchmarkLayout(linearLayoutCaseFactory)
+    }
+
+    @Test
+    fun changeLayoutContents_draw() {
+        benchmarkRule.toggleStateBenchmarkDraw(linearLayoutCaseFactory)
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/WeightedLinearLayoutTestCase.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/WeightedLinearLayoutTestCase.kt
new file mode 100644
index 0000000..0177e2e
--- /dev/null
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/view/WeightedLinearLayoutTestCase.kt
@@ -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.compose.foundation.layout.benchmark.view
+
+import android.app.Activity
+import android.graphics.Color
+import android.view.View
+import android.view.ViewGroup
+import android.widget.LinearLayout
+import androidx.compose.testutils.ToggleableTestCase
+import androidx.compose.testutils.benchmark.android.AndroidTestCase
+
+class WeightedLinearLayoutTestCase(
+    private val subLayouts: Int,
+    private val numberOfBoxes: Int
+) : AndroidTestCase, ToggleableTestCase {
+
+    private val rows = mutableListOf<LinearLayout>()
+    private var isToggled = false
+    private var linearLayout: LinearLayout? = null
+    override fun getContent(activity: Activity): ViewGroup {
+        val mainLayout = LinearLayout(activity).also { linearLayout = it }
+        mainLayout.orientation = LinearLayout.VERTICAL
+        mainLayout.layoutParams = ViewGroup.LayoutParams(
+            ViewGroup.LayoutParams.MATCH_PARENT,
+            ViewGroup.LayoutParams.MATCH_PARENT
+        )
+
+        repeat(subLayouts) {
+            val row = LinearLayout(activity)
+            row.orientation = LinearLayout.HORIZONTAL
+            row.layoutParams = LinearLayout.LayoutParams(
+                ViewGroup.LayoutParams.MATCH_PARENT,
+                ViewGroup.LayoutParams.WRAP_CONTENT,
+                1 / subLayouts.toFloat()
+            )
+
+            repeat(numberOfBoxes) {
+                val box = View(activity)
+                box.setBackgroundColor(Color.BLUE)
+                box.layoutParams = LinearLayout.LayoutParams(
+                    ViewGroup.LayoutParams.WRAP_CONTENT,
+                    ViewGroup.LayoutParams.WRAP_CONTENT,
+                    1 / numberOfBoxes.toFloat()
+                )
+                row.addView(box)
+            }
+            rows += row
+            mainLayout.addView(row)
+        }
+        return mainLayout
+    }
+
+    override fun toggleState() {
+        if (!isToggled) {
+            linearLayout?.removeView(rows.last())
+            isToggled = true
+        } else {
+            linearLayout?.addView(rows.last())
+            isToggled = false
+        }
+    }
+}
\ 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/RtlDemo.kt b/compose/foundation/foundation-layout/integration-tests/layout-demos/src/main/java/androidx/compose/foundation/layout/demos/RtlDemo.kt
index adb9dbe..2b42b77 100644
--- a/compose/foundation/foundation-layout/integration-tests/layout-demos/src/main/java/androidx/compose/foundation/layout/demos/RtlDemo.kt
+++ b/compose/foundation/foundation-layout/integration-tests/layout-demos/src/main/java/androidx/compose/foundation/layout/demos/RtlDemo.kt
@@ -24,10 +24,15 @@
 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.foundation.layout.size
 import androidx.compose.foundation.layout.wrapContentHeight
 import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.material.Icon
+import androidx.compose.material.IconButton
 import androidx.compose.material.Text
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Info
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.ui.Alignment
@@ -42,6 +47,14 @@
 @Composable
 fun RtlDemo() {
     Column(verticalArrangement = Arrangement.SpaceEvenly) {
+        CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
+            Text("RTL")
+            TestPlacementInLimitedSpace()
+        }
+        CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Ltr) {
+            Text("LTR")
+            TestPlacementInLimitedSpace()
+        }
         Text("TEXT", Modifier.align(Alignment.CenterHorizontally))
         TestText()
         Text("ROW", Modifier.align(Alignment.CenterHorizontally))
@@ -74,6 +87,20 @@
 }
 
 @Composable
+private fun TestPlacementInLimitedSpace() {
+    Row(modifier = Modifier.fillMaxWidth()) {
+        Box(modifier = Modifier.padding(12.dp).size(56.dp).background(Color.Yellow)) {
+            IconButton( // adds minimumTouchTargetSize
+                modifier = Modifier.padding(horizontal = 12.dp),
+                onClick = { }
+            ) {
+                Icon(Icons.Filled.Info, null)
+            }
+        }
+    }
+}
+
+@Composable
 fun StackExample() {
     Box(Modifier.fillMaxSize().background(Color.LightGray)) {
         Box(Modifier.fillMaxSize().wrapContentSize(Alignment.TopStart)) {
diff --git a/compose/foundation/foundation/api/1.3.0-beta01.txt b/compose/foundation/foundation/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..963ea75
--- /dev/null
+++ b/compose/foundation/foundation/api/1.3.0-beta01.txt
@@ -0,0 +1,1092 @@
+// 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 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 Clickable_androidKt {
+  }
+
+  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 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);
+  }
+
+  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 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);
+  }
+
+  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 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();
+    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 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);
+  }
+
+  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 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);
+  }
+
+  public final class TempListUtilsKt {
+  }
+
+}
+
+package androidx.compose.foundation.gestures {
+
+  public final class AndroidScrollable_androidKt {
+  }
+
+  public final class DragGestureDetectorKt {
+    method public static suspend Object? awaitDragOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    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, androidx.compose.ui.input.pointer.PointerInputChange initialDown, 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? 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 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 abstract boolean isScrollInProgress;
+  }
+
+  public final class ScrollableStateKt {
+    method public static androidx.compose.foundation.gestures.ScrollableState ScrollableState(kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> consumeScrollDelta);
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.gestures.ScrollableState rememberScrollableState(kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> consumeScrollDelta);
+  }
+
+  public final class TapGestureDetectorKt {
+    method public static suspend Object? awaitFirstDown(androidx.compose.ui.input.pointer.AwaitPointerEventScope, optional boolean requireUnconsumed, optional kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    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, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+  }
+
+  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 {
+  }
+
+  public final class SnapFlingBehaviorKt {
+  }
+
+}
+
+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.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);
+    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 final class LazyListHeadersKt {
+  }
+
+  public interface LazyListItemInfo {
+    method public int getIndex();
+    method public Object getKey();
+    method public int getOffset();
+    method public int getSize();
+    property public abstract int index;
+    property public abstract Object key;
+    property public abstract int offset;
+    property public abstract int size;
+  }
+
+  public final class 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();
+    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 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;
+  }
+
+  public final class LazyListMeasureKt {
+  }
+
+  public final class LazyListPinningModifierKt {
+  }
+
+  @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);
+  }
+
+  public final class LazyListScrollingKt {
+  }
+
+  @androidx.compose.runtime.Stable public final class LazyListState implements androidx.compose.foundation.gestures.ScrollableState {
+    ctor public LazyListState(optional int firstVisibleItemIndex, optional int firstVisibleItemScrollOffset);
+    method public suspend Object? animateScrollToItem(int index, optional int scrollOffset, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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 final int firstVisibleItemIndex;
+    property public final int firstVisibleItemScrollOffset;
+    property public final androidx.compose.foundation.interaction.InteractionSource interactionSource;
+    property public boolean isScrollInProgress;
+    property public final androidx.compose.foundation.lazy.LazyListLayoutInfo layoutInfo;
+    field public static final androidx.compose.foundation.lazy.LazyListState.Companion Companion;
+  }
+
+  public static final class LazyListState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.lazy.LazyListState,?> getSaver();
+    property public final androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.lazy.LazyListState,?> Saver;
+  }
+
+  public final class LazyListStateKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.lazy.LazyListState rememberLazyListState(optional int initialFirstVisibleItemIndex, optional int initialFirstVisibleItemScrollOffset);
+  }
+
+  @kotlin.DslMarker public @interface LazyScopeMarker {
+  }
+
+  public final class LazySemanticsKt {
+  }
+
+}
+
+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 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
+  }
+
+  public final class LazyGridItemPlacementAnimatorKt {
+  }
+
+  public final class LazyGridItemProviderKt {
+  }
+
+  @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 final class LazyGridKt {
+  }
+
+  public sealed interface LazyGridLayoutInfo {
+    method public int getAfterContentPadding();
+    method public int getBeforeContentPadding();
+    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 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;
+  }
+
+  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);
+  }
+
+  @kotlin.DslMarker public @interface LazyGridScopeMarker {
+  }
+
+  public final class LazyGridScrollingKt {
+  }
+
+  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 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);
+  }
+
+  public final class LazySemanticsKt {
+  }
+
+}
+
+package androidx.compose.foundation.lazy.layout {
+
+  public final class IntervalListKt {
+  }
+
+  public final class LazyLayoutItemProviderKt {
+  }
+
+  public final class LazyLayoutKt {
+  }
+
+  public final class LazyLayoutPrefetcher_androidKt {
+  }
+
+  public final class LazyNearestItemsRangeKt {
+  }
+
+  public final class Lazy_androidKt {
+  }
+
+  public final class PinnableParentKt {
+  }
+
+}
+
+package androidx.compose.foundation.lazy.staggeredgrid {
+
+  public final class LazyStaggeredGridDslKt {
+  }
+
+  public final class LazyStaggeredGridItemProviderKt {
+  }
+
+  public final class LazyStaggeredGridKt {
+  }
+
+  public final class LazyStaggeredGridMeasureKt {
+  }
+
+}
+
+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 {
+
+  public final class SelectableGroupKt {
+    method public static androidx.compose.ui.Modifier selectableGroup(androidx.compose.ui.Modifier);
+  }
+
+  public final class SelectableKt {
+    method public static androidx.compose.ui.Modifier selectable(androidx.compose.ui.Modifier, boolean selected, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static androidx.compose.ui.Modifier selectable(androidx.compose.ui.Modifier, boolean selected, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+  }
+
+  public final class ToggleableKt {
+    method public static androidx.compose.ui.Modifier toggleable(androidx.compose.ui.Modifier, boolean value, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange);
+    method public static androidx.compose.ui.Modifier toggleable(androidx.compose.ui.Modifier, boolean value, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange);
+    method public static androidx.compose.ui.Modifier triStateToggleable(androidx.compose.ui.Modifier, androidx.compose.ui.state.ToggleableState state, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static androidx.compose.ui.Modifier triStateToggleable(androidx.compose.ui.Modifier, androidx.compose.ui.state.ToggleableState state, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+  }
+
+}
+
+package androidx.compose.foundation.shape {
+
+  public final class AbsoluteCutCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public AbsoluteCutCornerShape(androidx.compose.foundation.shape.CornerSize topLeft, androidx.compose.foundation.shape.CornerSize topRight, androidx.compose.foundation.shape.CornerSize bottomRight, androidx.compose.foundation.shape.CornerSize bottomLeft);
+    method public androidx.compose.foundation.shape.AbsoluteCutCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class AbsoluteCutCornerShapeKt {
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(optional int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+  }
+
+  public final class AbsoluteRoundedCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public AbsoluteRoundedCornerShape(androidx.compose.foundation.shape.CornerSize topLeft, androidx.compose.foundation.shape.CornerSize topRight, androidx.compose.foundation.shape.CornerSize bottomRight, androidx.compose.foundation.shape.CornerSize bottomLeft);
+    method public androidx.compose.foundation.shape.AbsoluteRoundedCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class AbsoluteRoundedCornerShapeKt {
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(optional int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+  }
+
+  public abstract class CornerBasedShape implements androidx.compose.ui.graphics.Shape {
+    ctor public CornerBasedShape(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public abstract androidx.compose.foundation.shape.CornerBasedShape copy(optional androidx.compose.foundation.shape.CornerSize topStart, optional androidx.compose.foundation.shape.CornerSize topEnd, optional androidx.compose.foundation.shape.CornerSize bottomEnd, optional androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public final androidx.compose.foundation.shape.CornerBasedShape copy(androidx.compose.foundation.shape.CornerSize all);
+    method public final androidx.compose.ui.graphics.Outline createOutline(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+    method public abstract androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public final androidx.compose.foundation.shape.CornerSize getBottomEnd();
+    method public final androidx.compose.foundation.shape.CornerSize getBottomStart();
+    method public final androidx.compose.foundation.shape.CornerSize getTopEnd();
+    method public final androidx.compose.foundation.shape.CornerSize getTopStart();
+    property public final androidx.compose.foundation.shape.CornerSize bottomEnd;
+    property public final androidx.compose.foundation.shape.CornerSize bottomStart;
+    property public final androidx.compose.foundation.shape.CornerSize topEnd;
+    property public final androidx.compose.foundation.shape.CornerSize topStart;
+  }
+
+  @androidx.compose.runtime.Immutable public interface CornerSize {
+    method public float toPx(long shapeSize, androidx.compose.ui.unit.Density density);
+  }
+
+  public final class CornerSizeKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(int percent);
+    method public static androidx.compose.foundation.shape.CornerSize getZeroCornerSize();
+    property public static final androidx.compose.foundation.shape.CornerSize ZeroCornerSize;
+  }
+
+  public final class CutCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public CutCornerShape(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.foundation.shape.CutCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class CutCornerShapeKt {
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(optional int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+  }
+
+  public final class GenericShape implements androidx.compose.ui.graphics.Shape {
+    ctor public GenericShape(kotlin.jvm.functions.Function3<? super androidx.compose.ui.graphics.Path,? super androidx.compose.ui.geometry.Size,? super androidx.compose.ui.unit.LayoutDirection,kotlin.Unit> builder);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+  }
+
+  public final class RoundedCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public RoundedCornerShape(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.foundation.shape.RoundedCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class RoundedCornerShapeKt {
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape getCircleShape();
+    property public static final androidx.compose.foundation.shape.RoundedCornerShape CircleShape;
+  }
+
+}
+
+package androidx.compose.foundation.text {
+
+  public final class AndroidCursorHandle_androidKt {
+  }
+
+  public final class BasicTextFieldKt {
+    method @androidx.compose.runtime.Composable public static void BasicTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Brush cursorBrush, optional kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> decorationBox);
+    method @androidx.compose.runtime.Composable public static void BasicTextField(androidx.compose.ui.text.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.TextFieldValue,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Brush cursorBrush, optional kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> decorationBox);
+  }
+
+  public final class BasicTextKt {
+    method @androidx.compose.runtime.Composable public static void BasicText(String text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional int overflow, optional boolean softWrap, optional int maxLines);
+    method @androidx.compose.runtime.Composable public static void BasicText(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.Map<java.lang.String,androidx.compose.foundation.text.InlineTextContent> inlineContent);
+  }
+
+  public final class ClickableTextKt {
+    method @androidx.compose.runtime.Composable public static void ClickableText(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional boolean softWrap, optional int overflow, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
+  }
+
+  public final class ContextMenu_androidKt {
+  }
+
+  public final class CoreTextFieldKt {
+  }
+
+  public final class CoreTextKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class InlineTextContent {
+    ctor public InlineTextContent(androidx.compose.ui.text.Placeholder placeholder, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> children);
+    method public kotlin.jvm.functions.Function1<java.lang.String,kotlin.Unit> getChildren();
+    method public androidx.compose.ui.text.Placeholder getPlaceholder();
+    property public final kotlin.jvm.functions.Function1<java.lang.String,kotlin.Unit> children;
+    property public final androidx.compose.ui.text.Placeholder placeholder;
+  }
+
+  public final class InlineTextContentKt {
+    method public static void appendInlineContent(androidx.compose.ui.text.AnnotatedString.Builder, String id, optional String alternateText);
+  }
+
+  public final class KeyEventHelpers_androidKt {
+  }
+
+  public final class KeyMappingKt {
+  }
+
+  public final class KeyMapping_androidKt {
+  }
+
+  public interface KeyboardActionScope {
+    method public void defaultKeyboardAction(int imeAction);
+  }
+
+  public final class KeyboardActions {
+    ctor public KeyboardActions(optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onDone, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onGo, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onNext, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onPrevious, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSearch, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSend);
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnDone();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnGo();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnNext();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnPrevious();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnSearch();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnSend();
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onDone;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onGo;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onNext;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onPrevious;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSearch;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSend;
+    field public static final androidx.compose.foundation.text.KeyboardActions.Companion Companion;
+  }
+
+  public static final class KeyboardActions.Companion {
+    method public androidx.compose.foundation.text.KeyboardActions getDefault();
+    property public final androidx.compose.foundation.text.KeyboardActions Default;
+  }
+
+  public final class KeyboardActionsKt {
+    method public static androidx.compose.foundation.text.KeyboardActions KeyboardActions(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit> onAny);
+  }
+
+  @androidx.compose.runtime.Immutable public final class KeyboardOptions {
+    ctor public KeyboardOptions(optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public androidx.compose.foundation.text.KeyboardOptions copy(optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public boolean getAutoCorrect();
+    method public int getCapitalization();
+    method public int getImeAction();
+    method public int getKeyboardType();
+    property public final boolean autoCorrect;
+    property public final int capitalization;
+    property public final int imeAction;
+    property public final int keyboardType;
+    field public static final androidx.compose.foundation.text.KeyboardOptions.Companion Companion;
+  }
+
+  public static final class KeyboardOptions.Companion {
+    method public androidx.compose.foundation.text.KeyboardOptions getDefault();
+    property public final androidx.compose.foundation.text.KeyboardOptions Default;
+  }
+
+  public final class LongPressTextDragObserverKt {
+  }
+
+  public final class MaxLinesHeightModifierKt {
+  }
+
+  public final class StringHelpersKt {
+  }
+
+  public final class StringHelpers_androidKt {
+  }
+
+  public final class StringHelpers_jvmKt {
+  }
+
+  public final class TextDelegateKt {
+  }
+
+  public final class TextFieldCursorKt {
+  }
+
+  public final class TextFieldDelegateKt {
+  }
+
+  public final class TextFieldGestureModifiersKt {
+  }
+
+  public final class TextFieldKeyInputKt {
+  }
+
+  public final class TextFieldKeyInput_androidKt {
+  }
+
+  public final class TextFieldPressGestureFilterKt {
+  }
+
+  public final class TextFieldScrollKt {
+  }
+
+  public final class TextFieldSizeKt {
+  }
+
+  public final class TextLayoutHelperKt {
+  }
+
+  public final class TextLayoutResultProxyKt {
+  }
+
+  public final class TextPointerIcon_androidKt {
+  }
+
+  public final class TouchMode_androidKt {
+  }
+
+  public final class UndoManagerKt {
+  }
+
+  public final class UndoManager_jvmKt {
+  }
+
+  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();
+    method public long getHandleColor();
+    property public final long backgroundColor;
+    property public final long handleColor;
+  }
+
+  public final class TextSelectionColorsKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> getLocalTextSelectionColors();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> LocalTextSelectionColors;
+  }
+
+  public final class TextSelectionDelegateKt {
+  }
+
+  public final class TextSelectionMouseDetectorKt {
+  }
+
+}
+
diff --git a/compose/foundation/foundation/api/current.txt b/compose/foundation/foundation/api/current.txt
index 9de6783..963ea75 100644
--- a/compose/foundation/foundation/api/current.txt
+++ b/compose/foundation/foundation/api/current.txt
@@ -170,6 +170,7 @@
     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, androidx.compose.ui.input.pointer.PointerInputChange initialDown, 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>);
@@ -296,6 +297,16 @@
 
 }
 
+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 {
@@ -697,6 +708,22 @@
 
 }
 
+package androidx.compose.foundation.lazy.staggeredgrid {
+
+  public final class LazyStaggeredGridDslKt {
+  }
+
+  public final class LazyStaggeredGridItemProviderKt {
+  }
+
+  public final class LazyStaggeredGridKt {
+  }
+
+  public final class LazyStaggeredGridMeasureKt {
+  }
+
+}
+
 package androidx.compose.foundation.relocation {
 
   public final class BringIntoViewKt {
diff --git a/compose/foundation/foundation/api/public_plus_experimental_1.3.0-beta01.txt b/compose/foundation/foundation/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..76239a6
--- /dev/null
+++ b/compose/foundation/foundation/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,1257 @@
+// 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 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 Clickable_androidKt {
+  }
+
+  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 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);
+  }
+
+  @kotlin.RequiresOptIn(message="This foundation API is experimental and is likely to change or be removed in the " + "future.") public @interface ExperimentalFoundationApi {
+  }
+
+  public final class FocusableKt {
+    method @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.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;
+  }
+
+  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? consumePostFling(long velocity, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public void consumePostScroll(long initialDragDelta, long overscrollDelta, int source);
+    method public suspend Object? consumePreFling(long velocity, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity>);
+    method public long consumePreScroll(long scrollDelta, int source);
+    method public androidx.compose.ui.Modifier getEffectModifier();
+    method public boolean isEnabled();
+    method public boolean isInProgress();
+    method public void setEnabled(boolean);
+    property public abstract androidx.compose.ui.Modifier effectModifier;
+    property public abstract boolean isEnabled;
+    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 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);
+  }
+
+  public final class TempListUtilsKt {
+  }
+
+}
+
+package androidx.compose.foundation.gestures {
+
+  public final class AndroidScrollable_androidKt {
+  }
+
+  public final class DragGestureDetectorKt {
+    method public static suspend Object? awaitDragOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    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, androidx.compose.ui.input.pointer.PointerInputChange initialDown, 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? 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 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 abstract boolean isScrollInProgress;
+  }
+
+  public final class ScrollableStateKt {
+    method public static androidx.compose.foundation.gestures.ScrollableState ScrollableState(kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> consumeScrollDelta);
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.gestures.ScrollableState rememberScrollableState(kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> consumeScrollDelta);
+  }
+
+  public final class TapGestureDetectorKt {
+    method public static suspend Object? awaitFirstDown(androidx.compose.ui.input.pointer.AwaitPointerEventScope, optional boolean requireUnconsumed, optional kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    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, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+  }
+
+  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.Function2<? super java.lang.Float,? super java.lang.Float,java.lang.Float> positionInLayout);
+  }
+
+  public final class SnapFlingBehaviorKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static androidx.compose.foundation.gestures.FlingBehavior rememberSnapFlingBehavior(androidx.compose.foundation.gestures.snapping.SnapLayoutInfoProvider snapLayoutInfoProvider, optional androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float> approachAnimationSpec, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> snapAnimationSpec);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.foundation.gestures.FlingBehavior snapFlingBehavior(androidx.compose.foundation.gestures.snapping.SnapLayoutInfoProvider snapLayoutInfoProvider, androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float> approachAnimationSpec, androidx.compose.animation.core.AnimationSpec<java.lang.Float> snapAnimationSpec, androidx.compose.ui.unit.Density density, optional float shortSnapVelocityThreshold);
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public interface SnapLayoutInfoProvider {
+    method public float calculateApproachOffset(float initialVelocity);
+    method public kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> calculateSnappingOffsetBounds();
+    method public float getSnapStepSize();
+    property public abstract float snapStepSize;
+  }
+
+}
+
+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.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);
+    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);
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public final class LazyListDefaults {
+    method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public androidx.compose.foundation.gestures.FlingBehavior snapFlingBehavior(androidx.compose.foundation.lazy.LazyListState lazyListState);
+    field public static final androidx.compose.foundation.lazy.LazyListDefaults INSTANCE;
+  }
+
+  public final class LazyListHeadersKt {
+  }
+
+  public interface LazyListItemInfo {
+    method public int getIndex();
+    method public Object getKey();
+    method public int getOffset();
+    method public int getSize();
+    property public abstract int index;
+    property public abstract Object key;
+    property public abstract int offset;
+    property public abstract int size;
+  }
+
+  public final class 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();
+    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 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;
+  }
+
+  public final class LazyListMeasureKt {
+  }
+
+  public final class LazyListPinningModifierKt {
+  }
+
+  @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);
+  }
+
+  public final class LazyListScrollingKt {
+  }
+
+  @androidx.compose.runtime.Stable public final class LazyListState implements androidx.compose.foundation.gestures.ScrollableState {
+    ctor public LazyListState(optional int firstVisibleItemIndex, optional int firstVisibleItemScrollOffset);
+    method public suspend Object? animateScrollToItem(int index, optional int scrollOffset, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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 final int firstVisibleItemIndex;
+    property public final int firstVisibleItemScrollOffset;
+    property public final androidx.compose.foundation.interaction.InteractionSource interactionSource;
+    property public boolean isScrollInProgress;
+    property public final androidx.compose.foundation.lazy.LazyListLayoutInfo layoutInfo;
+    field public static final androidx.compose.foundation.lazy.LazyListState.Companion Companion;
+  }
+
+  public static final class LazyListState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.lazy.LazyListState,?> getSaver();
+    property public final androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.lazy.LazyListState,?> Saver;
+  }
+
+  public final class LazyListStateKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.lazy.LazyListState rememberLazyListState(optional int initialFirstVisibleItemIndex, optional int initialFirstVisibleItemScrollOffset);
+  }
+
+  @kotlin.DslMarker public @interface LazyScopeMarker {
+  }
+
+  public final class LazySemanticsKt {
+  }
+
+}
+
+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 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
+  }
+
+  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);
+  }
+
+  @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 final class LazyGridKt {
+  }
+
+  public sealed interface LazyGridLayoutInfo {
+    method public int getAfterContentPadding();
+    method public int getBeforeContentPadding();
+    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 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;
+  }
+
+  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);
+  }
+
+  @kotlin.DslMarker public @interface LazyGridScopeMarker {
+  }
+
+  public final class LazyGridScrollingKt {
+  }
+
+  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 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);
+  }
+
+  public final class LazySemanticsKt {
+  }
+
+}
+
+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;
+  }
+
+  public final class IntervalListKt {
+  }
+
+  @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 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 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);
+  }
+
+  @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 LazyLayoutPrefetcher_androidKt {
+  }
+
+  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;
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public interface PinnableParent {
+    method public androidx.compose.foundation.lazy.layout.PinnableParent.PinnedItemsHandle pinItems();
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public static interface PinnableParent.PinnedItemsHandle {
+    method public void unpin();
+  }
+
+  public final class PinnableParentKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.ui.modifier.ProvidableModifierLocal<androidx.compose.foundation.lazy.layout.PinnableParent> getModifierLocalPinnableParent();
+    property @androidx.compose.foundation.ExperimentalFoundationApi public static final androidx.compose.ui.modifier.ProvidableModifierLocal<androidx.compose.foundation.lazy.layout.PinnableParent> ModifierLocalPinnableParent;
+  }
+
+}
+
+package androidx.compose.foundation.lazy.staggeredgrid {
+
+  public final class LazyStaggeredGridDslKt {
+  }
+
+  public final class LazyStaggeredGridItemProviderKt {
+  }
+
+  public final class LazyStaggeredGridKt {
+  }
+
+  public final class LazyStaggeredGridMeasureKt {
+  }
+
+}
+
+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>);
+  }
+
+  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(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);
+  }
+
+  public final class BringIntoViewResponder_androidKt {
+  }
+
+}
+
+package androidx.compose.foundation.selection {
+
+  public final class SelectableGroupKt {
+    method public static androidx.compose.ui.Modifier selectableGroup(androidx.compose.ui.Modifier);
+  }
+
+  public final class SelectableKt {
+    method public static androidx.compose.ui.Modifier selectable(androidx.compose.ui.Modifier, boolean selected, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static androidx.compose.ui.Modifier selectable(androidx.compose.ui.Modifier, boolean selected, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+  }
+
+  public final class ToggleableKt {
+    method public static androidx.compose.ui.Modifier toggleable(androidx.compose.ui.Modifier, boolean value, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange);
+    method public static androidx.compose.ui.Modifier toggleable(androidx.compose.ui.Modifier, boolean value, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange);
+    method public static androidx.compose.ui.Modifier triStateToggleable(androidx.compose.ui.Modifier, androidx.compose.ui.state.ToggleableState state, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static androidx.compose.ui.Modifier triStateToggleable(androidx.compose.ui.Modifier, androidx.compose.ui.state.ToggleableState state, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+  }
+
+}
+
+package androidx.compose.foundation.shape {
+
+  public final class AbsoluteCutCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public AbsoluteCutCornerShape(androidx.compose.foundation.shape.CornerSize topLeft, androidx.compose.foundation.shape.CornerSize topRight, androidx.compose.foundation.shape.CornerSize bottomRight, androidx.compose.foundation.shape.CornerSize bottomLeft);
+    method public androidx.compose.foundation.shape.AbsoluteCutCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class AbsoluteCutCornerShapeKt {
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(optional int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+  }
+
+  public final class AbsoluteRoundedCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public AbsoluteRoundedCornerShape(androidx.compose.foundation.shape.CornerSize topLeft, androidx.compose.foundation.shape.CornerSize topRight, androidx.compose.foundation.shape.CornerSize bottomRight, androidx.compose.foundation.shape.CornerSize bottomLeft);
+    method public androidx.compose.foundation.shape.AbsoluteRoundedCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class AbsoluteRoundedCornerShapeKt {
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(optional int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+  }
+
+  public abstract class CornerBasedShape implements androidx.compose.ui.graphics.Shape {
+    ctor public CornerBasedShape(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public abstract androidx.compose.foundation.shape.CornerBasedShape copy(optional androidx.compose.foundation.shape.CornerSize topStart, optional androidx.compose.foundation.shape.CornerSize topEnd, optional androidx.compose.foundation.shape.CornerSize bottomEnd, optional androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public final androidx.compose.foundation.shape.CornerBasedShape copy(androidx.compose.foundation.shape.CornerSize all);
+    method public final androidx.compose.ui.graphics.Outline createOutline(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+    method public abstract androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public final androidx.compose.foundation.shape.CornerSize getBottomEnd();
+    method public final androidx.compose.foundation.shape.CornerSize getBottomStart();
+    method public final androidx.compose.foundation.shape.CornerSize getTopEnd();
+    method public final androidx.compose.foundation.shape.CornerSize getTopStart();
+    property public final androidx.compose.foundation.shape.CornerSize bottomEnd;
+    property public final androidx.compose.foundation.shape.CornerSize bottomStart;
+    property public final androidx.compose.foundation.shape.CornerSize topEnd;
+    property public final androidx.compose.foundation.shape.CornerSize topStart;
+  }
+
+  @androidx.compose.runtime.Immutable public interface CornerSize {
+    method public float toPx(long shapeSize, androidx.compose.ui.unit.Density density);
+  }
+
+  public final class CornerSizeKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(int percent);
+    method public static androidx.compose.foundation.shape.CornerSize getZeroCornerSize();
+    property public static final androidx.compose.foundation.shape.CornerSize ZeroCornerSize;
+  }
+
+  public final class CutCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public CutCornerShape(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.foundation.shape.CutCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class CutCornerShapeKt {
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(optional int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+  }
+
+  public final class GenericShape implements androidx.compose.ui.graphics.Shape {
+    ctor public GenericShape(kotlin.jvm.functions.Function3<? super androidx.compose.ui.graphics.Path,? super androidx.compose.ui.geometry.Size,? super androidx.compose.ui.unit.LayoutDirection,kotlin.Unit> builder);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+  }
+
+  public final class RoundedCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public RoundedCornerShape(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.foundation.shape.RoundedCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class RoundedCornerShapeKt {
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape getCircleShape();
+    property public static final androidx.compose.foundation.shape.RoundedCornerShape CircleShape;
+  }
+
+}
+
+package androidx.compose.foundation.text {
+
+  public final class AndroidCursorHandle_androidKt {
+  }
+
+  public final class BasicTextFieldKt {
+    method @androidx.compose.runtime.Composable public static void BasicTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Brush cursorBrush, optional kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> decorationBox);
+    method @androidx.compose.runtime.Composable public static void BasicTextField(androidx.compose.ui.text.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.TextFieldValue,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Brush cursorBrush, optional kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> decorationBox);
+  }
+
+  public final class BasicTextKt {
+    method @androidx.compose.runtime.Composable public static void BasicText(String text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional int overflow, optional boolean softWrap, optional int maxLines);
+    method @androidx.compose.runtime.Composable public static void BasicText(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.Map<java.lang.String,androidx.compose.foundation.text.InlineTextContent> inlineContent);
+  }
+
+  public final class ClickableTextKt {
+    method @androidx.compose.runtime.Composable public static void ClickableText(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional boolean softWrap, optional int overflow, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
+  }
+
+  public final class ContextMenu_androidKt {
+  }
+
+  public final class CoreTextFieldKt {
+  }
+
+  public final class CoreTextKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class InlineTextContent {
+    ctor public InlineTextContent(androidx.compose.ui.text.Placeholder placeholder, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> children);
+    method public kotlin.jvm.functions.Function1<java.lang.String,kotlin.Unit> getChildren();
+    method public androidx.compose.ui.text.Placeholder getPlaceholder();
+    property public final kotlin.jvm.functions.Function1<java.lang.String,kotlin.Unit> children;
+    property public final androidx.compose.ui.text.Placeholder placeholder;
+  }
+
+  public final class InlineTextContentKt {
+    method public static void appendInlineContent(androidx.compose.ui.text.AnnotatedString.Builder, String id, optional String alternateText);
+  }
+
+  @kotlin.RequiresOptIn(message="Internal/Unstable API for use only between foundation modules sharing " + "the same exact version, subject to change without notice.") @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.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);
+  }
+
+  public final class KeyboardActions {
+    ctor public KeyboardActions(optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onDone, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onGo, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onNext, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onPrevious, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSearch, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSend);
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnDone();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnGo();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnNext();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnPrevious();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnSearch();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnSend();
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onDone;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onGo;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onNext;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onPrevious;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSearch;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSend;
+    field public static final androidx.compose.foundation.text.KeyboardActions.Companion Companion;
+  }
+
+  public static final class KeyboardActions.Companion {
+    method public androidx.compose.foundation.text.KeyboardActions getDefault();
+    property public final androidx.compose.foundation.text.KeyboardActions Default;
+  }
+
+  public final class KeyboardActionsKt {
+    method public static androidx.compose.foundation.text.KeyboardActions KeyboardActions(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit> onAny);
+  }
+
+  @androidx.compose.runtime.Immutable public final class KeyboardOptions {
+    ctor public KeyboardOptions(optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public androidx.compose.foundation.text.KeyboardOptions copy(optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public boolean getAutoCorrect();
+    method public int getCapitalization();
+    method public int getImeAction();
+    method public int getKeyboardType();
+    property public final boolean autoCorrect;
+    property public final int capitalization;
+    property public final int imeAction;
+    property public final int keyboardType;
+    field public static final androidx.compose.foundation.text.KeyboardOptions.Companion Companion;
+  }
+
+  public static final class KeyboardOptions.Companion {
+    method public androidx.compose.foundation.text.KeyboardOptions getDefault();
+    property public final androidx.compose.foundation.text.KeyboardOptions Default;
+  }
+
+  public final class LongPressTextDragObserverKt {
+  }
+
+  public final class MaxLinesHeightModifierKt {
+  }
+
+  public final class StringHelpersKt {
+  }
+
+  public final class StringHelpers_androidKt {
+  }
+
+  public final class StringHelpers_jvmKt {
+  }
+
+  public final class TextDelegateKt {
+  }
+
+  public final class TextFieldCursorKt {
+  }
+
+  public final class TextFieldDelegateKt {
+  }
+
+  public final class TextFieldGestureModifiersKt {
+  }
+
+  public final class TextFieldKeyInputKt {
+  }
+
+  public final class TextFieldKeyInput_androidKt {
+  }
+
+  public final class TextFieldPressGestureFilterKt {
+  }
+
+  public final class TextFieldScrollKt {
+  }
+
+  public final class TextFieldSizeKt {
+  }
+
+  public final class TextLayoutHelperKt {
+  }
+
+  public final class TextLayoutResultProxyKt {
+  }
+
+  public final class TextPointerIcon_androidKt {
+  }
+
+  public final class TouchMode_androidKt {
+  }
+
+  public final class UndoManagerKt {
+  }
+
+  public final class UndoManager_jvmKt {
+  }
+
+  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();
+    method public long getHandleColor();
+    property public final long backgroundColor;
+    property public final long handleColor;
+  }
+
+  public final class TextSelectionColorsKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> getLocalTextSelectionColors();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> LocalTextSelectionColors;
+  }
+
+  public final class TextSelectionDelegateKt {
+  }
+
+  public final class TextSelectionMouseDetectorKt {
+  }
+
+}
+
diff --git a/compose/foundation/foundation/api/public_plus_experimental_current.txt b/compose/foundation/foundation/api/public_plus_experimental_current.txt
index aac4ae1..76239a6 100644
--- a/compose/foundation/foundation/api/public_plus_experimental_current.txt
+++ b/compose/foundation/foundation/api/public_plus_experimental_current.txt
@@ -153,9 +153,9 @@
 
   @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Stable public interface OverscrollEffect {
     method public suspend Object? consumePostFling(long velocity, kotlin.coroutines.Continuation<? super kotlin.Unit>);
-    method public void consumePostScroll(long initialDragDelta, long overscrollDelta, androidx.compose.ui.geometry.Offset? pointerPosition, int source);
+    method public void consumePostScroll(long initialDragDelta, long overscrollDelta, int source);
     method public suspend Object? consumePreFling(long velocity, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity>);
-    method public long consumePreScroll(long scrollDelta, androidx.compose.ui.geometry.Offset? pointerPosition, int source);
+    method public long consumePreScroll(long scrollDelta, int source);
     method public androidx.compose.ui.Modifier getEffectModifier();
     method public boolean isEnabled();
     method public boolean isInProgress();
@@ -221,6 +221,7 @@
     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, androidx.compose.ui.input.pointer.PointerInputChange initialDown, 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>);
@@ -349,6 +350,26 @@
 
 }
 
+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.Function2<? super java.lang.Float,? super java.lang.Float,java.lang.Float> positionInLayout);
+  }
+
+  public final class SnapFlingBehaviorKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static androidx.compose.foundation.gestures.FlingBehavior rememberSnapFlingBehavior(androidx.compose.foundation.gestures.snapping.SnapLayoutInfoProvider snapLayoutInfoProvider, optional androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float> approachAnimationSpec, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> snapAnimationSpec);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.foundation.gestures.FlingBehavior snapFlingBehavior(androidx.compose.foundation.gestures.snapping.SnapLayoutInfoProvider snapLayoutInfoProvider, androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float> approachAnimationSpec, androidx.compose.animation.core.AnimationSpec<java.lang.Float> snapAnimationSpec, androidx.compose.ui.unit.Density density, optional float shortSnapVelocityThreshold);
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public interface SnapLayoutInfoProvider {
+    method public float calculateApproachOffset(float initialVelocity);
+    method public kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> calculateSnappingOffsetBounds();
+    method public float getSnapStepSize();
+    property public abstract float snapStepSize;
+  }
+
+}
+
 package androidx.compose.foundation.interaction {
 
   public interface DragInteraction extends androidx.compose.foundation.interaction.Interaction {
@@ -486,6 +507,11 @@
     method public androidx.compose.ui.Modifier fillParentMaxWidth(androidx.compose.ui.Modifier, optional float fraction);
   }
 
+  @androidx.compose.foundation.ExperimentalFoundationApi public final class LazyListDefaults {
+    method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public androidx.compose.foundation.gestures.FlingBehavior snapFlingBehavior(androidx.compose.foundation.lazy.LazyListState lazyListState);
+    field public static final androidx.compose.foundation.lazy.LazyListDefaults INSTANCE;
+  }
+
   public final class LazyListHeadersKt {
   }
 
@@ -832,6 +858,22 @@
 
 }
 
+package androidx.compose.foundation.lazy.staggeredgrid {
+
+  public final class LazyStaggeredGridDslKt {
+  }
+
+  public final class LazyStaggeredGridItemProviderKt {
+  }
+
+  public final class LazyStaggeredGridKt {
+  }
+
+  public final class LazyStaggeredGridMeasureKt {
+  }
+
+}
+
 package androidx.compose.foundation.relocation {
 
   public final class BringIntoViewKt {
diff --git a/health/health-connect-client/api/res-current.txt b/compose/foundation/foundation/api/res-1.3.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/foundation/foundation/api/res-1.3.0-beta01.txt
diff --git a/compose/foundation/foundation/api/restricted_1.3.0-beta01.txt b/compose/foundation/foundation/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..963ea75
--- /dev/null
+++ b/compose/foundation/foundation/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,1092 @@
+// 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 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 Clickable_androidKt {
+  }
+
+  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 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);
+  }
+
+  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 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);
+  }
+
+  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 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();
+    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 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);
+  }
+
+  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 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);
+  }
+
+  public final class TempListUtilsKt {
+  }
+
+}
+
+package androidx.compose.foundation.gestures {
+
+  public final class AndroidScrollable_androidKt {
+  }
+
+  public final class DragGestureDetectorKt {
+    method public static suspend Object? awaitDragOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    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, androidx.compose.ui.input.pointer.PointerInputChange initialDown, 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? 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 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 abstract boolean isScrollInProgress;
+  }
+
+  public final class ScrollableStateKt {
+    method public static androidx.compose.foundation.gestures.ScrollableState ScrollableState(kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> consumeScrollDelta);
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.gestures.ScrollableState rememberScrollableState(kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> consumeScrollDelta);
+  }
+
+  public final class TapGestureDetectorKt {
+    method public static suspend Object? awaitFirstDown(androidx.compose.ui.input.pointer.AwaitPointerEventScope, optional boolean requireUnconsumed, optional kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    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, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+  }
+
+  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 {
+  }
+
+  public final class SnapFlingBehaviorKt {
+  }
+
+}
+
+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.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);
+    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 final class LazyListHeadersKt {
+  }
+
+  public interface LazyListItemInfo {
+    method public int getIndex();
+    method public Object getKey();
+    method public int getOffset();
+    method public int getSize();
+    property public abstract int index;
+    property public abstract Object key;
+    property public abstract int offset;
+    property public abstract int size;
+  }
+
+  public final class 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();
+    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 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;
+  }
+
+  public final class LazyListMeasureKt {
+  }
+
+  public final class LazyListPinningModifierKt {
+  }
+
+  @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);
+  }
+
+  public final class LazyListScrollingKt {
+  }
+
+  @androidx.compose.runtime.Stable public final class LazyListState implements androidx.compose.foundation.gestures.ScrollableState {
+    ctor public LazyListState(optional int firstVisibleItemIndex, optional int firstVisibleItemScrollOffset);
+    method public suspend Object? animateScrollToItem(int index, optional int scrollOffset, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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 final int firstVisibleItemIndex;
+    property public final int firstVisibleItemScrollOffset;
+    property public final androidx.compose.foundation.interaction.InteractionSource interactionSource;
+    property public boolean isScrollInProgress;
+    property public final androidx.compose.foundation.lazy.LazyListLayoutInfo layoutInfo;
+    field public static final androidx.compose.foundation.lazy.LazyListState.Companion Companion;
+  }
+
+  public static final class LazyListState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.lazy.LazyListState,?> getSaver();
+    property public final androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.lazy.LazyListState,?> Saver;
+  }
+
+  public final class LazyListStateKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.lazy.LazyListState rememberLazyListState(optional int initialFirstVisibleItemIndex, optional int initialFirstVisibleItemScrollOffset);
+  }
+
+  @kotlin.DslMarker public @interface LazyScopeMarker {
+  }
+
+  public final class LazySemanticsKt {
+  }
+
+}
+
+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 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
+  }
+
+  public final class LazyGridItemPlacementAnimatorKt {
+  }
+
+  public final class LazyGridItemProviderKt {
+  }
+
+  @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 final class LazyGridKt {
+  }
+
+  public sealed interface LazyGridLayoutInfo {
+    method public int getAfterContentPadding();
+    method public int getBeforeContentPadding();
+    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 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;
+  }
+
+  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);
+  }
+
+  @kotlin.DslMarker public @interface LazyGridScopeMarker {
+  }
+
+  public final class LazyGridScrollingKt {
+  }
+
+  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 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);
+  }
+
+  public final class LazySemanticsKt {
+  }
+
+}
+
+package androidx.compose.foundation.lazy.layout {
+
+  public final class IntervalListKt {
+  }
+
+  public final class LazyLayoutItemProviderKt {
+  }
+
+  public final class LazyLayoutKt {
+  }
+
+  public final class LazyLayoutPrefetcher_androidKt {
+  }
+
+  public final class LazyNearestItemsRangeKt {
+  }
+
+  public final class Lazy_androidKt {
+  }
+
+  public final class PinnableParentKt {
+  }
+
+}
+
+package androidx.compose.foundation.lazy.staggeredgrid {
+
+  public final class LazyStaggeredGridDslKt {
+  }
+
+  public final class LazyStaggeredGridItemProviderKt {
+  }
+
+  public final class LazyStaggeredGridKt {
+  }
+
+  public final class LazyStaggeredGridMeasureKt {
+  }
+
+}
+
+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 {
+
+  public final class SelectableGroupKt {
+    method public static androidx.compose.ui.Modifier selectableGroup(androidx.compose.ui.Modifier);
+  }
+
+  public final class SelectableKt {
+    method public static androidx.compose.ui.Modifier selectable(androidx.compose.ui.Modifier, boolean selected, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static androidx.compose.ui.Modifier selectable(androidx.compose.ui.Modifier, boolean selected, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+  }
+
+  public final class ToggleableKt {
+    method public static androidx.compose.ui.Modifier toggleable(androidx.compose.ui.Modifier, boolean value, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange);
+    method public static androidx.compose.ui.Modifier toggleable(androidx.compose.ui.Modifier, boolean value, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange);
+    method public static androidx.compose.ui.Modifier triStateToggleable(androidx.compose.ui.Modifier, androidx.compose.ui.state.ToggleableState state, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static androidx.compose.ui.Modifier triStateToggleable(androidx.compose.ui.Modifier, androidx.compose.ui.state.ToggleableState state, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+  }
+
+}
+
+package androidx.compose.foundation.shape {
+
+  public final class AbsoluteCutCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public AbsoluteCutCornerShape(androidx.compose.foundation.shape.CornerSize topLeft, androidx.compose.foundation.shape.CornerSize topRight, androidx.compose.foundation.shape.CornerSize bottomRight, androidx.compose.foundation.shape.CornerSize bottomLeft);
+    method public androidx.compose.foundation.shape.AbsoluteCutCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class AbsoluteCutCornerShapeKt {
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(optional int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+  }
+
+  public final class AbsoluteRoundedCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public AbsoluteRoundedCornerShape(androidx.compose.foundation.shape.CornerSize topLeft, androidx.compose.foundation.shape.CornerSize topRight, androidx.compose.foundation.shape.CornerSize bottomRight, androidx.compose.foundation.shape.CornerSize bottomLeft);
+    method public androidx.compose.foundation.shape.AbsoluteRoundedCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class AbsoluteRoundedCornerShapeKt {
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(optional int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+  }
+
+  public abstract class CornerBasedShape implements androidx.compose.ui.graphics.Shape {
+    ctor public CornerBasedShape(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public abstract androidx.compose.foundation.shape.CornerBasedShape copy(optional androidx.compose.foundation.shape.CornerSize topStart, optional androidx.compose.foundation.shape.CornerSize topEnd, optional androidx.compose.foundation.shape.CornerSize bottomEnd, optional androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public final androidx.compose.foundation.shape.CornerBasedShape copy(androidx.compose.foundation.shape.CornerSize all);
+    method public final androidx.compose.ui.graphics.Outline createOutline(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+    method public abstract androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public final androidx.compose.foundation.shape.CornerSize getBottomEnd();
+    method public final androidx.compose.foundation.shape.CornerSize getBottomStart();
+    method public final androidx.compose.foundation.shape.CornerSize getTopEnd();
+    method public final androidx.compose.foundation.shape.CornerSize getTopStart();
+    property public final androidx.compose.foundation.shape.CornerSize bottomEnd;
+    property public final androidx.compose.foundation.shape.CornerSize bottomStart;
+    property public final androidx.compose.foundation.shape.CornerSize topEnd;
+    property public final androidx.compose.foundation.shape.CornerSize topStart;
+  }
+
+  @androidx.compose.runtime.Immutable public interface CornerSize {
+    method public float toPx(long shapeSize, androidx.compose.ui.unit.Density density);
+  }
+
+  public final class CornerSizeKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(int percent);
+    method public static androidx.compose.foundation.shape.CornerSize getZeroCornerSize();
+    property public static final androidx.compose.foundation.shape.CornerSize ZeroCornerSize;
+  }
+
+  public final class CutCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public CutCornerShape(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.foundation.shape.CutCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class CutCornerShapeKt {
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(optional int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+  }
+
+  public final class GenericShape implements androidx.compose.ui.graphics.Shape {
+    ctor public GenericShape(kotlin.jvm.functions.Function3<? super androidx.compose.ui.graphics.Path,? super androidx.compose.ui.geometry.Size,? super androidx.compose.ui.unit.LayoutDirection,kotlin.Unit> builder);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+  }
+
+  public final class RoundedCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public RoundedCornerShape(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.foundation.shape.RoundedCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class RoundedCornerShapeKt {
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape getCircleShape();
+    property public static final androidx.compose.foundation.shape.RoundedCornerShape CircleShape;
+  }
+
+}
+
+package androidx.compose.foundation.text {
+
+  public final class AndroidCursorHandle_androidKt {
+  }
+
+  public final class BasicTextFieldKt {
+    method @androidx.compose.runtime.Composable public static void BasicTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Brush cursorBrush, optional kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> decorationBox);
+    method @androidx.compose.runtime.Composable public static void BasicTextField(androidx.compose.ui.text.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.TextFieldValue,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Brush cursorBrush, optional kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> decorationBox);
+  }
+
+  public final class BasicTextKt {
+    method @androidx.compose.runtime.Composable public static void BasicText(String text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional int overflow, optional boolean softWrap, optional int maxLines);
+    method @androidx.compose.runtime.Composable public static void BasicText(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.Map<java.lang.String,androidx.compose.foundation.text.InlineTextContent> inlineContent);
+  }
+
+  public final class ClickableTextKt {
+    method @androidx.compose.runtime.Composable public static void ClickableText(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional boolean softWrap, optional int overflow, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
+  }
+
+  public final class ContextMenu_androidKt {
+  }
+
+  public final class CoreTextFieldKt {
+  }
+
+  public final class CoreTextKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class InlineTextContent {
+    ctor public InlineTextContent(androidx.compose.ui.text.Placeholder placeholder, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> children);
+    method public kotlin.jvm.functions.Function1<java.lang.String,kotlin.Unit> getChildren();
+    method public androidx.compose.ui.text.Placeholder getPlaceholder();
+    property public final kotlin.jvm.functions.Function1<java.lang.String,kotlin.Unit> children;
+    property public final androidx.compose.ui.text.Placeholder placeholder;
+  }
+
+  public final class InlineTextContentKt {
+    method public static void appendInlineContent(androidx.compose.ui.text.AnnotatedString.Builder, String id, optional String alternateText);
+  }
+
+  public final class KeyEventHelpers_androidKt {
+  }
+
+  public final class KeyMappingKt {
+  }
+
+  public final class KeyMapping_androidKt {
+  }
+
+  public interface KeyboardActionScope {
+    method public void defaultKeyboardAction(int imeAction);
+  }
+
+  public final class KeyboardActions {
+    ctor public KeyboardActions(optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onDone, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onGo, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onNext, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onPrevious, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSearch, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSend);
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnDone();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnGo();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnNext();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnPrevious();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnSearch();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnSend();
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onDone;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onGo;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onNext;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onPrevious;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSearch;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSend;
+    field public static final androidx.compose.foundation.text.KeyboardActions.Companion Companion;
+  }
+
+  public static final class KeyboardActions.Companion {
+    method public androidx.compose.foundation.text.KeyboardActions getDefault();
+    property public final androidx.compose.foundation.text.KeyboardActions Default;
+  }
+
+  public final class KeyboardActionsKt {
+    method public static androidx.compose.foundation.text.KeyboardActions KeyboardActions(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit> onAny);
+  }
+
+  @androidx.compose.runtime.Immutable public final class KeyboardOptions {
+    ctor public KeyboardOptions(optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public androidx.compose.foundation.text.KeyboardOptions copy(optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public boolean getAutoCorrect();
+    method public int getCapitalization();
+    method public int getImeAction();
+    method public int getKeyboardType();
+    property public final boolean autoCorrect;
+    property public final int capitalization;
+    property public final int imeAction;
+    property public final int keyboardType;
+    field public static final androidx.compose.foundation.text.KeyboardOptions.Companion Companion;
+  }
+
+  public static final class KeyboardOptions.Companion {
+    method public androidx.compose.foundation.text.KeyboardOptions getDefault();
+    property public final androidx.compose.foundation.text.KeyboardOptions Default;
+  }
+
+  public final class LongPressTextDragObserverKt {
+  }
+
+  public final class MaxLinesHeightModifierKt {
+  }
+
+  public final class StringHelpersKt {
+  }
+
+  public final class StringHelpers_androidKt {
+  }
+
+  public final class StringHelpers_jvmKt {
+  }
+
+  public final class TextDelegateKt {
+  }
+
+  public final class TextFieldCursorKt {
+  }
+
+  public final class TextFieldDelegateKt {
+  }
+
+  public final class TextFieldGestureModifiersKt {
+  }
+
+  public final class TextFieldKeyInputKt {
+  }
+
+  public final class TextFieldKeyInput_androidKt {
+  }
+
+  public final class TextFieldPressGestureFilterKt {
+  }
+
+  public final class TextFieldScrollKt {
+  }
+
+  public final class TextFieldSizeKt {
+  }
+
+  public final class TextLayoutHelperKt {
+  }
+
+  public final class TextLayoutResultProxyKt {
+  }
+
+  public final class TextPointerIcon_androidKt {
+  }
+
+  public final class TouchMode_androidKt {
+  }
+
+  public final class UndoManagerKt {
+  }
+
+  public final class UndoManager_jvmKt {
+  }
+
+  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();
+    method public long getHandleColor();
+    property public final long backgroundColor;
+    property public final long handleColor;
+  }
+
+  public final class TextSelectionColorsKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> getLocalTextSelectionColors();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> LocalTextSelectionColors;
+  }
+
+  public final class TextSelectionDelegateKt {
+  }
+
+  public final class TextSelectionMouseDetectorKt {
+  }
+
+}
+
diff --git a/compose/foundation/foundation/api/restricted_current.txt b/compose/foundation/foundation/api/restricted_current.txt
index 9de6783..963ea75 100644
--- a/compose/foundation/foundation/api/restricted_current.txt
+++ b/compose/foundation/foundation/api/restricted_current.txt
@@ -170,6 +170,7 @@
     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, androidx.compose.ui.input.pointer.PointerInputChange initialDown, 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>);
@@ -296,6 +297,16 @@
 
 }
 
+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 {
@@ -697,6 +708,22 @@
 
 }
 
+package androidx.compose.foundation.lazy.staggeredgrid {
+
+  public final class LazyStaggeredGridDslKt {
+  }
+
+  public final class LazyStaggeredGridItemProviderKt {
+  }
+
+  public final class LazyStaggeredGridKt {
+  }
+
+  public final class LazyStaggeredGridMeasureKt {
+  }
+
+}
+
 package androidx.compose.foundation.relocation {
 
   public final class BringIntoViewKt {
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/OverscrollBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/OverscrollBenchmark.kt
new file mode 100644
index 0000000..82f9b23
--- /dev/null
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/OverscrollBenchmark.kt
@@ -0,0 +1,158 @@
+/*
+ * 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.benchmark
+
+import android.view.MotionEvent
+import android.view.View
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.background
+import androidx.compose.foundation.benchmark.lazy.MotionEventHelper
+import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.foundation.gestures.ScrollableDefaults
+import androidx.compose.foundation.gestures.scrollable
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.offset
+import androidx.compose.foundation.overscroll
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.runtime.Composable
+import androidx.compose.testutils.LayeredComposeTestCase
+import androidx.compose.testutils.ToggleableTestCase
+import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
+import androidx.compose.testutils.benchmark.benchmarkDrawPerf
+import androidx.compose.testutils.benchmark.benchmarkFirstCompose
+import androidx.compose.testutils.benchmark.benchmarkFirstDraw
+import androidx.compose.testutils.benchmark.benchmarkFirstLayout
+import androidx.compose.testutils.benchmark.benchmarkFirstMeasure
+import androidx.compose.testutils.benchmark.benchmarkLayoutPerf
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkDraw
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkLayout
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkMeasure
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalView
+import androidx.compose.ui.unit.IntOffset
+import androidx.compose.ui.unit.dp
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+class OverscrollBenchmark {
+    @get:Rule
+    val benchmarkRule = ComposeBenchmarkRule()
+
+    private val overscrollTestCase = { OverscrollTestCase() }
+
+    @Test
+    fun first_compose() {
+        benchmarkRule.benchmarkFirstCompose(overscrollTestCase)
+    }
+
+    @Test
+    fun first_measure() {
+        benchmarkRule.benchmarkFirstMeasure(overscrollTestCase)
+    }
+
+    @Test
+    fun first_layout() {
+        benchmarkRule.benchmarkFirstLayout(overscrollTestCase)
+    }
+
+    @Test
+    fun first_draw() {
+        benchmarkRule.benchmarkFirstDraw(overscrollTestCase)
+    }
+
+    @Test
+    fun overscroll_measure() {
+        benchmarkRule.toggleStateBenchmarkMeasure(overscrollTestCase, false)
+    }
+
+    @Test
+    fun overscroll_layout() {
+        benchmarkRule.toggleStateBenchmarkLayout(overscrollTestCase, false)
+    }
+
+    @Test
+    fun overscroll_draw() {
+        benchmarkRule.toggleStateBenchmarkDraw(overscrollTestCase, false)
+    }
+
+    @Test
+    fun layout() {
+        benchmarkRule.benchmarkLayoutPerf(overscrollTestCase)
+    }
+
+    @Test
+    fun draw() {
+        benchmarkRule.benchmarkDrawPerf(overscrollTestCase)
+    }
+}
+
+@OptIn(ExperimentalFoundationApi::class)
+private class OverscrollTestCase : LayeredComposeTestCase(), ToggleableTestCase {
+
+    private lateinit var view: View
+    private lateinit var motionEventHelper: MotionEventHelper
+
+    private var showingOverscroll = false
+
+    @Composable
+    override fun MeasuredContent() {
+        view = LocalView.current
+        if (!::motionEventHelper.isInitialized) motionEventHelper = MotionEventHelper(view)
+        val scrollState = rememberScrollState()
+        val overscrollEffect = ScrollableDefaults.overscrollEffect().apply { isEnabled = true }
+        Box(
+            Modifier
+                .scrollable(
+                    scrollState,
+                    orientation = Orientation.Vertical,
+                    reverseDirection = true,
+                    overscrollEffect = overscrollEffect
+                )
+                .overscroll(overscrollEffect)
+                .fillMaxSize()
+        ) {
+            Box(
+                Modifier
+                    .offset { IntOffset(0, scrollState.value) }
+                    .background(color = Color.Red)
+                    .fillMaxWidth()
+                    .height(100.dp))
+        }
+    }
+
+    override fun toggleState() {
+        if (!showingOverscroll) {
+            val height = view.measuredHeight
+            motionEventHelper.sendEvent(MotionEvent.ACTION_DOWN, Offset(x = 0f, y = height / 4f))
+            motionEventHelper.sendEvent(MotionEvent.ACTION_MOVE, Offset(x = 0f, y = height / 8f))
+            showingOverscroll = true
+        } else {
+            motionEventHelper.sendEvent(MotionEvent.ACTION_UP, Offset.Zero)
+            showingOverscroll = false
+        }
+    }
+}
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/lazy/LazyListScrollingBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/lazy/LazyListScrollingBenchmark.kt
index 578c8622..d3f66c9 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/lazy/LazyListScrollingBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/lazy/LazyListScrollingBenchmark.kt
@@ -41,6 +41,7 @@
 import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
 import androidx.compose.testutils.doFramesUntilNoChangesPending
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.LocalView
@@ -276,6 +277,7 @@
 
     private lateinit var listState: LazyListState
     private lateinit var view: View
+    private lateinit var motionEventHelper: MotionEventHelper
     private var touchSlop: Float = 0f
     private var scrollBy: Int = 0
 
@@ -292,6 +294,7 @@
             5
         }
         view = LocalView.current
+        if (!::motionEventHelper.isInitialized) motionEventHelper = MotionEventHelper(view)
         touchSlop = LocalViewConfiguration.current.touchSlop
         listState = rememberLazyListState()
         content(listState)
@@ -308,8 +311,8 @@
         }
         if (usePointerInput) {
             val size = if (isVertical) view.measuredHeight else view.measuredWidth
-            sendEvent(MotionEvent.ACTION_DOWN, size / 2f)
-            sendEvent(MotionEvent.ACTION_MOVE, touchSlop)
+            motionEventHelper.sendEvent(MotionEvent.ACTION_DOWN, (size / 2f).toSingleAxisOffset())
+            motionEventHelper.sendEvent(MotionEvent.ACTION_MOVE, touchSlop.toSingleAxisOffset())
         }
         assertEquals(0, listState.firstVisibleItemIndex)
         assertEquals(0, listState.firstVisibleItemScrollOffset)
@@ -317,7 +320,8 @@
 
     fun toggle() {
         if (usePointerInput) {
-            sendEvent(MotionEvent.ACTION_MOVE, -scrollBy.toFloat())
+            motionEventHelper
+                .sendEvent(MotionEvent.ACTION_MOVE, -scrollBy.toFloat().toSingleAxisOffset())
         } else {
             runBlocking {
                 listState.scrollBy(scrollBy.toFloat())
@@ -329,25 +333,35 @@
         assertEquals(0, listState.firstVisibleItemIndex)
         assertEquals(scrollBy, listState.firstVisibleItemScrollOffset)
         if (usePointerInput) {
-            sendEvent(MotionEvent.ACTION_UP, 0f)
+            motionEventHelper.sendEvent(MotionEvent.ACTION_UP, Offset.Zero)
         }
     }
 
-    private var time = 0L
-    private var lastCoord: Float? = null
+    private fun Float.toSingleAxisOffset(): Offset =
+        Offset(x = if (isVertical) 0f else this, y = if (isVertical) this else 0f)
+}
 
-    private fun sendEvent(
+data class ListItem(val index: Int)
+
+/**
+ * Helper for dispatching simple [MotionEvent]s to a [view] for use in scrolling benchmarks.
+ */
+class MotionEventHelper(private val view: View) {
+    private var time = 0L
+    private var lastCoord: Offset? = null
+
+    fun sendEvent(
         action: Int,
-        delta: Float
+        delta: Offset
     ) {
         time += 10L
 
-        val coord = delta + (lastCoord ?: 0f)
+        val coord = delta + (lastCoord ?: Offset.Zero)
 
-        if (action == MotionEvent.ACTION_UP) {
-            lastCoord = null
+        lastCoord = if (action == MotionEvent.ACTION_UP) {
+            null
         } else {
-            lastCoord = coord
+            coord
         }
 
         val locationOnScreen = IntArray(2) { 0 }
@@ -361,8 +375,8 @@
             arrayOf(MotionEvent.PointerProperties()),
             arrayOf(
                 MotionEvent.PointerCoords().apply {
-                    this.x = locationOnScreen[0] + if (!isVertical) coord else 1f
-                    this.y = locationOnScreen[1] + if (isVertical) coord else 1f
+                    x = locationOnScreen[0] + coord.x.coerceAtLeast(1f)
+                    y = locationOnScreen[1] + coord.y.coerceAtLeast(1f)
                 }
             ),
             0,
@@ -380,5 +394,3 @@
         view.dispatchTouchEvent(motionEvent)
     }
 }
-
-data class ListItem(val index: Int)
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/IfNotEmptyCallText.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/IfNotEmptyCallText.kt
new file mode 100644
index 0000000..650c032
--- /dev/null
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/IfNotEmptyCallText.kt
@@ -0,0 +1,113 @@
+/*
+ * 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.benchmark.text.empirical
+
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.testutils.LayeredComposeTestCase
+import androidx.compose.testutils.ToggleableTestCase
+import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkComposeMeasureLayout
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkRecompose
+import androidx.compose.ui.text.font.FontFamily
+import androidx.test.filters.LargeTest
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+/**
+ * Toggle between missing Text and Text("aaa..") to simulate backend text loading.
+ *
+ * This intentionally hits as many text caches as possible, to isolate compose setText behavior.
+ */
+class IfNotEmptyCallText(private val text: String) : LayeredComposeTestCase(), ToggleableTestCase {
+    private var toggleText = mutableStateOf("")
+
+    @Composable
+    override fun MeasuredContent() {
+        if (toggleText.value.isNotEmpty()) {
+            Text(toggleText.value, fontFamily = FontFamily.Monospace)
+        }
+    }
+
+    override fun toggleState() {
+        if (toggleText.value == "") {
+            toggleText.value = text
+        } else {
+            toggleText.value = ""
+        }
+    }
+}
+
+@LargeTest
+@RunWith(Parameterized::class)
+open class IfNotEmptyParent(private val size: Int) {
+
+    @get:Rule
+    val benchmarkRule = ComposeBenchmarkRule()
+
+    private val caseFactory = {
+        val text = generateCacheableStringOf(size)
+        IfNotEmptyCallText(text)
+    }
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}")
+        fun initParameters(): Array<Any> = arrayOf()
+    }
+
+    @Test
+    fun recomposeOnly() {
+        benchmarkRule.toggleStateBenchmarkRecompose(caseFactory)
+    }
+
+    @Test
+    fun recomposeMeasureLayout() {
+        benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(caseFactory)
+    }
+}
+
+/**
+ * Metrics determined from all apps
+ */
+@LargeTest
+@RunWith(Parameterized::class)
+class AllAppsIfNotEmptyCallText(size: Int) : IfNotEmptyParent(size) {
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}")
+        fun initParameters(): Array<Any> = AllApps.TextLengths
+    }
+}
+
+/**
+ * Metrics for Chat-like apps.
+ *
+ * These apps typically have more longer strings, due to user generated content.
+ */
+@LargeTest
+@RunWith(Parameterized::class)
+class ChatAppIfNotEmptyCallText(size: Int) : IfNotEmptyParent(size) {
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}")
+        fun initParameters(): Array<Any> = ChatApps.TextLengths
+    }
+}
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/Parameters.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/Parameters.kt
new file mode 100644
index 0000000..d571f24
--- /dev/null
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/Parameters.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.compose.foundation.benchmark.text.empirical
+
+object AllApps {
+    /**
+     * For all apps, the vast majority of text is <64 characters.
+     *
+     * Examples of typical text
+     *
+     * "OK"
+     * "Close"
+     * "Click below to learn more"
+     */
+    val TextLengths: Array<Any> = arrayOf(2, 16, 32, 64)
+}
+
+object ChatApps {
+    /**
+     * For chat apps, strings tend to be longer due to user generated content.
+     */
+    val TextLengths: Array<Any> = arrayOf(256, 512)
+}
+
+fun generateCacheableStringOf(size: Int): String {
+    var workingSize = size
+    val builder = StringBuilder(size)
+    while (workingSize > 0) {
+        repeat(Integer.min(8, workingSize) - 1) {
+            builder.append("a")
+            workingSize--
+        }
+        if (workingSize > 1) {
+            builder.append(" ")
+        } else {
+            builder.append("a")
+        }
+        workingSize--
+    }
+    return builder.toString()
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/ParametersKtTest.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/ParametersKtTest.kt
new file mode 100644
index 0000000..53b4b07
--- /dev/null
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/ParametersKtTest.kt
@@ -0,0 +1,68 @@
+/*
+ * 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.benchmark.text.empirical
+
+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
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class ParametersKtTest {
+
+    @Test
+    fun generate0() {
+        assertThat(generateCacheableStringOf(0)).isEqualTo("")
+    }
+
+    @Test
+    fun generate1() {
+        assertThat(generateCacheableStringOf(1)).isEqualTo("a")
+    }
+
+    @Test
+    fun generate2() {
+        assertThat(generateCacheableStringOf(2)).isEqualTo("aa")
+    }
+
+    @Test
+    fun generate7() {
+        assertThat(generateCacheableStringOf(7)).isEqualTo("aaaaaaa")
+    }
+
+    @Test
+    fun generate8() {
+        assertThat(generateCacheableStringOf(8)).isEqualTo("aaaaaaaa")
+    }
+
+    @Test
+    fun generate9() {
+        assertThat(generateCacheableStringOf(9)).isEqualTo("aaaaaaa a")
+    }
+
+    @Test
+    fun generate10() {
+        assertThat(generateCacheableStringOf(10)).isEqualTo("aaaaaaa aa")
+    }
+
+    @Test
+    fun generate16() {
+        assertThat(generateCacheableStringOf(16)).isEqualTo("aaaaaaa aaaaaaaa")
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/README.md b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/README.md
new file mode 100644
index 0000000..5242dc7
--- /dev/null
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/README.md
@@ -0,0 +1,43 @@
+# (Text) Empirical derived benchmarks
+
+These benchmarks are derived from realistic text usage gathered from instrumenting text.
+
+You should consider a drop in one of these metrics a *critical* signal that some performance change
+has occurred that will be perceivable to real-world users in real production apps.
+
+## Cached design
+
+By design, all tests in this module will _intentionally_ hit layout caching on platform. This is
+accomplished by using deterministic strings (such as "OK") that will reliably be cached.
+
+This does not completely remove text layout cost, but it controls it to allow changes in Compose
+text overhead to be more visible.
+
+As much as possible, new benchmarks added to this module should endeavor to avoid measuring the
+cost of text layout and focus on Compose related text code.
+
+Care should be taken to ensure we only hit caching in minikin, and avoid hitting caches inside of 
+compose text implementations unless there is concrete evidence that we hit the caches in test at the
+same rate as production code.
+
+## Parameters
+
+Parameters are determined by empirical analysis of real-world text usage.
+
+Parameter sets should be one of:
+
+* AllApps - aggregate totals for all apps
+* ChatApps - benchmarks are unique to chat apps (e.g. longer strings)
+* SocialApps - benchmarks that are unique te social apps (e.g. more spans)
+* ShoppingApps - benchmarks that are unique to shopping apps (e.g. more spans)
+
+## Use-case naming
+
+Name new benchmarks after the developer task being performed. 
+
+For example 
+* `SetText` the task of setting text after loading it from some source 
+* `IfNotEmptyCallText` the task of adding Text, only if not empty
+
+Benchmarks should attempt to provide a realistic async loading "default" value as state between
+every call, such as `null` or `""` to ensure we're measuring the cost of calling Text.
\ No newline at end of file
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetText.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetText.kt
new file mode 100644
index 0000000..36cf78a
--- /dev/null
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetText.kt
@@ -0,0 +1,111 @@
+/*
+ * 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.benchmark.text.empirical
+
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.testutils.LayeredComposeTestCase
+import androidx.compose.testutils.ToggleableTestCase
+import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkComposeMeasureLayout
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkRecompose
+import androidx.compose.ui.text.font.FontFamily
+import androidx.test.filters.LargeTest
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+/**
+ * Toggle between "" and "aaaa..." to simulate backend text loading.
+ *
+ * This intentionally hits as many text caches as possible, to isolate compose setText behavior.
+ */
+class SetText(private val text: String) : LayeredComposeTestCase(), ToggleableTestCase {
+    private var toggleText = mutableStateOf("")
+
+    @Composable
+    override fun MeasuredContent() {
+        Text(toggleText.value, fontFamily = FontFamily.Monospace)
+    }
+
+    override fun toggleState() {
+        if (toggleText.value == "") {
+            toggleText.value = text
+        } else {
+            toggleText.value = ""
+        }
+    }
+}
+
+@LargeTest
+@RunWith(Parameterized::class)
+open class SetTextParent(private val size: Int) {
+
+    @get:Rule
+    val benchmarkRule = ComposeBenchmarkRule()
+
+    private val caseFactory = {
+        val text = generateCacheableStringOf(size)
+        SetText(text)
+    }
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}")
+        fun initParameters(): Array<Any> = arrayOf()
+    }
+
+    @Test
+    fun recomposeOnly() {
+        benchmarkRule.toggleStateBenchmarkRecompose(caseFactory)
+    }
+
+    @Test
+    fun recomposeMeasureLayout() {
+        benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(caseFactory)
+    }
+}
+
+/**
+ * Metrics determined from all apps
+ */
+@LargeTest
+@RunWith(Parameterized::class)
+class AllAppsSetText(size: Int) : SetTextParent(size) {
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}")
+        fun initParameters(): Array<Any> = AllApps.TextLengths
+    }
+}
+
+/**
+ * Metrics for Chat-like apps.
+ *
+ * These apps typically have more longer strings, due to user generated content.
+ */
+@LargeTest
+@RunWith(Parameterized::class)
+class ChatAppSetText(size: Int) : SetTextParent(size) {
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}")
+        fun initParameters(): Array<Any> = ChatApps.TextLengths
+    }
+}
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextFixedSize.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextFixedSize.kt
new file mode 100644
index 0000000..c9bdc46
--- /dev/null
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextFixedSize.kt
@@ -0,0 +1,117 @@
+/*
+ * 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.benchmark.text.empirical
+
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.testutils.LayeredComposeTestCase
+import androidx.compose.testutils.ToggleableTestCase
+import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkComposeMeasureLayout
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkRecompose
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.text.font.FontFamily
+import androidx.test.filters.LargeTest
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+/**
+ * Toggle between "" and "aaaa..." to simulate backend text loading.
+ *
+ * This intentionally hits as many text caches as possible, to isolate compose setText behavior.
+ */
+class SetTextFixedSize(private val text: String) : LayeredComposeTestCase(), ToggleableTestCase {
+    private var toggleText = mutableStateOf("")
+
+    @Composable
+    override fun MeasuredContent() {
+        Text(
+            toggleText.value,
+            modifier = Modifier.fillMaxWidth(),
+            fontFamily = FontFamily.Monospace
+        )
+    }
+
+    override fun toggleState() {
+        if (toggleText.value == "") {
+            toggleText.value = text
+        } else {
+            toggleText.value = ""
+        }
+    }
+}
+
+@LargeTest
+@RunWith(Parameterized::class)
+open class SetTextFixedSizeParent(private val size: Int) {
+
+    @get:Rule
+    val benchmarkRule = ComposeBenchmarkRule()
+
+    private val caseFactory = {
+        val text = generateCacheableStringOf(size)
+        SetText(text)
+    }
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}")
+        fun initParameters(): Array<Any> = arrayOf()
+    }
+
+    @Test
+    fun recomposeOnly() {
+        benchmarkRule.toggleStateBenchmarkRecompose(caseFactory)
+    }
+
+    @Test
+    fun recomposeMeasureLayout() {
+        benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(caseFactory)
+    }
+}
+
+/**
+ * Metrics determined from all apps
+ */
+@LargeTest
+@RunWith(Parameterized::class)
+class AllAppsSetTextFixedSize(size: Int) : SetTextParent(size) {
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}")
+        fun initParameters(): Array<Any> = AllApps.TextLengths
+    }
+}
+
+/**
+ * Metrics for Chat-like apps.
+ *
+ * These apps typically have more longer strings, due to user generated content.
+ */
+@LargeTest
+@RunWith(Parameterized::class)
+class ChatAppSetTextFixedSize(size: Int) : SetTextParent(size) {
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}")
+        fun initParameters(): Array<Any> = ChatApps.TextLengths
+    }
+}
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/baselines/EmptyLayoutBaseline.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/baselines/EmptyLayoutBaseline.kt
new file mode 100644
index 0000000..71a292f
--- /dev/null
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/baselines/EmptyLayoutBaseline.kt
@@ -0,0 +1,128 @@
+/*
+ * 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.benchmark.text.empirical.baselines
+
+import androidx.compose.foundation.benchmark.text.empirical.AllApps
+import androidx.compose.foundation.benchmark.text.empirical.ChatApps
+import androidx.compose.foundation.benchmark.text.empirical.generateCacheableStringOf
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.testutils.LayeredComposeTestCase
+import androidx.compose.testutils.ToggleableTestCase
+import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkComposeMeasureLayout
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkRecompose
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.layout.Layout
+import androidx.compose.ui.layout.MeasurePolicy
+import androidx.test.filters.LargeTest
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+/**
+ * This benchmark emits an empty Layout and does not do _any_ Text work.
+ *
+ * Any impl. of text must emit at least one Layout node sized on soft wrapping, so this is a floor
+ * of work that Text could theoretically do if everything were fetched from a hypothetical free
+ * cache that could compute results for future requests magically..
+ *
+ * Text will never be able to be _this_ fast (as we don't _yet_ have time-travel chips), but it is
+ * useful to use this number as a floor when evaluating potential optimizations.
+ */
+class EmptyLayoutBaseline(
+    private val text: String
+) : LayeredComposeTestCase(), ToggleableTestCase {
+    private var toggleText = mutableStateOf("")
+
+    private val measurePolicy = MeasurePolicy { _, _ ->
+        val width = 300
+        val length = toggleText.value.length
+        val height = /* line height */ 20 * (length / (/* width */ 300 / /* char width */ 12))
+        layout(width, height.coerceAtLeast(20)) {}
+    }
+
+    @Composable
+    override fun MeasuredContent() {
+        // emit a layout based on text length, which is the minimal work that Text must perform
+        Layout(modifier = modifier, measurePolicy = measurePolicy)
+    }
+
+    override fun toggleState() {
+        if (toggleText.value == "") {
+            toggleText.value = text
+        } else {
+            toggleText.value = ""
+        }
+    }
+}
+
+private val modifier = Modifier.fillMaxSize()
+
+@LargeTest
+@RunWith(Parameterized::class)
+open class EmptyLayoutBaselineParent(private val size: Int) {
+
+    @get:Rule
+    val benchmarkRule = ComposeBenchmarkRule()
+
+    private val caseFactory = {
+        val text = generateCacheableStringOf(size)
+        EmptyLayoutBaseline(text)
+    }
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}")
+        fun initParameters(): Array<Any> = arrayOf()
+    }
+
+    @Test
+    fun recomposeOnly() {
+        benchmarkRule.toggleStateBenchmarkRecompose(caseFactory, requireRecomposition = false)
+    }
+
+    @Test
+    fun recomposeMeasureLayout() {
+        benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(
+            caseFactory,
+            requireRecomposition = false
+        )
+    }
+}
+
+@LargeTest
+@RunWith(Parameterized::class)
+class AllAppsEmptyLayoutBaselineBaseline(size: Int) : EmptyLayoutBaselineParent(size) {
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}")
+        fun initParameters(): Array<Any> = AllApps.TextLengths
+    }
+}
+
+@LargeTest
+@RunWith(Parameterized::class)
+class ChatAppEmptyLayoutBaselineBaseline(size: Int) : EmptyLayoutBaselineParent(size) {
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}")
+        fun initParameters(): Array<Any> = ChatApps.TextLengths
+    }
+}
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/baselines/StaticLayoutBaseline.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/baselines/StaticLayoutBaseline.kt
new file mode 100644
index 0000000..eb2a4c6
--- /dev/null
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/baselines/StaticLayoutBaseline.kt
@@ -0,0 +1,125 @@
+/*
+ * 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.benchmark.text.empirical.baselines
+
+import android.graphics.Bitmap
+import android.graphics.Canvas
+import android.graphics.Typeface
+import android.os.Build
+import android.text.Layout
+import android.text.StaticLayout
+import android.text.TextPaint
+import androidx.annotation.RequiresApi
+import androidx.benchmark.junit4.BenchmarkRule
+import androidx.benchmark.junit4.measureRepeated
+import androidx.compose.foundation.benchmark.text.empirical.AllApps
+import androidx.compose.foundation.benchmark.text.empirical.ChatApps
+import androidx.compose.foundation.benchmark.text.empirical.generateCacheableStringOf
+import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+/**
+ * This benchmark tests the *absolute* lower bound of drawing perfectly optimal text on Android.
+ *
+ * It intentionally hits the word-layout cache and emits monospace.
+ *
+ * No real-world text usage will lay out this fast, but it provides a useful check for the lowest
+ * cost possible in text layout when evaluating potential optimizations.
+ */
+@RunWith(Parameterized::class)
+@LargeTest
+@SdkSuppress(minSdkVersion = 23)
+open class StaticLayoutBaseline(private val size: Int) {
+
+    @get:Rule
+    val benchmarkRule = BenchmarkRule()
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}")
+        fun initParameters(): Array<Any> = emptyArray()
+    }
+
+    @Test
+    fun constructLayoutDraw() {
+        val text = generateCacheableStringOf(size)
+        val textPaint = TextPaint()
+        textPaint.typeface = Typeface.MONOSPACE
+        val canvas = Canvas(Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888))
+        var isEmpty = false
+        benchmarkRule.measureRepeated {
+            val measureText = runWithTimingDisabled {
+                isEmpty = !isEmpty
+                if (isEmpty) "" else text
+            }
+            val layout = makeStaticLayout(measureText, textPaint)
+            layout.draw(canvas)
+        }
+    }
+}
+
+@RunWith(Parameterized::class)
+@LargeTest
+class AllAppsStaticLayoutBaseline(size: Int) : StaticLayoutBaseline(size) {
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}")
+        fun initParameters(): Array<Any> = AllApps.TextLengths
+    }
+}
+
+@RunWith(Parameterized::class)
+@LargeTest
+class ChatAppsStaticLayoutBaseline(size: Int) : StaticLayoutBaseline(size) {
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "size={0}")
+        fun initParameters(): Array<Any> = ChatApps.TextLengths
+    }
+}
+
+// do compat code to make a realistic lowest-possible benchmark for API21+
+// since StaticLayout.Builder is 23+
+fun makeStaticLayout(text: String, textPaint: TextPaint): StaticLayout {
+    return if (Build.VERSION.SDK_INT >= 23) {
+        StaticLayoutBuilderCompat_Api23.build(text, textPaint)
+    } else {
+        @Suppress("DEPRECATION")
+        StaticLayout(/* source = */ text, /* paint = */
+            textPaint, /* width = */
+            Int.MAX_VALUE, /* align = */
+            Layout.Alignment.ALIGN_NORMAL, /* spacingmult = */
+            1.0f, /* spacingadd = */
+            0.0f, /* includepad = */
+            true)
+    }
+}
+
+@RequiresApi(23)
+object StaticLayoutBuilderCompat_Api23 {
+    fun build(text: String, textPaint: TextPaint): StaticLayout {
+        return StaticLayout.Builder.obtain(/* source = */ text, /* start = */
+            0, /* end = */
+            text.length, /* paint = */
+            textPaint, /* width = */
+            Int.MAX_VALUE).build()
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/FoundationDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/FoundationDemos.kt
index 0edb218..024b8f1 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/FoundationDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/FoundationDemos.kt
@@ -22,6 +22,7 @@
 import androidx.compose.foundation.demos.relocation.BringNestedIntoViewDemo
 import androidx.compose.foundation.demos.relocation.BringRectangleIntoViewDemo
 import androidx.compose.foundation.demos.relocation.RequestRectangleOnScreenDemo
+import androidx.compose.foundation.demos.snapping.SnappingDemos
 import androidx.compose.foundation.samples.BringIntoViewResponderSample
 import androidx.compose.foundation.samples.BringPartOfComposableIntoViewSample
 import androidx.compose.foundation.samples.ControlledScrollableRowSample
@@ -55,6 +56,7 @@
         ComposableDemo("Controlled Scrollable Row") { ControlledScrollableRowSample() },
         ComposableDemo("Draw Modifiers") { DrawModifiersDemo() },
         DemoCategory("Lazy lists", LazyListDemos),
+        DemoCategory("Snapping", SnappingDemos),
         ComposableDemo("Simple InteractionSource") { SimpleInteractionSourceSample() },
         ComposableDemo("Flow InteractionSource") { InteractionSourceFlowSample() },
         DemoCategory("Suspending Gesture Detectors", CoroutineGestureDemos),
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ScrollableFocusedChildDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ScrollableFocusedChildDemo.kt
index 471a5f4..3b0461a 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ScrollableFocusedChildDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ScrollableFocusedChildDemo.kt
@@ -34,7 +34,6 @@
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.layout.wrapContentSize
 import androidx.compose.foundation.rememberScrollState
 import androidx.compose.foundation.verticalScroll
@@ -51,12 +50,17 @@
 import androidx.compose.ui.focus.focusRequester
 import androidx.compose.ui.focus.onFocusChanged
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Size
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.layout.Layout
+import androidx.compose.ui.layout.layout
+import androidx.compose.ui.layout.onSizeChanged
 import androidx.compose.ui.tooling.preview.Preview
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.IntOffset
+import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.toSize
 import kotlin.math.roundToInt
 
 @Preview(showBackground = true)
@@ -92,11 +96,13 @@
 
         FocusGrabber(Modifier.fillMaxWidth())
 
+        var maxViewportSize by remember { mutableStateOf(IntSize.Zero) }
         Resizable(
             resizableState,
             Modifier
                 .weight(1f)
                 .fillMaxWidth()
+                .onSizeChanged { maxViewportSize = it }
         ) {
             Box(
                 Modifier
@@ -106,9 +112,11 @@
             ) {
                 Box(
                     Modifier
-                        .size(300.dp)
+                        // Ensure there's always something to scroll by making the scrollable
+                        // content a multiple of the available screen space.
+                        .size { maxViewportSize.toSize() * 1.5f }
                         .background(Color.LightGray)
-                        .wrapContentSize(align = Alignment.BottomEnd)
+                        .wrapContentSize(align = Alignment.Center)
                 ) {
                     FocusGrabber()
                 }
@@ -248,4 +256,15 @@
             drawLine(Color.Black, Offset(x2, startY), Offset(x2, endY), lineWeight)
         }
     }
+}
+
+/** Measures the modified node to be the size returned from [size]. */
+private fun Modifier.size(size: () -> Size): Modifier = layout { measurable, _ ->
+    val constraints = size().let {
+        Constraints.fixed(it.width.roundToInt(), it.height.roundToInt())
+    }
+    val placeable = measurable.measure(constraints)
+    layout(placeable.width, placeable.height) {
+        placeable.place(IntOffset.Zero)
+    }
 }
\ No newline at end of file
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/SinglePageSnappingDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/SinglePageSnappingDemos.kt
new file mode 100644
index 0000000..365521f
--- /dev/null
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/SinglePageSnappingDemos.kt
@@ -0,0 +1,131 @@
+/*
+ * 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.demos.snapping
+
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.lazy.LazyListDefaults
+import androidx.compose.foundation.lazy.rememberLazyListState
+import androidx.compose.integration.demos.common.ComposableDemo
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.drawWithContent
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.layout.LayoutCoordinates
+import androidx.compose.ui.layout.onPlaced
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+
+val SinglePageSnappingDemos = listOf(
+    ComposableDemo("Same Size Pages") { SamePageSizeDemo() },
+    ComposableDemo("Multi-Size Pages") { MultiSizePageDemo() },
+    ComposableDemo("Large Pages") { LargePageSizeDemo() },
+    ComposableDemo("List with Content padding") { DifferentContentPaddingDemo() },
+)
+
+@OptIn(ExperimentalFoundationApi::class)
+@Composable
+fun SamePageSizeDemo() {
+    val lazyListState = rememberLazyListState()
+
+    SnappingDemoMainLayout(
+        lazyListState = lazyListState,
+        flingBehavior = LazyListDefaults.snapFlingBehavior(lazyListState = lazyListState)
+    ) {
+        DefaultSnapDemoItem(it)
+    }
+}
+
+@Composable
+fun ResizableSnapDemoItem(modifier: Modifier, position: Int) {
+    val innerCoordinates = remember { mutableStateOf<LayoutCoordinates?>(null) }
+    Box(
+        modifier = Modifier
+            .then(modifier)
+            .padding(8.dp)
+            .background(Color.White)
+            .onPlaced { innerCoordinates.value = it }
+            .drawWithContent {
+                drawContent()
+                drawAnchor(innerCoordinates.value, CenterAnchor)
+            },
+        contentAlignment = Alignment.Center
+    ) {
+        Text(text = position.toString(), fontSize = 40.sp)
+    }
+}
+
+@OptIn(ExperimentalFoundationApi::class)
+@Composable
+fun LargePageSizeDemo() {
+    val lazyListState = rememberLazyListState()
+
+    SnappingDemoMainLayout(
+        lazyListState = lazyListState,
+        flingBehavior = LazyListDefaults.snapFlingBehavior(lazyListState = lazyListState)
+    ) {
+        ResizableSnapDemoItem(
+            modifier = Modifier
+                .width(350.dp)
+                .height(500.dp),
+            position = it
+        )
+    }
+}
+
+private val PagesSizes = (0..ItemNumber).toList().map { (50..500).random().dp }
+
+@OptIn(ExperimentalFoundationApi::class)
+@Composable
+fun MultiSizePageDemo() {
+    val lazyListState = rememberLazyListState()
+
+    SnappingDemoMainLayout(
+        lazyListState = lazyListState,
+        flingBehavior = LazyListDefaults.snapFlingBehavior(lazyListState = lazyListState)
+    ) {
+        ResizableSnapDemoItem(
+            modifier = Modifier
+                .width(PagesSizes[it])
+                .height(500.dp),
+            position = it
+        )
+    }
+}
+
+@OptIn(ExperimentalFoundationApi::class)
+@Composable
+fun DifferentContentPaddingDemo() {
+    val lazyListState = rememberLazyListState()
+
+    SnappingDemoMainLayout(
+        lazyListState = lazyListState,
+        flingBehavior = LazyListDefaults.snapFlingBehavior(lazyListState = lazyListState),
+        contentPaddingValues = PaddingValues(start = 20.dp, end = 50.dp)
+    ) {
+        DefaultSnapDemoItem(position = it)
+    }
+}
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/SnappingDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/SnappingDemos.kt
new file mode 100644
index 0000000..7f172b1
--- /dev/null
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/snapping/SnappingDemos.kt
@@ -0,0 +1,213 @@
+/*
+ * 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.demos.snapping
+
+import androidx.compose.animation.core.DecayAnimationSpec
+import androidx.compose.animation.core.calculateTargetValue
+import androidx.compose.animation.rememberSplineBasedDecay
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.background
+import androidx.compose.foundation.gestures.FlingBehavior
+import androidx.compose.foundation.gestures.snapping.SnapLayoutInfoProvider
+import androidx.compose.foundation.gestures.snapping.rememberSnapFlingBehavior
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.calculateEndPadding
+import androidx.compose.foundation.layout.calculateStartPadding
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.lazy.LazyListState
+import androidx.compose.foundation.lazy.LazyRow
+import androidx.compose.foundation.lazy.rememberLazyListState
+import androidx.compose.integration.demos.common.ComposableDemo
+import androidx.compose.integration.demos.common.DemoCategory
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+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.graphics.Color
+import androidx.compose.ui.graphics.drawscope.ContentDrawScope
+import androidx.compose.ui.graphics.drawscope.Stroke
+import androidx.compose.ui.layout.LayoutCoordinates
+import androidx.compose.ui.layout.onPlaced
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+
+val SnappingDemos = listOf(
+    DemoCategory("Single Page Snapping", SinglePageSnappingDemos),
+    ComposableDemo("Multi Page Snapping") { MultiPageDemo() },
+    ComposableDemo("View Port Based Snapping") { ViewPortBasedDemo() },
+)
+
+@OptIn(ExperimentalFoundationApi::class)
+@Composable
+fun MultiPageDemo() {
+    val lazyListState = rememberLazyListState()
+    val animation: DecayAnimationSpec<Float> = rememberSplineBasedDecay()
+    val snappingLayout = remember(lazyListState) {
+        MultiPageSnappingLayoutInfoProvider(
+            animation,
+            SnapLayoutInfoProvider(lazyListState = lazyListState)
+        )
+    }
+
+    val flingBehavior = rememberSnapFlingBehavior(snappingLayout)
+    SnappingDemoMainLayout(lazyListState = lazyListState, flingBehavior = flingBehavior) {
+        DefaultSnapDemoItem(position = it)
+    }
+}
+
+@OptIn(ExperimentalFoundationApi::class)
+class MultiPageSnappingLayoutInfoProvider(
+    private val decayAnimationSpec: DecayAnimationSpec<Float>,
+    private val lazySnapLayoutInfoProvider: SnapLayoutInfoProvider
+) : SnapLayoutInfoProvider by lazySnapLayoutInfoProvider {
+    override fun calculateApproachOffset(initialVelocity: Float): Float {
+        return decayAnimationSpec.calculateTargetValue(0f, initialVelocity) / 2f
+    }
+}
+
+@OptIn(ExperimentalFoundationApi::class)
+@Composable
+fun ViewPortBasedDemo() {
+    val lazyListState = rememberLazyListState()
+    val snappingLayout = remember(lazyListState) {
+        ViewPortBasedSnappingLayoutInfoProvider(
+            SnapLayoutInfoProvider(lazyListState = lazyListState),
+            lazyListState
+        )
+    }
+    val flingBehavior = rememberSnapFlingBehavior(snappingLayout)
+
+    SnappingDemoMainLayout(lazyListState = lazyListState, flingBehavior = flingBehavior) {
+        DefaultSnapDemoItem(position = it)
+    }
+}
+
+@OptIn(ExperimentalFoundationApi::class)
+class ViewPortBasedSnappingLayoutInfoProvider(
+    private val lazySnapLayoutInfoProvider: SnapLayoutInfoProvider,
+    private val lazyLayoutState: LazyListState
+) : SnapLayoutInfoProvider by lazySnapLayoutInfoProvider {
+    override fun calculateApproachOffset(initialVelocity: Float): Float {
+        return lazyLayoutState.layoutInfo.visibleItemsInfo.sumOf { it.size }.toFloat()
+    }
+}
+
+@Composable
+fun SnappingDemoMainLayout(
+    lazyListState: LazyListState,
+    flingBehavior: FlingBehavior,
+    contentPaddingValues: PaddingValues = PaddingValues(8.dp),
+    content: @Composable (Int) -> Unit
+) {
+    val layoutCoordinates = remember { mutableStateOf<LayoutCoordinates?>(null) }
+    LazyRow(
+        modifier = Modifier
+            .fillMaxSize()
+            .onPlaced { layoutCoordinates.value = it }
+            .background(Color.LightGray)
+            .drawWithContent {
+                drawContent()
+                drawAnchor(
+                    layoutCoordinates.value,
+                    CenterAnchor,
+                    contentPaddingValues,
+                    true,
+                    4.0f,
+                    4.0f
+                )
+            },
+        contentPadding = contentPaddingValues,
+        verticalAlignment = Alignment.CenterVertically,
+        state = lazyListState,
+        flingBehavior = flingBehavior
+    ) {
+        items(ItemNumber) {
+            content(it)
+        }
+    }
+}
+
+@Composable
+fun DefaultSnapDemoItem(position: Int) {
+    val innerCoordinates = remember { mutableStateOf<LayoutCoordinates?>(null) }
+    Box(
+        modifier = Modifier
+            .width(200.dp)
+            .height(500.dp)
+            .padding(8.dp)
+            .background(Color.White)
+            .onPlaced { innerCoordinates.value = it }
+            .drawWithContent {
+                drawContent()
+                drawAnchor(innerCoordinates.value, CenterAnchor)
+            },
+        contentAlignment = Alignment.Center
+    ) {
+        Text(text = position.toString(), fontSize = 40.sp)
+    }
+}
+
+internal fun ContentDrawScope.drawAnchor(
+    layoutCoordinates: LayoutCoordinates?,
+    anchor: Float,
+    contentPaddingValues: PaddingValues = PaddingValues(0.dp),
+    shouldDrawPadding: Boolean = false,
+    mainLineStrokeWidth: Float = Stroke.HairlineWidth,
+    paddingLineStrokeWidth: Float = Stroke.HairlineWidth
+) {
+    val beforePadding = contentPaddingValues.calculateStartPadding(LayoutDirection.Rtl).toPx()
+    val afterPadding = contentPaddingValues.calculateEndPadding(LayoutDirection.Rtl).toPx()
+
+    layoutCoordinates?.let {
+        val center = (it.size.width - beforePadding - afterPadding) * anchor + beforePadding
+
+        drawLine(
+            Color.Red,
+            start = Offset(center, 0f),
+            end = Offset(center, it.size.height.toFloat()),
+            strokeWidth = mainLineStrokeWidth
+        )
+
+        if (shouldDrawPadding) {
+            drawLine(
+                Color.Magenta,
+                start = Offset(beforePadding, 0f),
+                end = Offset(beforePadding, it.size.height.toFloat()),
+                strokeWidth = paddingLineStrokeWidth
+            )
+
+            drawLine(
+                Color.Magenta,
+                start = Offset(it.size.width - afterPadding, 0f),
+                end = Offset(it.size.width - afterPadding, it.size.height.toFloat()),
+                strokeWidth = paddingLineStrokeWidth
+            )
+        }
+    }
+}
+
+internal const val CenterAnchor = 0.5f
+internal const val ItemNumber = 200
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeText.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeText.kt
index c0be809..03ca2b8 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeText.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeText.kt
@@ -92,8 +92,10 @@
 
 const val displayText = "Text Demo"
 const val displayTextChinese = "文本演示"
-const val displayTextArabic = "عرض النص"
+const val displayTextArabic = "\u0639\u0631\u0636\u0020\u0627\u0644\u0646\u0635"
 const val displayTextHindi = "पाठ डेमो"
+const val displayTextBidi = "Text \u0639\u0631\u0636"
+
 val fontSize4 = 16.sp
 val fontSize6 = 20.sp
 val fontSize8 = 25.sp
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/EllipsizeWithLetterSpacing.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/EllipsizeWithLetterSpacing.kt
new file mode 100644
index 0000000..d73e2a0
--- /dev/null
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/EllipsizeWithLetterSpacing.kt
@@ -0,0 +1,117 @@
+/*
+ * 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.demos.text
+
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.requiredWidth
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.text.BasicText
+import androidx.compose.foundation.text.selection.SelectionContainer
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.text.style.TextDirection
+import androidx.compose.ui.text.style.TextIndent
+import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+
+private val fontSize = 21.sp
+private val positiveTextIndent = TextIndent(fontSize, fontSize)
+private val negativeTextIndent = TextIndent(-fontSize, -fontSize)
+
+@Preview
+@Composable
+fun EllipsizeWithLetterSpacing() {
+    SelectionContainer() {
+        Column(
+            Modifier
+                .padding(horizontal = 16.dp)
+                .verticalScroll(rememberScrollState())
+        ) {
+
+            for (textIndent in arrayOf(
+                TextIndent.None,
+                positiveTextIndent,
+                negativeTextIndent
+            )) {
+                for (text in arrayOf(
+                    displayText,
+                    displayTextArabic,
+                    displayTextBidi
+                )) {
+                    for (textAlign in arrayOf(
+                        TextAlign.Start,
+                        TextAlign.End,
+                        TextAlign.Center,
+                        TextAlign.Justify
+                    )) {
+                        for (maxLines in arrayOf(1, 3)) {
+                            SecondTagLine(
+                                "align=$textAlign, lines=$maxLines, " +
+                                    "indent=${textIndent.toLabel()}"
+                            )
+                            TextWithEllipsizeAndLetterSpacing(
+                                text = text,
+                                maxLines = maxLines,
+                                textAlign = textAlign,
+                                textIndent = textIndent
+                            )
+                            Spacer(Modifier.padding(8.dp))
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+
+@Composable
+fun TextWithEllipsizeAndLetterSpacing(
+    text: String,
+    maxLines: Int,
+    textAlign: TextAlign,
+    textIndent: TextIndent
+) {
+    BasicText(
+        modifier = Modifier.background(Color.LightGray).requiredWidth(200.dp),
+        text = text.repeat(100),
+        maxLines = maxLines,
+        overflow = TextOverflow.Ellipsis,
+        style = TextStyle(
+            fontSize = fontSize,
+            textAlign = textAlign,
+            letterSpacing = fontSize / 3,
+            textDirection = TextDirection.Content,
+            textIndent = textIndent
+        )
+    )
+}
+
+private fun TextIndent.toLabel() = when (this) {
+    TextIndent.None -> "None"
+    positiveTextIndent -> "Positive"
+    negativeTextIndent -> "Negative"
+    else -> toString()
+}
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextDemos.kt
index 34aa0d5..5a8d6cf 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextDemos.kt
@@ -37,6 +37,7 @@
         ComposableDemo("Layout Reuse") { TextReuseLayoutDemo() },
         ComposableDemo("Line Height Behavior") { TextLineHeightDemo() },
         ComposableDemo("Interactive text") { InteractiveTextDemo() },
+        ComposableDemo("Ellipsize and letterspacing") { EllipsizeWithLetterSpacing() },
         DemoCategory(
             "Input fields",
             listOf(
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/OverscrollSample.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/OverscrollSample.kt
index 31dca0c..02c04af 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/OverscrollSample.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/OverscrollSample.kt
@@ -63,7 +63,6 @@
         private val overscrollOffset = Animatable(0f)
         override fun consumePreScroll(
             scrollDelta: Offset,
-            pointerPosition: Offset?,
             source: NestedScrollSource
         ): Offset {
             // in pre scroll we relax the overscroll if needed
@@ -91,7 +90,6 @@
         override fun consumePostScroll(
             initialDragDelta: Offset,
             overscrollDelta: Offset,
-            pointerPosition: Offset?,
             source: NestedScrollSource
         ) {
             // if it is a drag, not a fling, add the delta left to our over scroll value
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/SnapFlingBehaviorSample.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/SnapFlingBehaviorSample.kt
new file mode 100644
index 0000000..99d8bd8
--- /dev/null
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/SnapFlingBehaviorSample.kt
@@ -0,0 +1,97 @@
+/*
+ * 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.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.background
+import androidx.compose.foundation.gestures.snapping.SnapLayoutInfoProvider
+import androidx.compose.foundation.gestures.snapping.rememberSnapFlingBehavior
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.lazy.LazyListDefaults
+import androidx.compose.foundation.lazy.LazyRow
+import androidx.compose.foundation.lazy.rememberLazyListState
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+
+@OptIn(ExperimentalFoundationApi::class)
+@Sampled
+@Composable
+fun SnapFlingBehaviorSimpleSample() {
+    val state = rememberLazyListState()
+
+    LazyRow(
+        modifier = Modifier.fillMaxSize(),
+        verticalAlignment = Alignment.CenterVertically,
+        state = state,
+        flingBehavior = LazyListDefaults.snapFlingBehavior(lazyListState = state)
+    ) {
+        items(200) {
+            Box(
+                modifier = Modifier
+                    .height(400.dp)
+                    .width(200.dp)
+                    .padding(8.dp)
+                    .background(Color.Gray),
+                contentAlignment = Alignment.Center
+            ) {
+                Text(it.toString(), fontSize = 32.sp)
+            }
+        }
+    }
+}
+
+@OptIn(ExperimentalFoundationApi::class)
+@Sampled
+@Composable
+fun SnapFlingBehaviorCustomizedSample() {
+    val state = rememberLazyListState()
+
+    // If you'd like to customize either the snap behavior or the layout provider
+    val snappingLayout = remember(state) { SnapLayoutInfoProvider(state) }
+    val flingBehavior = rememberSnapFlingBehavior(snappingLayout)
+
+    LazyRow(
+        modifier = Modifier.fillMaxSize(),
+        verticalAlignment = Alignment.CenterVertically,
+        state = state,
+        flingBehavior = flingBehavior
+    ) {
+        items(200) {
+            Box(
+                modifier = Modifier
+                    .height(400.dp)
+                    .width(200.dp)
+                    .padding(8.dp)
+                    .background(Color.Gray),
+                contentAlignment = Alignment.Center
+            ) {
+                Text(it.toString(), fontSize = 32.sp)
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/BaseLazyLayoutTestWithOrientation.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/BaseLazyLayoutTestWithOrientation.kt
new file mode 100644
index 0000000..179dd3a
--- /dev/null
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/BaseLazyLayoutTestWithOrientation.kt
@@ -0,0 +1,151 @@
+/*
+ * 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
+
+import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.lazy.grid.scrollBy
+import androidx.compose.runtime.Stable
+import androidx.compose.testutils.assertIsEqualTo
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.test.SemanticsNodeInteraction
+import androidx.compose.ui.test.assertHeightIsEqualTo
+import androidx.compose.ui.test.assertLeftPositionInRootIsEqualTo
+import androidx.compose.ui.test.assertTopPositionInRootIsEqualTo
+import androidx.compose.ui.test.assertWidthIsEqualTo
+import androidx.compose.ui.test.getUnclippedBoundsInRoot
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+import org.junit.Rule
+
+open class BaseLazyLayoutTestWithOrientation(private val orientation: Orientation) {
+    @get:Rule
+    val rule = createComposeRule()
+
+    val vertical: Boolean
+        get() = orientation == Orientation.Vertical
+
+    @Stable
+    fun Modifier.crossAxisSize(size: Dp) =
+        if (vertical) {
+            this.width(size)
+        } else {
+            this.height(size)
+        }
+
+    @Stable
+    fun Modifier.mainAxisSize(size: Dp) =
+        if (vertical) {
+            this.height(size)
+        } else {
+            this.width(size)
+        }
+
+    @Stable
+    fun Modifier.axisSize(crossAxis: Dp, mainAxis: Dp) =
+        if (vertical) {
+            this.size(crossAxis, mainAxis)
+        } else {
+            this.size(mainAxis, crossAxis)
+        }
+
+    fun SemanticsNodeInteraction.scrollMainAxisBy(distance: Dp) {
+        if (vertical) {
+            this.scrollBy(y = distance, density = rule.density)
+        } else {
+            this.scrollBy(x = distance, density = rule.density)
+        }
+    }
+
+    fun SemanticsNodeInteraction.assertMainAxisSizeIsEqualTo(expectedSize: Dp) =
+        if (vertical) {
+            assertHeightIsEqualTo(expectedSize)
+        } else {
+            assertWidthIsEqualTo(expectedSize)
+        }
+
+    fun SemanticsNodeInteraction.assertCrossAxisSizeIsEqualTo(expectedSize: Dp) =
+        if (vertical) {
+            assertWidthIsEqualTo(expectedSize)
+        } else {
+            assertHeightIsEqualTo(expectedSize)
+        }
+
+    fun SemanticsNodeInteraction.assertStartPositionIsAlmost(expected: Dp) {
+        val position = if (vertical) {
+            getUnclippedBoundsInRoot().top
+        } else {
+            getUnclippedBoundsInRoot().left
+        }
+        position.assertIsEqualTo(expected, tolerance = 1.dp)
+    }
+
+    fun SemanticsNodeInteraction.assertMainAxisStartPositionInRootIsEqualTo(expectedStart: Dp) =
+        if (vertical) {
+            assertTopPositionInRootIsEqualTo(expectedStart)
+        } else {
+            assertLeftPositionInRootIsEqualTo(expectedStart)
+        }
+
+    fun SemanticsNodeInteraction.assertStartPositionInRootIsEqualTo(expectedStart: Dp) =
+        if (vertical) {
+            assertTopPositionInRootIsEqualTo(expectedStart)
+        } else {
+            assertLeftPositionInRootIsEqualTo(expectedStart)
+        }
+
+    fun SemanticsNodeInteraction.assertCrossAxisStartPositionInRootIsEqualTo(expectedStart: Dp) =
+        if (vertical) {
+            assertLeftPositionInRootIsEqualTo(expectedStart)
+        } else {
+            assertTopPositionInRootIsEqualTo(expectedStart)
+        }
+
+    fun PaddingValues(
+        mainAxis: Dp = 0.dp,
+        crossAxis: Dp = 0.dp
+    ) = PaddingValues(
+        beforeContent = mainAxis,
+        afterContent = mainAxis,
+        beforeContentCrossAxis = crossAxis,
+        afterContentCrossAxis = crossAxis
+    )
+
+    fun PaddingValues(
+        beforeContent: Dp = 0.dp,
+        afterContent: Dp = 0.dp,
+        beforeContentCrossAxis: Dp = 0.dp,
+        afterContentCrossAxis: Dp = 0.dp,
+    ) = if (vertical) {
+        androidx.compose.foundation.layout.PaddingValues(
+            start = beforeContentCrossAxis,
+            top = beforeContent,
+            end = afterContentCrossAxis,
+            bottom = afterContent
+        )
+    } else {
+        androidx.compose.foundation.layout.PaddingValues(
+            start = beforeContent,
+            top = beforeContentCrossAxis,
+            end = afterContent,
+            bottom = afterContentCrossAxis
+        )
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/DraggableTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/DraggableTest.kt
index c8eccf7..b51c047 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/DraggableTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/DraggableTest.kt
@@ -628,7 +628,7 @@
                 "startDragImmediately",
                 "onDragStarted",
                 "onDragStopped",
-                "stateFactory",
+                "state",
             )
         }
     }
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/OverscrollTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/OverscrollTest.kt
index 54952bd..b994fe6f 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/OverscrollTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/OverscrollTest.kt
@@ -148,9 +148,7 @@
             assertThat(controller.drawCallsCount).isEqualTo(1)
         }
 
-        var centerXAxis = 0f
         rule.onNodeWithTag(boxTag).performTouchInput {
-            centerXAxis = centerX
             down(center)
             moveBy(Offset(1000f, 0f))
         }
@@ -161,8 +159,6 @@
             assertThat(abs(acummulatedScroll - 1000f * 9 / 10)).isWithin(0.1f)
 
             assertThat(controller.preScrollDelta).isEqualTo(Offset(1000f - slop, 0f))
-            assertThat(controller.preScrollPointerPosition?.x)
-                .isEqualTo(centerXAxis + slop)
             assertThat(controller.lastNestedScrollSource).isEqualTo(NestedScrollSource.Drag)
         }
 
@@ -184,9 +180,7 @@
             overscrollEffect = controller
         )
 
-        var centerXAxis = 0f
         rule.onNodeWithTag(boxTag).performTouchInput {
-            centerXAxis = centerX
             down(center)
             moveBy(Offset(1000f, 0f))
             up()
@@ -198,15 +192,12 @@
             assertThat(abs(acummulatedScroll - 1000f * 9 / 10)).isWithin(0.1f)
 
             assertThat(controller.preScrollDelta).isEqualTo(Offset(1000f - slop, 0f))
-            assertThat(controller.preScrollPointerPosition?.x)
-                .isEqualTo(centerXAxis + slop)
             assertThat(controller.lastNestedScrollSource).isEqualTo(NestedScrollSource.Drag)
             controller.isEnabled = false
             controller.preScrollDelta
         }
 
         rule.onNodeWithTag(boxTag).performTouchInput {
-            centerXAxis = centerX
             down(center)
             moveBy(Offset(1000f, 0f))
             up()
@@ -369,7 +360,6 @@
             controller.consumePostScroll(
                 initialDragDelta = offset,
                 overscrollDelta = offset,
-                pointerPosition = null,
                 source = NestedScrollSource.Drag
             )
             // we have to disable further invalidation requests as otherwise while the overscroll
@@ -408,9 +398,9 @@
             repeat(2) {
                 val offset = Offset(-10f, -10f)
                 assertThat(
-                    effect.consumePreScroll(offset, null, NestedScrollSource.Drag)
+                    effect.consumePreScroll(offset, NestedScrollSource.Drag)
                 ).isEqualTo(Offset.Zero)
-                effect.consumePostScroll(offset, offset, null, NestedScrollSource.Drag)
+                effect.consumePostScroll(offset, offset, NestedScrollSource.Drag)
             }
             val velocity = Velocity(-5f, -5f)
             runBlocking {
@@ -435,9 +425,9 @@
             repeat(2) {
                 val offset = Offset(0f, 10f)
                 assertThat(
-                    effect.consumePreScroll(offset, null, NestedScrollSource.Drag)
+                    effect.consumePreScroll(offset, NestedScrollSource.Drag)
                 ).isEqualTo(Offset.Zero)
-                effect.consumePostScroll(offset, offset, null, NestedScrollSource.Drag)
+                effect.consumePostScroll(offset, offset, NestedScrollSource.Drag)
             }
 
             val velocity = Velocity(0f, 5f)
@@ -645,22 +635,18 @@
         var lastVelocity = Velocity.Zero
         var lastInitialDragDelta = Offset.Zero
         var lastOverscrollDelta = Offset.Zero
-        var lastPointerPosition: Offset? = Offset.Zero
         var lastNestedScrollSource: NestedScrollSource? = null
 
         var preScrollDelta = Offset.Zero
-        var preScrollPointerPosition: Offset? = Offset.Zero
         var preScrollSource: NestedScrollSource? = null
 
         var preFlingVelocity = Velocity.Zero
 
         override fun consumePreScroll(
             scrollDelta: Offset,
-            pointerPosition: Offset?,
             source: NestedScrollSource
         ): Offset {
             preScrollDelta = scrollDelta
-            preScrollPointerPosition = pointerPosition
             preScrollSource = source
 
             return if (consumePreCycles) scrollDelta / 10f else Offset.Zero
@@ -669,12 +655,10 @@
         override fun consumePostScroll(
             initialDragDelta: Offset,
             overscrollDelta: Offset,
-            pointerPosition: Offset?,
             source: NestedScrollSource
         ) {
             lastInitialDragDelta = initialDragDelta
             lastOverscrollDelta = overscrollDelta
-            lastPointerPosition = pointerPosition
             lastNestedScrollSource = source
         }
 
@@ -712,7 +696,7 @@
                 delta
             }
         }
-        val viewConfig = rule.setOverscrollContentAndReturnViewConfig(
+        rule.setOverscrollContentAndReturnViewConfig(
             scrollableState = scrollableState,
             overscrollEffect = controller,
             reverseDirection = reverseDirection
@@ -725,9 +709,7 @@
 
         rule.onNodeWithTag(boxTag).assertExists()
 
-        var centerXAxis = 0f
         rule.onNodeWithTag(boxTag).performTouchInput {
-            centerXAxis = centerX
             down(center)
             moveBy(Offset(1000f, 0f))
         }
@@ -735,9 +717,6 @@
         rule.runOnIdle {
             assertThat(controller.lastInitialDragDelta.x).isGreaterThan(0f)
             assertThat(controller.lastInitialDragDelta.y).isZero()
-            // there was only one pointer position coming from the center + 1000, let's check
-            assertThat(controller.lastPointerPosition?.x)
-                .isEqualTo(centerXAxis + viewConfig.touchSlop)
             // consuming all, so overscroll is 0
             assertThat(controller.lastOverscrollDelta).isEqualTo(Offset.Zero)
         }
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollTest.kt
index 7801e2a..b05fcaa 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollTest.kt
@@ -25,6 +25,7 @@
 import androidx.compose.foundation.gestures.scrollBy
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.IntrinsicSize
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.fillMaxHeight
@@ -39,8 +40,10 @@
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.SideEffect
+import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.runtime.setValue
 import androidx.compose.testutils.assertPixels
 import androidx.compose.testutils.assertShape
 import androidx.compose.ui.Modifier
@@ -52,9 +55,12 @@
 import androidx.compose.ui.layout.IntrinsicMeasurable
 import androidx.compose.ui.layout.IntrinsicMeasureScope
 import androidx.compose.ui.layout.Layout
+import androidx.compose.ui.layout.LayoutModifier
 import androidx.compose.ui.layout.Measurable
 import androidx.compose.ui.layout.MeasurePolicy
+import androidx.compose.ui.layout.MeasureResult
 import androidx.compose.ui.layout.MeasureScope
+import androidx.compose.ui.layout.layout
 import androidx.compose.ui.layout.onSizeChanged
 import androidx.compose.ui.platform.InspectableValue
 import androidx.compose.ui.platform.LocalDensity
@@ -799,6 +805,192 @@
         }
     }
 
+    @Test
+    fun minIntrinsic_mainAxis() {
+        var sizeParam by mutableStateOf(0)
+
+        val layoutModifier = object : LayoutModifier {
+            override fun MeasureScope.measure(
+                measurable: Measurable,
+                constraints: Constraints
+            ): MeasureResult {
+                val p = measurable.measure(constraints)
+                return layout(p.width, p.height) {
+                    p.place(0, 0)
+                }
+            }
+
+            override fun IntrinsicMeasureScope.minIntrinsicWidth(
+                measurable: IntrinsicMeasurable,
+                height: Int
+            ): Int {
+                sizeParam = height
+                return measurable.minIntrinsicWidth(height)
+            }
+
+            override fun IntrinsicMeasureScope.minIntrinsicHeight(
+                measurable: IntrinsicMeasurable,
+                width: Int
+            ): Int {
+                sizeParam = width
+                return measurable.minIntrinsicHeight(width)
+            }
+        }
+        rule.setContent {
+            Box(Modifier.intrinsicMainAxisSize(IntrinsicSize.Min)
+                .scrollerWithOrientation()
+                .then(layoutModifier)
+            )
+        }
+        rule.waitForIdle()
+        assertThat(sizeParam).isNotEqualTo(Constraints.Infinity)
+    }
+
+    @Test
+    fun minIntrinsic_crossAxis() {
+        var sizeParam by mutableStateOf(0)
+
+        val layoutModifier = object : LayoutModifier {
+            override fun MeasureScope.measure(
+                measurable: Measurable,
+                constraints: Constraints
+            ): MeasureResult {
+                val p = measurable.measure(constraints)
+                return layout(p.width, p.height) {
+                    p.place(0, 0)
+                }
+            }
+
+            override fun IntrinsicMeasureScope.minIntrinsicWidth(
+                measurable: IntrinsicMeasurable,
+                height: Int
+            ): Int {
+                sizeParam = height
+                return measurable.minIntrinsicWidth(height)
+            }
+
+            override fun IntrinsicMeasureScope.minIntrinsicHeight(
+                measurable: IntrinsicMeasurable,
+                width: Int
+            ): Int {
+                sizeParam = width
+                return measurable.minIntrinsicHeight(width)
+            }
+        }
+        rule.setContent {
+            Box(Modifier.intrinsicCrossAxisSize(IntrinsicSize.Min)
+                .scrollerWithOrientation()
+                .then(layoutModifier)
+            )
+        }
+        rule.waitForIdle()
+        assertThat(sizeParam).isEqualTo(Constraints.Infinity)
+    }
+
+    @Test
+    fun maxIntrinsic_mainAxis() {
+        var sizeParam by mutableStateOf(0)
+
+        val layoutModifier = object : LayoutModifier {
+            override fun MeasureScope.measure(
+                measurable: Measurable,
+                constraints: Constraints
+            ): MeasureResult {
+                val p = measurable.measure(constraints)
+                return layout(p.width, p.height) {
+                    p.place(0, 0)
+                }
+            }
+
+            override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                measurable: IntrinsicMeasurable,
+                height: Int
+            ): Int {
+                sizeParam = height
+                return measurable.minIntrinsicWidth(height)
+            }
+
+            override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+                measurable: IntrinsicMeasurable,
+                width: Int
+            ): Int {
+                sizeParam = width
+                return measurable.minIntrinsicHeight(width)
+            }
+        }
+        rule.setContent {
+            Box(Modifier.intrinsicMainAxisSize(IntrinsicSize.Max)
+                .scrollerWithOrientation()
+                .then(layoutModifier)
+            )
+        }
+        rule.waitForIdle()
+        assertThat(sizeParam).isNotEqualTo(Constraints.Infinity)
+    }
+
+    @Test
+    fun maxIntrinsic_crossAxis() {
+        var sizeParam by mutableStateOf(0)
+
+        val layoutModifier = object : LayoutModifier {
+            override fun MeasureScope.measure(
+                measurable: Measurable,
+                constraints: Constraints
+            ): MeasureResult {
+                val p = measurable.measure(constraints)
+                return layout(p.width, p.height) {
+                    p.place(0, 0)
+                }
+            }
+
+            override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+                measurable: IntrinsicMeasurable,
+                height: Int
+            ): Int {
+                sizeParam = height
+                return measurable.minIntrinsicWidth(height)
+            }
+
+            override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+                measurable: IntrinsicMeasurable,
+                width: Int
+            ): Int {
+                sizeParam = width
+                return measurable.minIntrinsicHeight(width)
+            }
+        }
+        rule.setContent {
+            Box(Modifier.intrinsicCrossAxisSize(IntrinsicSize.Max)
+                .scrollerWithOrientation()
+                .then(layoutModifier)
+            )
+        }
+        rule.waitForIdle()
+        assertThat(sizeParam).isEqualTo(Constraints.Infinity)
+    }
+
+    private fun Modifier.intrinsicMainAxisSize(size: IntrinsicSize): Modifier =
+        if (config.orientation == Horizontal) {
+            width(size)
+        } else {
+            height(size)
+        }
+
+    private fun Modifier.intrinsicCrossAxisSize(size: IntrinsicSize): Modifier =
+        if (config.orientation == Vertical) {
+            width(size)
+        } else {
+            height(size)
+        }
+
+    @Composable
+    private fun Modifier.scrollerWithOrientation(): Modifier =
+        if (config.orientation == Vertical) {
+            verticalScroll(rememberScrollState())
+        } else {
+            horizontalScroll(rememberScrollState())
+        }
+
     /**
      * Swipes forward (up/left) or backward given the current orientation and layout direction
      * of the test config.
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 49053f2..5815d61 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
@@ -2244,14 +2244,12 @@
 
     override fun consumePreScroll(
         scrollDelta: Offset,
-        pointerPosition: Offset?,
         source: NestedScrollSource
     ): Offset = Offset.Zero
 
     override fun consumePostScroll(
         initialDragDelta: Offset,
         overscrollDelta: Offset,
-        pointerPosition: Offset?,
         source: NestedScrollSource
     ) {
     }
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/gesture/snapping/LazyListSnapFlingBehaviorTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/gesture/snapping/LazyListSnapFlingBehaviorTest.kt
new file mode 100644
index 0000000..bc5b486
--- /dev/null
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/gesture/snapping/LazyListSnapFlingBehaviorTest.kt
@@ -0,0 +1,293 @@
+/*
+ * 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.gesture.snapping
+
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.foundation.gestures.snapping.MinFlingVelocityDp
+import androidx.compose.foundation.gestures.snapping.calculateDistanceToDesiredSnapPosition
+import androidx.compose.foundation.gestures.snapping.SnapLayoutInfoProvider
+import androidx.compose.foundation.gestures.snapping.rememberSnapFlingBehavior
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.lazy.LazyListState
+import androidx.compose.foundation.lazy.list.BaseLazyListTestWithOrientation
+import androidx.compose.foundation.lazy.rememberLazyListState
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.SemanticsNodeInteraction
+import androidx.compose.ui.test.TouchInjectionScope
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.performTouchInput
+import androidx.compose.ui.test.swipeLeft
+import androidx.compose.ui.test.swipeUp
+import androidx.compose.ui.test.swipeWithVelocity
+import androidx.compose.ui.unit.dp
+import androidx.test.filters.LargeTest
+import kotlin.math.abs
+import kotlin.test.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@LargeTest
+@RunWith(Parameterized::class)
+@OptIn(ExperimentalFoundationApi::class)
+class LazyListSnapFlingBehaviorTest(private val orientation: Orientation) :
+    BaseLazyListTestWithOrientation(orientation) {
+
+    @Test
+    fun belowThresholdVelocity_lessThanAnItemScroll_shouldStayInSamePage() {
+        var lazyListState: LazyListState? = null
+        var stepSize = 0f
+        var velocityThreshold = 0f
+
+        // arrange
+        rule.setContent {
+            val state = rememberLazyListState().also { lazyListState = it }
+            stepSize = with(LocalDensity.current) { ItemSize.toPx() }
+            velocityThreshold = with(LocalDensity.current) { MinFlingVelocityDp.toPx() }
+            MainLayout(state = state)
+        }
+
+        // Scroll a bit
+        onMainList().swipeOnMainAxis()
+        rule.waitForIdle()
+        val currentItem = getCurrentSnappedItem(lazyListState)
+
+        // act
+        onMainList().performTouchInput {
+            swipeMainAxisWithVelocity(stepSize / 2, velocityThreshold / 2)
+        }
+
+        // assert
+        rule.runOnIdle {
+            val nextItem = getCurrentSnappedItem(lazyListState)
+            assertEquals(currentItem, nextItem)
+        }
+    }
+
+    @Test
+    fun belowThresholdVelocity_moreThanAnItemScroll_shouldGoToNextPage() {
+        var lazyListState: LazyListState? = null
+        var stepSize = 0f
+        var velocityThreshold = 0f
+
+        // arrange
+        rule.setContent {
+            val state = rememberLazyListState().also { lazyListState = it }
+            stepSize = with(LocalDensity.current) { ItemSize.toPx() }
+            velocityThreshold = with(LocalDensity.current) { MinFlingVelocityDp.toPx() }
+            MainLayout(state = state)
+        }
+
+        // Scroll a bit
+        onMainList().swipeOnMainAxis()
+        rule.waitForIdle()
+        val currentItem = getCurrentSnappedItem(lazyListState)
+
+        // act
+        onMainList().performTouchInput {
+            swipeMainAxisWithVelocity(
+                stepSize,
+                velocityThreshold / 2
+            )
+        }
+
+        // assert
+        rule.runOnIdle {
+            val nextItem = getCurrentSnappedItem(lazyListState)
+            assertEquals(currentItem + 1, nextItem)
+        }
+    }
+
+    @Test
+    fun aboveThresholdVelocityForward_notLargeEnoughScroll_shouldGoToNextPage() {
+        var lazyListState: LazyListState? = null
+        var stepSize = 0f
+        var velocityThreshold = 0f
+
+        // arrange
+        rule.setContent {
+            val state = rememberLazyListState().also { lazyListState = it }
+            stepSize = with(LocalDensity.current) { ItemSize.toPx() }
+            velocityThreshold = with(LocalDensity.current) { MinFlingVelocityDp.toPx() }
+            MainLayout(state = state)
+        }
+
+        // Scroll a bit
+        onMainList().swipeOnMainAxis()
+        rule.waitForIdle()
+        val currentItem = getCurrentSnappedItem(lazyListState)
+
+        // act
+        onMainList().performTouchInput {
+            swipeMainAxisWithVelocity(
+                stepSize / 2,
+                velocityThreshold * 2
+            )
+        }
+
+        // assert
+        rule.runOnIdle {
+            val nextItem = getCurrentSnappedItem(lazyListState)
+            assertEquals(currentItem + 1, nextItem)
+        }
+    }
+
+    @Test
+    fun aboveThresholdVelocityBackward_notLargeEnoughScroll_shouldGoToPreviousPage() {
+        var lazyListState: LazyListState? = null
+        var stepSize = 0f
+        var velocityThreshold = 0f
+
+        // arrange
+        rule.setContent {
+            val state = rememberLazyListState().also { lazyListState = it }
+            stepSize = with(LocalDensity.current) { ItemSize.toPx() }
+            velocityThreshold = with(LocalDensity.current) { MinFlingVelocityDp.toPx() }
+            MainLayout(state = state)
+        }
+
+        // Scroll a bit
+        onMainList().swipeOnMainAxis()
+        rule.waitForIdle()
+        val currentItem = getCurrentSnappedItem(lazyListState)
+
+        // act
+        onMainList().performTouchInput {
+            swipeMainAxisWithVelocity(
+                stepSize / 2,
+                velocityThreshold * 2,
+                true
+            )
+        }
+
+        // assert
+        rule.runOnIdle {
+            val nextItem = getCurrentSnappedItem(lazyListState)
+            assertEquals(currentItem - 1, nextItem)
+        }
+    }
+
+    @Test
+    fun aboveThresholdVelocity_largeEnoughScroll_shouldGoToNextNextPage() {
+        var lazyListState: LazyListState? = null
+        var stepSize = 0f
+        var velocityThreshold = 0f
+
+        // arrange
+        rule.setContent {
+            val state = rememberLazyListState().also { lazyListState = it }
+            stepSize = with(LocalDensity.current) { ItemSize.toPx() }
+            velocityThreshold = with(LocalDensity.current) { MinFlingVelocityDp.toPx() }
+            MainLayout(state = state)
+        }
+
+        // Scroll a bit
+        onMainList().swipeOnMainAxis()
+        rule.waitForIdle()
+        val currentItem = getCurrentSnappedItem(lazyListState)
+
+        // act
+        onMainList().performTouchInput {
+            swipeMainAxisWithVelocity(
+                1.5f * stepSize,
+                velocityThreshold * 3
+            )
+        }
+
+        // assert
+        rule.runOnIdle {
+            val nextItem = getCurrentSnappedItem(lazyListState)
+            assertEquals(currentItem + 2, nextItem)
+        }
+    }
+
+    private fun onMainList() = rule.onNodeWithTag(TestTag)
+
+    @Composable
+    fun MainLayout(state: LazyListState) {
+        val layoutInfoProvider = remember(state) { SnapLayoutInfoProvider(state) }
+
+        LazyColumnOrRow(
+            state = state,
+            modifier = Modifier.testTag(TestTag),
+            flingBehavior = rememberSnapFlingBehavior(snapLayoutInfoProvider = layoutInfoProvider)
+        ) {
+            items(200) {
+                Box(modifier = Modifier.size(ItemSize))
+            }
+        }
+    }
+
+    private fun SemanticsNodeInteraction.swipeOnMainAxis() {
+        performTouchInput {
+            if (orientation == Orientation.Vertical) {
+                swipeUp()
+            } else {
+                swipeLeft()
+            }
+        }
+    }
+
+    private fun getCurrentSnappedItem(state: LazyListState?): Int {
+        var itemIndex = -1
+        if (state == null) return -1
+        var minDistance = Float.POSITIVE_INFINITY
+        (state.layoutInfo.visibleItemsInfo).forEach {
+            val distance =
+                calculateDistanceToDesiredSnapPosition(state.layoutInfo, it, CenterToCenter)
+            if (abs(distance) < minDistance) {
+                minDistance = abs(distance)
+                itemIndex = it.index
+            }
+        }
+        return itemIndex
+    }
+
+    private fun TouchInjectionScope.swipeMainAxisWithVelocity(
+        scrollSize: Float,
+        endVelocity: Float,
+        reversed: Boolean = false
+    ) {
+        val (start, end) = if (orientation == Orientation.Vertical) {
+            bottomCenter to bottomCenter.copy(y = bottomCenter.y - scrollSize)
+        } else {
+            centerRight to centerRight.copy(x = centerRight.x - scrollSize)
+        }
+        swipeWithVelocity(
+            if (reversed) end else start,
+            if (reversed) start else end,
+            endVelocity
+        )
+    }
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "{0}")
+        fun params() = arrayOf(Orientation.Vertical, Orientation.Horizontal)
+
+        val ItemSize = 200.dp
+        const val TestTag = "MainList"
+        val CenterToCenter: (Float, Float) -> Float =
+            { layoutSize, itemSize -> layoutSize / 2f - itemSize / 2f }
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/gesture/snapping/LazyListSnapLayoutInfoProviderTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/gesture/snapping/LazyListSnapLayoutInfoProviderTest.kt
new file mode 100644
index 0000000..909db89
--- /dev/null
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/gesture/snapping/LazyListSnapLayoutInfoProviderTest.kt
@@ -0,0 +1,196 @@
+/*
+ * 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.gesture.snapping
+
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.foundation.gestures.snapping.SnapLayoutInfoProvider
+import androidx.compose.foundation.gestures.snapping.rememberSnapFlingBehavior
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.lazy.LazyListState
+import androidx.compose.foundation.lazy.list.BaseLazyListTestWithOrientation
+import androidx.compose.foundation.lazy.rememberLazyListState
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+import androidx.test.filters.LargeTest
+import kotlin.math.round
+import kotlin.math.sign
+import kotlin.test.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@OptIn(ExperimentalFoundationApi::class)
+@LargeTest
+@RunWith(Parameterized::class)
+class LazyListSnapLayoutInfoProviderTest(orientation: Orientation) :
+    BaseLazyListTestWithOrientation(orientation) {
+
+    @Test
+    fun snapStepSize_sameSizeItems_shouldBeAverageItemSize() {
+        var expectedItemSize = 0f
+        var actualItemSize = 0f
+
+        rule.setContent {
+            val state = rememberLazyListState()
+            val layoutInfoProvider = remember(state) { createLayoutInfo(state) }.also {
+                actualItemSize = it.snapStepSize
+            }
+            expectedItemSize = with(LocalDensity.current) { FixedItemSize.toPx() }
+            MainLayout(
+                state = state,
+                layoutInfo = layoutInfoProvider,
+                items = 200,
+                itemSizeProvider = { FixedItemSize }
+            )
+        }
+
+        rule.runOnIdle {
+            assertEquals(round(expectedItemSize), round(actualItemSize))
+        }
+    }
+
+    @Test
+    fun snapStepSize_differentSizeItems_shouldBeAverageItemSize() {
+        var actualItemSize = 0f
+        var expectedItemSize = 0f
+
+        rule.setContent {
+            val state = rememberLazyListState()
+            val layoutInfoProvider = remember(state) { createLayoutInfo(state) }.also {
+                actualItemSize = it.snapStepSize
+            }
+            expectedItemSize = state.layoutInfo.visibleItemsInfo.map { it.size }.average().toFloat()
+
+            MainLayout(state, layoutInfoProvider, DynamicItemSizes.size, { DynamicItemSizes[it] })
+        }
+
+        rule.runOnIdle {
+            assertEquals(round(expectedItemSize), round(actualItemSize))
+        }
+    }
+
+    @Test
+    fun snapStepSize_withSpacers_shouldBeAverageItemSize() {
+        var snapStepSize = 0f
+        var actualItemSize = 0f
+        rule.setContent {
+            val state = rememberLazyListState()
+            val layoutInfoProvider = remember(state) { createLayoutInfo(state) }.also {
+                snapStepSize = it.snapStepSize
+            }
+
+            actualItemSize =
+                with(LocalDensity.current) { (FixedItemSize + FixedItemSize / 2).toPx() }
+            MainLayout(
+                state = state,
+                layoutInfo = layoutInfoProvider,
+                items = 200,
+                itemSizeProvider = { FixedItemSize }) {
+                Box(modifier = Modifier.size(FixedItemSize))
+                Spacer(modifier = Modifier.size(FixedItemSize / 2))
+            }
+        }
+
+        rule.runOnIdle {
+            assertEquals(round(actualItemSize), round(snapStepSize))
+        }
+    }
+
+    @Test
+    fun snappingOffsetBounds_shouldBeDifferentSignedBounds() {
+        var upperBound = 0f
+        var lowerBound = 0f
+        rule.setContent {
+            val state = rememberLazyListState()
+            val layoutInfoProvider = remember(state) { createLayoutInfo(state) }
+            val bounds = layoutInfoProvider.calculateSnappingOffsetBounds()
+            lowerBound = bounds.start
+            upperBound = bounds.endInclusive
+            MainLayout(
+                state = state,
+                layoutInfo = layoutInfoProvider,
+                items = 200,
+                itemSizeProvider = { FixedItemSize }
+            )
+        }
+
+        rule.runOnIdle {
+            assertEquals(sign(lowerBound), sign(-1f))
+            assertEquals(sign(upperBound), sign(1f))
+        }
+    }
+
+    @Test
+    fun calculateApproachOffset_approachOffsetIsAlwaysZero() {
+        var snapLayoutInfoProvider: SnapLayoutInfoProvider? = null
+        rule.setContent {
+            val state = rememberLazyListState()
+            val layoutInfoProvider = remember(state) { createLayoutInfo(state) }.also {
+                snapLayoutInfoProvider = it
+            }
+            LazyColumnOrRow(
+                state = state,
+                flingBehavior = rememberSnapFlingBehavior(layoutInfoProvider)
+            ) {
+                items(200) {
+                    Box(modifier = Modifier.size(200.dp))
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            assertEquals(snapLayoutInfoProvider?.calculateApproachOffset(1000f), 0f)
+            assertEquals(snapLayoutInfoProvider?.calculateApproachOffset(-1000f), 0f)
+        }
+    }
+
+    @Composable
+    private fun MainLayout(
+        state: LazyListState,
+        layoutInfo: SnapLayoutInfoProvider,
+        items: Int,
+        itemSizeProvider: (Int) -> Dp,
+        listItem: @Composable (Int) -> Unit = { Box(Modifier.size(itemSizeProvider(it))) }
+    ) {
+        LazyColumnOrRow(
+            state = state,
+            flingBehavior = rememberSnapFlingBehavior(snapLayoutInfoProvider = layoutInfo)
+        ) {
+            items(items) { listItem(it) }
+        }
+    }
+
+    private fun createLayoutInfo(state: LazyListState): SnapLayoutInfoProvider {
+        return SnapLayoutInfoProvider(state)
+    }
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "{0}")
+        fun params() = arrayOf(Orientation.Vertical, Orientation.Horizontal)
+
+        val FixedItemSize = 200.dp
+        val DynamicItemSizes = (200..500).map { it.dp }
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/gesture/snapping/SnapFlingBehaviorTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/gesture/snapping/SnapFlingBehaviorTest.kt
new file mode 100644
index 0000000..4931030
--- /dev/null
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/gesture/snapping/SnapFlingBehaviorTest.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.compose.foundation.gesture.snapping
+
+import androidx.compose.animation.SplineBasedFloatDecayAnimationSpec
+import androidx.compose.animation.core.AnimationSpec
+import androidx.compose.animation.core.AnimationVector
+import androidx.compose.animation.core.FloatDecayAnimationSpec
+import androidx.compose.animation.core.SpringSpec
+import androidx.compose.animation.core.TwoWayConverter
+import androidx.compose.animation.core.VectorizedAnimationSpec
+import androidx.compose.animation.core.generateDecayAnimationSpec
+import androidx.compose.animation.core.spring
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.gestures.FlingBehavior
+import androidx.compose.foundation.gestures.rememberScrollableState
+import androidx.compose.foundation.gestures.snapping.MinFlingVelocityDp
+import androidx.compose.foundation.gestures.snapping.NoVelocity
+import androidx.compose.foundation.gestures.snapping.SnapLayoutInfoProvider
+import androidx.compose.foundation.gestures.snapping.findClosestOffset
+import androidx.compose.foundation.gestures.snapping.rememberSnapFlingBehavior
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.remember
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import kotlin.test.assertEquals
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+@OptIn(ExperimentalFoundationApi::class)
+class SnapFlingBehaviorTest {
+    @get:Rule
+    val rule = createComposeRule()
+
+    private val inspectSpringAnimationSpec = InspectSpringAnimationSpec(spring())
+
+    @Test
+    fun performFling_whenVelocityIsBelowThreshold_shouldShortSnap() {
+        val testLayoutInfoProvider = TestLayoutInfoProvider()
+        rule.setContent {
+            val testFlingBehavior = rememberSnapFlingBehavior(testLayoutInfoProvider)
+            VelocityEffect(testFlingBehavior, calculateVelocityThreshold() - 1)
+        }
+
+        rule.runOnIdle {
+            assertEquals(0, testLayoutInfoProvider.calculateApproachOffsetCount)
+        }
+    }
+
+    @Test
+    fun performFling_whenVelocityIsAboveThreshold_shouldLongSnap() {
+        val testLayoutInfoProvider = TestLayoutInfoProvider()
+        rule.setContent {
+            val testFlingBehavior = rememberSnapFlingBehavior(testLayoutInfoProvider)
+            VelocityEffect(testFlingBehavior, calculateVelocityThreshold() + 1)
+        }
+
+        rule.runOnIdle {
+            assertEquals(1, testLayoutInfoProvider.calculateApproachOffsetCount)
+        }
+    }
+
+    @Test
+    fun performFling_afterSnappingVelocity_shouldReturnNoVelocity() {
+        val testLayoutInfoProvider = TestLayoutInfoProvider()
+        var afterFlingVelocity = 0f
+        rule.setContent {
+            val scrollableState = rememberScrollableState(consumeScrollDelta = { it })
+            val testFlingBehavior = rememberSnapFlingBehavior(testLayoutInfoProvider)
+
+            LaunchedEffect(Unit) {
+                scrollableState.scroll {
+                    afterFlingVelocity = with(testFlingBehavior) {
+                        performFling(50000f)
+                    }
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            assertEquals(NoVelocity, afterFlingVelocity)
+        }
+    }
+
+    @Test
+    fun findClosestOffset_noFlingDirection_shouldReturnAbsoluteDistance() {
+        val testLayoutInfoProvider = TestLayoutInfoProvider()
+        val offset = findClosestOffset(0f, testLayoutInfoProvider)
+        assertEquals(offset, MinOffset)
+    }
+
+    @Test
+    fun findClosestOffset_flingDirection_shouldReturnCorrectBound() {
+        val testLayoutInfoProvider = TestLayoutInfoProvider()
+        val forwardOffset = findClosestOffset(1f, testLayoutInfoProvider)
+        val backwardOffset = findClosestOffset(-1f, testLayoutInfoProvider)
+        assertEquals(forwardOffset, MaxOffset)
+        assertEquals(backwardOffset, MinOffset)
+    }
+
+    @Test
+    fun approach_cannotDecay_justSnap() {
+        val testLayoutInfoProvider = TestLayoutInfoProvider(approachOffset = SnapStep * 5)
+        var inspectSplineAnimationSpec: InspectSplineAnimationSpec? = null
+        rule.setContent {
+            val splineAnimationSpec = rememberInspectSplineAnimationSpec().also {
+                inspectSplineAnimationSpec = it
+            }
+            val testFlingBehavior = rememberSnapFlingBehavior(
+                snapLayoutInfoProvider = testLayoutInfoProvider,
+                approachAnimationSpec = splineAnimationSpec.generateDecayAnimationSpec()
+            )
+            VelocityEffect(testFlingBehavior, calculateVelocityThreshold() * 2)
+        }
+
+        rule.runOnIdle {
+            assertEquals(0, inspectSplineAnimationSpec?.animationWasExecutions)
+        }
+    }
+
+    @Test
+    fun approach_canDecayWithoutHalfStep_decayAndSnap() {
+        val testLayoutInfoProvider = TestLayoutInfoProvider(maxOffset = 100f)
+        var inspectSplineAnimationSpec: InspectSplineAnimationSpec? = null
+        rule.setContent {
+            val splineAnimationSpec = rememberInspectSplineAnimationSpec().also {
+                inspectSplineAnimationSpec = it
+            }
+            val testFlingBehavior = rememberSnapFlingBehavior(
+                snapLayoutInfoProvider = testLayoutInfoProvider,
+                approachAnimationSpec = splineAnimationSpec.generateDecayAnimationSpec(),
+                snapAnimationSpec = inspectSpringAnimationSpec
+            )
+            VelocityEffect(testFlingBehavior, calculateVelocityThreshold() * 5)
+        }
+
+        rule.runOnIdle {
+            assertEquals(1, inspectSplineAnimationSpec?.animationWasExecutions)
+            assertEquals(1, inspectSpringAnimationSpec.animationWasExecutions)
+        }
+    }
+
+    @Test
+    fun approach_canDecayWithHalfStep_doubleDecayAndSnap() {
+        val testLayoutInfoProvider = TestLayoutInfoProvider(maxOffset = 300f, snapStep = 400f)
+        var inspectSplineAnimationSpec: InspectSplineAnimationSpec? = null
+        rule.setContent {
+            val splineAnimationSpec = rememberInspectSplineAnimationSpec().also {
+                inspectSplineAnimationSpec = it
+            }
+            val testFlingBehavior = rememberSnapFlingBehavior(
+                snapLayoutInfoProvider = testLayoutInfoProvider,
+                approachAnimationSpec = splineAnimationSpec.generateDecayAnimationSpec(),
+                snapAnimationSpec = inspectSpringAnimationSpec
+            )
+
+            VelocityEffect(testFlingBehavior, calculateVelocityThreshold() * 3)
+        }
+
+        rule.runOnIdle {
+            assertEquals(2, inspectSplineAnimationSpec?.animationWasExecutions)
+            assertEquals(1, inspectSpringAnimationSpec.animationWasExecutions)
+        }
+    }
+}
+
+@Composable
+private fun VelocityEffect(testFlingBehavior: FlingBehavior, velocity: Float) {
+    val scrollableState = rememberScrollableState(consumeScrollDelta = { it })
+    LaunchedEffect(Unit) {
+        scrollableState.scroll {
+            with(testFlingBehavior) {
+                performFling(velocity)
+            }
+        }
+    }
+}
+
+private class InspectSpringAnimationSpec(
+    private val springSpec: SpringSpec<Float>
+) : AnimationSpec<Float> by springSpec {
+
+    var animationWasExecutions = 0
+
+    override fun <V : AnimationVector> vectorize(
+        converter: TwoWayConverter<Float, V>
+    ): VectorizedAnimationSpec<V> {
+        animationWasExecutions++
+        return springSpec.vectorize(converter)
+    }
+}
+
+private class InspectSplineAnimationSpec(
+    private val splineBasedFloatDecayAnimationSpec: SplineBasedFloatDecayAnimationSpec
+) : FloatDecayAnimationSpec by splineBasedFloatDecayAnimationSpec {
+
+    private var valueFromNanosCalls = 0
+    val animationWasExecutions: Int
+        get() = valueFromNanosCalls / 2
+
+    override fun getValueFromNanos(
+        playTimeNanos: Long,
+        initialValue: Float,
+        initialVelocity: Float
+    ): Float {
+
+        if (playTimeNanos == 0L) {
+            valueFromNanosCalls++
+        }
+
+        return splineBasedFloatDecayAnimationSpec.getValueFromNanos(
+            playTimeNanos,
+            initialValue,
+            initialVelocity
+        )
+    }
+}
+
+@Composable
+private fun rememberInspectSplineAnimationSpec(): InspectSplineAnimationSpec {
+    val density = LocalDensity.current
+    return remember {
+        InspectSplineAnimationSpec(
+            SplineBasedFloatDecayAnimationSpec(density)
+        )
+    }
+}
+
+@Composable
+private fun calculateVelocityThreshold(): Float {
+    val density = LocalDensity.current
+    return with(density) { MinFlingVelocityDp.toPx() }
+}
+
+private const val SnapStep = 250f
+private const val MinOffset = -200f
+private const val MaxOffset = 300f
+
+@OptIn(ExperimentalFoundationApi::class)
+
+private class TestLayoutInfoProvider(
+    val minOffset: Float = MinOffset,
+    val maxOffset: Float = MaxOffset,
+    val snapStep: Float = SnapStep,
+    val approachOffset: Float = 0f
+) : SnapLayoutInfoProvider {
+    var calculateApproachOffsetCount = 0
+
+    override val snapStepSize: Float
+        get() = snapStep
+
+    override fun calculateSnappingOffsetBounds(): ClosedFloatingPointRange<Float> {
+        return minOffset.rangeTo(maxOffset)
+    }
+
+    override fun calculateApproachOffset(initialVelocity: Float): Float {
+        calculateApproachOffsetCount++
+        return approachOffset
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/grid/BaseLazyGridTestWithOrientation.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/grid/BaseLazyGridTestWithOrientation.kt
index 16b0e12..dcb34e1 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/grid/BaseLazyGridTestWithOrientation.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/grid/BaseLazyGridTestWithOrientation.kt
@@ -18,139 +18,24 @@
 
 import androidx.compose.animation.core.snap
 import androidx.compose.foundation.AutoTestFrameClock
+import androidx.compose.foundation.BaseLazyLayoutTestWithOrientation
 import androidx.compose.foundation.gestures.FlingBehavior
 import androidx.compose.foundation.gestures.Orientation
 import androidx.compose.foundation.gestures.ScrollableDefaults
 import androidx.compose.foundation.gestures.animateScrollBy
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.PaddingValues
-import androidx.compose.foundation.layout.height
-import androidx.compose.foundation.layout.size
-import androidx.compose.foundation.layout.width
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.Stable
-import androidx.compose.testutils.assertIsEqualTo
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.test.SemanticsNodeInteraction
-import androidx.compose.ui.test.assertHeightIsEqualTo
-import androidx.compose.ui.test.assertLeftPositionInRootIsEqualTo
-import androidx.compose.ui.test.assertTopPositionInRootIsEqualTo
-import androidx.compose.ui.test.assertWidthIsEqualTo
-import androidx.compose.ui.test.getUnclippedBoundsInRoot
-import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.runBlocking
-import org.junit.Rule
 
-open class BaseLazyGridTestWithOrientation(private val orientation: Orientation) {
-
-    @get:Rule
-    val rule = createComposeRule()
-
-    val vertical: Boolean
-        get() = orientation == Orientation.Vertical
-
-    @Stable
-    fun Modifier.crossAxisSize(size: Dp) =
-        if (vertical) {
-            this.width(size)
-        } else {
-            this.height(size)
-        }
-
-    @Stable
-    fun Modifier.mainAxisSize(size: Dp) =
-        if (vertical) {
-            this.height(size)
-        } else {
-            this.width(size)
-        }
-
-    @Stable
-    fun Modifier.axisSize(crossAxis: Dp, mainAxis: Dp) =
-        if (vertical) {
-            this.size(crossAxis, mainAxis)
-        } else {
-            this.size(mainAxis, crossAxis)
-        }
-
-    fun SemanticsNodeInteraction.scrollMainAxisBy(distance: Dp) {
-        if (vertical) {
-            this.scrollBy(y = distance, density = rule.density)
-        } else {
-            this.scrollBy(x = distance, density = rule.density)
-        }
-    }
-
-    fun SemanticsNodeInteraction.assertMainAxisSizeIsEqualTo(expectedSize: Dp) =
-        if (vertical) {
-            assertHeightIsEqualTo(expectedSize)
-        } else {
-            assertWidthIsEqualTo(expectedSize)
-        }
-
-    fun SemanticsNodeInteraction.assertCrossAxisSizeIsEqualTo(expectedSize: Dp) =
-        if (vertical) {
-            assertWidthIsEqualTo(expectedSize)
-        } else {
-            assertHeightIsEqualTo(expectedSize)
-        }
-
-    fun SemanticsNodeInteraction.assertStartPositionIsAlmost(expected: Dp) {
-        val position = if (vertical) {
-            getUnclippedBoundsInRoot().top
-        } else {
-            getUnclippedBoundsInRoot().left
-        }
-        position.assertIsEqualTo(expected, tolerance = 1.dp)
-    }
-
-    fun SemanticsNodeInteraction.assertMainAxisStartPositionInRootIsEqualTo(expectedStart: Dp) =
-        if (vertical) {
-            assertTopPositionInRootIsEqualTo(expectedStart)
-        } else {
-            assertLeftPositionInRootIsEqualTo(expectedStart)
-        }
-
-    fun SemanticsNodeInteraction.assertCrossAxisStartPositionInRootIsEqualTo(expectedStart: Dp) =
-        if (vertical) {
-            assertLeftPositionInRootIsEqualTo(expectedStart)
-        } else {
-            assertTopPositionInRootIsEqualTo(expectedStart)
-        }
-
-    fun PaddingValues(
-        mainAxis: Dp = 0.dp,
-        crossAxis: Dp = 0.dp
-    ) = PaddingValues(
-        beforeContent = mainAxis,
-        afterContent = mainAxis,
-        beforeContentCrossAxis = crossAxis,
-        afterContentCrossAxis = crossAxis
-    )
-
-    fun PaddingValues(
-        beforeContent: Dp = 0.dp,
-        afterContent: Dp = 0.dp,
-        beforeContentCrossAxis: Dp = 0.dp,
-        afterContentCrossAxis: Dp = 0.dp,
-    ) = if (vertical) {
-        PaddingValues(
-            start = beforeContentCrossAxis,
-            top = beforeContent,
-            end = afterContentCrossAxis,
-            bottom = afterContent
-        )
-    } else {
-        PaddingValues(
-            start = beforeContent,
-            top = beforeContentCrossAxis,
-            end = afterContent,
-            bottom = afterContentCrossAxis
-        )
-    }
+open class BaseLazyGridTestWithOrientation(
+    orientation: Orientation
+) : BaseLazyLayoutTestWithOrientation(orientation) {
 
     fun LazyGridState.scrollBy(offset: Dp) {
         runBlocking(Dispatchers.Main + AutoTestFrameClock()) {
@@ -164,11 +49,7 @@
         }
     }
 
-    fun SemanticsNodeInteraction.scrollBy(offset: Dp) = scrollBy(
-        x = if (vertical) 0.dp else offset,
-        y = if (!vertical) 0.dp else offset,
-        density = rule.density
-    )
+    fun SemanticsNodeInteraction.scrollBy(offset: Dp) = scrollMainAxisBy(offset)
 
     @Composable
     fun LazyGrid(
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/BaseLazyListTestWithOrientation.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/BaseLazyListTestWithOrientation.kt
index 1919263..44c5abf 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/BaseLazyListTestWithOrientation.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/BaseLazyListTestWithOrientation.kt
@@ -18,6 +18,7 @@
 
 import androidx.compose.animation.core.snap
 import androidx.compose.foundation.AutoTestFrameClock
+import androidx.compose.foundation.BaseLazyLayoutTestWithOrientation
 import androidx.compose.foundation.composeViewSwipeDown
 import androidx.compose.foundation.composeViewSwipeLeft
 import androidx.compose.foundation.composeViewSwipeRight
@@ -30,8 +31,6 @@
 import androidx.compose.foundation.layout.PaddingValues
 import androidx.compose.foundation.layout.fillMaxHeight
 import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.foundation.layout.height
-import androidx.compose.foundation.layout.width
 import androidx.compose.foundation.lazy.LazyColumn
 import androidx.compose.foundation.lazy.LazyItemScope
 import androidx.compose.foundation.lazy.LazyListScope
@@ -39,42 +38,16 @@
 import androidx.compose.foundation.lazy.LazyRow
 import androidx.compose.foundation.lazy.rememberLazyListState
 import androidx.compose.runtime.Composable
-import androidx.compose.testutils.assertIsEqualTo
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.test.SemanticsNodeInteraction
-import androidx.compose.ui.test.assertHeightIsEqualTo
-import androidx.compose.ui.test.assertLeftPositionInRootIsEqualTo
-import androidx.compose.ui.test.assertTopPositionInRootIsEqualTo
-import androidx.compose.ui.test.assertWidthIsEqualTo
-import androidx.compose.ui.test.getUnclippedBoundsInRoot
-import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.runBlocking
-import org.junit.Rule
 
-open class BaseLazyListTestWithOrientation(private val orientation: Orientation) {
-
-    @get:Rule
-    val rule = createComposeRule()
-
-    val vertical: Boolean
-        get() = orientation == Orientation.Vertical
-
-    fun Modifier.mainAxisSize(size: Dp) =
-        if (vertical) {
-            this.height(size)
-        } else {
-            this.width(size)
-        }
-
-    fun Modifier.crossAxisSize(size: Dp) =
-        if (vertical) {
-            this.width(size)
-        } else {
-            this.height(size)
-        }
+open class BaseLazyListTestWithOrientation(
+    private val orientation: Orientation
+) : BaseLazyLayoutTestWithOrientation(orientation) {
 
     fun Modifier.fillMaxCrossAxis() =
         if (vertical) {
@@ -90,82 +63,6 @@
             Modifier.fillParentMaxHeight()
         }
 
-    fun SemanticsNodeInteraction.scrollMainAxisBy(distance: Dp) {
-        if (vertical) {
-            this.scrollBy(y = distance, density = rule.density)
-        } else {
-            this.scrollBy(x = distance, density = rule.density)
-        }
-    }
-
-    fun SemanticsNodeInteraction.assertMainAxisSizeIsEqualTo(expectedSize: Dp) =
-        if (vertical) {
-            assertHeightIsEqualTo(expectedSize)
-        } else {
-            assertWidthIsEqualTo(expectedSize)
-        }
-
-    fun SemanticsNodeInteraction.assertCrossAxisSizeIsEqualTo(expectedSize: Dp) =
-        if (vertical) {
-            assertWidthIsEqualTo(expectedSize)
-        } else {
-            assertHeightIsEqualTo(expectedSize)
-        }
-
-    fun SemanticsNodeInteraction.assertStartPositionIsAlmost(expected: Dp) {
-        val position = if (vertical) {
-            getUnclippedBoundsInRoot().top
-        } else {
-            getUnclippedBoundsInRoot().left
-        }
-        position.assertIsEqualTo(expected, tolerance = 1.dp)
-    }
-
-    fun SemanticsNodeInteraction.assertStartPositionInRootIsEqualTo(expectedStart: Dp) =
-        if (vertical) {
-            assertTopPositionInRootIsEqualTo(expectedStart)
-        } else {
-            assertLeftPositionInRootIsEqualTo(expectedStart)
-        }
-
-    fun SemanticsNodeInteraction.assertCrossAxisStartPositionInRootIsEqualTo(expectedStart: Dp) =
-        if (vertical) {
-            assertLeftPositionInRootIsEqualTo(expectedStart)
-        } else {
-            assertTopPositionInRootIsEqualTo(expectedStart)
-        }
-
-    fun PaddingValues(
-        mainAxis: Dp = 0.dp,
-        crossAxis: Dp = 0.dp
-    ) = PaddingValues(
-        beforeContent = mainAxis,
-        afterContent = mainAxis,
-        beforeContentCrossAxis = crossAxis,
-        afterContentCrossAxis = crossAxis
-    )
-
-    fun PaddingValues(
-        beforeContent: Dp = 0.dp,
-        afterContent: Dp = 0.dp,
-        beforeContentCrossAxis: Dp = 0.dp,
-        afterContentCrossAxis: Dp = 0.dp,
-    ) = if (vertical) {
-        PaddingValues(
-            start = beforeContentCrossAxis,
-            top = beforeContent,
-            end = afterContentCrossAxis,
-            bottom = afterContent
-        )
-    } else {
-        PaddingValues(
-            start = beforeContent,
-            top = beforeContentCrossAxis,
-            end = afterContent,
-            bottom = afterContentCrossAxis
-        )
-    }
-
     fun LazyListState.scrollBy(offset: Dp) {
         runBlocking(Dispatchers.Main + AutoTestFrameClock()) {
             animateScrollBy(with(rule.density) { offset.roundToPx().toFloat() }, snap())
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/BaseLazyStaggeredGridWithOrientation.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/BaseLazyStaggeredGridWithOrientation.kt
new file mode 100644
index 0000000..b865bdb
--- /dev/null
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/BaseLazyStaggeredGridWithOrientation.kt
@@ -0,0 +1,72 @@
+/*
+ * 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.staggeredgrid
+
+import androidx.compose.animation.core.snap
+import androidx.compose.foundation.AutoTestFrameClock
+import androidx.compose.foundation.BaseLazyLayoutTestWithOrientation
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.foundation.gestures.animateScrollBy
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.Dp
+import kotlin.math.roundToInt
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.runBlocking
+
+@OptIn(ExperimentalFoundationApi::class)
+open class BaseLazyStaggeredGridWithOrientation(
+    private val orientation: Orientation
+) : BaseLazyLayoutTestWithOrientation(orientation) {
+
+    internal fun LazyStaggeredGridState.scrollBy(offset: Dp) {
+        runBlocking(Dispatchers.Main + AutoTestFrameClock()) {
+            animateScrollBy(with(rule.density) { offset.roundToPx().toFloat() }, snap())
+        }
+    }
+
+    @Composable
+    internal fun LazyStaggeredGrid(
+        lanes: Int,
+        modifier: Modifier = Modifier,
+        state: LazyStaggeredGridState = remember { LazyStaggeredGridState() },
+        content: LazyStaggeredGridScope.() -> Unit,
+    ) {
+        LazyStaggeredGrid(
+            state = state,
+            modifier = modifier,
+            orientation = orientation,
+            userScrollEnabled = true,
+            verticalArrangement = Arrangement.Top,
+            horizontalArrangement = Arrangement.Start,
+            slotSizesSums = { constraints ->
+                val crossAxisSize = if (orientation == Orientation.Vertical) {
+                    constraints.maxWidth
+                } else {
+                    constraints.maxHeight
+                }
+                IntArray(lanes) {
+                    (crossAxisSize / lanes.toDouble() * (it + 1)).roundToInt()
+                }
+            },
+            content = content
+        )
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridTest.kt
new file mode 100644
index 0000000..df3d0f3
--- /dev/null
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridTest.kt
@@ -0,0 +1,342 @@
+/*
+ * 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.staggeredgrid
+
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.size
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.composed
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.assertIsDisplayed
+import androidx.compose.ui.test.assertIsNotDisplayed
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+import androidx.test.filters.MediumTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@OptIn(ExperimentalFoundationApi::class)
+@MediumTest
+@RunWith(Parameterized::class)
+class LazyStaggeredGridTest(
+    private val orientation: Orientation
+) : BaseLazyStaggeredGridWithOrientation(orientation) {
+    private val LazyStaggeredGridTag = "LazyStaggeredGridTag"
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "{0}")
+        fun initParameters(): Array<Any> = arrayOf(
+            Orientation.Vertical,
+            Orientation.Horizontal,
+        )
+    }
+
+    private var itemSizeDp: Dp = Dp.Unspecified
+    private val itemSizePx: Int = 50
+
+    @Before
+    fun setUp() {
+        with(rule.density) {
+            itemSizeDp = itemSizePx.toDp()
+        }
+    }
+
+    @Test
+    fun showsOneItem() {
+        val itemTestTag = "itemTestTag"
+
+        rule.setContent {
+            LazyStaggeredGrid(
+                lanes = 3,
+            ) {
+                item {
+                    Spacer(
+                        Modifier.size(itemSizeDp).testTag(itemTestTag)
+                    )
+                }
+            }
+        }
+
+        rule.onNodeWithTag(itemTestTag)
+            .assertIsDisplayed()
+    }
+
+    @Test
+    fun distributesSingleLine() {
+        rule.setContent {
+            LazyStaggeredGrid(
+                lanes = 3,
+                modifier = Modifier.crossAxisSize(itemSizeDp * 3),
+            ) {
+                items(3) {
+                    Spacer(
+                        Modifier.size(itemSizeDp).testTag("$it")
+                    )
+                }
+            }
+        }
+
+        rule.onNodeWithTag("0")
+            .assertIsDisplayed()
+            .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
+            .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
+
+        rule.onNodeWithTag("1")
+            .assertIsDisplayed()
+            .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
+            .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp)
+
+        rule.onNodeWithTag("2")
+            .assertIsDisplayed()
+            .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
+            .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp * 2)
+    }
+
+    @Test
+    fun distributesTwoLines() {
+        rule.setContent {
+            LazyStaggeredGrid(
+                lanes = 3,
+                modifier = Modifier.crossAxisSize(itemSizeDp * 3),
+            ) {
+                items(6) {
+                    Spacer(
+                        Modifier.axisSize(
+                            crossAxis = itemSizeDp,
+                            mainAxis = itemSizeDp * (it + 1)
+                        ).testTag("$it")
+                    )
+                }
+            }
+        }
+
+        rule.onNodeWithTag("0")
+            .assertIsDisplayed()
+            .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
+            .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
+
+        // [item, 0, 0]
+        rule.onNodeWithTag("1")
+            .assertIsDisplayed()
+            .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
+            .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp)
+
+        // [item, item x 2, 0]
+        rule.onNodeWithTag("2")
+            .assertIsDisplayed()
+            .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
+            .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp * 2)
+
+        // [item, item x 2, item x 3]
+        rule.onNodeWithTag("3")
+            .assertIsDisplayed()
+            .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp)
+            .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
+
+        // [item x 4, item x 2, item x 3]
+        rule.onNodeWithTag("4")
+            .assertIsDisplayed()
+            .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp * 2)
+            .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp)
+
+        // [item x 4, item x 7, item x 3]
+        rule.onNodeWithTag("5")
+            .assertIsDisplayed()
+            .assertMainAxisStartPositionInRootIsEqualTo(itemSizeDp * 3)
+            .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp * 2)
+
+        // [item x 4, item x 7, item x 9]
+    }
+
+    @Test
+    fun moreItemsDisplayedOnScroll() {
+        val state = LazyStaggeredGridState()
+        rule.setContent {
+            LazyStaggeredGrid(
+                lanes = 3,
+                state = state,
+                modifier = Modifier.axisSize(itemSizeDp * 3, itemSizeDp),
+            ) {
+                items(6) {
+                    Spacer(
+                        Modifier.axisSize(
+                            crossAxis = itemSizeDp,
+                            mainAxis = itemSizeDp * (it + 1)
+                        ).testTag("$it")
+                    )
+                }
+            }
+        }
+
+        rule.onNodeWithTag("3")
+            .assertIsNotDisplayed()
+
+        state.scrollBy(itemSizeDp * 3)
+
+        // [item, item x 2, item x 3]
+        rule.onNodeWithTag("3")
+            .assertIsDisplayed()
+            .assertMainAxisStartPositionInRootIsEqualTo(-itemSizeDp * 2)
+            .assertCrossAxisStartPositionInRootIsEqualTo(0.dp)
+
+        // [item x 4, item x 2, item x 3]
+        rule.onNodeWithTag("4")
+            .assertIsDisplayed()
+            .assertMainAxisStartPositionInRootIsEqualTo(-itemSizeDp)
+            .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp)
+
+        // [item x 4, item x 7, item x 3]
+        rule.onNodeWithTag("5")
+            .assertIsDisplayed()
+            .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
+            .assertCrossAxisStartPositionInRootIsEqualTo(itemSizeDp * 2)
+
+        // [item x 4, item x 7, item x 9]
+    }
+
+    @Test
+    fun itemsAreHiddenOnScroll() {
+        val state = LazyStaggeredGridState()
+        rule.setContent {
+            LazyStaggeredGrid(
+                lanes = 3,
+                state = state,
+                modifier = Modifier.axisSize(itemSizeDp * 3, itemSizeDp),
+            ) {
+                items(6) {
+                    Spacer(
+                        Modifier.axisSize(
+                            crossAxis = itemSizeDp,
+                            mainAxis = itemSizeDp * (it + 1)
+                        ).testTag("$it")
+                    )
+                }
+            }
+        }
+
+        rule.onNodeWithTag("0")
+            .assertIsDisplayed()
+
+        state.scrollBy(itemSizeDp * 3)
+
+        rule.onNodeWithTag("0")
+            .assertIsNotDisplayed()
+
+        rule.onNodeWithTag("1")
+            .assertIsNotDisplayed()
+
+        rule.onNodeWithTag("2")
+            .assertIsNotDisplayed()
+    }
+
+    @Test
+    fun itemsArePresentedWhenScrollingBack() {
+        val state = LazyStaggeredGridState()
+        rule.setContent {
+            LazyStaggeredGrid(
+                lanes = 3,
+                state = state,
+                modifier = Modifier.axisSize(itemSizeDp * 3, itemSizeDp),
+            ) {
+                items(6) {
+                    Spacer(
+                        Modifier.axisSize(
+                            crossAxis = itemSizeDp,
+                            mainAxis = itemSizeDp * (it + 1)
+                        ).testTag("$it")
+                    )
+                }
+            }
+        }
+
+        rule.onNodeWithTag("0")
+            .assertIsDisplayed()
+
+        state.scrollBy(itemSizeDp * 3)
+        state.scrollBy(-itemSizeDp * 3)
+
+        for (i in 0..2) {
+            rule.onNodeWithTag("$i")
+                .assertIsDisplayed()
+                .assertMainAxisStartPositionInRootIsEqualTo(0.dp)
+        }
+    }
+
+    @Test
+    fun scrollingALot_layoutIsNotRecomposed() {
+        val state = LazyStaggeredGridState()
+        var recomposed = 0
+        rule.setContent {
+            LazyStaggeredGrid(
+                lanes = 3,
+                state = state,
+                modifier = Modifier
+                    .mainAxisSize(itemSizeDp * 10)
+                    .composed {
+                        recomposed++
+                        Modifier
+                    }
+            ) {
+                items(1000) {
+                    Spacer(
+                        Modifier.mainAxisSize(itemSizeDp).testTag("$it")
+                    )
+                }
+            }
+        }
+
+        rule.waitForIdle()
+        assertThat(recomposed).isEqualTo(1)
+
+        state.scrollBy(1000.dp)
+
+        rule.waitForIdle()
+        assertThat(recomposed).isEqualTo(1)
+    }
+
+    @Test
+    fun onlyOneInitialMeasurePass() {
+        val state = LazyStaggeredGridState()
+        rule.setContent {
+            LazyStaggeredGrid(
+                lanes = 3,
+                state = state,
+                modifier = Modifier
+                    .mainAxisSize(itemSizeDp * 10)
+                    .composed {
+                        Modifier
+                    }
+            ) {
+                items(1000) {
+                    Spacer(
+                        Modifier.mainAxisSize(itemSizeDp).testTag("$it")
+                    )
+                }
+            }
+        }
+
+        rule.waitForIdle()
+        assertThat(state.measurePassCount).isEqualTo(1)
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/relocation/BringIntoViewRequesterModifierTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/relocation/BringIntoViewRequesterModifierTest.kt
deleted file mode 100644
index 5a13ce4..0000000
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/relocation/BringIntoViewRequesterModifierTest.kt
+++ /dev/null
@@ -1,818 +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.relocation
-
-import android.os.Build.VERSION_CODES.O
-import androidx.annotation.RequiresApi
-import androidx.compose.foundation.Canvas
-import androidx.compose.foundation.ExperimentalFoundationApi
-import androidx.compose.foundation.ScrollState
-import androidx.compose.foundation.gestures.Orientation
-import androidx.compose.foundation.gestures.Orientation.Horizontal
-import androidx.compose.foundation.gestures.Orientation.Vertical
-import androidx.compose.foundation.horizontalScroll
-import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.Row
-import androidx.compose.foundation.layout.offset
-import androidx.compose.foundation.layout.size
-import androidx.compose.foundation.rememberScrollState
-import androidx.compose.foundation.verticalScroll
-import androidx.compose.runtime.Composable
-import androidx.compose.testutils.assertAgainstGolden
-import androidx.compose.foundation.GOLDEN_UI
-import androidx.compose.ui.Modifier
-import androidx.compose.foundation.background
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.geometry.Rect
-import androidx.compose.ui.geometry.Size
-import androidx.compose.ui.graphics.Color.Companion.Blue
-import androidx.compose.ui.graphics.Color.Companion.Green
-import androidx.compose.ui.graphics.Color.Companion.LightGray
-import androidx.compose.ui.graphics.Color.Companion.Red
-import androidx.compose.ui.platform.LocalDensity
-import androidx.compose.ui.platform.testTag
-import androidx.compose.ui.test.TestMonotonicFrameClock
-import androidx.compose.ui.test.captureToImage
-import androidx.compose.ui.test.junit4.createComposeRule
-import androidx.compose.ui.test.onNodeWithTag
-import androidx.compose.ui.unit.Density
-import androidx.compose.ui.unit.dp
-import androidx.test.filters.MediumTest
-import androidx.test.filters.SdkSuppress
-import androidx.test.screenshot.AndroidXScreenshotTestRule
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.advanceUntilIdle
-import kotlinx.coroutines.test.runTest
-import kotlinx.coroutines.withContext
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.Parameterized
-
-@OptIn(ExperimentalCoroutinesApi::class, ExperimentalFoundationApi::class)
-@MediumTest
-@RunWith(Parameterized::class)
-@SdkSuppress(minSdkVersion = O)
-class BringIntoViewRequesterModifierTest(private val orientation: Orientation) {
-    @get:Rule
-    val rule = createComposeRule()
-
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_UI)
-
-    private val parentBox = "parent box"
-
-    companion object {
-        @JvmStatic
-        @Parameterized.Parameters(name = "{0}")
-        fun initParameters(): Array<Orientation> = arrayOf(Horizontal, Vertical)
-    }
-
-    @Test
-    fun noScrollableParent_noChange() {
-        // Arrange.
-        val bringIntoViewRequester = BringIntoViewRequester()
-        rule.setContent {
-            Box(
-                Modifier
-                    .then(
-                        when (orientation) {
-                            Horizontal -> Modifier.size(100.dp, 50.dp)
-                            Vertical -> Modifier.size(50.dp, 100.dp)
-                        }
-                    )
-                    .testTag(parentBox)
-                    .background(LightGray)
-            ) {
-                Box(
-                    Modifier
-                        .size(50.dp)
-                        .background(Blue)
-                        .bringIntoViewRequester(bringIntoViewRequester)
-                )
-            }
-        }
-
-        // Act.
-        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
-
-        // Assert.
-        assertScreenshot(if (horizontal) "blueBoxLeft" else "blueBoxTop")
-    }
-
-    @Test
-    fun noScrollableParent_itemNotVisible_noChange() {
-        // Arrange.
-        val bringIntoViewRequester = BringIntoViewRequester()
-        rule.setContent {
-            Box(
-                Modifier
-                    .then(
-                        when (orientation) {
-                            Horizontal -> Modifier.size(100.dp, 50.dp)
-                            Vertical -> Modifier.size(50.dp, 100.dp)
-                        }
-                    )
-                    .testTag(parentBox)
-                    .background(LightGray)
-            ) {
-                Box(
-                    Modifier
-                        .then(
-                            when (orientation) {
-                                Horizontal -> Modifier.offset(x = 150.dp)
-                                Vertical -> Modifier.offset(y = 150.dp)
-                            }
-                        )
-                        .size(50.dp)
-                        .background(Blue)
-                        .bringIntoViewRequester(bringIntoViewRequester)
-                )
-            }
-        }
-
-        // Act.
-        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
-
-        // Assert.
-        assertScreenshot(if (horizontal) "grayRectangleHorizontal" else "grayRectangleVertical")
-    }
-
-    @Test
-    fun itemAtLeadingEdge_alreadyVisible_noChange() {
-        // Arrange.
-        val bringIntoViewRequester = BringIntoViewRequester()
-        rule.setContent {
-            Box(
-                Modifier
-                    .testTag(parentBox)
-                    .background(LightGray)
-                    .then(
-                        when (orientation) {
-                            Horizontal ->
-                                Modifier
-                                    .size(100.dp, 50.dp)
-                                    .horizontalScroll(rememberScrollState())
-                            Vertical ->
-                                Modifier
-                                    .size(50.dp, 100.dp)
-                                    .verticalScroll(rememberScrollState())
-                        }
-                    )
-            ) {
-                Box(
-                    Modifier
-                        .size(50.dp)
-                        .background(Blue)
-                        .bringIntoViewRequester(bringIntoViewRequester)
-                )
-            }
-        }
-
-        // Act.
-        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
-
-        // Assert.
-        assertScreenshot(if (horizontal) "blueBoxLeft" else "blueBoxTop")
-    }
-
-    @Test
-    fun itemAtTrailingEdge_alreadyVisible_noChange() {
-        // Arrange.
-        val bringIntoViewRequester = BringIntoViewRequester()
-        rule.setContent {
-            Box(
-                Modifier
-                    .testTag(parentBox)
-                    .background(LightGray)
-                    .then(
-                        when (orientation) {
-                            Horizontal ->
-                                Modifier
-                                    .size(100.dp, 50.dp)
-                                    .horizontalScroll(rememberScrollState())
-                            Vertical ->
-                                Modifier
-                                    .size(50.dp, 100.dp)
-                                    .verticalScroll(rememberScrollState())
-                        }
-                    )
-            ) {
-                Box(
-                    Modifier
-                        .then(
-                            when (orientation) {
-                                Horizontal -> Modifier.offset(x = 50.dp)
-                                Vertical -> Modifier.offset(y = 50.dp)
-                            }
-                        )
-                        .size(50.dp)
-                        .background(Blue)
-                        .bringIntoViewRequester(bringIntoViewRequester)
-                )
-            }
-        }
-
-        // Act.
-        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
-
-        // Assert.
-        assertScreenshot(if (horizontal) "blueBoxRight" else "blueBoxBottom")
-    }
-
-    @Test
-    fun itemAtCenter_alreadyVisible_noChange() {
-        // Arrange.
-        val bringIntoViewRequester = BringIntoViewRequester()
-        rule.setContent {
-            Box(
-                Modifier
-                    .testTag(parentBox)
-                    .background(LightGray)
-                    .then(
-                        when (orientation) {
-                            Horizontal ->
-                                Modifier
-                                    .size(100.dp, 50.dp)
-                                    .horizontalScroll(rememberScrollState())
-                            Vertical ->
-                                Modifier
-                                    .size(50.dp, 100.dp)
-                                    .verticalScroll(rememberScrollState())
-                        }
-                    )
-            ) {
-                Box(
-                    Modifier
-                        .then(
-                            when (orientation) {
-                                Horizontal -> Modifier.offset(x = 25.dp)
-                                Vertical -> Modifier.offset(y = 25.dp)
-                            }
-                        )
-                        .size(50.dp)
-                        .background(Blue)
-                        .bringIntoViewRequester(bringIntoViewRequester)
-                )
-            }
-        }
-
-        // Act.
-        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
-
-        // Assert.
-        assertScreenshot(if (horizontal) "blueBoxCenterHorizontal" else "blueBoxCenterVertical")
-    }
-
-    @Test
-    fun itemBiggerThanParentAtLeadingEdge_alreadyVisible_noChange() {
-        // Arrange.
-        val bringIntoViewRequester = BringIntoViewRequester()
-        rule.setContent {
-            Box(
-                Modifier
-                    .size(50.dp)
-                    .testTag(parentBox)
-                    .background(LightGray)
-                    .then(
-                        when (orientation) {
-                            Horizontal -> Modifier.horizontalScroll(rememberScrollState())
-                            Vertical -> Modifier.verticalScroll(rememberScrollState())
-                        }
-                    )
-            ) {
-                // Using a multi-colored item to make sure we can assert that the right part of
-                // the item is visible.
-                RowOrColumn(Modifier.bringIntoViewRequester(bringIntoViewRequester)) {
-                    Box(Modifier.size(50.dp).background(Blue))
-                    Box(Modifier.size(50.dp).background(Green))
-                    Box(Modifier.size(50.dp).background(Red))
-                }
-            }
-        }
-
-        // Act.
-        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
-
-        // Assert.
-        assertScreenshot("blueBox")
-    }
-
-    @Test
-    fun itemBiggerThanParentAtTrailingEdge_alreadyVisible_noChange() {
-        // Arrange.
-        val bringIntoViewRequester = BringIntoViewRequester()
-        lateinit var scrollState: ScrollState
-        rule.setContent {
-            scrollState = rememberScrollState()
-            Box(
-                Modifier
-                    .size(50.dp)
-                    .testTag(parentBox)
-                    .background(LightGray)
-                    .then(
-                        when (orientation) {
-                            Horizontal -> Modifier.horizontalScroll(scrollState)
-                            Vertical -> Modifier.verticalScroll(scrollState)
-                        }
-                    )
-            ) {
-                // Using a multi-colored item to make sure we can assert that the right part of
-                // the item is visible.
-                RowOrColumn(Modifier.bringIntoViewRequester(bringIntoViewRequester)) {
-                    Box(Modifier.size(50.dp).background(Red))
-                    Box(Modifier.size(50.dp).background(Green))
-                    Box(Modifier.size(50.dp).background(Blue))
-                }
-            }
-        }
-        runBlockingAndAwaitIdle { scrollState.scrollTo(scrollState.maxValue) }
-
-        // Act.
-        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
-
-        // Assert.
-        assertScreenshot("blueBox")
-    }
-
-    @Test
-    fun itemBiggerThanParentAtCenter_alreadyVisible_noChange() {
-        // Arrange.
-        val bringIntoViewRequester = BringIntoViewRequester()
-        lateinit var scrollState: ScrollState
-        rule.setContent {
-            scrollState = rememberScrollState()
-            Box(
-                Modifier
-                    .size(50.dp)
-                    .testTag(parentBox)
-                    .background(LightGray)
-                    .then(
-                        when (orientation) {
-                            Horizontal -> Modifier.horizontalScroll(scrollState)
-                            Vertical -> Modifier.verticalScroll(scrollState)
-                        }
-                    )
-            ) {
-                // Using a multi-colored item to make sure we can assert that the right part of
-                // the item is visible.
-                RowOrColumn(Modifier.bringIntoViewRequester(bringIntoViewRequester)) {
-                    Box(Modifier.size(50.dp).background(Green))
-                    Box(Modifier.size(50.dp).background(Blue))
-                    Box(Modifier.size(50.dp).background(Red))
-                }
-            }
-        }
-        runBlockingAndAwaitIdle { scrollState.scrollTo(scrollState.maxValue / 2) }
-
-        // Act.
-        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
-
-        // Assert.
-        assertScreenshot("blueBox")
-    }
-
-    @Test
-    fun childBeforeVisibleBounds_parentIsScrolledSoThatLeadingEdgeOfChildIsVisible() {
-        // Arrange.
-        val bringIntoViewRequester = BringIntoViewRequester()
-        lateinit var scrollState: ScrollState
-        rule.setContent {
-            scrollState = rememberScrollState()
-            Box(
-                Modifier
-                    .testTag(parentBox)
-                    .background(LightGray)
-                    .then(
-                        when (orientation) {
-                            Horizontal ->
-                                Modifier
-                                    .size(100.dp, 50.dp)
-                                    .horizontalScroll(scrollState)
-                            Vertical ->
-                                Modifier
-                                    .size(50.dp, 100.dp)
-                                    .verticalScroll(scrollState)
-                        }
-                    )
-            ) {
-                Box(
-                    when (orientation) {
-                        Horizontal -> Modifier.size(200.dp, 50.dp)
-                        Vertical -> Modifier.size(50.dp, 200.dp)
-                    }
-                ) {
-                    Box(
-                        Modifier
-                            .then(
-                                when (orientation) {
-                                    Horizontal -> Modifier.offset(x = 50.dp)
-                                    Vertical -> Modifier.offset(y = 50.dp)
-                                }
-                            )
-                            .size(50.dp)
-                            .background(Blue)
-                            .bringIntoViewRequester(bringIntoViewRequester)
-                    )
-                }
-            }
-        }
-        runBlockingAndAwaitIdle { scrollState.scrollTo(scrollState.maxValue) }
-
-        // Act.
-        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
-
-        // Assert.
-        assertScreenshot(if (horizontal) "blueBoxLeft" else "blueBoxTop")
-    }
-
-    @Test
-    fun childAfterVisibleBounds_parentIsScrolledSoThatTrailingEdgeOfChildIsVisible() {
-        // Arrange.
-        val bringIntoViewRequester = BringIntoViewRequester()
-        lateinit var scrollState: ScrollState
-        rule.setContent {
-            scrollState = rememberScrollState()
-            Box(
-                Modifier
-                    .testTag(parentBox)
-                    .background(LightGray)
-                    .then(
-                        when (orientation) {
-                            Horizontal ->
-                                Modifier
-                                    .size(100.dp, 50.dp)
-                                    .horizontalScroll(scrollState)
-                            Vertical ->
-                                Modifier
-                                    .size(50.dp, 100.dp)
-                                    .verticalScroll(scrollState)
-                        }
-                    )
-            ) {
-                Box(
-                    when (orientation) {
-                        Horizontal -> Modifier.size(200.dp, 50.dp)
-                        Vertical -> Modifier.size(50.dp, 200.dp)
-                    }
-                ) {
-                    Box(
-                        Modifier
-                            .then(
-                                when (orientation) {
-                                    Horizontal -> Modifier.offset(x = 150.dp)
-                                    Vertical -> Modifier.offset(y = 150.dp)
-                                }
-                            )
-                            .size(50.dp)
-                            .background(Blue)
-                            .bringIntoViewRequester(bringIntoViewRequester)
-                    )
-                }
-            }
-        }
-        runBlockingAndAwaitIdle { scrollState.scrollTo(scrollState.maxValue) }
-
-        // Act.
-        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
-
-        // Assert.
-        assertScreenshot(if (horizontal) "blueBoxRight" else "blueBoxBottom")
-    }
-
-    @Test
-    fun childPartiallyVisible_parentIsScrolledSoThatLeadingEdgeOfChildIsVisible() {
-        // Arrange.
-        val bringIntoViewRequester = BringIntoViewRequester()
-        lateinit var scrollState: ScrollState
-        rule.setContent {
-            scrollState = rememberScrollState()
-            Box(
-                Modifier
-                    .testTag(parentBox)
-                    .background(LightGray)
-                    .then(
-                        when (orientation) {
-                            Horizontal ->
-                                Modifier
-                                    .size(100.dp, 50.dp)
-                                    .horizontalScroll(scrollState)
-                            Vertical ->
-                                Modifier
-                                    .size(50.dp, 100.dp)
-                                    .verticalScroll(scrollState)
-                        }
-                    )
-            ) {
-                Box(Modifier.size(200.dp)) {
-                    Box(
-                        Modifier
-                            .then(
-                                when (orientation) {
-                                    Horizontal -> Modifier.offset(x = 25.dp)
-                                    Vertical -> Modifier.offset(y = 25.dp)
-                                }
-                            )
-                            .size(50.dp)
-                            .background(Blue)
-                            .bringIntoViewRequester(bringIntoViewRequester)
-                    )
-                }
-            }
-        }
-        runBlockingAndAwaitIdle { scrollState.scrollTo(scrollState.maxValue / 2) }
-
-        // Act.
-        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
-
-        // Assert.
-        assertScreenshot(if (horizontal) "blueBoxLeft" else "blueBoxTop")
-    }
-
-    @Test
-    fun childPartiallyVisible_parentIsScrolledSoThatTrailingEdgeOfChildIsVisible() {
-        // Arrange.
-        val bringIntoViewRequester = BringIntoViewRequester()
-        lateinit var scrollState: ScrollState
-        rule.setContent {
-            scrollState = rememberScrollState()
-            Box(
-                Modifier
-                    .testTag(parentBox)
-                    .background(LightGray)
-                    .then(
-                        when (orientation) {
-                            Horizontal ->
-                                Modifier
-                                    .size(100.dp, 50.dp)
-                                    .horizontalScroll(scrollState)
-                            Vertical ->
-                                Modifier
-                                    .size(50.dp, 100.dp)
-                                    .verticalScroll(scrollState)
-                        }
-                    )
-            ) {
-                Box(
-                    when (orientation) {
-                        Horizontal -> Modifier.size(200.dp, 50.dp)
-                        Vertical -> Modifier.size(50.dp, 200.dp)
-                    }
-                ) {
-                    Box(
-                        Modifier
-                            .then(
-                                when (orientation) {
-                                    Horizontal -> Modifier.offset(x = 150.dp)
-                                    Vertical -> Modifier.offset(y = 150.dp)
-                                }
-                            )
-                            .size(50.dp)
-                            .background(Blue)
-                            .bringIntoViewRequester(bringIntoViewRequester)
-                    )
-                }
-            }
-        }
-        runBlockingAndAwaitIdle { scrollState.scrollTo(scrollState.maxValue) }
-
-        // Act.
-        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
-
-        // Assert.
-        assertScreenshot(if (horizontal) "blueBoxRight" else "blueBoxBottom")
-    }
-
-    @Test
-    fun multipleParentsAreScrolledSoThatChildIsVisible() {
-        // Arrange.
-        val bringIntoViewRequester = BringIntoViewRequester()
-        lateinit var parentScrollState: ScrollState
-        lateinit var grandParentScrollState: ScrollState
-        rule.setContent {
-            parentScrollState = rememberScrollState()
-            grandParentScrollState = rememberScrollState()
-            Box(
-                Modifier
-                    .testTag(parentBox)
-                    .background(LightGray)
-                    .then(
-                        when (orientation) {
-                            Horizontal ->
-                                Modifier
-                                    .size(100.dp, 50.dp)
-                                    .horizontalScroll(grandParentScrollState)
-                            Vertical ->
-                                Modifier
-                                    .size(50.dp, 100.dp)
-                                    .verticalScroll(grandParentScrollState)
-                        }
-                    )
-            ) {
-                Box(
-                    Modifier
-                        .background(LightGray)
-                        .then(
-                            when (orientation) {
-                                Horizontal ->
-                                    Modifier
-                                        .size(200.dp, 50.dp)
-                                        .horizontalScroll(parentScrollState)
-                                Vertical ->
-                                    Modifier
-                                        .size(50.dp, 200.dp)
-                                        .verticalScroll(parentScrollState)
-                            }
-                        )
-                ) {
-                    Box(
-                        when (orientation) {
-                            Horizontal -> Modifier.size(400.dp, 50.dp)
-                            Vertical -> Modifier.size(50.dp, 400.dp)
-                        }
-                    ) {
-                        Box(
-                            Modifier
-                                .then(
-                                    when (orientation) {
-                                        Horizontal -> Modifier.offset(x = 25.dp)
-                                        Vertical -> Modifier.offset(y = 25.dp)
-                                    }
-                                )
-                                .size(50.dp)
-                                .background(Blue)
-                                .bringIntoViewRequester(bringIntoViewRequester)
-                        )
-                    }
-                }
-            }
-        }
-        runBlockingAndAwaitIdle { parentScrollState.scrollTo(parentScrollState.maxValue) }
-        runBlockingAndAwaitIdle { grandParentScrollState.scrollTo(grandParentScrollState.maxValue) }
-
-        // Act.
-        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
-
-        // Assert.
-        assertScreenshot(if (horizontal) "blueBoxLeft" else "blueBoxTop")
-    }
-
-    @Test
-    fun multipleParentsAreScrolledInDifferentDirectionsSoThatChildIsVisible() {
-        // Arrange.
-        val bringIntoViewRequester = BringIntoViewRequester()
-        lateinit var parentScrollState: ScrollState
-        lateinit var grandParentScrollState: ScrollState
-        rule.setContent {
-            parentScrollState = rememberScrollState()
-            grandParentScrollState = rememberScrollState()
-            Box(
-                Modifier
-                    .testTag(parentBox)
-                    .background(LightGray)
-                    .then(
-                        when (orientation) {
-                            Horizontal ->
-                                Modifier
-                                    .size(100.dp, 50.dp)
-                                    .verticalScroll(grandParentScrollState)
-                            Vertical ->
-                                Modifier
-                                    .size(50.dp, 100.dp)
-                                    .horizontalScroll(grandParentScrollState)
-                        }
-                    )
-            ) {
-                Box(
-                    Modifier
-                        .size(100.dp)
-                        .background(LightGray)
-                        .then(
-                            when (orientation) {
-                                Horizontal -> Modifier.horizontalScroll(parentScrollState)
-                                Vertical -> Modifier.verticalScroll(parentScrollState)
-                            }
-                        )
-                ) {
-                    Box(Modifier.size(200.dp)) {
-                        Box(
-                            Modifier
-                                .offset(x = 25.dp, y = 25.dp)
-                                .size(50.dp)
-                                .background(Blue)
-                                .bringIntoViewRequester(bringIntoViewRequester)
-                        )
-                    }
-                }
-            }
-        }
-        runBlockingAndAwaitIdle { parentScrollState.scrollTo(parentScrollState.maxValue) }
-        runBlockingAndAwaitIdle { grandParentScrollState.scrollTo(grandParentScrollState.maxValue) }
-
-        // Act.
-        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
-
-        // Assert.
-        assertScreenshot(if (horizontal) "blueBoxLeft" else "blueBoxTop")
-    }
-
-    @Test
-    fun specifiedPartOfComponentBroughtOnScreen() {
-        // Arrange.
-        val bringIntoViewRequester = BringIntoViewRequester()
-        lateinit var density: Density
-        rule.setContent {
-            density = LocalDensity.current
-            Box(
-                Modifier
-                    .testTag(parentBox)
-                    .size(50.dp)
-                    .background(LightGray)
-                    .then(
-                        when (orientation) {
-                            Horizontal -> Modifier.horizontalScroll(rememberScrollState())
-                            Vertical -> Modifier.verticalScroll(rememberScrollState())
-                        }
-                    )
-            ) {
-                Canvas(
-                    when (orientation) {
-                        Horizontal -> Modifier.size(150.dp, 50.dp)
-                        Vertical -> Modifier.size(50.dp, 150.dp)
-                    }.bringIntoViewRequester(bringIntoViewRequester)
-                ) {
-                    with(density) {
-                        drawRect(
-                            color = Blue,
-                            topLeft = when (orientation) {
-                                Horizontal -> Offset(50.dp.toPx(), 0.dp.toPx())
-                                Vertical -> Offset(0.dp.toPx(), 50.dp.toPx())
-                            },
-                            size = Size(50.dp.toPx(), 50.dp.toPx())
-                        )
-                    }
-                }
-            }
-        }
-
-        // Act.
-        runBlockingAndAwaitIdle {
-            val rect = with(density) {
-                when (orientation) {
-                    Horizontal -> Rect(50.dp.toPx(), 0.dp.toPx(), 100.dp.toPx(), 50.dp.toPx())
-                    Vertical -> Rect(0.dp.toPx(), 50.dp.toPx(), 50.dp.toPx(), 100.dp.toPx())
-                }
-            }
-            bringIntoViewRequester.bringIntoView(rect)
-        }
-
-        // Assert.
-        assertScreenshot("blueBox")
-    }
-
-    private val horizontal: Boolean get() = (orientation == Horizontal)
-
-    @Composable
-    private fun RowOrColumn(
-        modifier: Modifier = Modifier,
-        content: @Composable () -> Unit
-    ) {
-        when (orientation) {
-            Horizontal -> Row(modifier) { content() }
-            Vertical -> Column(modifier) { content() }
-        }
-    }
-
-    @RequiresApi(O)
-    private fun assertScreenshot(screenshot: String) {
-        rule.onNodeWithTag(parentBox)
-            .captureToImage()
-            .assertAgainstGolden(screenshotRule, "bringIntoParentBounds_$screenshot")
-    }
-
-    private fun runBlockingAndAwaitIdle(block: suspend CoroutineScope.() -> Unit) {
-        runTest {
-            withContext(TestMonotonicFrameClock(this)) {
-                block()
-                advanceUntilIdle()
-            }
-        }
-        rule.waitForIdle()
-    }
-}
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/relocation/BringIntoViewScrollableInteractionTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/relocation/BringIntoViewScrollableInteractionTest.kt
new file mode 100644
index 0000000..0adee6c
--- /dev/null
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/relocation/BringIntoViewScrollableInteractionTest.kt
@@ -0,0 +1,943 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.foundation.relocation
+
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.ScrollState
+import androidx.compose.foundation.background
+import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.foundation.gestures.Orientation.Horizontal
+import androidx.compose.foundation.gestures.Orientation.Vertical
+import androidx.compose.foundation.horizontalScroll
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.offset
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.graphics.Color.Companion.Blue
+import androidx.compose.ui.graphics.Color.Companion.Green
+import androidx.compose.ui.graphics.Color.Companion.LightGray
+import androidx.compose.ui.graphics.Color.Companion.Red
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.assertPositionInRootIsEqualTo
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.DpRect
+import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.unit.toSize
+import androidx.test.filters.MediumTest
+import com.google.common.truth.Truth.assertThat
+import kotlin.math.roundToInt
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.runBlocking
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@OptIn(ExperimentalFoundationApi::class)
+@MediumTest
+@RunWith(Parameterized::class)
+class BringIntoViewScrollableInteractionTest(private val orientation: Orientation) {
+
+    @get:Rule
+    val rule = createComposeRule()
+
+    private val parentBox = "parent box"
+    private val childBox = "child box"
+
+    /**
+     * Captures a scope from inside the composition for [runBlockingAndAwaitIdle].
+     * Make sure to call [setContentAndInitialize] instead of calling `rule.setContent` to initialize this.
+     */
+    private lateinit var testScope: CoroutineScope
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "{0}")
+        fun initParameters(): Array<Orientation> = arrayOf(Horizontal, Vertical)
+    }
+
+    @Test
+    fun noScrollableParent_noChange() {
+        // Arrange.
+        val bringIntoViewRequester = BringIntoViewRequester()
+        setContentAndInitialize {
+            Box(
+                Modifier
+                    .then(
+                        when (orientation) {
+                            Horizontal -> Modifier.size(100.toDp(), 50.toDp())
+                            Vertical -> Modifier.size(50.toDp(), 100.toDp())
+                        }
+                    )
+                    .testTag(parentBox)
+                    .background(LightGray)
+            ) {
+                Box(
+                    Modifier
+                        .size(50.toDp())
+                        .background(Blue)
+                        .bringIntoViewRequester(bringIntoViewRequester)
+                        .testTag(childBox)
+                )
+            }
+        }
+        val startingBounds = getUnclippedBoundsInRoot(childBox)
+
+        // Act.
+        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
+
+        // Assert.
+        assertThat(getUnclippedBoundsInRoot(childBox)).isEqualTo(startingBounds)
+        assertChildMaxInView()
+    }
+
+    @Test
+    fun noScrollableParent_itemNotVisible_noChange() {
+        // Arrange.
+        val bringIntoViewRequester = BringIntoViewRequester()
+        setContentAndInitialize {
+            Box(
+                Modifier
+                    .then(
+                        when (orientation) {
+                            Horizontal -> Modifier.size(100.toDp(), 50.toDp())
+                            Vertical -> Modifier.size(50.toDp(), 100.toDp())
+                        }
+                    )
+                    .testTag(parentBox)
+                    .background(LightGray)
+            ) {
+                Box(
+                    Modifier
+                        .then(
+                            when (orientation) {
+                                Horizontal -> Modifier.offset(x = 150.toDp())
+                                Vertical -> Modifier.offset(y = 150.toDp())
+                            }
+                        )
+                        .size(50.toDp())
+                        .background(Blue)
+                        .bringIntoViewRequester(bringIntoViewRequester)
+                        .testTag(childBox)
+                )
+            }
+        }
+        val startingBounds = getUnclippedBoundsInRoot(childBox)
+
+        // Act.
+        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
+
+        // Assert.
+        assertThat(getUnclippedBoundsInRoot(childBox)).isEqualTo(startingBounds)
+        assertChildMaxInView()
+    }
+
+    @Test
+    fun itemAtLeadingEdge_alreadyVisible_noChange() {
+        // Arrange.
+        val bringIntoViewRequester = BringIntoViewRequester()
+        setContentAndInitialize {
+            Box(
+                Modifier
+                    .testTag(parentBox)
+                    .background(LightGray)
+                    .then(
+                        when (orientation) {
+                            Horizontal ->
+                                Modifier
+                                    .size(100.toDp(), 50.toDp())
+                                    .horizontalScroll(rememberScrollState())
+                            Vertical ->
+                                Modifier
+                                    .size(50.toDp(), 100.toDp())
+                                    .verticalScroll(rememberScrollState())
+                        }
+                    )
+            ) {
+                Box(
+                    Modifier
+                        .size(50.toDp())
+                        .background(Blue)
+                        .bringIntoViewRequester(bringIntoViewRequester)
+                        .testTag(childBox)
+                )
+            }
+        }
+        val startingBounds = getUnclippedBoundsInRoot(childBox)
+
+        // Act.
+        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
+
+        // Assert.
+        assertThat(getUnclippedBoundsInRoot(childBox)).isEqualTo(startingBounds)
+        assertChildMaxInView()
+    }
+
+    @Test
+    fun itemAtTrailingEdge_alreadyVisible_noChange() {
+        // Arrange.
+        val bringIntoViewRequester = BringIntoViewRequester()
+        setContentAndInitialize {
+            Box(
+                Modifier
+                    .testTag(parentBox)
+                    .background(LightGray)
+                    .then(
+                        when (orientation) {
+                            Horizontal ->
+                                Modifier
+                                    .size(100.toDp(), 50.toDp())
+                                    .horizontalScroll(rememberScrollState())
+                            Vertical ->
+                                Modifier
+                                    .size(50.toDp(), 100.toDp())
+                                    .verticalScroll(rememberScrollState())
+                        }
+                    )
+            ) {
+                Box(
+                    Modifier
+                        .then(
+                            when (orientation) {
+                                Horizontal -> Modifier.offset(x = 50.toDp())
+                                Vertical -> Modifier.offset(y = 50.toDp())
+                            }
+                        )
+                        .size(50.toDp())
+                        .background(Blue)
+                        .bringIntoViewRequester(bringIntoViewRequester)
+                        .testTag(childBox)
+                )
+            }
+        }
+        val startingBounds = getUnclippedBoundsInRoot(childBox)
+
+        // Act.
+        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
+
+        // Assert.
+        assertThat(getUnclippedBoundsInRoot(childBox)).isEqualTo(startingBounds)
+        assertChildMaxInView()
+    }
+
+    @Test
+    fun itemAtCenter_alreadyVisible_noChange() {
+        // Arrange.
+        val bringIntoViewRequester = BringIntoViewRequester()
+        setContentAndInitialize {
+            Box(
+                Modifier
+                    .testTag(parentBox)
+                    .background(LightGray)
+                    .then(
+                        when (orientation) {
+                            Horizontal ->
+                                Modifier
+                                    .size(100.toDp(), 50.toDp())
+                                    .horizontalScroll(rememberScrollState())
+                            Vertical ->
+                                Modifier
+                                    .size(50.toDp(), 100.toDp())
+                                    .verticalScroll(rememberScrollState())
+                        }
+                    )
+            ) {
+                Box(
+                    Modifier
+                        .then(
+                            when (orientation) {
+                                Horizontal -> Modifier.offset(x = 25.toDp())
+                                Vertical -> Modifier.offset(y = 25.toDp())
+                            }
+                        )
+                        .size(50.toDp())
+                        .background(Blue)
+                        .bringIntoViewRequester(bringIntoViewRequester)
+                        .testTag(childBox)
+                )
+            }
+        }
+        val startingBounds = getUnclippedBoundsInRoot(childBox)
+
+        // Act.
+        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
+
+        // Assert.
+        assertThat(getUnclippedBoundsInRoot(childBox)).isEqualTo(startingBounds)
+        assertChildMaxInView()
+    }
+
+    @Test
+    fun itemBiggerThanParentAtLeadingEdge_alreadyVisible_noChange() {
+        // Arrange.
+        val bringIntoViewRequester = BringIntoViewRequester()
+        setContentAndInitialize {
+            Box(
+                Modifier
+                    .size(50.toDp())
+                    .testTag(parentBox)
+                    .background(LightGray)
+                    .then(
+                        when (orientation) {
+                            Horizontal -> Modifier.horizontalScroll(rememberScrollState())
+                            Vertical -> Modifier.verticalScroll(rememberScrollState())
+                        }
+                    )
+            ) {
+                // Using a multi-colored item to make sure we can assert that the right part of
+                // the item is visible.
+                RowOrColumn(
+                    Modifier
+                        .bringIntoViewRequester(bringIntoViewRequester)
+                        .testTag(childBox)
+                ) {
+                    Box(
+                        Modifier
+                            .size(50.toDp())
+                            .background(Blue)
+                    )
+                    Box(
+                        Modifier
+                            .size(50.toDp())
+                            .background(Green)
+                    )
+                    Box(
+                        Modifier
+                            .size(50.toDp())
+                            .background(Red)
+                    )
+                }
+            }
+        }
+        val startingBounds = getUnclippedBoundsInRoot(childBox)
+
+        // Act.
+        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
+
+        // Assert.
+        assertThat(getUnclippedBoundsInRoot(childBox)).isEqualTo(startingBounds)
+        assertChildMaxInView()
+    }
+
+    @Test
+    fun itemBiggerThanParentAtTrailingEdge_alreadyVisible_noChange() {
+        // Arrange.
+        val bringIntoViewRequester = BringIntoViewRequester()
+        lateinit var scrollState: ScrollState
+        setContentAndInitialize {
+            scrollState = rememberScrollState()
+            Box(
+                Modifier
+                    .size(50.toDp())
+                    .testTag(parentBox)
+                    .background(LightGray)
+                    .then(
+                        when (orientation) {
+                            Horizontal -> Modifier.horizontalScroll(scrollState)
+                            Vertical -> Modifier.verticalScroll(scrollState)
+                        }
+                    )
+            ) {
+                // Using a multi-colored item to make sure we can assert that the right part of
+                // the item is visible.
+                RowOrColumn(
+                    Modifier
+                        .bringIntoViewRequester(bringIntoViewRequester)
+                        .testTag(childBox)
+                ) {
+                    Box(
+                        Modifier
+                            .size(50.toDp())
+                            .background(Red)
+                    )
+                    Box(
+                        Modifier
+                            .size(50.toDp())
+                            .background(Green)
+                    )
+                    Box(
+                        Modifier
+                            .size(50.toDp())
+                            .background(Blue)
+                    )
+                }
+            }
+        }
+        runBlockingAndAwaitIdle { scrollState.scrollTo(scrollState.maxValue) }
+        val startingBounds = getUnclippedBoundsInRoot(childBox)
+
+        // Act.
+        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
+
+        // Assert.
+        assertThat(getUnclippedBoundsInRoot(childBox)).isEqualTo(startingBounds)
+        assertChildMaxInView()
+    }
+
+    @Test
+    fun itemBiggerThanParentAtCenter_alreadyVisible_noChange() {
+        // Arrange.
+        val bringIntoViewRequester = BringIntoViewRequester()
+        lateinit var scrollState: ScrollState
+        setContentAndInitialize {
+            scrollState = rememberScrollState()
+            Box(
+                Modifier
+                    .size(50.toDp())
+                    .testTag(parentBox)
+                    .background(LightGray)
+                    .then(
+                        when (orientation) {
+                            Horizontal -> Modifier.horizontalScroll(scrollState)
+                            Vertical -> Modifier.verticalScroll(scrollState)
+                        }
+                    )
+            ) {
+                // Using a multi-colored item to make sure we can assert that the right part of
+                // the item is visible.
+                RowOrColumn(
+                    Modifier
+                        .bringIntoViewRequester(bringIntoViewRequester)
+                        .testTag(childBox)
+                ) {
+                    Box(
+                        Modifier
+                            .size(50.toDp())
+                            .background(Green)
+                    )
+                    Box(
+                        Modifier
+                            .size(50.toDp())
+                            .background(Blue)
+                    )
+                    Box(
+                        Modifier
+                            .size(50.toDp())
+                            .background(Red)
+                    )
+                }
+            }
+        }
+        runBlockingAndAwaitIdle { scrollState.scrollTo(scrollState.maxValue / 2) }
+        val startingBounds = getUnclippedBoundsInRoot(childBox)
+
+        // Act.
+        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
+
+        // Assert.
+        assertThat(getUnclippedBoundsInRoot(childBox)).isEqualTo(startingBounds)
+        assertChildMaxInView()
+    }
+
+    @Test
+    fun childBeforeVisibleBounds_parentIsScrolledSoThatLeadingEdgeOfChildIsVisible() {
+        // Arrange.
+        val bringIntoViewRequester = BringIntoViewRequester()
+        lateinit var scrollState: ScrollState
+        setContentAndInitialize {
+            scrollState = rememberScrollState()
+            Box(
+                Modifier
+                    .testTag(parentBox)
+                    .background(LightGray)
+                    .then(
+                        when (orientation) {
+                            Horizontal ->
+                                Modifier
+                                    .size(100.toDp(), 50.toDp())
+                                    .horizontalScroll(scrollState)
+                            Vertical ->
+                                Modifier
+                                    .size(50.toDp(), 100.toDp())
+                                    .verticalScroll(scrollState)
+                        }
+                    )
+            ) {
+                Box(
+                    when (orientation) {
+                        Horizontal -> Modifier.size(200.toDp(), 50.toDp())
+                        Vertical -> Modifier.size(50.toDp(), 200.toDp())
+                    }
+                ) {
+                    Box(
+                        Modifier
+                            .then(
+                                when (orientation) {
+                                    Horizontal -> Modifier.offset(x = 50.toDp())
+                                    Vertical -> Modifier.offset(y = 50.toDp())
+                                }
+                            )
+                            .size(50.toDp())
+                            .background(Blue)
+                            .bringIntoViewRequester(bringIntoViewRequester)
+                            .testTag(childBox)
+                    )
+                }
+            }
+        }
+        runBlockingAndAwaitIdle { scrollState.scrollTo(scrollState.maxValue) }
+
+        // Act.
+        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
+
+        // Assert.
+        rule.onNodeWithTag(childBox).assertPositionInRootIsEqualTo(0.toDp(), 0.toDp())
+        assertChildMaxInView()
+    }
+
+    @Test
+    fun childAfterVisibleBounds_parentIsScrolledSoThatTrailingEdgeOfChildIsVisible() {
+        // Arrange.
+        val bringIntoViewRequester = BringIntoViewRequester()
+        lateinit var scrollState: ScrollState
+        setContentAndInitialize {
+            scrollState = rememberScrollState()
+            Box(
+                Modifier
+                    .testTag(parentBox)
+                    .background(LightGray)
+                    .then(
+                        when (orientation) {
+                            Horizontal ->
+                                Modifier
+                                    .size(100.toDp(), 50.toDp())
+                                    .horizontalScroll(scrollState)
+                            Vertical ->
+                                Modifier
+                                    .size(50.toDp(), 100.toDp())
+                                    .verticalScroll(scrollState)
+                        }
+                    )
+            ) {
+                Box(
+                    when (orientation) {
+                        Horizontal -> Modifier.size(200.toDp(), 50.toDp())
+                        Vertical -> Modifier.size(50.toDp(), 200.toDp())
+                    }
+                ) {
+                    Box(
+                        Modifier
+                            .then(
+                                when (orientation) {
+                                    Horizontal -> Modifier.offset(x = 150.toDp())
+                                    Vertical -> Modifier.offset(y = 150.toDp())
+                                }
+                            )
+                            .size(50.toDp())
+                            .background(Blue)
+                            .bringIntoViewRequester(bringIntoViewRequester)
+                            .testTag(childBox)
+                    )
+                }
+            }
+        }
+        runBlockingAndAwaitIdle { scrollState.scrollTo(scrollState.maxValue) }
+
+        // Act.
+        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
+
+        // Assert.
+        rule.onNodeWithTag(childBox).assertPositionInRootIsEqualTo(
+            expectedLeft = if (orientation == Horizontal) 50.toDp() else 0.toDp(),
+            expectedTop = if (orientation == Horizontal) 0.toDp() else 50.toDp()
+        )
+        assertChildMaxInView()
+    }
+
+    @Test
+    fun childPartiallyVisible_parentIsScrolledSoThatLeadingEdgeOfChildIsVisible() {
+        // Arrange.
+        val bringIntoViewRequester = BringIntoViewRequester()
+        lateinit var scrollState: ScrollState
+        setContentAndInitialize {
+            scrollState = rememberScrollState()
+            Box(
+                Modifier
+                    .testTag(parentBox)
+                    .background(LightGray)
+                    .then(
+                        when (orientation) {
+                            Horizontal ->
+                                Modifier
+                                    .size(100.toDp(), 50.toDp())
+                                    .horizontalScroll(scrollState)
+                            Vertical ->
+                                Modifier
+                                    .size(50.toDp(), 100.toDp())
+                                    .verticalScroll(scrollState)
+                        }
+                    )
+            ) {
+                Box(Modifier.size(200.toDp())) {
+                    Box(
+                        Modifier
+                            .then(
+                                when (orientation) {
+                                    Horizontal -> Modifier.offset(x = 25.toDp())
+                                    Vertical -> Modifier.offset(y = 25.toDp())
+                                }
+                            )
+                            .size(50.toDp())
+                            .background(Blue)
+                            .bringIntoViewRequester(bringIntoViewRequester)
+                            .testTag(childBox)
+                    )
+                }
+            }
+        }
+        runBlockingAndAwaitIdle { scrollState.scrollTo(scrollState.maxValue / 2) }
+
+        // Act.
+        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
+
+        // Assert.
+        rule.onNodeWithTag(childBox).assertPositionInRootIsEqualTo(0.toDp(), 0.toDp())
+        assertChildMaxInView()
+    }
+
+    @Test
+    fun childPartiallyVisible_parentIsScrolledSoThatTrailingEdgeOfChildIsVisible() {
+        // Arrange.
+        val bringIntoViewRequester = BringIntoViewRequester()
+        lateinit var scrollState: ScrollState
+        setContentAndInitialize {
+            scrollState = rememberScrollState()
+            Box(
+                Modifier
+                    .testTag(parentBox)
+                    .background(LightGray)
+                    .then(
+                        when (orientation) {
+                            Horizontal ->
+                                Modifier
+                                    .size(100.toDp(), 50.toDp())
+                                    .horizontalScroll(scrollState)
+                            Vertical ->
+                                Modifier
+                                    .size(50.toDp(), 100.toDp())
+                                    .verticalScroll(scrollState)
+                        }
+                    )
+            ) {
+                Box(
+                    when (orientation) {
+                        Horizontal -> Modifier.size(200.toDp(), 50.toDp())
+                        Vertical -> Modifier.size(50.toDp(), 200.toDp())
+                    }
+                ) {
+                    Box(
+                        Modifier
+                            .then(
+                                when (orientation) {
+                                    Horizontal -> Modifier.offset(x = 150.toDp())
+                                    Vertical -> Modifier.offset(y = 150.toDp())
+                                }
+                            )
+                            .size(50.toDp())
+                            .background(Blue)
+                            .bringIntoViewRequester(bringIntoViewRequester)
+                            .testTag(childBox)
+                    )
+                }
+            }
+        }
+        runBlockingAndAwaitIdle { scrollState.scrollTo(scrollState.maxValue) }
+
+        // Act.
+        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
+
+        // Assert.
+        rule.onNodeWithTag(childBox).assertPositionInRootIsEqualTo(
+            expectedLeft = if (orientation == Horizontal) 50.toDp() else 0.toDp(),
+            expectedTop = if (orientation == Horizontal) 0.toDp() else 50.toDp()
+        )
+        assertChildMaxInView()
+    }
+
+    @Test
+    fun multipleParentsAreScrolledSoThatChildIsVisible() {
+        // Arrange.
+        val bringIntoViewRequester = BringIntoViewRequester()
+        lateinit var parentScrollState: ScrollState
+        lateinit var grandParentScrollState: ScrollState
+        setContentAndInitialize {
+            parentScrollState = rememberScrollState()
+            grandParentScrollState = rememberScrollState()
+            Box(
+                Modifier
+                    .testTag(parentBox)
+                    .background(LightGray)
+                    .then(
+                        when (orientation) {
+                            Horizontal ->
+                                Modifier
+                                    .size(100.toDp(), 50.toDp())
+                                    .horizontalScroll(grandParentScrollState)
+                            Vertical ->
+                                Modifier
+                                    .size(50.toDp(), 100.toDp())
+                                    .verticalScroll(grandParentScrollState)
+                        }
+                    )
+            ) {
+                Box(
+                    Modifier
+                        .background(LightGray)
+                        .then(
+                            when (orientation) {
+                                Horizontal ->
+                                    Modifier
+                                        .size(200.toDp(), 50.toDp())
+                                        .horizontalScroll(parentScrollState)
+                                Vertical ->
+                                    Modifier
+                                        .size(50.toDp(), 200.toDp())
+                                        .verticalScroll(parentScrollState)
+                            }
+                        )
+                ) {
+                    Box(
+                        when (orientation) {
+                            Horizontal -> Modifier.size(400.toDp(), 50.toDp())
+                            Vertical -> Modifier.size(50.toDp(), 400.toDp())
+                        }
+                    ) {
+                        Box(
+                            Modifier
+                                .then(
+                                    when (orientation) {
+                                        Horizontal -> Modifier.offset(x = 25.toDp())
+                                        Vertical -> Modifier.offset(y = 25.toDp())
+                                    }
+                                )
+                                .size(50.toDp())
+                                .background(Blue)
+                                .bringIntoViewRequester(bringIntoViewRequester)
+                                .testTag(childBox)
+                        )
+                    }
+                }
+            }
+        }
+        runBlockingAndAwaitIdle { parentScrollState.scrollTo(parentScrollState.maxValue) }
+        runBlockingAndAwaitIdle { grandParentScrollState.scrollTo(grandParentScrollState.maxValue) }
+
+        // Act.
+        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
+
+        // Assert.
+        rule.onNodeWithTag(childBox).assertPositionInRootIsEqualTo(0.toDp(), 0.toDp())
+        assertChildMaxInView()
+    }
+
+    @Test
+    fun multipleParentsAreScrolledInDifferentDirectionsSoThatChildIsVisible() {
+        // Arrange.
+        val bringIntoViewRequester = BringIntoViewRequester()
+        lateinit var parentScrollState: ScrollState
+        lateinit var grandParentScrollState: ScrollState
+        setContentAndInitialize {
+            parentScrollState = rememberScrollState()
+            grandParentScrollState = rememberScrollState()
+            Box(
+                Modifier
+                    .testTag(parentBox)
+                    .background(LightGray)
+                    .then(
+                        when (orientation) {
+                            Horizontal ->
+                                Modifier
+                                    .size(100.toDp(), 50.toDp())
+                                    .verticalScroll(grandParentScrollState)
+                            Vertical ->
+                                Modifier
+                                    .size(50.toDp(), 100.toDp())
+                                    .horizontalScroll(grandParentScrollState)
+                        }
+                    )
+            ) {
+                Box(
+                    Modifier
+                        .size(100.toDp())
+                        .background(LightGray)
+                        .then(
+                            when (orientation) {
+                                Horizontal -> Modifier.horizontalScroll(parentScrollState)
+                                Vertical -> Modifier.verticalScroll(parentScrollState)
+                            }
+                        )
+                ) {
+                    Box(Modifier.size(200.toDp())) {
+                        Box(
+                            Modifier
+                                .offset(x = 25.toDp(), y = 25.toDp())
+                                .size(50.toDp())
+                                .background(Blue)
+                                .bringIntoViewRequester(bringIntoViewRequester)
+                                .testTag(childBox)
+                        )
+                    }
+                }
+            }
+        }
+        runBlockingAndAwaitIdle { parentScrollState.scrollTo(parentScrollState.maxValue) }
+        runBlockingAndAwaitIdle { grandParentScrollState.scrollTo(grandParentScrollState.maxValue) }
+
+        // Act.
+        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
+
+        // Assert.
+        rule.onNodeWithTag(childBox).assertPositionInRootIsEqualTo(0.toDp(), 0.toDp())
+        assertChildMaxInView()
+    }
+
+    @Test
+    fun specifiedPartOfComponentBroughtOnScreen() {
+        // Arrange.
+        val bringIntoViewRequester = BringIntoViewRequester()
+        lateinit var density: Density
+        setContentAndInitialize {
+            density = LocalDensity.current
+            Box(
+                Modifier
+                    .testTag(parentBox)
+                    .size(50.toDp())
+                    .background(LightGray)
+                    .then(
+                        when (orientation) {
+                            Horizontal -> Modifier.horizontalScroll(rememberScrollState())
+                            Vertical -> Modifier.verticalScroll(rememberScrollState())
+                        }
+                    )
+            ) {
+                Box(
+                    Modifier
+                        .then(
+                            when (orientation) {
+                                Horizontal -> Modifier.size(150.toDp(), 50.toDp())
+                                Vertical -> Modifier.size(50.toDp(), 150.toDp())
+                            }
+                        )
+                        .bringIntoViewRequester(bringIntoViewRequester)
+                ) {
+                    Box(
+                        Modifier
+                            .size(50.toDp())
+                            .then(
+                                when (orientation) {
+                                    Horizontal -> Modifier.offset(50.toDp(), 0.toDp())
+                                    Vertical -> Modifier.offset(0.toDp(), 50.toDp())
+                                }
+                            )
+                            .background(Blue)
+                            .testTag(childBox)
+                    )
+                }
+            }
+        }
+
+        // Act.
+        runBlockingAndAwaitIdle {
+            val rect = with(density) {
+                when (orientation) {
+                    Horizontal -> DpRect(50.toDp(), 0.toDp(), 100.toDp(), 50.toDp()).toRect()
+                    Vertical -> DpRect(0.toDp(), 50.toDp(), 50.toDp(), 100.toDp()).toRect()
+                }
+            }
+            bringIntoViewRequester.bringIntoView(rect)
+        }
+
+        // Assert.
+        rule.onNodeWithTag(childBox).assertPositionInRootIsEqualTo(0.toDp(), 0.toDp())
+        assertChildMaxInView()
+    }
+
+    private fun setContentAndInitialize(content: @Composable () -> Unit) {
+        rule.setContent {
+            testScope = rememberCoroutineScope()
+            content()
+        }
+    }
+
+    /**
+     * Sizes and offsets of the composables in these tests must be specified using this function.
+     * If they're specified using `xx.dp` syntax, a rounding error somewhere in the layout system
+     * will cause the pixel values to be off-by-one.
+     */
+    private fun Int.toDp(): Dp = with(rule.density) { this@toDp.toDp() }
+
+    /**
+     * Returns the bounds of the node with [tag], without performing any clipping by any parents.
+     */
+    @Suppress("SameParameterValue")
+    private fun getUnclippedBoundsInRoot(tag: String): Rect {
+        val node = rule.onNodeWithTag(tag).fetchSemanticsNode()
+        return Rect(node.positionInRoot, node.size.toSize())
+    }
+
+    @Composable
+    private fun RowOrColumn(
+        modifier: Modifier = Modifier,
+        content: @Composable () -> Unit
+    ) {
+        when (orientation) {
+            Horizontal -> Row(modifier) { content() }
+            Vertical -> Column(modifier) { content() }
+        }
+    }
+
+    private fun runBlockingAndAwaitIdle(block: suspend CoroutineScope.() -> Unit) {
+        val job = testScope.launch(block = block)
+        rule.waitForIdle()
+        runBlocking {
+            job.join()
+        }
+    }
+
+    /**
+     * Asserts that as much of the child (identified by [childBox]) as can fit in the viewport
+     * (identified by [parentBox]) is visible. This is the min of the child size and the viewport
+     * size.
+     */
+    private fun assertChildMaxInView() {
+        val parentNode = rule.onNodeWithTag(parentBox).fetchSemanticsNode()
+        val childNode = rule.onNodeWithTag(childBox).fetchSemanticsNode()
+
+        // BoundsInRoot returns the clipped bounds.
+        val visibleBounds: IntSize = childNode.boundsInRoot.size.run {
+            IntSize(width.roundToInt(), height.roundToInt())
+        }
+        val expectedVisibleBounds = IntSize(
+            width = minOf(parentNode.size.width, childNode.size.width),
+            height = minOf(parentNode.size.height, childNode.size.height)
+        )
+
+        assertThat(visibleBounds).isEqualTo(expectedVisibleBounds)
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSelectionOnBackTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSelectionOnBackTest.kt
index 1acbc14..a6a9477 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSelectionOnBackTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSelectionOnBackTest.kt
@@ -44,6 +44,7 @@
 import androidx.compose.ui.text.TextRange
 import androidx.compose.ui.text.input.TextFieldValue
 import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.FlakyTest
 import androidx.test.filters.LargeTest
 import com.google.common.truth.Truth.assertThat
 import org.junit.Rule
@@ -72,6 +73,7 @@
         )
     )
 
+    @FlakyTest(bugId = 209063017)
     @Test
     fun whenBackPressed_andReleased_coreTextFieldClearsSelection() {
         val results = mutableListOf<TextFieldValue>()
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/DefaultKeyboardActionsTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/DefaultKeyboardActionsTest.kt
index 76510a7..630e70e 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/DefaultKeyboardActionsTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/DefaultKeyboardActionsTest.kt
@@ -24,9 +24,11 @@
 import androidx.compose.ui.focus.focusProperties
 import androidx.compose.ui.focus.focusRequester
 import androidx.compose.ui.focus.onFocusChanged
+import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.performClick
 import androidx.compose.ui.test.performImeAction
 import androidx.compose.ui.text.input.ImeAction.Companion.Go
 import androidx.compose.ui.text.input.ImeAction.Companion.Search
@@ -77,8 +79,11 @@
         val (value1, value2, value3) = List(3) { TextFieldValue("Placeholder Text") }
         val (textField1, textField2, textField3) = FocusRequester.createRefs()
         var (focusState1, focusState2, focusState3) = List(3) { false }
+        val keyboardHelper = KeyboardHelper(rule)
 
         rule.setContent {
+            keyboardHelper.view = LocalView.current
+
             Column {
                 CoreTextField(
                     value = value1,
@@ -107,6 +112,11 @@
             }
         }
 
+        // Show keyboard.
+        rule.onNodeWithTag(initialTextField).performClick()
+        keyboardHelper.waitForKeyboardVisibility(visible = true)
+        assertThat(keyboardHelper.isSoftwareKeyboardShown()).isTrue()
+
         // Act.
         rule.onNodeWithTag(initialTextField).performImeAction()
 
@@ -124,6 +134,16 @@
                 assertThat(focusState2).isFalse()
                 assertThat(focusState3).isFalse()
             }
+            Done -> {
+                // No change to focus state.
+                assertThat(focusState1).isFalse()
+                assertThat(focusState2).isTrue()
+                assertThat(focusState3).isFalse()
+
+                // Software keyboard is hidden.
+                keyboardHelper.waitForKeyboardVisibility(false)
+                assertThat(keyboardHelper.isSoftwareKeyboardShown()).isFalse()
+            }
             else -> {
                 // No change to focus state.
                 assertThat(focusState1).isFalse()
@@ -141,8 +161,11 @@
         val (value1, value2, value3) = List(3) { TextFieldValue("Placeholder Text") }
         val (textField1, textField2, textField3) = FocusRequester.createRefs()
         var (focusState1, focusState2, focusState3) = List(3) { false }
+        val keyboardHelper = KeyboardHelper(rule)
 
         rule.setContent {
+            keyboardHelper.view = LocalView.current
+
             Column {
                 CoreTextField(
                     value = value1,
@@ -179,6 +202,12 @@
             }
         }
 
+        // Show keyboard.
+        rule.onNodeWithTag(initialTextField).performClick()
+
+        keyboardHelper.waitForKeyboardVisibility(visible = true)
+        assertThat(keyboardHelper.isSoftwareKeyboardShown()).isTrue()
+
         // Act.
         rule.onNodeWithTag(initialTextField).performImeAction()
 
@@ -196,6 +225,16 @@
                 assertThat(focusState2).isFalse()
                 assertThat(focusState3).isFalse()
             }
+            Done -> {
+                // No change to focus state.
+                assertThat(focusState1).isFalse()
+                assertThat(focusState2).isTrue()
+                assertThat(focusState3).isFalse()
+
+                // Software keyboard is hidden.
+                keyboardHelper.waitForKeyboardVisibility(false)
+                assertThat(keyboardHelper.isSoftwareKeyboardShown()).isFalse()
+            }
             else -> {
                 // No change to focus state.
                 assertThat(focusState1).isFalse()
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/KeyboardActionsTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/KeyboardActionsTest.kt
index e61b5d6..9d52ba0 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/KeyboardActionsTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/KeyboardActionsTest.kt
@@ -18,9 +18,11 @@
 
 import android.os.Build
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.performClick
 import androidx.compose.ui.test.performImeAction
 import androidx.compose.ui.text.input.ImeAction
 import androidx.compose.ui.text.input.ImeAction.Companion.Go
@@ -98,4 +100,48 @@
             }
         }
     }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.R)
+    fun imeActionDone_customCallback_doesNotHideKeyboard() {
+        if (imeAction != Done) return
+
+        // Arrange.
+        val initialTextField = "text field test tag"
+        val textFieldValue = TextFieldValue("Placeholder Text")
+        val keyboardHelper = KeyboardHelper(rule)
+        var wasCallbackTriggered = false
+
+        rule.setContent {
+            keyboardHelper.view = LocalView.current
+
+            CoreTextField(
+                value = textFieldValue,
+                onValueChange = {},
+                modifier = Modifier
+                    .testTag(initialTextField),
+                imeOptions = ImeOptions(imeAction = Done),
+                keyboardActions = KeyboardActions(
+                    onDone = { wasCallbackTriggered = true },
+                )
+            )
+        }
+
+        // Show keyboard.
+        rule.onNodeWithTag(initialTextField).performClick()
+        keyboardHelper.waitForKeyboardVisibility(visible = true)
+        assertThat(keyboardHelper.isSoftwareKeyboardShown()).isTrue()
+
+        // Act.
+        rule.onNodeWithTag(initialTextField).performImeAction()
+
+        // Assert.
+        rule.runOnIdle {
+            // The custom onDone callback was triggered.
+            assertThat(wasCallbackTriggered).isTrue()
+
+            // Software keyboard is still visible.
+            assertThat(keyboardHelper.isSoftwareKeyboardShown()).isTrue()
+        }
+    }
 }
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/KeyboardHelper.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/KeyboardHelper.kt
index 87fe0e8..018cd82 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/KeyboardHelper.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/KeyboardHelper.kt
@@ -76,7 +76,7 @@
         }
     }
 
-    private fun isSoftwareKeyboardShown(): Boolean {
+    fun isSoftwareKeyboardShown(): Boolean {
         return if (Build.VERSION.SDK_INT >= 30) {
             isSoftwareKeyboardShownWithInsets()
         } else {
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldVisualTransformationSelectionBoundsTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldVisualTransformationSelectionBoundsTest.kt
index b1d92e6..bc1c269 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldVisualTransformationSelectionBoundsTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldVisualTransformationSelectionBoundsTest.kt
@@ -38,6 +38,7 @@
 import androidx.compose.ui.text.input.VisualTransformation
 import androidx.compose.ui.unit.dp
 import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.FlakyTest
 import androidx.test.filters.MediumTest
 import com.google.common.truth.Truth.assertThat
 import kotlin.math.roundToInt
@@ -92,6 +93,7 @@
         }
     }
 
+    @FlakyTest(bugId = 241572024)
     @Test
     fun cursor_throws_onShow_whenInvalidOriginalToTransformed() {
         rule.runOnIdle {
@@ -181,6 +183,7 @@
         assertValidMessage(error, sourceIndex = 0, toTransformed = false)
     }
 
+    @FlakyTest(bugId = 241572024)
     @Test
     fun selectionEnd_throws_onStart_whenInvalidOriginalToTransformed() {
         rule.runOnIdle {
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/AndroidOverscroll.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/AndroidOverscroll.kt
index f9d2839..5fdd0d1 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/AndroidOverscroll.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/AndroidOverscroll.kt
@@ -23,6 +23,8 @@
 import androidx.compose.foundation.EdgeEffectCompat.distanceCompat
 import androidx.compose.foundation.EdgeEffectCompat.onAbsorbCompat
 import androidx.compose.foundation.EdgeEffectCompat.onPullDistanceCompat
+import androidx.compose.foundation.gestures.awaitFirstDown
+import androidx.compose.foundation.gestures.forEachGesture
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.neverEqualPolicy
@@ -39,6 +41,8 @@
 import androidx.compose.ui.graphics.nativeCanvas
 import androidx.compose.ui.graphics.toArgb
 import androidx.compose.ui.input.nestedscroll.NestedScrollSource
+import androidx.compose.ui.input.pointer.PointerId
+import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.layout.layout
 import androidx.compose.ui.layout.onSizeChanged
 import androidx.compose.ui.platform.InspectorInfo
@@ -49,6 +53,7 @@
 import androidx.compose.ui.unit.Velocity
 import androidx.compose.ui.unit.toSize
 import androidx.compose.ui.util.fastAny
+import androidx.compose.ui.util.fastFirstOrNull
 import androidx.compose.ui.util.fastForEach
 import kotlin.math.roundToInt
 
@@ -99,6 +104,8 @@
     context: Context,
     private val overscrollConfig: OverscrollConfiguration
 ) : OverscrollEffect {
+    private var pointerPosition: Offset? = null
+
     private val topEffect = EdgeEffectCompat.create(context, null)
     private val bottomEffect = EdgeEffectCompat.create(context, null)
     private val leftEffect = EdgeEffectCompat.create(context, null)
@@ -126,7 +133,6 @@
 
     override fun consumePreScroll(
         scrollDelta: Offset,
-        pointerPosition: Offset?,
         source: NestedScrollSource
     ): Offset {
         if (containerSize.isEmpty()) {
@@ -173,7 +179,6 @@
     override fun consumePostScroll(
         initialDragDelta: Offset,
         overscrollDelta: Offset,
-        pointerPosition: Offset?,
         source: NestedScrollSource
     ) {
         if (containerSize.isEmpty()) {
@@ -308,8 +313,34 @@
         }
     }
 
+    private var pointerId: PointerId? = null
+
     override val effectModifier: Modifier = Modifier
         .then(StretchOverscrollNonClippingLayer)
+        .pointerInput(Unit) {
+            forEachGesture {
+                awaitPointerEventScope {
+                    val down = awaitFirstDown(requireUnconsumed = false)
+                    pointerId = down.id
+                    pointerPosition = down.position
+                    do {
+                        val pressedChanges = awaitPointerEvent().changes.fastFilter { it.pressed }
+                        // If the same ID we are already tracking is down, use that. Otherwise, use
+                        // the next down, to move the overscroll to the next pointer.
+                        val change = pressedChanges
+                            .fastFirstOrNull { it.id == pointerId } ?: pressedChanges.firstOrNull()
+                        if (change != null) {
+                            // Update the id if we are now tracking a new down
+                            pointerId = change.id
+                            pointerPosition = change.position
+                        }
+                    } while (pressedChanges.isNotEmpty())
+                    pointerId = null
+                    // Explicitly not resetting the pointer position until the next down, so we
+                    // don't change any existing effects
+                }
+            }
+        }
         .onSizeChanged(onNewSize)
         .then(
             DrawOverscrollModifier(
@@ -479,14 +510,12 @@
 
     override fun consumePreScroll(
         scrollDelta: Offset,
-        pointerPosition: Offset?,
         source: NestedScrollSource
     ): Offset = Offset.Zero
 
     override fun consumePostScroll(
         initialDragDelta: Offset,
         overscrollDelta: Offset,
-        pointerPosition: Offset?,
         source: NestedScrollSource
     ) {
     }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Overscroll.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Overscroll.kt
index f4ffe3b..bea29df 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Overscroll.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Overscroll.kt
@@ -46,7 +46,6 @@
      * good user-experience.
      *
      * @param scrollDelta the original delta to scroll
-     * @param pointerPosition position of the pointer causing the scroll, if known
      * @param source source of the scroll event
      *
      * @return the amount of scroll consumed that won't be available for scrollable container
@@ -54,7 +53,6 @@
      */
     fun consumePreScroll(
         scrollDelta: Offset,
-        pointerPosition: Offset?,
         source: NestedScrollSource
     ): Offset
 
@@ -67,13 +65,11 @@
      *
      * @param initialDragDelta initial drag delta before any consumption was made
      * @param overscrollDelta the amount of overscroll left after the scroll process
-     * @param pointerPosition the pointer location in the bounds of the container
      * @param source source of the scroll event
      */
     fun consumePostScroll(
         initialDragDelta: Offset,
         overscrollDelta: Offset,
-        pointerPosition: Offset?,
         source: NestedScrollSource
     )
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Scroll.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Scroll.kt
index 8b10b1a..18ca13c 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Scroll.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Scroll.kt
@@ -358,20 +358,44 @@
     override fun IntrinsicMeasureScope.minIntrinsicWidth(
         measurable: IntrinsicMeasurable,
         height: Int
-    ) = measurable.minIntrinsicWidth(height)
+    ): Int {
+        return if (isVertical) {
+            measurable.minIntrinsicWidth(Constraints.Infinity)
+        } else {
+            measurable.minIntrinsicWidth(height)
+        }
+    }
 
     override fun IntrinsicMeasureScope.minIntrinsicHeight(
         measurable: IntrinsicMeasurable,
         width: Int
-    ) = measurable.minIntrinsicHeight(width)
+    ): Int {
+        return if (isVertical) {
+            measurable.minIntrinsicHeight(width)
+        } else {
+            measurable.minIntrinsicHeight(Constraints.Infinity)
+        }
+    }
 
     override fun IntrinsicMeasureScope.maxIntrinsicWidth(
         measurable: IntrinsicMeasurable,
         height: Int
-    ) = measurable.maxIntrinsicWidth(height)
+    ): Int {
+        return if (isVertical) {
+            measurable.maxIntrinsicWidth(Constraints.Infinity)
+        } else {
+            measurable.maxIntrinsicWidth(height)
+        }
+    }
 
     override fun IntrinsicMeasureScope.maxIntrinsicHeight(
         measurable: IntrinsicMeasurable,
         width: Int
-    ) = measurable.maxIntrinsicHeight(width)
+    ): Int {
+        return if (isVertical) {
+            measurable.maxIntrinsicHeight(width)
+        } else {
+            measurable.maxIntrinsicHeight(Constraints.Infinity)
+        }
+    }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/ContentInViewModifier.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/ContentInViewModifier.kt
new file mode 100644
index 0000000..0e07948
--- /dev/null
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/ContentInViewModifier.kt
@@ -0,0 +1,267 @@
+/*
+ * 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.gestures
+
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.onFocusedBoundsChanged
+import androidx.compose.foundation.relocation.BringIntoViewResponder
+import androidx.compose.foundation.relocation.bringIntoViewResponder
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.layout.LayoutCoordinates
+import androidx.compose.ui.layout.OnPlacedModifier
+import androidx.compose.ui.layout.OnRemeasuredModifier
+import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.unit.toSize
+import kotlin.math.abs
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.NonCancellable
+import kotlinx.coroutines.launch
+
+/**
+ * Handles any logic related to bringing or keeping content in view, including
+ * [BringIntoViewResponder] and ensuring the focused child stays in view when the scrollable area
+ * is shrunk.
+ */
+@OptIn(ExperimentalFoundationApi::class)
+internal class ContentInViewModifier(
+    private val scope: CoroutineScope,
+    private val orientation: Orientation,
+    private val scrollableState: ScrollableState,
+    private val reverseDirection: Boolean
+) : BringIntoViewResponder, OnRemeasuredModifier, OnPlacedModifier {
+    private var focusedChild: LayoutCoordinates? = null
+    private var coordinates: LayoutCoordinates? = null
+    private var oldSize: IntSize? = null
+
+    // These properties are used to detect the case where the viewport size is animated shrinking
+    // while the scroll animation used to keep the focused child in view is still running.
+    private var focusedChildBeingAnimated: LayoutCoordinates? = null
+    private var focusTargetBounds: Rect? by mutableStateOf(null)
+    private var focusAnimationJob: Job? = null
+
+    val modifier: Modifier = this
+        .onFocusedBoundsChanged { focusedChild = it }
+        .bringIntoViewResponder(this)
+
+    override fun onRemeasured(size: IntSize) {
+        val coordinates = coordinates
+        val oldSize = oldSize
+        // We only care when this node becomes smaller than it previously was, so don't care about
+        // the initial measurement.
+        if (oldSize != null && oldSize != size && coordinates?.isAttached == true) {
+            onSizeChanged(coordinates, oldSize)
+        }
+        this.oldSize = size
+    }
+
+    override fun onPlaced(coordinates: LayoutCoordinates) {
+        this.coordinates = coordinates
+    }
+
+    override fun calculateRectForParent(localRect: Rect): Rect {
+        val oldSize = checkNotNull(oldSize) {
+            "Expected BringIntoViewRequester to not be used before parents are placed."
+        }
+        // oldSize will only be null before the initial measurement.
+        return computeDestination(localRect, oldSize)
+    }
+
+    override suspend fun bringChildIntoView(localRect: Rect) {
+        performBringIntoView(
+            source = localRect,
+            destination = calculateRectForParent(localRect)
+        )
+    }
+
+    /**
+     * Handles when the size of the scroll viewport changes by making sure any focused child is kept
+     * appropriately visible when the viewport shrinks and would otherwise hide it.
+     *
+     * One common instance of this is when a text field in a scrollable near the bottom is focused
+     * while the soft keyboard is hidden, causing the keyboard to show, and cover the field.
+     * See b/192043120 and related bugs.
+     *
+     * To future debuggers of this method, it might be helpful to add a draw modifier to the chain
+     * above to draw the focus target bounds:
+     * ```
+     * .drawWithContent {
+     *   drawContent()
+     *   focusTargetBounds?.let {
+     *     drawRect(
+     *       Color.Red,
+     *       topLeft = it.topLeft,
+     *       size = it.size,
+     *       style = Stroke(1.dp.toPx())
+     *     )
+     *   }
+     * }
+     * ```
+     */
+    private fun onSizeChanged(coordinates: LayoutCoordinates, oldSize: IntSize) {
+        val containerShrunk = if (orientation == Orientation.Horizontal) {
+            coordinates.size.width < oldSize.width
+        } else {
+            coordinates.size.height < oldSize.height
+        }
+        // If the container is growing, then if the focused child is only partially visible it will
+        // soon be _more_ visible, so don't scroll.
+        if (!containerShrunk) return
+
+        val focusedChild = focusedChild ?: return
+        val focusedBounds = coordinates.localBoundingBoxOf(focusedChild, clipBounds = false)
+
+        // In order to check if we need to scroll to bring the focused child into view, it's not
+        // enough to consider where the child actually is right now. If the viewport was recently
+        // shrunk, we may have already started a scroll animation to bring it into view. In that
+        // case, we need to compare with the target of the animation, not the current position. If
+        // we don't do that, then in some cases when the viewport size is being animated (e.g. when
+        // the keyboard insets are being animated on API 30+) we might stop trying to keep the
+        // focused child in view before the viewport animation is finished, and the scroll animation
+        // will stop short and leave the focused child out of the viewport. See b/230756508.
+        val eventualFocusedBounds = if (focusedChild === focusedChildBeingAnimated) {
+            // A previous call to this method started an animation that is still running, so compare
+            // with the target of that animation.
+            checkNotNull(focusTargetBounds)
+        } else {
+            focusedBounds
+        }
+
+        val myOldBounds = Rect(Offset.Zero, oldSize.toSize())
+        if (!myOldBounds.overlaps(eventualFocusedBounds)) {
+            // The focused child was not visible before the resize, so we don't need to keep
+            // it visible.
+            return
+        }
+
+        val targetBounds = computeDestination(eventualFocusedBounds, coordinates.size)
+        if (targetBounds == eventualFocusedBounds) {
+            // The focused child is already fully visible (not clipped or hidden) after the resize,
+            // or will be after it finishes animating, so we don't need to do anything.
+            return
+        }
+
+        // If execution has gotten to this point, it means the focused child was at least partially
+        // visible before the resize, and it is either partially clipped or completely hidden after
+        // the resize, so we need to adjust scroll to keep it in view.
+        focusedChildBeingAnimated = focusedChild
+        focusTargetBounds = targetBounds
+        scope.launch(NonCancellable) {
+            val job = launch {
+                // Animate the scroll offset to keep the focused child in view. This is a suspending
+                // call that will suspend until the animation is finished, and only return if it
+                // completes. If any other scroll operations are performed after the animation starts,
+                // e.g. the viewport shrinks again or the user manually scrolls, this animation will
+                // be cancelled and this function will throw a CancellationException.
+                performBringIntoView(source = focusedBounds, destination = targetBounds)
+            }
+            focusAnimationJob = job
+
+            // If the scroll was interrupted by another viewport shrink that happens while the
+            // animation is running, we don't want to clear these fields since the later call to
+            // this onSizeChanged method will have updated the fields with its own values.
+            // If the animation completed, or was cancelled for any other reason, we need to clear
+            // them so the next viewport shrink doesn't think there's already a scroll animation in
+            // progress.
+            // Doing this wrong has a few implications:
+            // 1. If the fields are nulled out when another onSizeChange call happens, it will not
+            //    use the current animation target and viewport animations will lose track of the
+            //    focusable.
+            // 2. If the fields are not nulled out in other cases, the next viewport animation will
+            //    not keep the focusable in view if the focus hasn't changed.
+            try {
+                job.join()
+            } finally {
+                if (focusAnimationJob === job) {
+                    focusedChildBeingAnimated = null
+                    focusTargetBounds = null
+                    focusAnimationJob = null
+                }
+            }
+        }
+    }
+
+    /**
+     * Compute the destination given the source rectangle and current bounds.
+     *
+     * @param childBounds The bounding box of the item that sent the request to be brought into view.
+     * @return the destination rectangle.
+     */
+    private fun computeDestination(childBounds: Rect, containerSize: IntSize): Rect {
+        val size = containerSize.toSize()
+        return when (orientation) {
+            Orientation.Vertical ->
+                childBounds.translate(
+                    translateX = 0f,
+                    translateY = -relocationDistance(
+                        childBounds.top,
+                        childBounds.bottom,
+                        size.height
+                    )
+                )
+            Orientation.Horizontal ->
+                childBounds.translate(
+                    translateX = -relocationDistance(
+                        childBounds.left,
+                        childBounds.right,
+                        size.width
+                    ),
+                    translateY = 0f
+                )
+        }
+    }
+
+    /**
+     * Using the source and destination bounds, perform an animated scroll.
+     */
+    private suspend fun performBringIntoView(source: Rect, destination: Rect) {
+        val offset = when (orientation) {
+            Orientation.Vertical -> destination.top - source.top
+            Orientation.Horizontal -> destination.left - source.left
+        }
+        val scrollDelta = if (reverseDirection) -offset else offset
+
+        // Note that this results in weird behavior if called before the previous
+        // performBringIntoView finishes due to b/220119990.
+        scrollableState.animateScrollBy(scrollDelta)
+    }
+
+    /**
+     * Calculate the offset needed to bring one of the edges into view. The leadingEdge is the side
+     * closest to the origin (For the x-axis this is 'left', for the y-axis this is 'top').
+     * The trailing edge is the other side (For the x-axis this is 'right', for the y-axis this is
+     * 'bottom').
+     */
+    private fun relocationDistance(leadingEdge: Float, trailingEdge: Float, parentSize: Float) =
+        when {
+            // If the item is already visible, no need to scroll.
+            leadingEdge >= 0 && trailingEdge <= parentSize -> 0f
+
+            // If the item is visible but larger than the parent, we don't scroll.
+            leadingEdge < 0 && trailingEdge > parentSize -> 0f
+
+            // Find the minimum scroll needed to make one of the edges coincide with the parent's
+            // edge.
+            abs(leadingEdge) < abs(trailingEdge - parentSize) -> leadingEdge
+            else -> trailingEdge - parentSize
+        }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/DragGestureDetector.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/DragGestureDetector.kt
index e4beb0a..d509851 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/DragGestureDetector.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/DragGestureDetector.kt
@@ -785,7 +785,7 @@
     if (this == Orientation.Vertical) VerticalPointerDirectionConfig
     else HorizontalPointerDirectionConfig
 
-private suspend fun AwaitPointerEventScope.awaitLongPressOrCancellation(
+suspend fun AwaitPointerEventScope.awaitLongPressOrCancellation(
     initialDown: PointerInputChange
 ): PointerInputChange? {
     var longPress: PointerInputChange? = null
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Draggable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Draggable.kt
index 7d8319f..ed29af1 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Draggable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Draggable.kt
@@ -181,9 +181,7 @@
     onDragStopped: suspend CoroutineScope.(velocity: Float) -> Unit = {},
     reverseDirection: Boolean = false
 ): Modifier = draggable(
-    stateFactory = { remember(state, orientation) {
-        IgnorePointerDraggableState(state, orientation) }
-    },
+    state = state,
     orientation = orientation,
     enabled = enabled,
     interactionSource = interactionSource,
@@ -195,7 +193,7 @@
 )
 
 internal fun Modifier.draggable(
-    stateFactory: @Composable () -> PointerAwareDraggableState,
+    state: DraggableState,
     canDrag: (PointerInputChange) -> Boolean,
     orientation: Orientation,
     enabled: Boolean = true,
@@ -215,10 +213,9 @@
         properties["startDragImmediately"] = startDragImmediately
         properties["onDragStarted"] = onDragStarted
         properties["onDragStopped"] = onDragStopped
-        properties["stateFactory"] = stateFactory
+        properties["state"] = state
     }
 ) {
-    val state = stateFactory.invoke()
     val draggedInteraction = remember { mutableStateOf<DragInteraction.Start?>(null) }
     DisposableEffect(interactionSource) {
         onDispose {
@@ -242,9 +239,7 @@
             try {
                 state.drag(MutatePriority.UserInput) {
                     while (event !is DragStopped && event !is DragCancelled) {
-                        (event as? DragDelta)?.let {
-                            dragBy(it.delta, it.pointerPosition)
-                        }
+                        (event as? DragDelta)?.let { dragBy(it.delta.toFloat(orientation)) }
                         event = channel.receive()
                     }
                 }
@@ -360,23 +355,13 @@
         Offset(overSlopOffset.x * xSign, overSlopOffset.y * ySign)
     channel.trySend(DragStarted(adjustedStart))
 
-    channel.trySend(
-        DragDelta(
-            if (reverseDirection) initialDelta * -1f else initialDelta,
-            adjustedStart
-        )
-    )
+    channel.trySend(DragDelta(if (reverseDirection) initialDelta * -1f else initialDelta))
 
     val dragTick: (PointerInputChange) -> Unit = { event ->
         velocityTracker.addPointerInputChange(event)
         val delta = event.positionChange()
         event.consume()
-        channel.trySend(
-            DragDelta(
-                if (reverseDirection) delta * -1f else delta,
-                event.position
-            )
-        )
+        channel.trySend(DragDelta(if (reverseDirection) delta * -1f else delta))
     }
     return if (orientation == Orientation.Vertical) {
         verticalDrag(startEvent.id, dragTick)
@@ -443,7 +428,7 @@
     class DragStarted(val startPoint: Offset) : DragEvent()
     class DragStopped(val velocity: Velocity) : DragEvent()
     object DragCancelled : DragEvent()
-    class DragDelta(val delta: Offset, val pointerPosition: Offset) : DragEvent()
+    class DragDelta(val delta: Offset) : DragEvent()
 }
 
 private fun Offset.toFloat(orientation: Orientation) =
@@ -451,41 +436,3 @@
 
 private fun Velocity.toFloat(orientation: Orientation) =
     if (orientation == Orientation.Vertical) this.y else this.x
-
-internal interface PointerAwareDragScope {
-    fun dragBy(pixels: Offset, pointerPosition: Offset): Unit
-}
-
-internal interface PointerAwareDraggableState {
-    suspend fun drag(
-        dragPriority: MutatePriority = MutatePriority.Default,
-        block: suspend PointerAwareDragScope.() -> Unit
-    )
-
-    fun dispatchRawDelta(delta: Offset)
-}
-
-private class IgnorePointerDraggableState(
-    val origin: DraggableState,
-    val orientation: Orientation
-) : PointerAwareDraggableState, PointerAwareDragScope {
-    var latestConsumptionScope: DragScope? = null
-
-    override fun dragBy(pixels: Offset, pointerPosition: Offset) {
-        latestConsumptionScope?.dragBy(pixels.toFloat(orientation))
-    }
-
-    override suspend fun drag(
-        dragPriority: MutatePriority,
-        block: suspend PointerAwareDragScope.() -> Unit
-    ) {
-        origin.drag(dragPriority) {
-            latestConsumptionScope = this
-            block()
-        }
-    }
-
-    override fun dispatchRawDelta(delta: Offset) {
-        origin.dispatchRawDelta(delta.toFloat(orientation))
-    }
-}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Scrollable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Scrollable.kt
index 02e20cc..10c8d13 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Scrollable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Scrollable.kt
@@ -25,24 +25,17 @@
 import androidx.compose.foundation.OverscrollEffect
 import androidx.compose.foundation.focusGroup
 import androidx.compose.foundation.gestures.Orientation.Horizontal
-import androidx.compose.foundation.gestures.Orientation.Vertical
 import androidx.compose.foundation.interaction.MutableInteractionSource
-import androidx.compose.foundation.onFocusedBoundsChanged
-import androidx.compose.foundation.relocation.BringIntoViewResponder
-import androidx.compose.foundation.relocation.bringIntoViewResponder
 import androidx.compose.foundation.rememberOverscrollEffect
 import androidx.compose.runtime.Composable
 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.rememberUpdatedState
-import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.composed
 import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
 import androidx.compose.ui.input.nestedscroll.NestedScrollDispatcher
 import androidx.compose.ui.input.nestedscroll.NestedScrollSource
@@ -54,9 +47,6 @@
 import androidx.compose.ui.input.pointer.PointerEventType
 import androidx.compose.ui.input.pointer.PointerType
 import androidx.compose.ui.input.pointer.pointerInput
-import androidx.compose.ui.layout.LayoutCoordinates
-import androidx.compose.ui.layout.OnPlacedModifier
-import androidx.compose.ui.layout.OnRemeasuredModifier
 import androidx.compose.ui.modifier.ModifierLocalProvider
 import androidx.compose.ui.modifier.modifierLocalOf
 import androidx.compose.ui.platform.LocalLayoutDirection
@@ -65,13 +55,9 @@
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.Velocity
-import androidx.compose.ui.unit.toSize
 import androidx.compose.ui.util.fastAll
 import androidx.compose.ui.util.fastForEach
 import kotlin.math.abs
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Job
-import kotlinx.coroutines.NonCancellable
 import kotlinx.coroutines.launch
 
 /**
@@ -279,7 +265,7 @@
     val scrollConfig = platformScrollConfig()
 
     return draggable(
-        { draggableState },
+        draggableState,
         orientation = orientation,
         enabled = enabled,
         interactionSource = interactionSource,
@@ -361,13 +347,9 @@
 
     fun Offset.reverseIfNeeded(): Offset = if (reverseDirection) this * -1f else this
 
-    fun ScrollScope.dispatchScroll(
-        availableDelta: Offset,
-        pointerPosition: Offset?,
-        source: NestedScrollSource
-    ): Offset {
+    fun ScrollScope.dispatchScroll(availableDelta: Offset, source: NestedScrollSource): Offset {
         val scrollDelta = availableDelta.singleAxisOffset()
-        val overscrollPreConsumed = overscrollPreConsumeDelta(scrollDelta, pointerPosition, source)
+        val overscrollPreConsumed = overscrollPreConsumeDelta(scrollDelta, source)
 
         val afterPreOverscroll = scrollDelta - overscrollPreConsumed
         val nestedScrollDispatcher = nestedScrollDispatcher.value
@@ -388,7 +370,6 @@
         overscrollPostConsumeDelta(
             scrollAvailable,
             leftForParent - parentConsumed,
-            pointerPosition,
             source
         )
         return leftForParent
@@ -396,11 +377,10 @@
 
     fun overscrollPreConsumeDelta(
         scrollDelta: Offset,
-        pointerPosition: Offset?,
         source: NestedScrollSource
     ): Offset {
         return if (overscrollEffect != null && overscrollEffect.isEnabled) {
-            overscrollEffect.consumePreScroll(scrollDelta, pointerPosition, source)
+            overscrollEffect.consumePreScroll(scrollDelta, source)
         } else {
             Offset.Zero
         }
@@ -409,14 +389,12 @@
     private fun overscrollPostConsumeDelta(
         consumedByChain: Offset,
         availableForOverscroll: Offset,
-        pointerPosition: Offset?,
         source: NestedScrollSource
     ) {
         if (overscrollEffect != null && overscrollEffect.isEnabled) {
             overscrollEffect.consumePostScroll(
                 consumedByChain,
                 availableForOverscroll,
-                pointerPosition,
                 source
             )
         }
@@ -459,7 +437,7 @@
         var result: Velocity = available
         scrollableState.scroll {
             val outerScopeScroll: (Offset) -> Offset = { delta ->
-                val consumed = this.dispatchScroll(delta.reverseIfNeeded(), null, Fling)
+                val consumed = this.dispatchScroll(delta.reverseIfNeeded(), Fling)
                 delta - consumed.reverseIfNeeded()
             }
             val scope = object : ScrollScope {
@@ -486,29 +464,26 @@
 
 private class ScrollDraggableState(
     val scrollLogic: State<ScrollingLogic>
-) : PointerAwareDraggableState, PointerAwareDragScope {
+) : DraggableState, DragScope {
     var latestScrollScope: ScrollScope = NoOpScrollScope
 
-    override fun dragBy(pixels: Offset, pointerPosition: Offset) {
+    override fun dragBy(pixels: Float) {
         with(scrollLogic.value) {
             with(latestScrollScope) {
-                dispatchScroll(pixels, pointerPosition, Drag)
+                dispatchScroll(pixels.toOffset(), Drag)
             }
         }
     }
 
-    override suspend fun drag(
-        dragPriority: MutatePriority,
-        block: suspend PointerAwareDragScope.() -> Unit
-    ) {
+    override suspend fun drag(dragPriority: MutatePriority, block: suspend DragScope.() -> Unit) {
         scrollLogic.value.scrollableState.scroll(dragPriority) {
             latestScrollScope = this
             block()
         }
     }
 
-    override fun dispatchRawDelta(delta: Offset) {
-        with(scrollLogic.value) { performRawScroll(delta) }
+    override fun dispatchRawDelta(delta: Float) {
+        with(scrollLogic.value) { performRawScroll(delta.toOffset()) }
     }
 }
 
@@ -569,235 +544,6 @@
     }
 }
 
-/**
- * Handles any logic related to bringing or keeping content in view, including
- * [BringIntoViewResponder] and ensuring the focused child stays in view when the scrollable area
- * is shrunk.
- */
-@OptIn(ExperimentalFoundationApi::class)
-private class ContentInViewModifier(
-    private val scope: CoroutineScope,
-    private val orientation: Orientation,
-    private val scrollableState: ScrollableState,
-    private val reverseDirection: Boolean
-) : BringIntoViewResponder, OnRemeasuredModifier, OnPlacedModifier {
-    private var focusedChild: LayoutCoordinates? = null
-    private var coordinates: LayoutCoordinates? = null
-    private var oldSize: IntSize? = null
-
-    // These properties are used to detect the case where the viewport size is animated shrinking
-    // while the scroll animation used to keep the focused child in view is still running.
-    private var focusedChildBeingAnimated: LayoutCoordinates? = null
-    private var focusTargetBounds: Rect? by mutableStateOf(null)
-    private var focusAnimationJob: Job? = null
-
-    val modifier: Modifier = this
-        .onFocusedBoundsChanged { focusedChild = it }
-        .bringIntoViewResponder(this)
-
-    override fun onRemeasured(size: IntSize) {
-        val coordinates = coordinates
-        val oldSize = oldSize
-        // We only care when this node becomes smaller than it previously was, so don't care about
-        // the initial measurement.
-        if (oldSize != null && oldSize != size && coordinates?.isAttached == true) {
-            onSizeChanged(coordinates, oldSize)
-        }
-        this.oldSize = size
-    }
-
-    override fun onPlaced(coordinates: LayoutCoordinates) {
-        this.coordinates = coordinates
-    }
-
-    override fun calculateRectForParent(localRect: Rect): Rect {
-        val oldSize = checkNotNull(oldSize) {
-            "Expected BringIntoViewRequester to not be used before parents are placed."
-        }
-        // oldSize will only be null before the initial measurement.
-        return computeDestination(localRect, oldSize)
-    }
-
-    override suspend fun bringChildIntoView(localRect: Rect) {
-        performBringIntoView(
-            source = localRect,
-            destination = calculateRectForParent(localRect)
-        )
-    }
-
-    /**
-     * Handles when the size of the scroll viewport changes by making sure any focused child is kept
-     * appropriately visible when the viewport shrinks and would otherwise hide it.
-     *
-     * One common instance of this is when a text field in a scrollable near the bottom is focused
-     * while the soft keyboard is hidden, causing the keyboard to show, and cover the field.
-     * See b/192043120 and related bugs.
-     *
-     * To future debuggers of this method, it might be helpful to add a draw modifier to the chain
-     * above to draw the focus target bounds:
-     * ```
-     * .drawWithContent {
-     *   drawContent()
-     *   focusTargetBounds?.let {
-     *     drawRect(
-     *       Color.Red,
-     *       topLeft = it.topLeft,
-     *       size = it.size,
-     *       style = Stroke(1.dp.toPx())
-     *     )
-     *   }
-     * }
-     * ```
-     */
-    private fun onSizeChanged(coordinates: LayoutCoordinates, oldSize: IntSize) {
-        val containerShrunk = if (orientation == Horizontal) {
-            coordinates.size.width < oldSize.width
-        } else {
-            coordinates.size.height < oldSize.height
-        }
-        // If the container is growing, then if the focused child is only partially visible it will
-        // soon be _more_ visible, so don't scroll.
-        if (!containerShrunk) return
-
-        val focusedChild = focusedChild?.takeIf { it.isAttached } ?: return
-        val focusedBounds = coordinates.localBoundingBoxOf(focusedChild, clipBounds = false)
-
-        // In order to check if we need to scroll to bring the focused child into view, it's not
-        // enough to consider where the child actually is right now. If the viewport was recently
-        // shrunk, we may have already started a scroll animation to bring it into view. In that
-        // case, we need to compare with the target of the animation, not the current position. If
-        // we don't do that, then in some cases when the viewport size is being animated (e.g. when
-        // the keyboard insets are being animated on API 30+) we might stop trying to keep the
-        // focused child in view before the viewport animation is finished, and the scroll animation
-        // will stop short and leave the focused child out of the viewport. See b/230756508.
-        val eventualFocusedBounds = if (focusedChild === focusedChildBeingAnimated) {
-            // A previous call to this method started an animation that is still running, so compare
-            // with the target of that animation.
-            checkNotNull(focusTargetBounds)
-        } else {
-            focusedBounds
-        }
-
-        val myOldBounds = Rect(Offset.Zero, oldSize.toSize())
-        if (!myOldBounds.overlaps(eventualFocusedBounds)) {
-            // The focused child was not visible before the resize, so we don't need to keep
-            // it visible.
-            return
-        }
-
-        val targetBounds = computeDestination(eventualFocusedBounds, coordinates.size)
-        if (targetBounds == eventualFocusedBounds) {
-            // The focused child is already fully visible (not clipped or hidden) after the resize,
-            // or will be after it finishes animating, so we don't need to do anything.
-            return
-        }
-
-        // If execution has gotten to this point, it means the focused child was at least partially
-        // visible before the resize, and it is either partially clipped or completely hidden after
-        // the resize, so we need to adjust scroll to keep it in view.
-        focusedChildBeingAnimated = focusedChild
-        focusTargetBounds = targetBounds
-        scope.launch(NonCancellable) {
-            val job = launch {
-                // Animate the scroll offset to keep the focused child in view. This is a suspending
-                // call that will suspend until the animation is finished, and only return if it
-                // completes. If any other scroll operations are performed after the animation starts,
-                // e.g. the viewport shrinks again or the user manually scrolls, this animation will
-                // be cancelled and this function will throw a CancellationException.
-                performBringIntoView(source = focusedBounds, destination = targetBounds)
-            }
-            focusAnimationJob = job
-
-            // If the scroll was interrupted by another viewport shrink that happens while the
-            // animation is running, we don't want to clear these fields since the later call to
-            // this onSizeChanged method will have updated the fields with its own values.
-            // If the animation completed, or was cancelled for any other reason, we need to clear
-            // them so the next viewport shrink doesn't think there's already a scroll animation in
-            // progress.
-            // Doing this wrong has a few implications:
-            // 1. If the fields are nulled out when another onSizeChange call happens, it will not
-            //    use the current animation target and viewport animations will lose track of the
-            //    focusable.
-            // 2. If the fields are not nulled out in other cases, the next viewport animation will
-            //    not keep the focusable in view if the focus hasn't changed.
-            try {
-                job.join()
-            } finally {
-                if (focusAnimationJob === job) {
-                    focusedChildBeingAnimated = null
-                    focusTargetBounds = null
-                    focusAnimationJob = null
-                }
-            }
-        }
-    }
-
-    /**
-     * Compute the destination given the source rectangle and current bounds.
-     *
-     * @param childBounds The bounding box of the item that sent the request to be brought into view.
-     * @return the destination rectangle.
-     */
-    private fun computeDestination(childBounds: Rect, containerSize: IntSize): Rect {
-        val size = containerSize.toSize()
-        return when (orientation) {
-            Vertical ->
-                childBounds.translate(
-                    translateX = 0f,
-                    translateY = -relocationDistance(
-                        childBounds.top,
-                        childBounds.bottom,
-                        size.height
-                    )
-                )
-            Horizontal ->
-                childBounds.translate(
-                    translateX = -relocationDistance(
-                        childBounds.left,
-                        childBounds.right,
-                        size.width
-                    ),
-                    translateY = 0f
-                )
-        }
-    }
-
-    /**
-     * Using the source and destination bounds, perform an animated scroll.
-     */
-    private suspend fun performBringIntoView(source: Rect, destination: Rect) {
-        val offset = when (orientation) {
-            Vertical -> destination.top - source.top
-            Horizontal -> destination.left - source.left
-        }
-        val scrollDelta = if (reverseDirection) -offset else offset
-
-        // Note that this results in weird behavior if called before the previous
-        // performBringIntoView finishes due to b/220119990.
-        scrollableState.animateScrollBy(scrollDelta)
-    }
-
-    /**
-     * Calculate the offset needed to bring one of the edges into view. The leadingEdge is the side
-     * closest to the origin (For the x-axis this is 'left', for the y-axis this is 'top').
-     * The trailing edge is the other side (For the x-axis this is 'right', for the y-axis this is
-     * 'bottom').
-     */
-    private fun relocationDistance(leadingEdge: Float, trailingEdge: Float, parentSize: Float) =
-        when {
-            // If the item is already visible, no need to scroll.
-            leadingEdge >= 0 && trailingEdge <= parentSize -> 0f
-
-            // If the item is visible but larger than the parent, we don't scroll.
-            leadingEdge < 0 && trailingEdge > parentSize -> 0f
-
-            // Find the minimum scroll needed to make one of the edges coincide with the parent's
-            // edge.
-            abs(leadingEdge) < abs(trailingEdge - parentSize) -> leadingEdge
-            else -> trailingEdge - parentSize
-        }
-}
-
 // TODO: b/203141462 - make this public and move it to ui
 /**
  * Whether this modifier is inside a scrollable container, provided by [Modifier.scrollable].
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Transformable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Transformable.kt
index c07fe9c..117fc97 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Transformable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Transformable.kt
@@ -83,6 +83,8 @@
     }
 )
 
+// b/242023503 for a planned fix for the MultipleAwaitPointerEventScopes lint violation.
+@Suppress("MultipleAwaitPointerEventScopes")
 private suspend fun PointerInputScope.detectZoom(
     panZoomLock: State<Boolean>,
     state: State<TransformableState>
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/LazyListSnapLayoutInfoProvider.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/LazyListSnapLayoutInfoProvider.kt
new file mode 100644
index 0000000..084ef75
--- /dev/null
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/LazyListSnapLayoutInfoProvider.kt
@@ -0,0 +1,99 @@
+/*
+ * 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.gestures.snapping
+
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.foundation.lazy.LazyListItemInfo
+import androidx.compose.foundation.lazy.LazyListLayoutInfo
+import androidx.compose.foundation.lazy.LazyListState
+import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastSumBy
+
+/**
+ * A [SnapLayoutInfoProvider] for LazyLists.
+ *
+ * @param lazyListState The [LazyListState] with information about the current state of the list
+ * @param positionInLayout The desired positioning of the snapped item within the main layout.
+ * This position should be considered with regard to the start edge of the item and the placement
+ * within the viewport.
+ *
+ * @return A [SnapLayoutInfoProvider] that can be used with [snapFlingBehavior]
+ */
+@ExperimentalFoundationApi
+fun SnapLayoutInfoProvider(
+    lazyListState: LazyListState,
+    positionInLayout: (layoutSize: Float, itemSize: Float) -> Float = { layoutSize, itemSize ->
+        layoutSize / 2f - itemSize / 2f
+    }
+) = object : SnapLayoutInfoProvider {
+
+    private val layoutInfo: LazyListLayoutInfo
+        get() = lazyListState.layoutInfo
+
+    // Single page snapping is the default
+    override fun calculateApproachOffset(initialVelocity: Float): Float = 0f
+
+    override fun calculateSnappingOffsetBounds(): ClosedFloatingPointRange<Float> {
+        var lowerBoundOffset = Float.NEGATIVE_INFINITY
+        var upperBoundOffset = Float.POSITIVE_INFINITY
+
+        layoutInfo.visibleItemsInfo.fastForEach { item ->
+            val offset =
+                calculateDistanceToDesiredSnapPosition(layoutInfo, item, positionInLayout)
+
+            // Find item that is closest to the center
+            if (offset <= 0 && offset > lowerBoundOffset) {
+                lowerBoundOffset = offset
+            }
+
+            // Find item that is closest to center, but after it
+            if (offset >= 0 && offset < upperBoundOffset) {
+                upperBoundOffset = offset
+            }
+        }
+
+        return lowerBoundOffset.rangeTo(upperBoundOffset)
+    }
+
+    override val snapStepSize: Float
+        get() = with(layoutInfo) {
+            if (visibleItemsInfo.isNotEmpty()) {
+                visibleItemsInfo.fastSumBy { it.size } / visibleItemsInfo.size.toFloat()
+            } else {
+                0f
+            }
+        }
+}
+
+internal fun calculateDistanceToDesiredSnapPosition(
+    layoutInfo: LazyListLayoutInfo,
+    item: LazyListItemInfo,
+    positionInLayout: (layoutSize: Float, itemSize: Float) -> Float
+): Float {
+    val containerSize =
+        with(layoutInfo) { singleAxisViewportSize - beforeContentPadding - afterContentPadding }
+
+    val desiredDistance =
+        positionInLayout(containerSize.toFloat(), item.size.toFloat())
+
+    val itemCurrentPosition = item.offset
+    return itemCurrentPosition - desiredDistance
+}
+
+private val LazyListLayoutInfo.singleAxisViewportSize: Int
+    get() = if (orientation == Orientation.Vertical) viewportSize.height else viewportSize.width
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/SnapFlingBehavior.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/SnapFlingBehavior.kt
new file mode 100644
index 0000000..ffae738
--- /dev/null
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/SnapFlingBehavior.kt
@@ -0,0 +1,420 @@
+/*
+ * 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.gestures.snapping
+
+import androidx.compose.animation.core.AnimationScope
+import androidx.compose.animation.core.AnimationSpec
+import androidx.compose.animation.core.AnimationState
+import androidx.compose.animation.core.AnimationVector
+import androidx.compose.animation.core.AnimationVector1D
+import androidx.compose.animation.core.DecayAnimationSpec
+import androidx.compose.animation.core.Spring
+import androidx.compose.animation.core.animateDecay
+import androidx.compose.animation.core.animateTo
+import androidx.compose.animation.core.calculateTargetValue
+import androidx.compose.animation.core.copy
+import androidx.compose.animation.core.spring
+import androidx.compose.animation.rememberSplineBasedDecay
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.gestures.FlingBehavior
+import androidx.compose.foundation.gestures.ScrollScope
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+import kotlin.math.abs
+import kotlin.math.sign
+
+/**
+ * A [FlingBehavior] that performs snapping of items to a given position. The algorithm will
+ * differentiate between short/scroll snapping and long/fling snapping.
+ *
+ * Use [shortSnapVelocityThreshold] to provide a threshold velocity that will appropriately select
+ * the desired behavior.
+ *
+ * A short snap usually happens after a fling with low velocity.
+ *
+ * When long snapping, you can use [SnapLayoutInfoProvider.calculateApproachOffset] to
+ * indicate that snapping should happen after this offset. If the velocity generated by the
+ * fling is high enough to get there, we'll use [approachAnimationSpec] to get to that offset and
+ * then we'll snap to the next bound calculated by
+ * [SnapLayoutInfoProvider.calculateSnappingOffsetBounds] in the direction of the fling using
+ * [snapAnimationSpec].
+ *
+ * If the velocity is not high enough, we'll perform the same algorithm, but use [snapAnimationSpec]
+ * to do so.
+ *
+ * Please refer to the sample to learn how to use this API.
+ * @sample androidx.compose.foundation.samples.SnapFlingBehaviorSimpleSample
+ * @sample androidx.compose.foundation.samples.SnapFlingBehaviorCustomizedSample
+ *
+ * @param snapLayoutInfoProvider The information about the layout being snapped.
+ * @param approachAnimationSpec The animation spec used to approach the target offset.
+ * @param snapAnimationSpec The animation spec used to finally snap to the correct bound.
+ * @param density The screen [Density]
+ * @param shortSnapVelocityThreshold Use the given velocity to determine if it's a
+ * short or long snap.
+ *
+ */
+@ExperimentalFoundationApi
+fun snapFlingBehavior(
+    snapLayoutInfoProvider: SnapLayoutInfoProvider,
+    approachAnimationSpec: DecayAnimationSpec<Float>,
+    snapAnimationSpec: AnimationSpec<Float>,
+    density: Density,
+    shortSnapVelocityThreshold: Dp = MinFlingVelocityDp
+) = object : FlingBehavior {
+    val velocityThreshold = with(density) { shortSnapVelocityThreshold.toPx() }
+
+    override suspend fun ScrollScope.performFling(initialVelocity: Float): Float {
+        // If snapping from scroll (short snap) or fling (long snap)
+        if (abs(initialVelocity) <= abs(velocityThreshold)) {
+            shortSnap(initialVelocity)
+        } else {
+            longSnap(initialVelocity)
+        }
+        return NoVelocity
+    }
+
+    private suspend fun ScrollScope.shortSnap(velocity: Float) {
+        val closestOffset = findClosestOffset(0f, snapLayoutInfoProvider)
+        val animationState = AnimationState(NoDistance, velocity)
+        animateSnap(closestOffset, closestOffset, animationState, snapAnimationSpec)
+    }
+
+    private suspend fun ScrollScope.longSnap(initialVelocity: Float) {
+        val initialOffset = snapLayoutInfoProvider.calculateApproachOffset(initialVelocity).let {
+            abs(it) * sign(initialVelocity) // ensure offset sign is correct
+        }
+
+        val (remainingOffset, animationState) = runApproach(initialOffset, initialVelocity)
+
+        animateSnap(remainingOffset, remainingOffset, animationState, snapAnimationSpec)
+    }
+
+    private suspend fun ScrollScope.runApproach(
+        initialTargetOffset: Float,
+        initialVelocity: Float
+    ): ApproachStepResult {
+
+        val animation =
+            if (isDecayApproachPossible(offset = initialTargetOffset, velocity = initialVelocity)) {
+                DecayApproachAnimation(approachAnimationSpec, snapLayoutInfoProvider)
+            } else {
+                SnapApproachAnimation(snapAnimationSpec, snapLayoutInfoProvider)
+            }
+
+        return approach(initialTargetOffset, initialVelocity, animation, snapLayoutInfoProvider)
+    }
+
+    /**
+     * If we can approach the target and still have velocity left to run 1 step's worth of animation
+     */
+    private fun isDecayApproachPossible(
+        offset: Float,
+        velocity: Float
+    ): Boolean {
+        val decayOffset = approachAnimationSpec.calculateTargetValue(NoDistance, velocity)
+        val stepSize = snapLayoutInfoProvider.snapStepSize
+        return abs(decayOffset) > stepSize && abs(decayOffset) - stepSize > abs(offset)
+    }
+}
+
+/**
+ * Creates and remember a [FlingBehavior] that performs snapping.
+ * @param snapLayoutInfoProvider The information about the layout that will do snapping
+ * @param approachAnimationSpec The animation spec to use for approaching the target item
+ * @param snapAnimationSpec The animation spec to use for snapping to the final position
+ */
+@ExperimentalFoundationApi
+@Composable
+fun rememberSnapFlingBehavior(
+    snapLayoutInfoProvider: SnapLayoutInfoProvider,
+    approachAnimationSpec: DecayAnimationSpec<Float> = rememberSplineBasedDecay(),
+    snapAnimationSpec: AnimationSpec<Float> = spring(stiffness = Spring.StiffnessMediumLow)
+): FlingBehavior {
+
+    val currentDensity = LocalDensity.current
+    return remember(
+        snapLayoutInfoProvider,
+        currentDensity,
+        approachAnimationSpec,
+        snapAnimationSpec
+    ) {
+        snapFlingBehavior(
+            snapLayoutInfoProvider,
+            approachAnimationSpec,
+            snapAnimationSpec,
+            currentDensity
+        )
+    }
+}
+
+/**
+ * To ensure we do not overshoot, the approach animation is divided into 2 parts.
+ *
+ * In the initial animation we animate up until targetOffset. At this point we will have fulfilled
+ * the requirement of [SnapLayoutInfoProvider.calculateApproachOffset] and we should snap to the
+ * next [SnapLayoutInfoProvider.calculateSnappingOffsetBounds]. We use [findClosestOffset] to find
+ * the next offset in the direction of the fling (for large enough velocities).
+ *
+ * The second part of the approach is a UX improvement. If the target offset is too far (in here, we
+ * define too far as over half a step offset away) we continue the approach animation a bit further
+ * and leave the remainder to be snapped.
+ */
+@OptIn(ExperimentalFoundationApi::class)
+private suspend fun ScrollScope.approach(
+    initialTargetOffset: Float,
+    initialVelocity: Float,
+    animation: ApproachAnimation<Float, AnimationVector1D>,
+    snapLayoutInfoProvider: SnapLayoutInfoProvider
+): ApproachStepResult {
+
+    var currentAnimationState =
+        animation.approachAnimation(this, initialTargetOffset, initialVelocity)
+
+    var remainingOffset =
+        findClosestOffset(currentAnimationState.velocity, snapLayoutInfoProvider)
+
+    val currentHalfStep = snapLayoutInfoProvider.halfStep
+    if (abs(remainingOffset) > currentHalfStep) {
+        currentAnimationState =
+            animation.halfStepAnimation(this, remainingOffset, currentAnimationState)
+        remainingOffset =
+            (abs(remainingOffset) - currentHalfStep) * sign(currentAnimationState.velocity)
+    }
+
+    // will snap the remainder
+    return ApproachStepResult(remainingOffset, currentAnimationState)
+}
+
+private data class ApproachStepResult(
+    val remainingOffset: Float,
+    val currentAnimationState: AnimationState<Float, AnimationVector1D>
+)
+
+/**
+ * Finds the closest offset to snap to given the Fling Direction.
+ *
+ * If velocity == 0 this means we'll return the smallest absolute
+ * [SnapLayoutInfoProvider.calculateSnappingOffsetBounds].
+ *
+ * If either 1 or -1 it means we'll snap to either
+ * [SnapLayoutInfoProvider.calculateSnappingOffsetBounds] upper or lower bounds respectively.
+ */
+@OptIn(ExperimentalFoundationApi::class)
+internal fun findClosestOffset(
+    velocity: Float,
+    snapLayoutInfoProvider: SnapLayoutInfoProvider
+): Float {
+
+    fun Float.isValidDistance(): Boolean {
+        return this != Float.POSITIVE_INFINITY && this != Float.NEGATIVE_INFINITY
+    }
+    val (lowerBound, upperBound) = snapLayoutInfoProvider.calculateSnappingOffsetBounds()
+
+    val finalDistance = when (sign(velocity)) {
+        0f -> {
+            if (abs(upperBound) <= abs(lowerBound)) {
+                upperBound
+            } else {
+                lowerBound
+            }
+        }
+        1f -> upperBound
+        -1f -> lowerBound
+        else -> NoDistance
+    }
+
+    return if (finalDistance.isValidDistance()) {
+        finalDistance
+    } else {
+        NoDistance
+    }
+}
+
+private operator fun <T : Comparable<T>> ClosedFloatingPointRange<T>.component1(): T = this.start
+private operator fun <T : Comparable<T>> ClosedFloatingPointRange<T>.component2(): T =
+    this.endInclusive
+
+/**
+ * Run a [DecayAnimationSpec] animation up to before [targetOffset] using [animationState]
+ */
+private suspend fun ScrollScope.animateDecay(
+    targetOffset: Float,
+    animationState: AnimationState<Float, AnimationVector1D>,
+    decayAnimationSpec: DecayAnimationSpec<Float>
+): AnimationState<Float, AnimationVector1D> {
+    var previousValue = 0f
+
+    fun AnimationScope<Float, AnimationVector1D>.consumeDelta(delta: Float) {
+        val consumed = scrollBy(delta)
+        if (abs(delta - consumed) > 0.5f) cancelAnimation()
+    }
+
+    animationState.animateDecay(
+        decayAnimationSpec,
+        sequentialAnimation = animationState.velocity != 0f
+    ) {
+        if (abs(value) >= abs(targetOffset)) {
+            val finalValue = value.coerceToTarget(targetOffset)
+            val finalDelta = finalValue - previousValue
+            consumeDelta(finalDelta)
+            cancelAnimation()
+        } else {
+            val delta = value - previousValue
+            consumeDelta(delta)
+            previousValue = value
+        }
+    }
+    return animationState
+}
+
+/**
+ * Runs a [AnimationSpec] to snap the list into [targetOffset]. Uses [cancelOffset] to stop this
+ * animation before it reaches the target.
+ */
+private suspend fun ScrollScope.animateSnap(
+    targetOffset: Float,
+    cancelOffset: Float,
+    animationState: AnimationState<Float, AnimationVector1D>,
+    snapAnimationSpec: AnimationSpec<Float>
+): AnimationState<Float, AnimationVector1D> {
+    var consumedUpToNow = 0f
+    val initialVelocity = animationState.velocity
+    animationState.animateTo(
+        targetOffset,
+        animationSpec = snapAnimationSpec,
+        sequentialAnimation = (animationState.velocity != 0f)
+    ) {
+        val realValue = value.coerceToTarget(cancelOffset)
+        val delta = realValue - consumedUpToNow
+        val consumed = scrollBy(delta)
+        // stop when unconsumed or when we reach the desired value
+        if (abs(delta - consumed) > 0.5f || realValue != value) {
+            cancelAnimation()
+        }
+        consumedUpToNow += delta
+    }
+
+    // Always course correct velocity so they don't become too large.
+    val finalVelocity = animationState.velocity.coerceToTarget(initialVelocity)
+    return animationState.copy(velocity = finalVelocity)
+}
+
+private fun Float.coerceToTarget(target: Float): Float {
+    if (target == 0f) return 0f
+    return if (target > 0) coerceAtMost(target) else coerceAtLeast(target)
+}
+
+@OptIn(ExperimentalFoundationApi::class)
+private val SnapLayoutInfoProvider.halfStep
+    get() = snapStepSize / 2f
+
+/**
+ * The animations used to approach offset and approach half a step offset.
+ */
+private interface ApproachAnimation<T, V : AnimationVector> {
+    suspend fun approachAnimation(
+        scope: ScrollScope,
+        offset: T,
+        velocity: T
+    ): AnimationState<T, V>
+
+    suspend fun halfStepAnimation(
+        scope: ScrollScope,
+        offset: T,
+        previousAnimationState: AnimationState<T, V>
+    ): AnimationState<T, V>
+}
+
+@OptIn(ExperimentalFoundationApi::class)
+private class SnapApproachAnimation(
+    private val snapAnimationSpec: AnimationSpec<Float>,
+    private val snapLayoutInfoProvider: SnapLayoutInfoProvider
+) : ApproachAnimation<Float, AnimationVector1D> {
+    override suspend fun approachAnimation(
+        scope: ScrollScope,
+        offset: Float,
+        velocity: Float
+    ): AnimationState<Float, AnimationVector1D> {
+        val animationState = AnimationState(initialValue = 0f, initialVelocity = velocity)
+        return with(scope) {
+            animateSnap(
+                targetOffset = (abs(offset) + snapLayoutInfoProvider.snapStepSize) * sign(velocity),
+                cancelOffset = offset,
+                animationState = animationState,
+                snapAnimationSpec = snapAnimationSpec,
+            )
+        }
+    }
+
+    override suspend fun halfStepAnimation(
+        scope: ScrollScope,
+        offset: Float,
+        previousAnimationState: AnimationState<Float, AnimationVector1D>
+    ): AnimationState<Float, AnimationVector1D> {
+        val animationState = previousAnimationState.copy(NoDistance)
+
+        return with(scope) {
+            animateSnap(
+                targetOffset = offset,
+                cancelOffset = snapLayoutInfoProvider.halfStep * sign(animationState.velocity),
+                animationState = animationState,
+                snapAnimationSpec = snapAnimationSpec
+            )
+        }
+    }
+}
+
+@OptIn(ExperimentalFoundationApi::class)
+private class DecayApproachAnimation(
+    private val decayAnimationSpec: DecayAnimationSpec<Float>,
+    private val snapLayoutInfoProvider: SnapLayoutInfoProvider
+) : ApproachAnimation<Float, AnimationVector1D> {
+    override suspend fun approachAnimation(
+        scope: ScrollScope,
+        offset: Float,
+        velocity: Float
+    ): AnimationState<Float, AnimationVector1D> {
+        val animationState = AnimationState(initialValue = 0f, initialVelocity = velocity)
+        return with(scope) {
+            animateDecay(offset, animationState, decayAnimationSpec)
+        }
+    }
+
+    override suspend fun halfStepAnimation(
+        scope: ScrollScope,
+        offset: Float,
+        previousAnimationState: AnimationState<Float, AnimationVector1D>
+    ): AnimationState<Float, AnimationVector1D> {
+        val animationState = previousAnimationState.copy(value = NoDistance)
+        return with(scope) {
+            animateDecay(
+                snapLayoutInfoProvider.halfStep * sign(animationState.velocity),
+                animationState,
+                decayAnimationSpec
+            )
+        }
+    }
+}
+
+internal val MinFlingVelocityDp = 400.dp
+internal const val NoDistance = 0f
+internal const val NoVelocity = 0f
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/SnapLayoutInfoProvider.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/SnapLayoutInfoProvider.kt
new file mode 100644
index 0000000..d790179
--- /dev/null
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/SnapLayoutInfoProvider.kt
@@ -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.compose.foundation.gestures.snapping
+
+import androidx.compose.foundation.ExperimentalFoundationApi
+
+/**
+ * Provides information about the layout that is using a SnapFlingBehavior.
+ * The provider should give the following information:
+ * 1) Snapping bounds, the previous and the next snap position offset.
+ * 2) Snap Step Size, the minimum size that the SnapFlingBehavior can animate.
+ * 3) Approach offset calculation, an offset to be consumed before snapping to a defined bound.
+ */
+@ExperimentalFoundationApi
+interface SnapLayoutInfoProvider {
+    /**
+     * The minimum offset that snapping will use to animate. (e.g. an item size)
+     */
+    val snapStepSize: Float
+
+    /**
+     * Calculate the distance to navigate before settling into the next snapping bound.
+     *
+     * @param initialVelocity The current fling movement velocity. You can use this tho calculate a
+     * velocity based offset.
+     */
+    fun calculateApproachOffset(initialVelocity: Float): Float
+
+    /**
+     * Given a target placement in a layout, the snapping bounds should be the closest offset we
+     * could snap to BEFORE and AFTER that placement. (e.g if the placement is the center of the
+     * viewport and we're snapping in a list this could be the distance to the center of the item
+     * before and after the center of the viewport)
+     *
+     * Bounds are *always* a negative (lower bound) and a positive (upper bound) value.
+     */
+    fun calculateSnappingOffsetBounds(): ClosedFloatingPointRange<Float>
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyDsl.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyDsl.kt
index 452b5e3..37dc71a 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyDsl.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyDsl.kt
@@ -19,6 +19,8 @@
 import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.gestures.FlingBehavior
 import androidx.compose.foundation.gestures.ScrollableDefaults
+import androidx.compose.foundation.gestures.snapping.SnapLayoutInfoProvider
+import androidx.compose.foundation.gestures.snapping.rememberSnapFlingBehavior
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.PaddingValues
 import androidx.compose.runtime.Composable
@@ -26,6 +28,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.unit.dp
 import androidx.compose.foundation.internal.JvmDefaultWithCompatibility
+import androidx.compose.runtime.remember
 
 /**
  * Receiver scope which is used by [LazyColumn] and [LazyRow].
@@ -420,3 +423,25 @@
         content = content
     )
 }
+
+/**
+ * Important default implementations to be used with LazyLists
+ */
+@ExperimentalFoundationApi
+object LazyListDefaults {
+
+    /**
+     * Creates and remembers a FlingBehavior for 1 page snapping in Lazy Lists. This will snap
+     * the item's center to the center of the viewport.
+     *
+     * @param lazyListState The [LazyListState] from the LazyList where this [FlingBehavior] will
+     * be used.
+     */
+    @ExperimentalFoundationApi
+    @Composable
+    fun snapFlingBehavior(lazyListState: LazyListState): FlingBehavior {
+        val snappingLayout =
+            remember(lazyListState) { SnapLayoutInfoProvider(lazyListState) }
+        return rememberSnapFlingBehavior(snappingLayout)
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyNearestItemsRange.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyNearestItemsRange.kt
index c602a6c..7b6d6ae 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyNearestItemsRange.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyNearestItemsRange.kt
@@ -18,10 +18,12 @@
 
 import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.State
-import androidx.compose.runtime.derivedStateOf
+import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
-import androidx.compose.runtime.structuralEqualityPolicy
+import androidx.compose.runtime.snapshotFlow
+import androidx.compose.runtime.snapshots.Snapshot
 
 /**
  * Calculate and memoize range of indexes which contains at least [extraItemCount] items near
@@ -41,17 +43,34 @@
     firstVisibleItemIndex: () -> Int,
     slidingWindowSize: () -> Int,
     extraItemCount: () -> Int
-): State<IntRange> =
-    remember(firstVisibleItemIndex, slidingWindowSize, extraItemCount) {
-        derivedStateOf(structuralEqualityPolicy()) {
+): State<IntRange> {
+    val state = remember(firstVisibleItemIndex, slidingWindowSize, extraItemCount) {
+        Snapshot.withoutReadObservation {
+            mutableStateOf(
+                calculateNearestItemsRange(
+                    firstVisibleItemIndex(),
+                    slidingWindowSize(),
+                    extraItemCount()
+                )
+            )
+        }
+    }
+
+    LaunchedEffect(state) {
+        snapshotFlow {
             calculateNearestItemsRange(
                 firstVisibleItemIndex(),
                 slidingWindowSize(),
                 extraItemCount()
             )
+        }.collect {
+            state.value = it
         }
     }
 
+    return state
+}
+
 /**
  * Returns a range of indexes which contains at least [extraItemCount] items near
  * the first visible item. It is optimized to return the same range for small changes in the
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
new file mode 100644
index 0000000..eb8ebd4
--- /dev/null
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGrid.kt
@@ -0,0 +1,98 @@
+/*
+ * 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.staggeredgrid
+
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.clipScrollableContainer
+import androidx.compose.foundation.gestures.FlingBehavior
+import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.foundation.gestures.ScrollableDefaults
+import androidx.compose.foundation.gestures.scrollable
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.lazy.layout.LazyLayout
+import androidx.compose.foundation.overscroll
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalLayoutDirection
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.dp
+
+@ExperimentalFoundationApi
+@Composable
+internal fun LazyStaggeredGrid(
+    /** State controlling the scroll position */
+    state: LazyStaggeredGridState,
+    /** Modifier to be applied for the inner layout */
+    modifier: Modifier = Modifier,
+    /** The inner padding to be added for the whole content (not for each individual item) */
+    contentPadding: PaddingValues = PaddingValues(0.dp),
+    /** reverse the direction of scrolling and layout */
+    reverseLayout: Boolean = false,
+    /** The layout orientation of the grid */
+    orientation: Orientation,
+    /** fling behavior to be used for flinging */
+    flingBehavior: FlingBehavior = ScrollableDefaults.flingBehavior(),
+    /** Whether scrolling via the user gestures is allowed. */
+    userScrollEnabled: Boolean,
+    /** The vertical arrangement for items/lines. */
+    verticalArrangement: Arrangement.Vertical,
+    /** The horizontal arrangement for items/lines. */
+    horizontalArrangement: Arrangement.Horizontal,
+    /** Prefix sums of cross axis sizes of slots per line, e.g. the columns for vertical grid. */
+    slotSizesSums: Density.(Constraints) -> IntArray,
+    /** The content of the grid */
+    content: LazyStaggeredGridScope.() -> Unit
+) {
+    val overscrollEffect = ScrollableDefaults.overscrollEffect()
+
+    val itemProvider = rememberStaggeredGridItemProvider(state, content)
+    val measurePolicy = rememberStaggeredGridMeasurePolicy(
+        state,
+        itemProvider,
+        contentPadding,
+        reverseLayout,
+        orientation,
+        verticalArrangement,
+        horizontalArrangement,
+        slotSizesSums,
+        overscrollEffect
+    )
+
+    LazyLayout(
+        modifier = modifier
+            .then(state.remeasurementModifier)
+            .clipScrollableContainer(orientation)
+            .overscroll(overscrollEffect)
+            .scrollable(
+                orientation = orientation,
+                reverseDirection = ScrollableDefaults.reverseDirection(
+                    LocalLayoutDirection.current,
+                    orientation,
+                    reverseLayout
+                ),
+                flingBehavior = flingBehavior,
+                state = state,
+                overscrollEffect = overscrollEffect,
+                enabled = userScrollEnabled
+            ),
+        prefetchState = state.prefetchState,
+        itemProvider = itemProvider,
+        measurePolicy = measurePolicy
+    )
+}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridDsl.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridDsl.kt
new file mode 100644
index 0000000..d836948
--- /dev/null
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridDsl.kt
@@ -0,0 +1,53 @@
+/*
+ * 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.staggeredgrid
+
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.runtime.Composable
+
+@DslMarker
+internal annotation class LazyStaggeredGridScopeMarker
+
+@ExperimentalFoundationApi
+@LazyStaggeredGridScopeMarker
+internal sealed interface LazyStaggeredGridScope {
+    fun items(
+        count: Int,
+        key: ((index: Int) -> Any)? = null,
+        contentType: (index: Int) -> Any? = { null },
+        itemContent: @Composable LazyStaggeredGridItemScope.(index: Int) -> Unit
+    )
+}
+
+@ExperimentalFoundationApi
+internal sealed interface LazyStaggeredGridItemScope
+
+@ExperimentalFoundationApi
+internal fun LazyStaggeredGridScope.item(
+    key: Any? = null,
+    contentType: Any? = null,
+    itemContent: @Composable LazyStaggeredGridItemScope.(index: Int) -> Unit
+) {
+    items(
+        count = 1,
+        key = key?.let { { it } },
+        contentType = { contentType },
+        itemContent = itemContent
+    )
+}
+
+// todo(b/182882362): item DSL for lists/arrays
\ No newline at end of file
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
new file mode 100644
index 0000000..c2d02b2
--- /dev/null
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridItemProvider.kt
@@ -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.compose.foundation.lazy.staggeredgrid
+
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.lazy.layout.DelegatingLazyLayoutItemProvider
+import androidx.compose.foundation.lazy.layout.LazyLayoutItemProvider
+import androidx.compose.foundation.lazy.layout.rememberLazyNearestItemsRangeState
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.derivedStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberUpdatedState
+
+@Composable
+@ExperimentalFoundationApi
+internal fun rememberStaggeredGridItemProvider(
+    state: LazyStaggeredGridState,
+    content: LazyStaggeredGridScope.() -> Unit,
+): LazyLayoutItemProvider {
+    val latestContent = rememberUpdatedState(content)
+    val nearestItemsRangeState = rememberLazyNearestItemsRangeState(
+        firstVisibleItemIndex = { state.firstVisibleItems.getOrNull(0) ?: 0 },
+        slidingWindowSize = { 90 },
+        extraItemCount = { 200 }
+    )
+    return remember(state) {
+        val itemProviderState = derivedStateOf {
+            val scope = LazyStaggeredGridScopeImpl().apply(latestContent.value)
+            LazyLayoutItemProvider(
+                scope.intervals,
+                nearestItemsRangeState.value,
+            ) { interval, index ->
+                interval.item.invoke(LazyStaggeredGridItemScopeImpl, index)
+            }
+        }
+        object : LazyLayoutItemProvider by DelegatingLazyLayoutItemProvider(itemProviderState) { }
+    }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..adc7424
--- /dev/null
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasure.kt
@@ -0,0 +1,549 @@
+/*
+ * 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.staggeredgrid
+
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.OverscrollEffect
+import androidx.compose.foundation.checkScrollableContainerConstraints
+import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.lazy.layout.LazyLayoutItemProvider
+import androidx.compose.foundation.lazy.layout.LazyLayoutMeasureScope
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.snapshots.Snapshot
+import androidx.compose.ui.layout.Placeable
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.IntOffset
+import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.unit.constrainHeight
+import androidx.compose.ui.unit.constrainWidth
+import androidx.compose.ui.util.fastForEach
+import kotlin.math.abs
+import kotlin.math.roundToInt
+import kotlin.math.sign
+
+@Composable
+@ExperimentalFoundationApi
+internal fun rememberStaggeredGridMeasurePolicy(
+    state: LazyStaggeredGridState,
+    itemProvider: LazyLayoutItemProvider,
+    contentPadding: PaddingValues,
+    reverseLayout: Boolean,
+    orientation: Orientation,
+    verticalArrangement: Arrangement.Vertical,
+    horizontalArrangement: Arrangement.Horizontal,
+    slotSizesSums: Density.(Constraints) -> IntArray,
+    overscrollEffect: OverscrollEffect
+): LazyLayoutMeasureScope.(Constraints) -> LazyStaggeredGridMeasureResult = remember(
+    state,
+    itemProvider,
+    contentPadding,
+    reverseLayout,
+    orientation,
+    verticalArrangement,
+    horizontalArrangement,
+    slotSizesSums,
+    overscrollEffect,
+) {
+    { constraints ->
+        checkScrollableContainerConstraints(
+            constraints,
+            orientation
+        )
+        val isVertical = orientation == Orientation.Vertical
+
+        val resolvedSlotSums = slotSizesSums(this, constraints)
+        val itemCount = itemProvider.itemCount
+
+        val mainAxisAvailableSize =
+            if (isVertical) constraints.maxHeight else constraints.maxWidth
+
+        val measuredItemProvider = LazyStaggeredGridMeasureProvider(
+            isVertical,
+            itemProvider,
+            this,
+            resolvedSlotSums
+        ) { index, key, placeables ->
+            LazyStaggeredGridMeasuredItem(
+                index,
+                key,
+                placeables,
+                isVertical
+            )
+        }
+
+        val beforeContentPadding = 0
+        val afterContentPadding = 0
+
+        val initialItemIndices: IntArray
+        val initialItemOffsets: IntArray
+
+        Snapshot.withoutReadObservation {
+            initialItemIndices =
+                if (state.firstVisibleItems.size == resolvedSlotSums.size) {
+                    state.firstVisibleItems
+                } else {
+                    IntArray(resolvedSlotSums.size) { -1 }
+                }
+            initialItemOffsets =
+                if (state.firstVisibleItemScrollOffsets.size == resolvedSlotSums.size) {
+                    state.firstVisibleItemScrollOffsets
+                } else {
+                    IntArray(resolvedSlotSums.size) { 0 }
+                }
+        }
+
+        val spans = state.spans
+        val firstItemIndices = initialItemIndices.copyOf()
+        val firstItemOffsets = initialItemOffsets.copyOf()
+
+        // Measure items
+
+        if (itemCount <= 0) {
+            LazyStaggeredGridMeasureResult(
+                firstVisibleItemIndices = IntArray(0),
+                firstVisibleItemScrollOffsets = IntArray(0),
+                consumedScroll = 0f,
+                measureResult = layout(constraints.minWidth, constraints.minHeight) {},
+                canScrollForward = false,
+                canScrollBackward = false,
+                visibleItemsInfo = emptyArray()
+            )
+        } else {
+            // todo(b/182882362): content padding
+
+            // represents the real amount of scroll we applied as a result of this measure pass.
+            var scrollDelta = state.scrollToBeConsumed.roundToInt()
+
+            // applying the whole requested scroll offset. we will figure out if we can't consume
+            // all of it later
+            firstItemOffsets.offsetBy(-scrollDelta)
+
+            // if the current scroll offset is less than minimally possible
+            if (firstItemIndices[0] == 0 && firstItemOffsets[0] < 0) {
+                scrollDelta += firstItemOffsets[0]
+                firstItemOffsets.fill(0)
+            }
+
+            // this will contain all the MeasuredItems representing the visible items
+            val measuredItems = Array(resolvedSlotSums.size) {
+                mutableListOf<LazyStaggeredGridMeasuredItem>()
+            }
+
+            // include the start padding so we compose items in the padding area. before starting
+            // scrolling forward we would remove it back
+            firstItemOffsets.offsetBy(-beforeContentPadding)
+
+            // define min and max offsets (min offset currently includes beforeContentPadding)
+            val minOffset = -beforeContentPadding
+            val maxOffset = mainAxisAvailableSize
+
+            fun hasSpaceOnTop(): Boolean {
+                for (column in firstItemIndices.indices) {
+                    val itemIndex = firstItemIndices[column]
+                    val itemOffset = firstItemOffsets[column]
+
+                    if (itemOffset <= 0 && itemIndex > 0) {
+                        return true
+                    }
+                }
+
+                return false
+            }
+
+            // we had scrolled backward or we compose items in the start padding area, which means
+            // items before current firstItemScrollOffset should be visible. compose them and update
+            // firstItemScrollOffset
+            while (hasSpaceOnTop()) {
+                val columnIndex = firstItemOffsets.indexOfMinValue()
+                val previousItemIndex = spans.findPreviousItemIndex(
+                    item = firstItemIndices[columnIndex],
+                    column = columnIndex
+                )
+
+                if (previousItemIndex < 0) {
+                    break
+                }
+
+                if (spans.getSpan(previousItemIndex) == SpanLookup.SpanUnset) {
+                    spans.setSpan(previousItemIndex, columnIndex)
+                }
+
+                val measuredItem = measuredItemProvider.getAndMeasure(
+                    previousItemIndex,
+                    columnIndex
+                )
+                measuredItems[columnIndex].add(0, measuredItem)
+
+                firstItemIndices[columnIndex] = previousItemIndex
+                firstItemOffsets[columnIndex] += measuredItem.sizeWithSpacings
+            }
+
+            // if we were scrolled backward, but there were not enough items before. this means
+            // not the whole scroll was consumed
+            if (firstItemOffsets[0] < minOffset) {
+                scrollDelta += firstItemOffsets[0]
+                firstItemOffsets.offsetBy(minOffset - firstItemOffsets[0])
+            }
+
+            val currentItemIndices = initialItemIndices.copyOf()
+            val currentItemOffsets = IntArray(initialItemOffsets.size) {
+                -(initialItemOffsets[it] - scrollDelta)
+            }
+
+            // neutralize previously added start padding as we stopped filling the before content padding
+            firstItemOffsets.offsetBy(beforeContentPadding)
+
+            val maxMainAxis = (maxOffset + afterContentPadding).coerceAtLeast(0)
+
+            // compose first visible items we received from state
+            currentItemIndices.forEachIndexed { columnIndex, itemIndex ->
+                if (itemIndex == -1) return@forEachIndexed
+
+                val measuredItem = measuredItemProvider.getAndMeasure(itemIndex, columnIndex)
+                currentItemOffsets[columnIndex] += measuredItem.sizeWithSpacings
+
+                if (
+                    currentItemOffsets[columnIndex] <= minOffset &&
+                        measuredItem.index != itemCount - 1
+                ) {
+                    // this item is offscreen and will not be placed. advance item index
+                    firstItemIndices[columnIndex] = -1
+                    firstItemOffsets[columnIndex] -= measuredItem.sizeWithSpacings
+                } else {
+                    measuredItems[columnIndex].add(measuredItem)
+                }
+            }
+
+            // then composing visible items forward until we fill the whole viewport.
+            // we want to have at least one item in visibleItems even if in fact all the items are
+            // offscreen, this can happen if the content padding is larger than the available size.
+            while (
+                currentItemOffsets.any { it <= maxMainAxis } ||
+                    measuredItems.all { it.isEmpty() }
+            ) {
+                val columnIndex = currentItemOffsets.indexOfMinValue()
+                val nextItemIndex = spans.findNextItemIndex(
+                    currentItemIndices[columnIndex],
+                    columnIndex
+                )
+
+                if (nextItemIndex == itemCount) {
+                    break
+                }
+
+                if (firstItemIndices[columnIndex] == -1) {
+                    firstItemIndices[columnIndex] = nextItemIndex
+                }
+                spans.setSpan(nextItemIndex, columnIndex)
+
+                val measuredItem = measuredItemProvider.getAndMeasure(nextItemIndex, columnIndex)
+                currentItemOffsets[columnIndex] += measuredItem.sizeWithSpacings
+
+                if (
+                    currentItemOffsets[columnIndex] <= minOffset &&
+                        measuredItem.index != itemCount - 1
+                ) {
+                    // this item is offscreen and will not be placed. advance item index
+                    firstItemIndices[columnIndex] = -1
+                    firstItemOffsets[columnIndex] -= measuredItem.sizeWithSpacings
+                } else {
+                    measuredItems[columnIndex].add(measuredItem)
+                }
+
+                currentItemIndices[columnIndex] = nextItemIndex
+            }
+
+            // we didn't fill the whole viewport with items starting from firstVisibleItemIndex.
+            // lets try to scroll back if we have enough items before firstVisibleItemIndex.
+            if (currentItemOffsets.all { it < maxOffset }) {
+                val maxOffsetColumn = currentItemOffsets.indexOfMaxValue()
+                val toScrollBack = maxOffset - currentItemOffsets[maxOffsetColumn]
+                firstItemOffsets.offsetBy(-toScrollBack)
+                currentItemOffsets.offsetBy(toScrollBack)
+                while (
+                    firstItemOffsets.any { it < beforeContentPadding } &&
+                        firstItemIndices.all { it != 0 }
+                ) {
+                    val columnIndex = firstItemOffsets.indexOfMinValue()
+                    val currentIndex =
+                        if (firstItemIndices[columnIndex] == -1) {
+                            itemCount
+                        } else {
+                            firstItemIndices[columnIndex]
+                        }
+
+                    val previousIndex =
+                        spans.findPreviousItemIndex(currentIndex, columnIndex)
+
+                    if (previousIndex < 0) {
+                        break
+                    }
+
+                    val measuredItem = measuredItemProvider.getAndMeasure(
+                        previousIndex,
+                        columnIndex
+                    )
+                    measuredItems[columnIndex].add(0, measuredItem)
+                    firstItemOffsets[columnIndex] += measuredItem.sizeWithSpacings
+                    firstItemIndices[columnIndex] = previousIndex
+                }
+                scrollDelta += toScrollBack
+
+                val minOffsetColumn = firstItemOffsets.indexOfMinValue()
+                if (firstItemOffsets[minOffsetColumn] < 0) {
+                    val offsetValue = firstItemOffsets[minOffsetColumn]
+                    scrollDelta += offsetValue
+                    currentItemOffsets.offsetBy(offsetValue)
+                    firstItemOffsets.offsetBy(-offsetValue)
+                }
+            }
+
+            // report the amount of pixels we consumed. scrollDelta can be smaller than
+            // scrollToBeConsumed if there were not enough items to fill the offered space or it
+            // can be larger if items were resized, or if, for example, we were previously
+            // displaying the item 15, but now we have only 10 items in total in the data set.
+            val consumedScroll = if (
+                state.scrollToBeConsumed.roundToInt().sign == scrollDelta.sign &&
+                    abs(state.scrollToBeConsumed.roundToInt()) >= abs(scrollDelta)
+            ) {
+                scrollDelta.toFloat()
+            } else {
+                state.scrollToBeConsumed
+            }
+
+            // todo(b/182882362):
+            // even if we compose items to fill before content padding we should ignore items fully
+            // located there for the state's scroll position calculation (first item + first offset)
+
+            // end measure
+
+            val layoutWidth = if (isVertical) {
+                constraints.maxWidth
+            } else {
+                constraints.constrainWidth(currentItemOffsets.max())
+            }
+            val layoutHeight = if (isVertical) {
+                constraints.constrainHeight(currentItemOffsets.max())
+            } else {
+                constraints.maxHeight
+            }
+
+            // Placement
+
+            val itemScrollOffsets = firstItemOffsets.map { -it }
+            val positionedItems = Array(measuredItems.size) {
+                mutableListOf<LazyStaggeredGridPositionedItem>()
+            }
+
+            var currentCrossAxis = 0
+            measuredItems.forEachIndexed { i, columnItems ->
+                var currentMainAxis = itemScrollOffsets[i]
+
+                // todo(b/182882362): arrangement/spacing support
+
+                columnItems.fastForEach { item ->
+                    positionedItems[i] += item.position(
+                        currentMainAxis,
+                        currentCrossAxis,
+                    )
+                    currentMainAxis += item.sizeWithSpacings
+                }
+                if (columnItems.isNotEmpty()) {
+                    currentCrossAxis += columnItems[0].crossAxisSize
+                }
+            }
+
+            // End placement
+
+            // todo: reverse layout support
+            // only scroll backward if the first item is not on screen or fully visible
+            val canScrollBackward = !(firstItemIndices[0] == 0 && firstItemOffsets[0] <= 0)
+            // only scroll forward if the last item is not on screen or fully visible
+            val canScrollForward = currentItemIndices.indexOf(itemCount - 1).let { columnIndex ->
+                if (columnIndex == -1) {
+                    true
+                } else {
+                    (currentItemOffsets[columnIndex] -
+                        measuredItems[columnIndex].last().sizeWithSpacings) < mainAxisAvailableSize
+                }
+            }
+
+            @Suppress("UNCHECKED_CAST")
+            LazyStaggeredGridMeasureResult(
+                firstVisibleItemIndices = firstItemIndices,
+                firstVisibleItemScrollOffsets = firstItemOffsets,
+                consumedScroll = consumedScroll,
+                measureResult = layout(layoutWidth, layoutHeight) {
+                    positionedItems.forEach {
+                        it.fastForEach { item ->
+                            item.place(this)
+                        }
+                    }
+                },
+                canScrollForward = canScrollForward,
+                canScrollBackward = canScrollBackward,
+                visibleItemsInfo = positionedItems as Array<List<LazyStaggeredGridItemInfo>>
+            ).also {
+                state.applyMeasureResult(it)
+                refreshOverscrollInfo(overscrollEffect, it)
+            }
+        }
+    }
+}
+
+@OptIn(ExperimentalFoundationApi::class)
+private fun refreshOverscrollInfo(
+    overscrollEffect: OverscrollEffect,
+    result: LazyStaggeredGridMeasureResult
+) {
+    overscrollEffect.isEnabled = result.canScrollForward || result.canScrollBackward
+}
+
+private fun IntArray.offsetBy(delta: Int) {
+    for (i in indices) {
+        this[i] = this[i] + delta
+    }
+}
+
+private fun IntArray.indexOfMinValue(): Int {
+    var result = -1
+    var min = Int.MAX_VALUE
+    for (i in indices) {
+        if (min > this[i]) {
+            min = this[i]
+            result = i
+        }
+    }
+
+    return result
+}
+
+private fun IntArray.indexOfMaxValue(): Int {
+    var result = -1
+    var max = Int.MIN_VALUE
+    for (i in indices) {
+        if (max < this[i]) {
+            max = this[i]
+            result = i
+        }
+    }
+
+    return result
+}
+
+private fun SpanLookup.findPreviousItemIndex(item: Int, column: Int): Int {
+    for (i in (item - 1) downTo 0) {
+        val span = getSpan(i)
+        if (span == column || span == SpanLookup.SpanUnset) {
+            return i
+        }
+    }
+    return -1
+}
+
+private fun SpanLookup.findNextItemIndex(item: Int, column: Int): Int {
+    for (i in (item + 1) until capacity()) {
+        val span = getSpan(i)
+        if (span == column || span == SpanLookup.SpanUnset) {
+            return i
+        }
+    }
+    return capacity()
+}
+
+@OptIn(ExperimentalFoundationApi::class)
+private class LazyStaggeredGridMeasureProvider(
+    private val isVertical: Boolean,
+    private val itemProvider: LazyLayoutItemProvider,
+    private val measureScope: LazyLayoutMeasureScope,
+    private val resolvedSlotSums: IntArray,
+    private val measuredItemFactory: MeasuredItemFactory
+) {
+    fun childConstraints(slot: Int): Constraints {
+        val previousSum = if (slot == 0) 0 else resolvedSlotSums[slot - 1]
+        val crossAxisSize = resolvedSlotSums[slot] - previousSum
+        return if (isVertical) {
+            Constraints.fixedWidth(crossAxisSize)
+        } else {
+            Constraints.fixedHeight(crossAxisSize)
+        }
+    }
+
+    fun getAndMeasure(index: Int, slot: Int): LazyStaggeredGridMeasuredItem {
+        val key = itemProvider.getKey(index)
+        val placeables = measureScope.measure(index, childConstraints(slot))
+        return measuredItemFactory.createItem(index, key, placeables)
+    }
+}
+
+private class LazyStaggeredGridMeasuredItem(
+    val index: Int,
+    val key: Any,
+    val placeables: Array<Placeable>,
+    val isVertical: Boolean
+) {
+    val sizeWithSpacings: Int = placeables.fold(0) { size, placeable ->
+        size + if (isVertical) placeable.height else placeable.width
+    }
+
+    val crossAxisSize: Int = placeables.maxOf {
+        if (isVertical) it.width else it.height
+    }
+
+    fun position(
+        mainAxis: Int,
+        crossAxis: Int,
+    ): LazyStaggeredGridPositionedItem =
+        LazyStaggeredGridPositionedItem(
+            offset = if (isVertical) {
+                IntOffset(crossAxis, mainAxis)
+            } else {
+                IntOffset(mainAxis, crossAxis)
+            },
+            index = index,
+            key = key,
+            size = IntSize(sizeWithSpacings, crossAxisSize),
+            placeables = placeables
+        )
+}
+
+private class LazyStaggeredGridPositionedItem(
+    override val offset: IntOffset,
+    override val index: Int,
+    override val key: Any,
+    override val size: IntSize,
+    val placeables: Array<Placeable>
+) : LazyStaggeredGridItemInfo {
+    fun place(scope: Placeable.PlacementScope) = with(scope) {
+        placeables.forEach { placeable ->
+            placeable.placeWithLayer(offset)
+        }
+    }
+}
+
+// This interface allows to avoid autoboxing on index param
+private fun interface MeasuredItemFactory {
+    fun createItem(
+        index: Int,
+        key: Any,
+        placeables: Array<Placeable>
+    ): LazyStaggeredGridMeasuredItem
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasureResult.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasureResult.kt
new file mode 100644
index 0000000..4abccf9
--- /dev/null
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasureResult.kt
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.foundation.lazy.staggeredgrid
+
+import androidx.compose.ui.layout.MeasureResult
+import androidx.compose.ui.unit.IntOffset
+import androidx.compose.ui.unit.IntSize
+
+internal class LazyStaggeredGridMeasureResult(
+    val firstVisibleItemIndices: IntArray,
+    val firstVisibleItemScrollOffsets: IntArray,
+    val consumedScroll: Float,
+    val measureResult: MeasureResult,
+    val canScrollForward: Boolean,
+    val canScrollBackward: Boolean,
+    val visibleItemsInfo: Array<List<LazyStaggeredGridItemInfo>>
+) : MeasureResult by measureResult
+
+internal interface LazyStaggeredGridItemInfo {
+    val offset: IntOffset
+    val index: Int
+    val key: Any
+    val size: IntSize
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScope.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScope.kt
new file mode 100644
index 0000000..3881306
--- /dev/null
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScope.kt
@@ -0,0 +1,53 @@
+/*
+ * 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.staggeredgrid
+
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.lazy.layout.LazyLayoutIntervalContent
+import androidx.compose.foundation.lazy.layout.MutableIntervalList
+import androidx.compose.runtime.Composable
+
+@ExperimentalFoundationApi
+internal class LazyStaggeredGridScopeImpl : LazyStaggeredGridScope {
+    val intervals = MutableIntervalList<LazyStaggeredGridIntervalContent>()
+
+    override fun items(
+        count: Int,
+        key: ((index: Int) -> Any)?,
+        contentType: (index: Int) -> Any?,
+        itemContent: @Composable LazyStaggeredGridItemScope.(index: Int) -> Unit
+    ) {
+        intervals.addInterval(
+            count,
+            LazyStaggeredGridIntervalContent(
+                key,
+                contentType,
+                itemContent
+            )
+        )
+    }
+}
+
+@OptIn(ExperimentalFoundationApi::class)
+internal object LazyStaggeredGridItemScopeImpl : LazyStaggeredGridItemScope
+
+@OptIn(ExperimentalFoundationApi::class)
+internal class LazyStaggeredGridIntervalContent(
+    override val key: ((index: Int) -> Any)?,
+    override val type: ((index: Int) -> Any?),
+    val item: @Composable LazyStaggeredGridItemScope.(Int) -> Unit
+) : LazyLayoutIntervalContent
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridState.kt
new file mode 100644
index 0000000..cef7880
--- /dev/null
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridState.kt
@@ -0,0 +1,150 @@
+/*
+ * 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.staggeredgrid
+
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.MutatePriority
+import androidx.compose.foundation.gestures.ScrollScope
+import androidx.compose.foundation.gestures.ScrollableState
+import androidx.compose.foundation.lazy.layout.LazyLayoutPrefetchState
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.layout.Remeasurement
+import androidx.compose.ui.layout.RemeasurementModifier
+import kotlin.math.abs
+
+@ExperimentalFoundationApi
+internal class LazyStaggeredGridState : ScrollableState {
+    var firstVisibleItems: IntArray by mutableStateOf(IntArray(0))
+        private set
+
+    var firstVisibleItemScrollOffsets: IntArray by mutableStateOf(IntArray(0))
+        private set
+
+    internal val spans: SpanLookup = SpanLookup()
+
+    private var canScrollForward = true
+    private var canScrollBackward = true
+
+    private var remeasurement: Remeasurement? = null
+
+    internal val remeasurementModifier = object : RemeasurementModifier {
+        override fun onRemeasurementAvailable(remeasurement: Remeasurement) {
+            this@LazyStaggeredGridState.remeasurement = remeasurement
+        }
+    }
+
+    internal val prefetchState: LazyLayoutPrefetchState = LazyLayoutPrefetchState()
+
+    internal var prefetchingEnabled = true
+
+    private val scrollableState = ScrollableState { -onScroll(-it) }
+
+    internal var scrollToBeConsumed = 0f
+        private set
+
+    /* @VisibleForTesting */
+    internal var measurePassCount = 0
+
+    override suspend fun scroll(
+        scrollPriority: MutatePriority,
+        block: suspend ScrollScope.() -> Unit
+    ) {
+        scrollableState.scroll(scrollPriority, block)
+    }
+
+    private fun onScroll(distance: Float): Float {
+        if (distance < 0 && !canScrollForward || distance > 0 && !canScrollBackward) {
+            return 0f
+        }
+        check(abs(scrollToBeConsumed) <= 0.5f) {
+            "entered drag with non-zero pending scroll: $scrollToBeConsumed"
+        }
+        scrollToBeConsumed += distance
+
+        // scrollToBeConsumed will be consumed synchronously during the forceRemeasure invocation
+        // inside measuring we do scrollToBeConsumed.roundToInt() so there will be no scroll if
+        // we have less than 0.5 pixels
+        if (abs(scrollToBeConsumed) > 0.5f) {
+            remeasurement?.forceRemeasure()
+            // todo(b/182882362): notify prefetch
+//            if (prefetchingEnabled) {
+//                val leftoverScroll = preScrollToBeConsumed - scrollToBeConsumed
+//                notifyPrefetch(preScrollToBeConsumed - scrollToBeConsumed)
+//            }
+        }
+
+        // here scrollToBeConsumed is already consumed during the forceRemeasure invocation
+        if (abs(scrollToBeConsumed) <= 0.5f) {
+            // We consumed all of it - we'll hold onto the fractional scroll for later, so report
+            // that we consumed the whole thing
+            return distance
+        } else {
+            val scrollConsumed = distance - scrollToBeConsumed
+            // We did not consume all of it - return the rest to be consumed elsewhere (e.g.,
+            // nested scrolling)
+            scrollToBeConsumed = 0f // We're not consuming the rest, give it back
+            return scrollConsumed
+        }
+    }
+
+    override fun dispatchRawDelta(delta: Float): Float =
+        scrollableState.dispatchRawDelta(delta)
+
+    internal fun applyMeasureResult(result: LazyStaggeredGridMeasureResult) {
+        scrollToBeConsumed -= result.consumedScroll
+        firstVisibleItems = result.firstVisibleItemIndices
+        firstVisibleItemScrollOffsets = result.firstVisibleItemScrollOffsets
+        canScrollBackward = result.canScrollBackward
+        canScrollForward = result.canScrollForward
+
+        measurePassCount++
+    }
+
+    override val isScrollInProgress: Boolean
+        get() = scrollableState.isScrollInProgress
+}
+
+internal class SpanLookup {
+    private var spans = IntArray(16)
+
+    fun setSpan(item: Int, span: Int) {
+        ensureCapacity(item + 1)
+        spans[item] = span + 1
+    }
+
+    fun getSpan(item: Int): Int =
+        spans[item] - 1
+
+    fun capacity(): Int =
+        spans.size
+
+    private fun ensureCapacity(capacity: Int) {
+        if (spans.size < capacity) {
+            spans = spans.copyInto(IntArray(spans.size * 2))
+        }
+    }
+
+    fun reset() {
+        spans.fill(0)
+    }
+
+    companion object {
+        internal const val SpanUnset = -1
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreTextField.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreTextField.kt
index a19a54e..ac6cbcf 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreTextField.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreTextField.kt
@@ -328,33 +328,37 @@
     val pointerModifier = if (isInTouchMode) {
         val selectionModifier =
             Modifier.longPressDragGestureFilter(manager.touchSelectionObserver, enabled)
-        Modifier.tapPressTextFieldModifier(interactionSource, enabled) { offset ->
-            tapToFocus(state, focusRequester, !readOnly)
-            if (state.hasFocus) {
-                if (state.handleState != HandleState.Selection) {
-                    state.layoutResult?.let { layoutResult ->
-                        TextFieldDelegate.setCursorOffset(
-                            offset,
-                            layoutResult,
-                            state.processor,
-                            offsetMapping,
-                            state.onValueChange
-                        )
-                        // Won't enter cursor state when text is empty.
-                        if (state.textDelegate.text.isNotEmpty()) {
-                            state.handleState = HandleState.Cursor
+        Modifier
+            .tapPressTextFieldModifier(interactionSource, enabled) { offset ->
+                tapToFocus(state, focusRequester, !readOnly)
+                if (state.hasFocus) {
+                    if (state.handleState != HandleState.Selection) {
+                        state.layoutResult?.let { layoutResult ->
+                            TextFieldDelegate.setCursorOffset(
+                                offset,
+                                layoutResult,
+                                state.processor,
+                                offsetMapping,
+                                state.onValueChange
+                            )
+                            // Won't enter cursor state when text is empty.
+                            if (state.textDelegate.text.isNotEmpty()) {
+                                state.handleState = HandleState.Cursor
+                            }
                         }
+                    } else {
+                        manager.deselect(offset)
                     }
-                } else {
-                    manager.deselect(offset)
                 }
             }
-        }.then(selectionModifier)
+            .then(selectionModifier)
     } else {
-        Modifier.mouseDragGestureDetector(
-            observer = manager.mouseSelectionObserver,
-            enabled = enabled
-        ).pointerHoverIcon(textPointerIcon)
+        Modifier
+            .mouseDragGestureDetector(
+                observer = manager.mouseSelectionObserver,
+                enabled = enabled
+            )
+            .pointerHoverIcon(textPointerIcon)
     }
 
     val drawModifier = Modifier.drawBehind {
@@ -844,6 +848,7 @@
         this.keyboardActionRunner.apply {
             this.keyboardActions = keyboardActions
             this.focusManager = focusManager
+            this.inputSession = this@TextFieldState.inputSession
         }
         this.untransformedText = untransformedText
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyboardActionRunner.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyboardActionRunner.kt
index 1a665dd..96051ac 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyboardActionRunner.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyboardActionRunner.kt
@@ -27,6 +27,7 @@
 import androidx.compose.ui.text.input.ImeAction.Companion.Previous
 import androidx.compose.ui.text.input.ImeAction.Companion.Next
 import androidx.compose.ui.text.input.ImeAction.Companion.Done
+import androidx.compose.ui.text.input.TextInputSession
 
 /**
  * This class can be used to run keyboard actions when the user triggers an IME action.
@@ -44,6 +45,12 @@
     lateinit var focusManager: FocusManager
 
     /**
+     * A reference to the current [TextInputSession].
+     */
+    // TODO(b/241399013) replace with SoftwareKeyboardController when it becomes stable.
+    var inputSession: TextInputSession? = null
+
+    /**
      * Run the keyboard action corresponding to the specified imeAction. If a keyboard action is
      * not specified, use the default implementation provided by [defaultKeyboardAction].
      */
@@ -68,9 +75,10 @@
         when (imeAction) {
             Next -> focusManager.moveFocus(FocusDirection.Next)
             Previous -> focusManager.moveFocus(FocusDirection.Previous)
+            Done -> inputSession?.hideSoftwareKeyboard()
             // Note: Don't replace this with an else. These are specified explicitly so that we
             // don't forget to update this when statement when new imeActions are added.
-            Done, Go, Search, Send, Default, None -> Unit // Do Nothing.
+            Go, Search, Send, Default, None -> Unit // Do Nothing.
         }
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionContainer.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionContainer.kt
index 684df3b..0d4733d 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionContainer.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionContainer.kt
@@ -34,7 +34,7 @@
 import androidx.compose.ui.util.fastForEach
 
 /**
- * Enables text selection for it's direct or indirect children.
+ * Enables text selection for its direct or indirect children.
  *
  * @sample androidx.compose.foundation.samples.SelectionSample
  */
@@ -52,7 +52,7 @@
 }
 
 /**
- * Disables text selection for it's direct or indirect children. To use this, simply add this
+ * Disables text selection for its direct or indirect children. To use this, simply add this
  * to wrap one or more text composables.
  *
  * @sample androidx.compose.foundation.samples.DisableSelectionSample
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/DesktopOverscroll.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/DesktopOverscroll.kt
index 40b0275..3c53ec5 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/DesktopOverscroll.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/DesktopOverscroll.kt
@@ -35,14 +35,12 @@
 private class DesktopEdgeEffectOverscrollEffect() : OverscrollEffect {
     override fun consumePreScroll(
         scrollDelta: Offset,
-        pointerPosition: Offset?,
         source: NestedScrollSource
     ): Offset = Offset.Zero
 
     override fun consumePostScroll(
         initialDragDelta: Offset,
         overscrollDelta: Offset,
-        pointerPosition: Offset?,
         source: NestedScrollSource
     ) {}
 
diff --git a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoActivity.kt b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoActivity.kt
index f1e808b..566b04d 100644
--- a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoActivity.kt
+++ b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoActivity.kt
@@ -52,6 +52,7 @@
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.platform.LocalFocusManager
 import androidx.compose.ui.platform.LocalView
+import androidx.core.view.WindowCompat
 import androidx.fragment.app.FragmentActivity
 
 /**
@@ -88,9 +89,13 @@
             }
 
             SoftInputModeEffect(SoftInputModeSetting.asState().value, window)
-            DecorFitsSystemWindowsEffect(DecorFitsSystemWindowsSetting.asState().value, window)
+            DecorFitsSystemWindowsEffect(
+                DecorFitsSystemWindowsSetting.asState().value,
+                hostView,
+                window
+            )
 
-            DemoTheme(DynamicThemeSetting.asState().value, window) {
+            DemoTheme(DynamicThemeSetting.asState().value, this.hostView, window) {
                 val filteringMode = rememberSaveable(
                     saver = FilterMode.Saver(onBackPressedDispatcher)
                 ) {
@@ -135,6 +140,7 @@
 @Composable
 private fun DemoTheme(
     isDynamicThemeOn: Boolean,
+    view: View,
     window: Window,
     content: @Composable () -> Unit
 ) {
@@ -150,8 +156,10 @@
         }
 
     SideEffect {
-        window.statusBarColor =
-            (if (isDarkMode) Color.Black else colorScheme.inversePrimary).toArgb()
+        WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = !isDarkMode
+        WindowCompat.getInsetsController(window, view).isAppearanceLightNavigationBars = !isDarkMode
+        window.statusBarColor = Color.Transparent.toArgb()
+        window.navigationBarColor = Color.Transparent.toArgb()
     }
     MaterialTheme(colorScheme = colorScheme, content = content)
 }
diff --git a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoApp.kt b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoApp.kt
index 96eb9e5..a252388 100644
--- a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoApp.kt
+++ b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoApp.kt
@@ -21,14 +21,15 @@
 import androidx.compose.foundation.isSystemInDarkTheme
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.ExperimentalLayoutApi
 import androidx.compose.foundation.layout.WindowInsets
+import androidx.compose.foundation.layout.consumedWindowInsets
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.heightIn
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.safeDrawing
-import androidx.compose.foundation.layout.windowInsetsPadding
 import androidx.compose.foundation.layout.wrapContentHeight
 import androidx.compose.foundation.layout.wrapContentSize
 import androidx.compose.foundation.rememberScrollState
@@ -39,7 +40,6 @@
 import androidx.compose.integration.demos.common.DemoCategory
 import androidx.compose.integration.demos.common.FragmentDemo
 import androidx.compose.integration.demos.common.allLaunchableDemos
-import androidx.compose.integration.demos.settings.DecorFitsSystemWindowsSetting
 import androidx.compose.material.LocalContentColor
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.ArrowBack
@@ -56,7 +56,6 @@
 import androidx.compose.material3.Text
 import androidx.compose.material3.TopAppBarDefaults
 import androidx.compose.material3.TopAppBarScrollBehavior
-import androidx.compose.material3.rememberTopAppBarState
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.DisposableEffect
@@ -75,7 +74,7 @@
 import androidx.fragment.app.FragmentActivity
 import androidx.fragment.app.FragmentContainerView
 
-@OptIn(ExperimentalMaterial3Api::class)
+@OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class)
 @Composable
 fun DemoApp(
     currentDemo: Demo,
@@ -92,12 +91,7 @@
 
     var filterText by rememberSaveable { mutableStateOf("") }
 
-    val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
-
-    // Only handle window insets when the system isn't doing it for us.
-    val insetsModifier = if (!DecorFitsSystemWindowsSetting.asState().value) {
-        Modifier.windowInsetsPadding(WindowInsets.safeDrawing)
-    } else Modifier
+    val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
 
     Scaffold(
         topBar = {
@@ -114,11 +108,20 @@
             )
         },
         modifier = Modifier
-            .then(insetsModifier)
             .nestedScroll(scrollBehavior.nestedScrollConnection)
     ) { innerPadding ->
-        val modifier = Modifier.padding(innerPadding)
-        DemoContent(modifier, currentDemo, isFiltering, filterText, onNavigateToDemo, onNavigateUp)
+        val modifier = Modifier
+            // as scaffold currently doesn't consume the safe drawing internally - consume here
+            .consumedWindowInsets(WindowInsets.safeDrawing)
+            .padding(innerPadding)
+        DemoContent(
+            modifier,
+            currentDemo,
+            isFiltering,
+            filterText,
+            onNavigateToDemo,
+            onNavigateUp
+        )
     }
 }
 
diff --git a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/settings/DecorFitsSystemWindowsSetting.kt b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/settings/DecorFitsSystemWindowsSetting.kt
index 7c0029f..5a6e3ae 100644
--- a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/settings/DecorFitsSystemWindowsSetting.kt
+++ b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/settings/DecorFitsSystemWindowsSetting.kt
@@ -17,10 +17,13 @@
 package androidx.compose.integration.demos.settings
 
 import android.content.Context
+import android.view.View
 import android.view.Window
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.DisposableEffect
+import androidx.core.view.ViewCompat
 import androidx.core.view.WindowCompat.setDecorFitsSystemWindows
+import androidx.core.view.WindowInsetsCompat
 import androidx.preference.CheckBoxPreference
 
 /**
@@ -53,9 +56,17 @@
  * [decorFitsSystemWindows] as long as this function is composed.
  */
 @Composable
-internal fun DecorFitsSystemWindowsEffect(decorFitsSystemWindows: Boolean, window: Window) {
+internal fun DecorFitsSystemWindowsEffect(
+    decorFitsSystemWindows: Boolean,
+    view: View,
+    window: Window
+) {
     DisposableEffect(decorFitsSystemWindows, window) {
         setDecorFitsSystemWindows(window, decorFitsSystemWindows)
+        ViewCompat.setOnApplyWindowInsetsListener(view) { _, insets ->
+            if (!decorFitsSystemWindows) WindowInsetsCompat.CONSUMED
+            else insets
+        }
         onDispose {
             setDecorFitsSystemWindows(window, true)
         }
diff --git a/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/TrivialTracingBenchmark.kt b/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/TrivialTracingBenchmark.kt
index 6c3d32d..70030c8 100644
--- a/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/TrivialTracingBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/TrivialTracingBenchmark.kt
@@ -24,6 +24,7 @@
 import androidx.benchmark.macro.junit4.MacrobenchmarkRule
 import androidx.benchmark.perfetto.PerfettoCapture
 import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -37,6 +38,7 @@
  * a Perfetto trace.
  */
 @OptIn(ExperimentalMetricApi::class)
+@SdkSuppress(minSdkVersion = Build.VERSION_CODES.R) // TODO(234351579): Support API < 30
 class TrivialTracingBenchmark(private val composableName: String) {
     @get:Rule
     val benchmarkRule = MacrobenchmarkRule()
diff --git a/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/specification/SpecificationTopAppBar.kt b/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/specification/SpecificationTopAppBar.kt
index deee833..93f2baf 100644
--- a/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/specification/SpecificationTopAppBar.kt
+++ b/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/specification/SpecificationTopAppBar.kt
@@ -16,6 +16,7 @@
 
 package androidx.compose.material.catalog.ui.specification
 
+import androidx.compose.animation.core.FastOutLinearInEasing
 import androidx.compose.foundation.layout.WindowInsets
 import androidx.compose.foundation.layout.WindowInsetsSides
 import androidx.compose.foundation.layout.only
@@ -23,14 +24,18 @@
 import androidx.compose.foundation.layout.windowInsetsPadding
 import androidx.compose.material3.CenterAlignedTopAppBar
 import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.Surface
 import androidx.compose.material3.Text
 import androidx.compose.material3.TopAppBarDefaults
 import androidx.compose.material3.TopAppBarScrollBehavior
+import androidx.compose.material3.surfaceColorAtElevation
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.lerp
 import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.unit.dp
 
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
@@ -38,10 +43,12 @@
     title: String,
     scrollBehavior: TopAppBarScrollBehavior? = null,
 ) {
-    val backgroundColors = TopAppBarDefaults.centerAlignedTopAppBarColors()
-    val backgroundColor = backgroundColors.containerColor(
-        colorTransitionFraction = scrollBehavior?.state?.overlappedFraction ?: 0f
-    ).value
+    val backgroundColor = lerp(
+        MaterialTheme.colorScheme.surface,
+        MaterialTheme.colorScheme.surfaceColorAtElevation(elevation = 3.dp),
+        FastOutLinearInEasing.transform(scrollBehavior?.state?.overlappedFraction ?: 0f)
+    )
+
     val foregroundColors = TopAppBarDefaults.centerAlignedTopAppBarColors(
         containerColor = Color.Transparent,
         scrolledContainerColor = Color.Transparent
diff --git a/compose/material/material-icons-core/api/1.3.0-beta01.txt b/compose/material/material-icons-core/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..b95d770
--- /dev/null
+++ b/compose/material/material-icons-core/api/1.3.0-beta01.txt
@@ -0,0 +1,1036 @@
+// Signature format: 4.0
+package androidx.compose.material.icons {
+
+  public final class Icons {
+    method public androidx.compose.material.icons.Icons.Filled getDefault();
+    property public final androidx.compose.material.icons.Icons.Filled Default;
+    field public static final androidx.compose.material.icons.Icons INSTANCE;
+  }
+
+  public static final class Icons.Filled {
+    field public static final androidx.compose.material.icons.Icons.Filled INSTANCE;
+  }
+
+  public static final class Icons.Outlined {
+    field public static final androidx.compose.material.icons.Icons.Outlined INSTANCE;
+  }
+
+  public static final class Icons.Rounded {
+    field public static final androidx.compose.material.icons.Icons.Rounded INSTANCE;
+  }
+
+  public static final class Icons.Sharp {
+    field public static final androidx.compose.material.icons.Icons.Sharp INSTANCE;
+  }
+
+  public static final class Icons.TwoTone {
+    field public static final androidx.compose.material.icons.Icons.TwoTone INSTANCE;
+  }
+
+  public final class IconsKt {
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector materialIcon(String name, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,androidx.compose.ui.graphics.vector.ImageVector.Builder> block);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder materialPath(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional float fillAlpha, optional float strokeAlpha, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+  }
+
+}
+
+package androidx.compose.material.icons.filled {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Filled);
+  }
+
+}
+
+package androidx.compose.material.icons.outlined {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+}
+
+package androidx.compose.material.icons.rounded {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+}
+
+package androidx.compose.material.icons.sharp {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+}
+
+package androidx.compose.material.icons.twotone {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+}
+
diff --git a/compose/material/material-icons-core/api/public_plus_experimental_1.3.0-beta01.txt b/compose/material/material-icons-core/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..b95d770
--- /dev/null
+++ b/compose/material/material-icons-core/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,1036 @@
+// Signature format: 4.0
+package androidx.compose.material.icons {
+
+  public final class Icons {
+    method public androidx.compose.material.icons.Icons.Filled getDefault();
+    property public final androidx.compose.material.icons.Icons.Filled Default;
+    field public static final androidx.compose.material.icons.Icons INSTANCE;
+  }
+
+  public static final class Icons.Filled {
+    field public static final androidx.compose.material.icons.Icons.Filled INSTANCE;
+  }
+
+  public static final class Icons.Outlined {
+    field public static final androidx.compose.material.icons.Icons.Outlined INSTANCE;
+  }
+
+  public static final class Icons.Rounded {
+    field public static final androidx.compose.material.icons.Icons.Rounded INSTANCE;
+  }
+
+  public static final class Icons.Sharp {
+    field public static final androidx.compose.material.icons.Icons.Sharp INSTANCE;
+  }
+
+  public static final class Icons.TwoTone {
+    field public static final androidx.compose.material.icons.Icons.TwoTone INSTANCE;
+  }
+
+  public final class IconsKt {
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector materialIcon(String name, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,androidx.compose.ui.graphics.vector.ImageVector.Builder> block);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder materialPath(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional float fillAlpha, optional float strokeAlpha, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+  }
+
+}
+
+package androidx.compose.material.icons.filled {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Filled);
+  }
+
+}
+
+package androidx.compose.material.icons.outlined {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+}
+
+package androidx.compose.material.icons.rounded {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+}
+
+package androidx.compose.material.icons.sharp {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+}
+
+package androidx.compose.material.icons.twotone {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/compose/material/material-icons-core/api/res-1.3.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/material/material-icons-core/api/res-1.3.0-beta01.txt
diff --git a/compose/material/material-icons-core/api/restricted_1.3.0-beta01.txt b/compose/material/material-icons-core/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..619d449
--- /dev/null
+++ b/compose/material/material-icons-core/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,1037 @@
+// Signature format: 4.0
+package androidx.compose.material.icons {
+
+  public final class Icons {
+    method public androidx.compose.material.icons.Icons.Filled getDefault();
+    property public final androidx.compose.material.icons.Icons.Filled Default;
+    field public static final androidx.compose.material.icons.Icons INSTANCE;
+  }
+
+  public static final class Icons.Filled {
+    field public static final androidx.compose.material.icons.Icons.Filled INSTANCE;
+  }
+
+  public static final class Icons.Outlined {
+    field public static final androidx.compose.material.icons.Icons.Outlined INSTANCE;
+  }
+
+  public static final class Icons.Rounded {
+    field public static final androidx.compose.material.icons.Icons.Rounded INSTANCE;
+  }
+
+  public static final class Icons.Sharp {
+    field public static final androidx.compose.material.icons.Icons.Sharp INSTANCE;
+  }
+
+  public static final class Icons.TwoTone {
+    field public static final androidx.compose.material.icons.Icons.TwoTone INSTANCE;
+  }
+
+  public final class IconsKt {
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector materialIcon(String name, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,androidx.compose.ui.graphics.vector.ImageVector.Builder> block);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder materialPath(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional float fillAlpha, optional float strokeAlpha, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+    field @kotlin.PublishedApi internal static final float MaterialIconDimension = 24.0f;
+  }
+
+}
+
+package androidx.compose.material.icons.filled {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Filled);
+  }
+
+}
+
+package androidx.compose.material.icons.outlined {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+}
+
+package androidx.compose.material.icons.rounded {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+}
+
+package androidx.compose.material.icons.sharp {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+}
+
+package androidx.compose.material.icons.twotone {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+}
+
diff --git a/compose/material/material-ripple/api/1.3.0-beta01.txt b/compose/material/material-ripple/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..32f4093
--- /dev/null
+++ b/compose/material/material-ripple/api/1.3.0-beta01.txt
@@ -0,0 +1,40 @@
+// Signature format: 4.0
+package androidx.compose.material.ripple {
+
+  @androidx.compose.runtime.Immutable public final class RippleAlpha {
+    ctor public RippleAlpha(float draggedAlpha, float focusedAlpha, float hoveredAlpha, float pressedAlpha);
+    method public float getDraggedAlpha();
+    method public float getFocusedAlpha();
+    method public float getHoveredAlpha();
+    method public float getPressedAlpha();
+    property public final float draggedAlpha;
+    property public final float focusedAlpha;
+    property public final float hoveredAlpha;
+    property public final float pressedAlpha;
+  }
+
+  public final class RippleAnimationKt {
+  }
+
+  public final class RippleKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.Indication rememberRipple(optional boolean bounded, optional float radius, optional long color);
+  }
+
+  public interface RippleTheme {
+    method @androidx.compose.runtime.Composable public long defaultColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ripple.RippleAlpha rippleAlpha();
+    field public static final androidx.compose.material.ripple.RippleTheme.Companion Companion;
+  }
+
+  public static final class RippleTheme.Companion {
+    method public androidx.compose.material.ripple.RippleAlpha defaultRippleAlpha(long contentColor, boolean lightTheme);
+    method public long defaultRippleColor(long contentColor, boolean lightTheme);
+  }
+
+  public final class RippleThemeKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> LocalRippleTheme;
+  }
+
+}
+
diff --git a/compose/material/material-ripple/api/public_plus_experimental_1.3.0-beta01.txt b/compose/material/material-ripple/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..32f4093
--- /dev/null
+++ b/compose/material/material-ripple/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,40 @@
+// Signature format: 4.0
+package androidx.compose.material.ripple {
+
+  @androidx.compose.runtime.Immutable public final class RippleAlpha {
+    ctor public RippleAlpha(float draggedAlpha, float focusedAlpha, float hoveredAlpha, float pressedAlpha);
+    method public float getDraggedAlpha();
+    method public float getFocusedAlpha();
+    method public float getHoveredAlpha();
+    method public float getPressedAlpha();
+    property public final float draggedAlpha;
+    property public final float focusedAlpha;
+    property public final float hoveredAlpha;
+    property public final float pressedAlpha;
+  }
+
+  public final class RippleAnimationKt {
+  }
+
+  public final class RippleKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.Indication rememberRipple(optional boolean bounded, optional float radius, optional long color);
+  }
+
+  public interface RippleTheme {
+    method @androidx.compose.runtime.Composable public long defaultColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ripple.RippleAlpha rippleAlpha();
+    field public static final androidx.compose.material.ripple.RippleTheme.Companion Companion;
+  }
+
+  public static final class RippleTheme.Companion {
+    method public androidx.compose.material.ripple.RippleAlpha defaultRippleAlpha(long contentColor, boolean lightTheme);
+    method public long defaultRippleColor(long contentColor, boolean lightTheme);
+  }
+
+  public final class RippleThemeKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> LocalRippleTheme;
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/compose/material/material-ripple/api/res-1.3.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/material/material-ripple/api/res-1.3.0-beta01.txt
diff --git a/compose/material/material-ripple/api/restricted_1.3.0-beta01.txt b/compose/material/material-ripple/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..32f4093
--- /dev/null
+++ b/compose/material/material-ripple/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,40 @@
+// Signature format: 4.0
+package androidx.compose.material.ripple {
+
+  @androidx.compose.runtime.Immutable public final class RippleAlpha {
+    ctor public RippleAlpha(float draggedAlpha, float focusedAlpha, float hoveredAlpha, float pressedAlpha);
+    method public float getDraggedAlpha();
+    method public float getFocusedAlpha();
+    method public float getHoveredAlpha();
+    method public float getPressedAlpha();
+    property public final float draggedAlpha;
+    property public final float focusedAlpha;
+    property public final float hoveredAlpha;
+    property public final float pressedAlpha;
+  }
+
+  public final class RippleAnimationKt {
+  }
+
+  public final class RippleKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.Indication rememberRipple(optional boolean bounded, optional float radius, optional long color);
+  }
+
+  public interface RippleTheme {
+    method @androidx.compose.runtime.Composable public long defaultColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ripple.RippleAlpha rippleAlpha();
+    field public static final androidx.compose.material.ripple.RippleTheme.Companion Companion;
+  }
+
+  public static final class RippleTheme.Companion {
+    method public androidx.compose.material.ripple.RippleAlpha defaultRippleAlpha(long contentColor, boolean lightTheme);
+    method public long defaultRippleColor(long contentColor, boolean lightTheme);
+  }
+
+  public final class RippleThemeKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> LocalRippleTheme;
+  }
+
+}
+
diff --git a/compose/material/material/api/1.3.0-beta01.txt b/compose/material/material/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..e6190b3
--- /dev/null
+++ b/compose/material/material/api/1.3.0-beta01.txt
@@ -0,0 +1,680 @@
+// Signature format: 4.0
+package androidx.compose.material {
+
+  public final class AlertDialogKt {
+  }
+
+  public final class AndroidAlertDialog_androidKt {
+    method @androidx.compose.runtime.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> confirmButton, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? dismissButton, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.window.DialogProperties properties);
+    method @androidx.compose.runtime.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> buttons, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.window.DialogProperties properties);
+  }
+
+  public final class AndroidMenu_androidKt {
+    method @androidx.compose.runtime.Composable public static void DropdownMenu(boolean expanded, kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.Modifier modifier, optional long offset, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void DropdownMenuItem(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  public final class AppBarDefaults {
+    method public float getBottomAppBarElevation();
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getTopAppBarElevation();
+    property public final float BottomAppBarElevation;
+    property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
+    property public final float TopAppBarElevation;
+    field public static final androidx.compose.material.AppBarDefaults INSTANCE;
+  }
+
+  public final class AppBarKt {
+    method @androidx.compose.runtime.Composable public static void BottomAppBar(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.graphics.Shape? cutoutShape, optional float elevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional long backgroundColor, optional long contentColor, optional float elevation);
+    method @androidx.compose.runtime.Composable public static void TopAppBar(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float elevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  public final class BackdropScaffoldDefaults {
+    method public float getFrontLayerElevation();
+    method @androidx.compose.runtime.Composable public long getFrontLayerScrimColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getFrontLayerShape();
+    method public float getHeaderHeight();
+    method public float getPeekHeight();
+    property public final float FrontLayerElevation;
+    property public final float HeaderHeight;
+    property public final float PeekHeight;
+    property @androidx.compose.runtime.Composable public final long frontLayerScrimColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape frontLayerShape;
+    field public static final androidx.compose.material.BackdropScaffoldDefaults INSTANCE;
+  }
+
+  public final class BackdropScaffoldKt {
+  }
+
+  public final class BadgeKt {
+    method @androidx.compose.runtime.Composable public static void Badge(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? content);
+    method @androidx.compose.runtime.Composable public static void BadgedBox(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> badge, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+  }
+
+  public final class BottomNavigationDefaults {
+    method public float getElevation();
+    property public final float Elevation;
+    field public static final androidx.compose.material.BottomNavigationDefaults INSTANCE;
+  }
+
+  public final class BottomNavigationKt {
+    method @androidx.compose.runtime.Composable public static void BottomNavigation(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float elevation, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void BottomNavigationItem(androidx.compose.foundation.layout.RowScope, boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+  }
+
+  public final class BottomSheetScaffoldDefaults {
+    method public float getSheetElevation();
+    method public float getSheetPeekHeight();
+    property public final float SheetElevation;
+    property public final float SheetPeekHeight;
+    field public static final androidx.compose.material.BottomSheetScaffoldDefaults INSTANCE;
+  }
+
+  public final class BottomSheetScaffoldKt {
+  }
+
+  @androidx.compose.runtime.Stable public interface ButtonColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> backgroundColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled);
+  }
+
+  public final class ButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors buttonColors(optional long backgroundColor, optional long contentColor, optional long disabledBackgroundColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float disabledElevation, optional float hoveredElevation, optional float focusedElevation);
+    method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material.ButtonElevation! elevation(optional float defaultElevation, optional float pressedElevation, optional float disabledElevation);
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getIconSize();
+    method public float getIconSpacing();
+    method public float getMinHeight();
+    method public float getMinWidth();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke getOutlinedBorder();
+    method public float getOutlinedBorderSize();
+    method public androidx.compose.foundation.layout.PaddingValues getTextButtonContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors outlinedButtonColors(optional long backgroundColor, optional long contentColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors textButtonColors(optional long backgroundColor, optional long contentColor, optional long disabledContentColor);
+    property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
+    property public final float IconSize;
+    property public final float IconSpacing;
+    property public final float MinHeight;
+    property public final float MinWidth;
+    property public final float OutlinedBorderSize;
+    property public final androidx.compose.foundation.layout.PaddingValues TextButtonContentPadding;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.BorderStroke outlinedBorder;
+    field public static final androidx.compose.material.ButtonDefaults INSTANCE;
+    field public static final float OutlinedBorderOpacity = 0.12f;
+  }
+
+  @androidx.compose.runtime.Stable public interface ButtonElevation {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> elevation(boolean enabled, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  }
+
+  public final class ButtonKt {
+    method @androidx.compose.runtime.Composable public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable @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);
+  }
+
+  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);
+    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 DragGestureDetectorCopyKt {
+  }
+
+  public final class DrawerDefaults {
+    method public float getElevation();
+    method @androidx.compose.runtime.Composable public long getScrimColor();
+    property public final float Elevation;
+    property @androidx.compose.runtime.Composable public final long scrimColor;
+    field public static final androidx.compose.material.DrawerDefaults INSTANCE;
+    field public static final float ScrimOpacity = 0.32f;
+  }
+
+  public final class DrawerKt {
+    method @androidx.compose.runtime.Composable public static void ModalDrawer(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> drawerContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.DrawerState drawerState, optional boolean gesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long scrimColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static androidx.compose.material.DrawerState rememberDrawerState(androidx.compose.material.DrawerValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.DrawerValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  @androidx.compose.runtime.Stable public final class DrawerState {
+    ctor public DrawerState(androidx.compose.material.DrawerValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.DrawerValue,java.lang.Boolean> confirmStateChange);
+    method public suspend Object? close(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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>);
+    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 final class ElevationKt {
+  }
+
+  public interface ElevationOverlay {
+    method @androidx.compose.runtime.Composable public long apply(long color, float elevation);
+  }
+
+  public final class ElevationOverlayKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteElevation();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> getLocalElevationOverlay();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> LocalAbsoluteElevation;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> LocalElevationOverlay;
+  }
+
+  public final class ExposedDropdownMenuKt {
+  }
+
+  @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 ListItemKt {
+  }
+
+  public final class MaterialTextSelectionColorsKt {
+  }
+
+  public final class MaterialTheme {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material.Colors getColors();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material.Shapes getShapes();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material.Typography getTypography();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material.Colors colors;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material.Shapes shapes;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material.Typography typography;
+    field public static final androidx.compose.material.MaterialTheme INSTANCE;
+  }
+
+  public final class MaterialThemeKt {
+    method @androidx.compose.runtime.Composable public static void MaterialTheme(optional androidx.compose.material.Colors colors, optional androidx.compose.material.Typography typography, optional androidx.compose.material.Shapes shapes, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class MaterialTheme_androidKt {
+  }
+
+  public final class MenuDefaults {
+    method public androidx.compose.foundation.layout.PaddingValues getDropdownMenuItemContentPadding();
+    property public final androidx.compose.foundation.layout.PaddingValues DropdownMenuItemContentPadding;
+    field public static final androidx.compose.material.MenuDefaults INSTANCE;
+  }
+
+  public final class MenuKt {
+  }
+
+  public final class ModalBottomSheetDefaults {
+    method public float getElevation();
+    method @androidx.compose.runtime.Composable public long getScrimColor();
+    property public final float Elevation;
+    property @androidx.compose.runtime.Composable public final long scrimColor;
+    field public static final androidx.compose.material.ModalBottomSheetDefaults INSTANCE;
+  }
+
+  public final class ModalBottomSheetKt {
+  }
+
+  public final class NavigationRailDefaults {
+    method public float getElevation();
+    property public final float Elevation;
+    field public static final androidx.compose.material.NavigationRailDefaults INSTANCE;
+  }
+
+  public final class NavigationRailKt {
+    method @androidx.compose.runtime.Composable public static void NavigationRail(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float elevation, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? header, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void NavigationRailItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+  }
+
+  public final class OutlinedTextFieldKt {
+    method @androidx.compose.runtime.Composable public static void OutlinedTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+    method @androidx.compose.runtime.Composable public static void OutlinedTextField(androidx.compose.ui.text.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.TextFieldValue,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+  }
+
+  public final class ProgressIndicatorDefaults {
+    method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getProgressAnimationSpec();
+    method public float getStrokeWidth();
+    property public final androidx.compose.animation.core.SpringSpec<java.lang.Float> ProgressAnimationSpec;
+    property public final float StrokeWidth;
+    field public static final androidx.compose.material.ProgressIndicatorDefaults INSTANCE;
+    field public static final float IndicatorBackgroundOpacity = 0.24f;
+  }
+
+  public final class ProgressIndicatorKt {
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor);
+  }
+
+  @androidx.compose.runtime.Stable public interface RadioButtonColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> radioColor(boolean enabled, boolean selected);
+  }
+
+  public final class RadioButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.RadioButtonColors colors(optional long selectedColor, optional long unselectedColor, optional long disabledColor);
+    field public static final androidx.compose.material.RadioButtonDefaults INSTANCE;
+  }
+
+  public final class RadioButtonKt {
+    method @androidx.compose.runtime.Composable public static void RadioButton(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.RadioButtonColors colors);
+  }
+
+  @androidx.compose.runtime.Immutable public final class ResistanceConfig {
+    ctor public ResistanceConfig(float basis, optional float factorAtMin, optional float factorAtMax);
+    method public float computeResistance(float overflow);
+    method public float getBasis();
+    method public float getFactorAtMax();
+    method public float getFactorAtMin();
+    property public final float basis;
+    property public final float factorAtMax;
+    property public final float factorAtMin;
+  }
+
+  public final class ScaffoldKt {
+    method @androidx.compose.runtime.Composable public static void Scaffold(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.ScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional int floatingActionButtonPosition, optional boolean isFloatingActionButtonDocked, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long drawerScrimColor, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static androidx.compose.material.ScaffoldState rememberScaffoldState(optional androidx.compose.material.DrawerState drawerState, optional androidx.compose.material.SnackbarHostState snackbarHostState);
+  }
+
+  @androidx.compose.runtime.Stable public final class ScaffoldState {
+    ctor public ScaffoldState(androidx.compose.material.DrawerState drawerState, androidx.compose.material.SnackbarHostState snackbarHostState);
+    method public androidx.compose.material.DrawerState getDrawerState();
+    method public androidx.compose.material.SnackbarHostState getSnackbarHostState();
+    property public final androidx.compose.material.DrawerState drawerState;
+    property public final androidx.compose.material.SnackbarHostState snackbarHostState;
+  }
+
+  @androidx.compose.runtime.Immutable public final class Shapes {
+    ctor public Shapes(optional androidx.compose.foundation.shape.CornerBasedShape small, optional androidx.compose.foundation.shape.CornerBasedShape medium, optional androidx.compose.foundation.shape.CornerBasedShape large);
+    method public androidx.compose.material.Shapes copy(optional androidx.compose.foundation.shape.CornerBasedShape small, optional androidx.compose.foundation.shape.CornerBasedShape medium, optional androidx.compose.foundation.shape.CornerBasedShape large);
+    method public androidx.compose.foundation.shape.CornerBasedShape getLarge();
+    method public androidx.compose.foundation.shape.CornerBasedShape getMedium();
+    method public androidx.compose.foundation.shape.CornerBasedShape getSmall();
+    property public final androidx.compose.foundation.shape.CornerBasedShape large;
+    property public final androidx.compose.foundation.shape.CornerBasedShape medium;
+    property public final androidx.compose.foundation.shape.CornerBasedShape small;
+  }
+
+  public final class ShapesKt {
+  }
+
+  @androidx.compose.runtime.Stable public interface SliderColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> thumbColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> tickColor(boolean enabled, boolean active);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trackColor(boolean enabled, boolean active);
+  }
+
+  public final class SliderDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.SliderColors colors(optional long thumbColor, optional long disabledThumbColor, optional long activeTrackColor, optional long inactiveTrackColor, optional long disabledActiveTrackColor, optional long disabledInactiveTrackColor, optional long activeTickColor, optional long inactiveTickColor, optional long disabledActiveTickColor, optional long disabledInactiveTickColor);
+    field public static final float DisabledActiveTrackAlpha = 0.32f;
+    field public static final float DisabledInactiveTrackAlpha = 0.12f;
+    field public static final float DisabledTickAlpha = 0.12f;
+    field public static final androidx.compose.material.SliderDefaults INSTANCE;
+    field public static final float InactiveTrackAlpha = 0.24f;
+    field public static final float TickAlpha = 0.54f;
+  }
+
+  public final class SliderKt {
+    method @androidx.compose.runtime.Composable public static void Slider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional int steps, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onValueChangeFinished, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.SliderColors colors);
+  }
+
+  public interface SnackbarData {
+    method public void dismiss();
+    method public String? getActionLabel();
+    method public androidx.compose.material.SnackbarDuration getDuration();
+    method public String getMessage();
+    method public void performAction();
+    property public abstract String? actionLabel;
+    property public abstract androidx.compose.material.SnackbarDuration duration;
+    property public abstract String message;
+  }
+
+  public final class SnackbarDefaults {
+    method @androidx.compose.runtime.Composable public long getBackgroundColor();
+    method @androidx.compose.runtime.Composable public long getPrimaryActionColor();
+    property @androidx.compose.runtime.Composable public final long backgroundColor;
+    property @androidx.compose.runtime.Composable public final long primaryActionColor;
+    field public static final androidx.compose.material.SnackbarDefaults INSTANCE;
+  }
+
+  public enum SnackbarDuration {
+    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 Strings_androidKt {
+  }
+
+  public final class SurfaceKt {
+    method @androidx.compose.runtime.Composable public static void Surface(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional androidx.compose.foundation.BorderStroke? border, optional float elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class SwipeToDismissKt {
+  }
+
+  public final class SwipeableDefaults {
+    method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getAnimationSpec();
+    method public float getVelocityThreshold();
+    method public androidx.compose.material.ResistanceConfig? resistanceConfig(java.util.Set<java.lang.Float> anchors, optional float factorAtMin, optional float factorAtMax);
+    property public final androidx.compose.animation.core.SpringSpec<java.lang.Float> AnimationSpec;
+    property public final float VelocityThreshold;
+    field public static final androidx.compose.material.SwipeableDefaults INSTANCE;
+    field public static final float StandardResistanceFactor = 10.0f;
+    field public static final float StiffResistanceFactor = 20.0f;
+  }
+
+  public final class SwipeableKt {
+  }
+
+  @androidx.compose.runtime.Stable public interface SwitchColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> thumbColor(boolean enabled, boolean checked);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trackColor(boolean enabled, boolean checked);
+  }
+
+  public final class SwitchDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.SwitchColors colors(optional long checkedThumbColor, optional long checkedTrackColor, optional float checkedTrackAlpha, optional long uncheckedThumbColor, optional long uncheckedTrackColor, optional float uncheckedTrackAlpha, optional long disabledCheckedThumbColor, optional long disabledCheckedTrackColor, optional long disabledUncheckedThumbColor, optional long disabledUncheckedTrackColor);
+    field public static final androidx.compose.material.SwitchDefaults INSTANCE;
+  }
+
+  public final class SwitchKt {
+    method @androidx.compose.runtime.Composable public static void Switch(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.SwitchColors colors);
+  }
+
+  public final class TabKt {
+    method @androidx.compose.runtime.Composable public static void LeadingIconTab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TabPosition {
+    method public float getLeft();
+    method public float getRight();
+    method public float getWidth();
+    property public final float left;
+    property public final float right;
+    property public final float width;
+  }
+
+  public final class TabRowDefaults {
+    method @androidx.compose.runtime.Composable public void Divider(optional androidx.compose.ui.Modifier modifier, optional float thickness, optional long color);
+    method @androidx.compose.runtime.Composable public void Indicator(optional androidx.compose.ui.Modifier modifier, optional float height, optional long color);
+    method public float getDividerThickness();
+    method public float getIndicatorHeight();
+    method public float getScrollableTabRowPadding();
+    method public androidx.compose.ui.Modifier tabIndicatorOffset(androidx.compose.ui.Modifier, androidx.compose.material.TabPosition currentTabPosition);
+    property public final float DividerThickness;
+    property public final float IndicatorHeight;
+    property public final float ScrollableTabRowPadding;
+    field public static final float DividerOpacity = 0.12f;
+    field public static final androidx.compose.material.TabRowDefaults INSTANCE;
+  }
+
+  public final class TabRowKt {
+    method @androidx.compose.runtime.Composable @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 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 androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+    method @androidx.compose.runtime.Composable public static void TextField(androidx.compose.ui.text.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.TextFieldValue,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+  }
+
+  public final class TextKt {
+    method @androidx.compose.runtime.Composable public static void ProvideTextStyle(androidx.compose.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
+    method @androidx.compose.runtime.Composable public static void Text(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.Map<java.lang.String,androidx.compose.foundation.text.InlineTextContent> inlineContent, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> getLocalTextStyle();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> LocalTextStyle;
+  }
+
+  public final class TouchTargetKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class Typography {
+    ctor public Typography(optional androidx.compose.ui.text.font.FontFamily defaultFontFamily, optional androidx.compose.ui.text.TextStyle h1, optional androidx.compose.ui.text.TextStyle h2, optional androidx.compose.ui.text.TextStyle h3, optional androidx.compose.ui.text.TextStyle h4, optional androidx.compose.ui.text.TextStyle h5, optional androidx.compose.ui.text.TextStyle h6, optional androidx.compose.ui.text.TextStyle subtitle1, optional androidx.compose.ui.text.TextStyle subtitle2, optional androidx.compose.ui.text.TextStyle body1, optional androidx.compose.ui.text.TextStyle body2, optional androidx.compose.ui.text.TextStyle button, optional androidx.compose.ui.text.TextStyle caption, optional androidx.compose.ui.text.TextStyle overline);
+    method public androidx.compose.material.Typography copy(optional androidx.compose.ui.text.TextStyle h1, optional androidx.compose.ui.text.TextStyle h2, optional androidx.compose.ui.text.TextStyle h3, optional androidx.compose.ui.text.TextStyle h4, optional androidx.compose.ui.text.TextStyle h5, optional androidx.compose.ui.text.TextStyle h6, optional androidx.compose.ui.text.TextStyle subtitle1, optional androidx.compose.ui.text.TextStyle subtitle2, optional androidx.compose.ui.text.TextStyle body1, optional androidx.compose.ui.text.TextStyle body2, optional androidx.compose.ui.text.TextStyle button, optional androidx.compose.ui.text.TextStyle caption, optional androidx.compose.ui.text.TextStyle overline);
+    method public androidx.compose.ui.text.TextStyle getBody1();
+    method public androidx.compose.ui.text.TextStyle getBody2();
+    method public androidx.compose.ui.text.TextStyle getButton();
+    method public androidx.compose.ui.text.TextStyle getCaption();
+    method public androidx.compose.ui.text.TextStyle getH1();
+    method public androidx.compose.ui.text.TextStyle getH2();
+    method public androidx.compose.ui.text.TextStyle getH3();
+    method public androidx.compose.ui.text.TextStyle getH4();
+    method public androidx.compose.ui.text.TextStyle getH5();
+    method public androidx.compose.ui.text.TextStyle getH6();
+    method public androidx.compose.ui.text.TextStyle getOverline();
+    method public androidx.compose.ui.text.TextStyle getSubtitle1();
+    method public androidx.compose.ui.text.TextStyle getSubtitle2();
+    property public final androidx.compose.ui.text.TextStyle body1;
+    property public final androidx.compose.ui.text.TextStyle body2;
+    property public final androidx.compose.ui.text.TextStyle button;
+    property public final androidx.compose.ui.text.TextStyle caption;
+    property public final androidx.compose.ui.text.TextStyle h1;
+    property public final androidx.compose.ui.text.TextStyle h2;
+    property public final androidx.compose.ui.text.TextStyle h3;
+    property public final androidx.compose.ui.text.TextStyle h4;
+    property public final androidx.compose.ui.text.TextStyle h5;
+    property public final androidx.compose.ui.text.TextStyle h6;
+    property public final androidx.compose.ui.text.TextStyle overline;
+    property public final androidx.compose.ui.text.TextStyle subtitle1;
+    property public final androidx.compose.ui.text.TextStyle subtitle2;
+  }
+
+  public final class TypographyKt {
+  }
+
+}
+
+package androidx.compose.material.internal {
+
+  public final class ExposedDropdownMenuPopupKt {
+  }
+
+}
+
diff --git a/compose/material/material/api/public_plus_experimental_1.3.0-beta01.txt b/compose/material/material/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..a673591
--- /dev/null
+++ b/compose/material/material/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,945 @@
+// Signature format: 4.0
+package androidx.compose.material {
+
+  public final class AlertDialogKt {
+  }
+
+  public final class AndroidAlertDialog_androidKt {
+    method @androidx.compose.runtime.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> confirmButton, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? dismissButton, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.window.DialogProperties properties);
+    method @androidx.compose.runtime.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> buttons, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.window.DialogProperties properties);
+  }
+
+  public final class AndroidMenu_androidKt {
+    method @androidx.compose.runtime.Composable public static void DropdownMenu(boolean expanded, kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.Modifier modifier, optional long offset, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void DropdownMenuItem(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  public final class AppBarDefaults {
+    method public float getBottomAppBarElevation();
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getTopAppBarElevation();
+    property public final float BottomAppBarElevation;
+    property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
+    property public final float TopAppBarElevation;
+    field public static final androidx.compose.material.AppBarDefaults INSTANCE;
+  }
+
+  public final class AppBarKt {
+    method @androidx.compose.runtime.Composable public static void BottomAppBar(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.graphics.Shape? cutoutShape, optional float elevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional long backgroundColor, optional long contentColor, optional float elevation);
+    method @androidx.compose.runtime.Composable public static void TopAppBar(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float elevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  public final class BackdropScaffoldDefaults {
+    method public float getFrontLayerElevation();
+    method @androidx.compose.runtime.Composable public long getFrontLayerScrimColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getFrontLayerShape();
+    method public float getHeaderHeight();
+    method public float getPeekHeight();
+    property public final float FrontLayerElevation;
+    property public final float HeaderHeight;
+    property public final float PeekHeight;
+    property @androidx.compose.runtime.Composable public final long frontLayerScrimColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape frontLayerShape;
+    field public static final androidx.compose.material.BackdropScaffoldDefaults INSTANCE;
+  }
+
+  public final class BackdropScaffoldKt {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void BackdropScaffold(kotlin.jvm.functions.Function0<kotlin.Unit> appBar, kotlin.jvm.functions.Function0<kotlin.Unit> backLayerContent, kotlin.jvm.functions.Function0<kotlin.Unit> frontLayerContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.BackdropScaffoldState scaffoldState, optional boolean gesturesEnabled, optional float peekHeight, optional float headerHeight, optional boolean persistentAppBar, optional boolean stickyFrontLayer, optional long backLayerBackgroundColor, optional long backLayerContentColor, optional androidx.compose.ui.graphics.Shape frontLayerShape, optional float frontLayerElevation, optional long frontLayerBackgroundColor, optional long frontLayerContentColor, optional long frontLayerScrimColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost);
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static androidx.compose.material.BackdropScaffoldState rememberBackdropScaffoldState(androidx.compose.material.BackdropValue initialValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.BackdropValue,java.lang.Boolean> confirmStateChange, optional androidx.compose.material.SnackbarHostState snackbarHostState);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Stable public final class BackdropScaffoldState extends androidx.compose.material.SwipeableState<androidx.compose.material.BackdropValue> {
+    ctor public BackdropScaffoldState(androidx.compose.material.BackdropValue initialValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.BackdropValue,java.lang.Boolean> confirmStateChange, optional androidx.compose.material.SnackbarHostState snackbarHostState);
+    method public suspend Object? conceal(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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 @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static androidx.compose.material.BottomSheetScaffoldState rememberBottomSheetScaffoldState(optional androidx.compose.material.DrawerState drawerState, optional androidx.compose.material.BottomSheetState bottomSheetState, optional androidx.compose.material.SnackbarHostState snackbarHostState);
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static androidx.compose.material.BottomSheetState rememberBottomSheetState(androidx.compose.material.BottomSheetValue initialValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.BottomSheetValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Stable public final class BottomSheetScaffoldState {
+    ctor public BottomSheetScaffoldState(androidx.compose.material.DrawerState drawerState, androidx.compose.material.BottomSheetState bottomSheetState, androidx.compose.material.SnackbarHostState snackbarHostState);
+    method public androidx.compose.material.BottomSheetState getBottomSheetState();
+    method public androidx.compose.material.DrawerState getDrawerState();
+    method public androidx.compose.material.SnackbarHostState getSnackbarHostState();
+    property public final androidx.compose.material.BottomSheetState bottomSheetState;
+    property public final androidx.compose.material.DrawerState drawerState;
+    property public final androidx.compose.material.SnackbarHostState snackbarHostState;
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Stable public final class BottomSheetState extends androidx.compose.material.SwipeableState<androidx.compose.material.BottomSheetValue> {
+    ctor public BottomSheetState(androidx.compose.material.BottomSheetValue initialValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.BottomSheetValue,java.lang.Boolean> confirmStateChange);
+    method public suspend Object? collapse(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public suspend Object? expand(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public boolean isCollapsed();
+    method public boolean isExpanded();
+    property public final boolean isCollapsed;
+    property public final boolean isExpanded;
+    field public static final androidx.compose.material.BottomSheetState.Companion Companion;
+  }
+
+  public static final class BottomSheetState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.material.BottomSheetState,?> Saver(androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, kotlin.jvm.functions.Function1<? super androidx.compose.material.BottomSheetValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi public enum BottomSheetValue {
+    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 DragGestureDetectorCopyKt {
+  }
+
+  public final class DrawerDefaults {
+    method public float getElevation();
+    method @androidx.compose.runtime.Composable public long getScrimColor();
+    property public final float Elevation;
+    property @androidx.compose.runtime.Composable public final long scrimColor;
+    field public static final androidx.compose.material.DrawerDefaults INSTANCE;
+    field public static final float ScrimOpacity = 0.32f;
+  }
+
+  public final class DrawerKt {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void BottomDrawer(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> drawerContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.BottomDrawerState drawerState, optional boolean gesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long scrimColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void ModalDrawer(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> drawerContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.DrawerState drawerState, optional boolean gesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long scrimColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static androidx.compose.material.BottomDrawerState rememberBottomDrawerState(androidx.compose.material.BottomDrawerValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.BottomDrawerValue,java.lang.Boolean> confirmStateChange);
+    method @androidx.compose.runtime.Composable public static androidx.compose.material.DrawerState rememberDrawerState(androidx.compose.material.DrawerValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.DrawerValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  @androidx.compose.runtime.Stable public final class DrawerState {
+    ctor public DrawerState(androidx.compose.material.DrawerValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.DrawerValue,java.lang.Boolean> confirmStateChange);
+    method @androidx.compose.material.ExperimentalMaterialApi public suspend Object? animateTo(androidx.compose.material.DrawerValue targetValue, androidx.compose.animation.core.AnimationSpec<java.lang.Float> anim, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public suspend Object? close(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public androidx.compose.material.DrawerValue getCurrentValue();
+    method @androidx.compose.material.ExperimentalMaterialApi public androidx.compose.runtime.State<java.lang.Float> getOffset();
+    method @androidx.compose.material.ExperimentalMaterialApi public androidx.compose.material.DrawerValue getTargetValue();
+    method public boolean isAnimationRunning();
+    method public boolean isClosed();
+    method public boolean isOpen();
+    method public suspend Object? open(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method @androidx.compose.material.ExperimentalMaterialApi 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 androidx.compose.runtime.State<java.lang.Float> offset;
+    property @androidx.compose.material.ExperimentalMaterialApi public final androidx.compose.material.DrawerValue targetValue;
+    field public static final androidx.compose.material.DrawerState.Companion Companion;
+  }
+
+  public static final class DrawerState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.material.DrawerState,androidx.compose.material.DrawerValue> Saver(kotlin.jvm.functions.Function1<? super androidx.compose.material.DrawerValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  public enum DrawerValue {
+    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 final class ElevationKt {
+  }
+
+  public interface ElevationOverlay {
+    method @androidx.compose.runtime.Composable public long apply(long color, float elevation);
+  }
+
+  public final class ElevationOverlayKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteElevation();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> getLocalElevationOverlay();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> LocalAbsoluteElevation;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> LocalElevationOverlay;
+  }
+
+  @kotlin.RequiresOptIn(message="This material API is experimental and is likely to change or to be removed in" + " the future.") public @interface ExperimentalMaterialApi {
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi public interface ExposedDropdownMenuBoxScope {
+    method @androidx.compose.runtime.Composable public default void ExposedDropdownMenu(boolean expanded, kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method public androidx.compose.ui.Modifier exposedDropdownSize(androidx.compose.ui.Modifier, optional boolean matchTextFieldWidth);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi public final class ExposedDropdownMenuDefaults {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public void TrailingIcon(boolean expanded, optional kotlin.jvm.functions.Function0<kotlin.Unit> onIconClick);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.TextFieldColors outlinedTextFieldColors(optional long textColor, optional long disabledTextColor, optional long backgroundColor, optional long cursorColor, optional long errorCursorColor, optional long focusedBorderColor, optional long unfocusedBorderColor, optional long disabledBorderColor, optional long errorBorderColor, optional long leadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long trailingIconColor, optional long focusedTrailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long placeholderColor, optional long disabledPlaceholderColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.TextFieldColors textFieldColors(optional long textColor, optional long disabledTextColor, optional long backgroundColor, optional long cursorColor, optional long errorCursorColor, optional long focusedIndicatorColor, optional long unfocusedIndicatorColor, optional long disabledIndicatorColor, optional long errorIndicatorColor, optional long leadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long trailingIconColor, optional long focusedTrailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long placeholderColor, optional long disabledPlaceholderColor);
+    field public static final androidx.compose.material.ExposedDropdownMenuDefaults INSTANCE;
+  }
+
+  public final class ExposedDropdownMenuKt {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void ExposedDropdownMenuBox(boolean expanded, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onExpandedChange, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.material.ExposedDropdownMenuBoxScope,kotlin.Unit> content);
+  }
+
+  @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 ListItemKt {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void ListItem(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? secondaryText, optional boolean singleLineSecondaryText, optional kotlin.jvm.functions.Function0<kotlin.Unit>? overlineText, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailing, kotlin.jvm.functions.Function0<kotlin.Unit> text);
+  }
+
+  public final class MaterialTextSelectionColorsKt {
+  }
+
+  public final class MaterialTheme {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material.Colors getColors();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material.Shapes getShapes();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material.Typography getTypography();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material.Colors colors;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material.Shapes shapes;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material.Typography typography;
+    field public static final androidx.compose.material.MaterialTheme INSTANCE;
+  }
+
+  public final class MaterialThemeKt {
+    method @androidx.compose.runtime.Composable public static void MaterialTheme(optional androidx.compose.material.Colors colors, optional androidx.compose.material.Typography typography, optional androidx.compose.material.Shapes shapes, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class MaterialTheme_androidKt {
+  }
+
+  public final class MenuDefaults {
+    method public androidx.compose.foundation.layout.PaddingValues getDropdownMenuItemContentPadding();
+    property public final androidx.compose.foundation.layout.PaddingValues DropdownMenuItemContentPadding;
+    field public static final androidx.compose.material.MenuDefaults INSTANCE;
+  }
+
+  public final class MenuKt {
+  }
+
+  public final class ModalBottomSheetDefaults {
+    method public float getElevation();
+    method @androidx.compose.runtime.Composable public long getScrimColor();
+    property public final float Elevation;
+    property @androidx.compose.runtime.Composable public final long scrimColor;
+    field public static final androidx.compose.material.ModalBottomSheetDefaults INSTANCE;
+  }
+
+  public final class ModalBottomSheetKt {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void ModalBottomSheetLayout(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> sheetContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.ModalBottomSheetState sheetState, optional androidx.compose.ui.graphics.Shape sheetShape, optional float sheetElevation, optional long sheetBackgroundColor, optional long sheetContentColor, optional long scrimColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static androidx.compose.material.ModalBottomSheetState rememberModalBottomSheetState(androidx.compose.material.ModalBottomSheetValue initialValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, boolean skipHalfExpanded, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.ModalBottomSheetValue,java.lang.Boolean> confirmStateChange);
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static androidx.compose.material.ModalBottomSheetState rememberModalBottomSheetState(androidx.compose.material.ModalBottomSheetValue initialValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.ModalBottomSheetValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi public final class ModalBottomSheetState extends androidx.compose.material.SwipeableState<androidx.compose.material.ModalBottomSheetValue> {
+    ctor public ModalBottomSheetState(androidx.compose.material.ModalBottomSheetValue initialValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, boolean isSkipHalfExpanded, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.ModalBottomSheetValue,java.lang.Boolean> confirmStateChange);
+    ctor public ModalBottomSheetState(androidx.compose.material.ModalBottomSheetValue initialValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.ModalBottomSheetValue,java.lang.Boolean> confirmStateChange);
+    method public suspend Object? hide(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public boolean isVisible();
+    method public suspend Object? show(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    property public final boolean isVisible;
+    field public static final androidx.compose.material.ModalBottomSheetState.Companion Companion;
+  }
+
+  public static final class ModalBottomSheetState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.material.ModalBottomSheetState,?> Saver(androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, boolean skipHalfExpanded, kotlin.jvm.functions.Function1<? super androidx.compose.material.ModalBottomSheetValue,java.lang.Boolean> confirmStateChange);
+    method @Deprecated public androidx.compose.runtime.saveable.Saver<androidx.compose.material.ModalBottomSheetState,?> Saver(androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, kotlin.jvm.functions.Function1<? super androidx.compose.material.ModalBottomSheetValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi public enum ModalBottomSheetValue {
+    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 androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+    method @androidx.compose.runtime.Composable public static void OutlinedTextField(androidx.compose.ui.text.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.TextFieldValue,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+  }
+
+  public final class ProgressIndicatorDefaults {
+    method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getProgressAnimationSpec();
+    method public float getStrokeWidth();
+    property public final androidx.compose.animation.core.SpringSpec<java.lang.Float> ProgressAnimationSpec;
+    property public final float StrokeWidth;
+    field public static final androidx.compose.material.ProgressIndicatorDefaults INSTANCE;
+    field public static final float IndicatorBackgroundOpacity = 0.24f;
+  }
+
+  public final class ProgressIndicatorKt {
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor);
+  }
+
+  @androidx.compose.runtime.Stable public interface RadioButtonColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> radioColor(boolean enabled, boolean selected);
+  }
+
+  public final class RadioButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.RadioButtonColors colors(optional long selectedColor, optional long unselectedColor, optional long disabledColor);
+    field public static final androidx.compose.material.RadioButtonDefaults INSTANCE;
+  }
+
+  public final class RadioButtonKt {
+    method @androidx.compose.runtime.Composable public static void RadioButton(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.RadioButtonColors colors);
+  }
+
+  @androidx.compose.runtime.Immutable public final class ResistanceConfig {
+    ctor public ResistanceConfig(float basis, optional float factorAtMin, optional float factorAtMax);
+    method public float computeResistance(float overflow);
+    method public float getBasis();
+    method public float getFactorAtMax();
+    method public float getFactorAtMin();
+    property public final float basis;
+    property public final float factorAtMax;
+    property public final float factorAtMin;
+  }
+
+  public final class ScaffoldKt {
+    method @androidx.compose.runtime.Composable public static void Scaffold(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.ScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional int floatingActionButtonPosition, optional boolean isFloatingActionButtonDocked, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long drawerScrimColor, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static androidx.compose.material.ScaffoldState rememberScaffoldState(optional androidx.compose.material.DrawerState drawerState, optional androidx.compose.material.SnackbarHostState snackbarHostState);
+  }
+
+  @androidx.compose.runtime.Stable public final class ScaffoldState {
+    ctor public ScaffoldState(androidx.compose.material.DrawerState drawerState, androidx.compose.material.SnackbarHostState snackbarHostState);
+    method public androidx.compose.material.DrawerState getDrawerState();
+    method public androidx.compose.material.SnackbarHostState getSnackbarHostState();
+    property public final androidx.compose.material.DrawerState drawerState;
+    property public final androidx.compose.material.SnackbarHostState snackbarHostState;
+  }
+
+  @androidx.compose.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;
+  }
+
+  public final class ShapesKt {
+  }
+
+  @androidx.compose.runtime.Stable public interface SliderColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> thumbColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> tickColor(boolean enabled, boolean active);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trackColor(boolean enabled, boolean active);
+  }
+
+  public final class SliderDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.SliderColors colors(optional long thumbColor, optional long disabledThumbColor, optional long activeTrackColor, optional long inactiveTrackColor, optional long disabledActiveTrackColor, optional long disabledInactiveTrackColor, optional long activeTickColor, optional long inactiveTickColor, optional long disabledActiveTickColor, optional long disabledInactiveTickColor);
+    field public static final float DisabledActiveTrackAlpha = 0.32f;
+    field public static final float DisabledInactiveTrackAlpha = 0.12f;
+    field public static final float DisabledTickAlpha = 0.12f;
+    field public static final androidx.compose.material.SliderDefaults INSTANCE;
+    field public static final float InactiveTrackAlpha = 0.24f;
+    field public static final float TickAlpha = 0.54f;
+  }
+
+  public final class SliderKt {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void RangeSlider(kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> 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 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);
+    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 public final float direction;
+    property public final boolean isAnimationRunning;
+    property public final androidx.compose.runtime.State<java.lang.Float> offset;
+    property public final androidx.compose.runtime.State<java.lang.Float> overflow;
+    property public final androidx.compose.material.SwipeProgress<T> progress;
+    property public final T! targetValue;
+    field public static final androidx.compose.material.SwipeableState.Companion Companion;
+  }
+
+  public static final class SwipeableState.Companion {
+    method public <T> androidx.compose.runtime.saveable.Saver<androidx.compose.material.SwipeableState<T>,T> Saver(androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> confirmStateChange);
+  }
+
+  @androidx.compose.runtime.Stable public interface SwitchColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> thumbColor(boolean enabled, boolean checked);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trackColor(boolean enabled, boolean checked);
+  }
+
+  public final class SwitchDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.SwitchColors colors(optional long checkedThumbColor, optional long checkedTrackColor, optional float checkedTrackAlpha, optional long uncheckedThumbColor, optional long uncheckedTrackColor, optional float uncheckedTrackAlpha, optional long disabledCheckedThumbColor, optional long disabledCheckedTrackColor, optional long disabledUncheckedThumbColor, optional long disabledUncheckedTrackColor);
+    field public static final androidx.compose.material.SwitchDefaults INSTANCE;
+  }
+
+  public final class SwitchKt {
+    method @androidx.compose.runtime.Composable public static void Switch(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.SwitchColors colors);
+  }
+
+  public final class TabKt {
+    method @androidx.compose.runtime.Composable public static void LeadingIconTab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TabPosition {
+    method public float getLeft();
+    method public float getRight();
+    method public float getWidth();
+    property public final float left;
+    property public final float right;
+    property public final float width;
+  }
+
+  public final class TabRowDefaults {
+    method @androidx.compose.runtime.Composable public void Divider(optional androidx.compose.ui.Modifier modifier, optional float thickness, optional long color);
+    method @androidx.compose.runtime.Composable public void Indicator(optional androidx.compose.ui.Modifier modifier, optional float height, optional long color);
+    method public float getDividerThickness();
+    method public float getIndicatorHeight();
+    method public float getScrollableTabRowPadding();
+    method public androidx.compose.ui.Modifier tabIndicatorOffset(androidx.compose.ui.Modifier, androidx.compose.material.TabPosition currentTabPosition);
+    property public final float DividerThickness;
+    property public final float IndicatorHeight;
+    property public final float ScrollableTabRowPadding;
+    field public static final float DividerOpacity = 0.12f;
+    field public static final androidx.compose.material.TabRowDefaults INSTANCE;
+  }
+
+  public final class TabRowKt {
+    method @androidx.compose.runtime.Composable @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 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 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 androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+    method @androidx.compose.runtime.Composable public static void TextField(androidx.compose.ui.text.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.TextFieldValue,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+  }
+
+  public final class TextKt {
+    method @androidx.compose.runtime.Composable public static void ProvideTextStyle(androidx.compose.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
+    method @androidx.compose.runtime.Composable public static void Text(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.Map<java.lang.String,androidx.compose.foundation.text.InlineTextContent> inlineContent, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> getLocalTextStyle();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> LocalTextStyle;
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Stable public interface ThresholdConfig {
+    method public float computeThreshold(androidx.compose.ui.unit.Density, float fromValue, float toValue);
+  }
+
+  public final class TouchTargetKt {
+    method @androidx.compose.material.ExperimentalMaterialApi public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalMinimumTouchTargetEnforcement();
+    property @androidx.compose.material.ExperimentalMaterialApi public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> LocalMinimumTouchTargetEnforcement;
+  }
+
+  @androidx.compose.runtime.Immutable public final class Typography {
+    ctor public Typography(optional androidx.compose.ui.text.font.FontFamily defaultFontFamily, optional androidx.compose.ui.text.TextStyle h1, optional androidx.compose.ui.text.TextStyle h2, optional androidx.compose.ui.text.TextStyle h3, optional androidx.compose.ui.text.TextStyle h4, optional androidx.compose.ui.text.TextStyle h5, optional androidx.compose.ui.text.TextStyle h6, optional androidx.compose.ui.text.TextStyle subtitle1, optional androidx.compose.ui.text.TextStyle subtitle2, optional androidx.compose.ui.text.TextStyle body1, optional androidx.compose.ui.text.TextStyle body2, optional androidx.compose.ui.text.TextStyle button, optional androidx.compose.ui.text.TextStyle caption, optional androidx.compose.ui.text.TextStyle overline);
+    method public androidx.compose.material.Typography copy(optional androidx.compose.ui.text.TextStyle h1, optional androidx.compose.ui.text.TextStyle h2, optional androidx.compose.ui.text.TextStyle h3, optional androidx.compose.ui.text.TextStyle h4, optional androidx.compose.ui.text.TextStyle h5, optional androidx.compose.ui.text.TextStyle h6, optional androidx.compose.ui.text.TextStyle subtitle1, optional androidx.compose.ui.text.TextStyle subtitle2, optional androidx.compose.ui.text.TextStyle body1, optional androidx.compose.ui.text.TextStyle body2, optional androidx.compose.ui.text.TextStyle button, optional androidx.compose.ui.text.TextStyle caption, optional androidx.compose.ui.text.TextStyle overline);
+    method public androidx.compose.ui.text.TextStyle getBody1();
+    method public androidx.compose.ui.text.TextStyle getBody2();
+    method public androidx.compose.ui.text.TextStyle getButton();
+    method public androidx.compose.ui.text.TextStyle getCaption();
+    method public androidx.compose.ui.text.TextStyle getH1();
+    method public androidx.compose.ui.text.TextStyle getH2();
+    method public androidx.compose.ui.text.TextStyle getH3();
+    method public androidx.compose.ui.text.TextStyle getH4();
+    method public androidx.compose.ui.text.TextStyle getH5();
+    method public androidx.compose.ui.text.TextStyle getH6();
+    method public androidx.compose.ui.text.TextStyle getOverline();
+    method public androidx.compose.ui.text.TextStyle getSubtitle1();
+    method public androidx.compose.ui.text.TextStyle getSubtitle2();
+    property public final androidx.compose.ui.text.TextStyle body1;
+    property public final androidx.compose.ui.text.TextStyle body2;
+    property public final androidx.compose.ui.text.TextStyle button;
+    property public final androidx.compose.ui.text.TextStyle caption;
+    property public final androidx.compose.ui.text.TextStyle h1;
+    property public final androidx.compose.ui.text.TextStyle h2;
+    property public final androidx.compose.ui.text.TextStyle h3;
+    property public final androidx.compose.ui.text.TextStyle h4;
+    property public final androidx.compose.ui.text.TextStyle h5;
+    property public final androidx.compose.ui.text.TextStyle h6;
+    property public final androidx.compose.ui.text.TextStyle overline;
+    property public final androidx.compose.ui.text.TextStyle subtitle1;
+    property public final androidx.compose.ui.text.TextStyle subtitle2;
+  }
+
+  public final class TypographyKt {
+  }
+
+}
+
+package androidx.compose.material.internal {
+
+  public final class ExposedDropdownMenuPopupKt {
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/compose/material/material/api/res-1.3.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/material/material/api/res-1.3.0-beta01.txt
diff --git a/compose/material/material/api/restricted_1.3.0-beta01.txt b/compose/material/material/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..e6190b3
--- /dev/null
+++ b/compose/material/material/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,680 @@
+// Signature format: 4.0
+package androidx.compose.material {
+
+  public final class AlertDialogKt {
+  }
+
+  public final class AndroidAlertDialog_androidKt {
+    method @androidx.compose.runtime.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> confirmButton, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? dismissButton, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.window.DialogProperties properties);
+    method @androidx.compose.runtime.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> buttons, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.window.DialogProperties properties);
+  }
+
+  public final class AndroidMenu_androidKt {
+    method @androidx.compose.runtime.Composable public static void DropdownMenu(boolean expanded, kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.Modifier modifier, optional long offset, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void DropdownMenuItem(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  public final class AppBarDefaults {
+    method public float getBottomAppBarElevation();
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getTopAppBarElevation();
+    property public final float BottomAppBarElevation;
+    property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
+    property public final float TopAppBarElevation;
+    field public static final androidx.compose.material.AppBarDefaults INSTANCE;
+  }
+
+  public final class AppBarKt {
+    method @androidx.compose.runtime.Composable public static void BottomAppBar(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.graphics.Shape? cutoutShape, optional float elevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional long backgroundColor, optional long contentColor, optional float elevation);
+    method @androidx.compose.runtime.Composable public static void TopAppBar(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float elevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  public final class BackdropScaffoldDefaults {
+    method public float getFrontLayerElevation();
+    method @androidx.compose.runtime.Composable public long getFrontLayerScrimColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getFrontLayerShape();
+    method public float getHeaderHeight();
+    method public float getPeekHeight();
+    property public final float FrontLayerElevation;
+    property public final float HeaderHeight;
+    property public final float PeekHeight;
+    property @androidx.compose.runtime.Composable public final long frontLayerScrimColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape frontLayerShape;
+    field public static final androidx.compose.material.BackdropScaffoldDefaults INSTANCE;
+  }
+
+  public final class BackdropScaffoldKt {
+  }
+
+  public final class BadgeKt {
+    method @androidx.compose.runtime.Composable public static void Badge(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? content);
+    method @androidx.compose.runtime.Composable public static void BadgedBox(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> badge, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+  }
+
+  public final class BottomNavigationDefaults {
+    method public float getElevation();
+    property public final float Elevation;
+    field public static final androidx.compose.material.BottomNavigationDefaults INSTANCE;
+  }
+
+  public final class BottomNavigationKt {
+    method @androidx.compose.runtime.Composable public static void BottomNavigation(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float elevation, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void BottomNavigationItem(androidx.compose.foundation.layout.RowScope, boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+  }
+
+  public final class BottomSheetScaffoldDefaults {
+    method public float getSheetElevation();
+    method public float getSheetPeekHeight();
+    property public final float SheetElevation;
+    property public final float SheetPeekHeight;
+    field public static final androidx.compose.material.BottomSheetScaffoldDefaults INSTANCE;
+  }
+
+  public final class BottomSheetScaffoldKt {
+  }
+
+  @androidx.compose.runtime.Stable public interface ButtonColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> backgroundColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled);
+  }
+
+  public final class ButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors buttonColors(optional long backgroundColor, optional long contentColor, optional long disabledBackgroundColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float disabledElevation, optional float hoveredElevation, optional float focusedElevation);
+    method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material.ButtonElevation! elevation(optional float defaultElevation, optional float pressedElevation, optional float disabledElevation);
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getIconSize();
+    method public float getIconSpacing();
+    method public float getMinHeight();
+    method public float getMinWidth();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke getOutlinedBorder();
+    method public float getOutlinedBorderSize();
+    method public androidx.compose.foundation.layout.PaddingValues getTextButtonContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors outlinedButtonColors(optional long backgroundColor, optional long contentColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors textButtonColors(optional long backgroundColor, optional long contentColor, optional long disabledContentColor);
+    property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
+    property public final float IconSize;
+    property public final float IconSpacing;
+    property public final float MinHeight;
+    property public final float MinWidth;
+    property public final float OutlinedBorderSize;
+    property public final androidx.compose.foundation.layout.PaddingValues TextButtonContentPadding;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.BorderStroke outlinedBorder;
+    field public static final androidx.compose.material.ButtonDefaults INSTANCE;
+    field public static final float OutlinedBorderOpacity = 0.12f;
+  }
+
+  @androidx.compose.runtime.Stable public interface ButtonElevation {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> elevation(boolean enabled, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  }
+
+  public final class ButtonKt {
+    method @androidx.compose.runtime.Composable public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable @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);
+  }
+
+  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);
+    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 DragGestureDetectorCopyKt {
+  }
+
+  public final class DrawerDefaults {
+    method public float getElevation();
+    method @androidx.compose.runtime.Composable public long getScrimColor();
+    property public final float Elevation;
+    property @androidx.compose.runtime.Composable public final long scrimColor;
+    field public static final androidx.compose.material.DrawerDefaults INSTANCE;
+    field public static final float ScrimOpacity = 0.32f;
+  }
+
+  public final class DrawerKt {
+    method @androidx.compose.runtime.Composable public static void ModalDrawer(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> drawerContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.DrawerState drawerState, optional boolean gesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long scrimColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static androidx.compose.material.DrawerState rememberDrawerState(androidx.compose.material.DrawerValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.DrawerValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  @androidx.compose.runtime.Stable public final class DrawerState {
+    ctor public DrawerState(androidx.compose.material.DrawerValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.DrawerValue,java.lang.Boolean> confirmStateChange);
+    method public suspend Object? close(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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>);
+    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 final class ElevationKt {
+  }
+
+  public interface ElevationOverlay {
+    method @androidx.compose.runtime.Composable public long apply(long color, float elevation);
+  }
+
+  public final class ElevationOverlayKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteElevation();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> getLocalElevationOverlay();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> LocalAbsoluteElevation;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> LocalElevationOverlay;
+  }
+
+  public final class ExposedDropdownMenuKt {
+  }
+
+  @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 ListItemKt {
+  }
+
+  public final class MaterialTextSelectionColorsKt {
+  }
+
+  public final class MaterialTheme {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material.Colors getColors();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material.Shapes getShapes();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material.Typography getTypography();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material.Colors colors;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material.Shapes shapes;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material.Typography typography;
+    field public static final androidx.compose.material.MaterialTheme INSTANCE;
+  }
+
+  public final class MaterialThemeKt {
+    method @androidx.compose.runtime.Composable public static void MaterialTheme(optional androidx.compose.material.Colors colors, optional androidx.compose.material.Typography typography, optional androidx.compose.material.Shapes shapes, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class MaterialTheme_androidKt {
+  }
+
+  public final class MenuDefaults {
+    method public androidx.compose.foundation.layout.PaddingValues getDropdownMenuItemContentPadding();
+    property public final androidx.compose.foundation.layout.PaddingValues DropdownMenuItemContentPadding;
+    field public static final androidx.compose.material.MenuDefaults INSTANCE;
+  }
+
+  public final class MenuKt {
+  }
+
+  public final class ModalBottomSheetDefaults {
+    method public float getElevation();
+    method @androidx.compose.runtime.Composable public long getScrimColor();
+    property public final float Elevation;
+    property @androidx.compose.runtime.Composable public final long scrimColor;
+    field public static final androidx.compose.material.ModalBottomSheetDefaults INSTANCE;
+  }
+
+  public final class ModalBottomSheetKt {
+  }
+
+  public final class NavigationRailDefaults {
+    method public float getElevation();
+    property public final float Elevation;
+    field public static final androidx.compose.material.NavigationRailDefaults INSTANCE;
+  }
+
+  public final class NavigationRailKt {
+    method @androidx.compose.runtime.Composable public static void NavigationRail(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float elevation, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? header, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void NavigationRailItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+  }
+
+  public final class OutlinedTextFieldKt {
+    method @androidx.compose.runtime.Composable public static void OutlinedTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+    method @androidx.compose.runtime.Composable public static void OutlinedTextField(androidx.compose.ui.text.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.TextFieldValue,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+  }
+
+  public final class ProgressIndicatorDefaults {
+    method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getProgressAnimationSpec();
+    method public float getStrokeWidth();
+    property public final androidx.compose.animation.core.SpringSpec<java.lang.Float> ProgressAnimationSpec;
+    property public final float StrokeWidth;
+    field public static final androidx.compose.material.ProgressIndicatorDefaults INSTANCE;
+    field public static final float IndicatorBackgroundOpacity = 0.24f;
+  }
+
+  public final class ProgressIndicatorKt {
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor);
+  }
+
+  @androidx.compose.runtime.Stable public interface RadioButtonColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> radioColor(boolean enabled, boolean selected);
+  }
+
+  public final class RadioButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.RadioButtonColors colors(optional long selectedColor, optional long unselectedColor, optional long disabledColor);
+    field public static final androidx.compose.material.RadioButtonDefaults INSTANCE;
+  }
+
+  public final class RadioButtonKt {
+    method @androidx.compose.runtime.Composable public static void RadioButton(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.RadioButtonColors colors);
+  }
+
+  @androidx.compose.runtime.Immutable public final class ResistanceConfig {
+    ctor public ResistanceConfig(float basis, optional float factorAtMin, optional float factorAtMax);
+    method public float computeResistance(float overflow);
+    method public float getBasis();
+    method public float getFactorAtMax();
+    method public float getFactorAtMin();
+    property public final float basis;
+    property public final float factorAtMax;
+    property public final float factorAtMin;
+  }
+
+  public final class ScaffoldKt {
+    method @androidx.compose.runtime.Composable public static void Scaffold(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.ScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional int floatingActionButtonPosition, optional boolean isFloatingActionButtonDocked, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long drawerScrimColor, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static androidx.compose.material.ScaffoldState rememberScaffoldState(optional androidx.compose.material.DrawerState drawerState, optional androidx.compose.material.SnackbarHostState snackbarHostState);
+  }
+
+  @androidx.compose.runtime.Stable public final class ScaffoldState {
+    ctor public ScaffoldState(androidx.compose.material.DrawerState drawerState, androidx.compose.material.SnackbarHostState snackbarHostState);
+    method public androidx.compose.material.DrawerState getDrawerState();
+    method public androidx.compose.material.SnackbarHostState getSnackbarHostState();
+    property public final androidx.compose.material.DrawerState drawerState;
+    property public final androidx.compose.material.SnackbarHostState snackbarHostState;
+  }
+
+  @androidx.compose.runtime.Immutable public final class Shapes {
+    ctor public Shapes(optional androidx.compose.foundation.shape.CornerBasedShape small, optional androidx.compose.foundation.shape.CornerBasedShape medium, optional androidx.compose.foundation.shape.CornerBasedShape large);
+    method public androidx.compose.material.Shapes copy(optional androidx.compose.foundation.shape.CornerBasedShape small, optional androidx.compose.foundation.shape.CornerBasedShape medium, optional androidx.compose.foundation.shape.CornerBasedShape large);
+    method public androidx.compose.foundation.shape.CornerBasedShape getLarge();
+    method public androidx.compose.foundation.shape.CornerBasedShape getMedium();
+    method public androidx.compose.foundation.shape.CornerBasedShape getSmall();
+    property public final androidx.compose.foundation.shape.CornerBasedShape large;
+    property public final androidx.compose.foundation.shape.CornerBasedShape medium;
+    property public final androidx.compose.foundation.shape.CornerBasedShape small;
+  }
+
+  public final class ShapesKt {
+  }
+
+  @androidx.compose.runtime.Stable public interface SliderColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> thumbColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> tickColor(boolean enabled, boolean active);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trackColor(boolean enabled, boolean active);
+  }
+
+  public final class SliderDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.SliderColors colors(optional long thumbColor, optional long disabledThumbColor, optional long activeTrackColor, optional long inactiveTrackColor, optional long disabledActiveTrackColor, optional long disabledInactiveTrackColor, optional long activeTickColor, optional long inactiveTickColor, optional long disabledActiveTickColor, optional long disabledInactiveTickColor);
+    field public static final float DisabledActiveTrackAlpha = 0.32f;
+    field public static final float DisabledInactiveTrackAlpha = 0.12f;
+    field public static final float DisabledTickAlpha = 0.12f;
+    field public static final androidx.compose.material.SliderDefaults INSTANCE;
+    field public static final float InactiveTrackAlpha = 0.24f;
+    field public static final float TickAlpha = 0.54f;
+  }
+
+  public final class SliderKt {
+    method @androidx.compose.runtime.Composable public static void Slider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional int steps, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onValueChangeFinished, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.SliderColors colors);
+  }
+
+  public interface SnackbarData {
+    method public void dismiss();
+    method public String? getActionLabel();
+    method public androidx.compose.material.SnackbarDuration getDuration();
+    method public String getMessage();
+    method public void performAction();
+    property public abstract String? actionLabel;
+    property public abstract androidx.compose.material.SnackbarDuration duration;
+    property public abstract String message;
+  }
+
+  public final class SnackbarDefaults {
+    method @androidx.compose.runtime.Composable public long getBackgroundColor();
+    method @androidx.compose.runtime.Composable public long getPrimaryActionColor();
+    property @androidx.compose.runtime.Composable public final long backgroundColor;
+    property @androidx.compose.runtime.Composable public final long primaryActionColor;
+    field public static final androidx.compose.material.SnackbarDefaults INSTANCE;
+  }
+
+  public enum SnackbarDuration {
+    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 Strings_androidKt {
+  }
+
+  public final class SurfaceKt {
+    method @androidx.compose.runtime.Composable public static void Surface(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional androidx.compose.foundation.BorderStroke? border, optional float elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class SwipeToDismissKt {
+  }
+
+  public final class SwipeableDefaults {
+    method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getAnimationSpec();
+    method public float getVelocityThreshold();
+    method public androidx.compose.material.ResistanceConfig? resistanceConfig(java.util.Set<java.lang.Float> anchors, optional float factorAtMin, optional float factorAtMax);
+    property public final androidx.compose.animation.core.SpringSpec<java.lang.Float> AnimationSpec;
+    property public final float VelocityThreshold;
+    field public static final androidx.compose.material.SwipeableDefaults INSTANCE;
+    field public static final float StandardResistanceFactor = 10.0f;
+    field public static final float StiffResistanceFactor = 20.0f;
+  }
+
+  public final class SwipeableKt {
+  }
+
+  @androidx.compose.runtime.Stable public interface SwitchColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> thumbColor(boolean enabled, boolean checked);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trackColor(boolean enabled, boolean checked);
+  }
+
+  public final class SwitchDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.SwitchColors colors(optional long checkedThumbColor, optional long checkedTrackColor, optional float checkedTrackAlpha, optional long uncheckedThumbColor, optional long uncheckedTrackColor, optional float uncheckedTrackAlpha, optional long disabledCheckedThumbColor, optional long disabledCheckedTrackColor, optional long disabledUncheckedThumbColor, optional long disabledUncheckedTrackColor);
+    field public static final androidx.compose.material.SwitchDefaults INSTANCE;
+  }
+
+  public final class SwitchKt {
+    method @androidx.compose.runtime.Composable public static void Switch(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.SwitchColors colors);
+  }
+
+  public final class TabKt {
+    method @androidx.compose.runtime.Composable public static void LeadingIconTab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TabPosition {
+    method public float getLeft();
+    method public float getRight();
+    method public float getWidth();
+    property public final float left;
+    property public final float right;
+    property public final float width;
+  }
+
+  public final class TabRowDefaults {
+    method @androidx.compose.runtime.Composable public void Divider(optional androidx.compose.ui.Modifier modifier, optional float thickness, optional long color);
+    method @androidx.compose.runtime.Composable public void Indicator(optional androidx.compose.ui.Modifier modifier, optional float height, optional long color);
+    method public float getDividerThickness();
+    method public float getIndicatorHeight();
+    method public float getScrollableTabRowPadding();
+    method public androidx.compose.ui.Modifier tabIndicatorOffset(androidx.compose.ui.Modifier, androidx.compose.material.TabPosition currentTabPosition);
+    property public final float DividerThickness;
+    property public final float IndicatorHeight;
+    property public final float ScrollableTabRowPadding;
+    field public static final float DividerOpacity = 0.12f;
+    field public static final androidx.compose.material.TabRowDefaults INSTANCE;
+  }
+
+  public final class TabRowKt {
+    method @androidx.compose.runtime.Composable @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 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 androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+    method @androidx.compose.runtime.Composable public static void TextField(androidx.compose.ui.text.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.TextFieldValue,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+  }
+
+  public final class TextKt {
+    method @androidx.compose.runtime.Composable public static void ProvideTextStyle(androidx.compose.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
+    method @androidx.compose.runtime.Composable public static void Text(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.Map<java.lang.String,androidx.compose.foundation.text.InlineTextContent> inlineContent, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> getLocalTextStyle();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> LocalTextStyle;
+  }
+
+  public final class TouchTargetKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class Typography {
+    ctor public Typography(optional androidx.compose.ui.text.font.FontFamily defaultFontFamily, optional androidx.compose.ui.text.TextStyle h1, optional androidx.compose.ui.text.TextStyle h2, optional androidx.compose.ui.text.TextStyle h3, optional androidx.compose.ui.text.TextStyle h4, optional androidx.compose.ui.text.TextStyle h5, optional androidx.compose.ui.text.TextStyle h6, optional androidx.compose.ui.text.TextStyle subtitle1, optional androidx.compose.ui.text.TextStyle subtitle2, optional androidx.compose.ui.text.TextStyle body1, optional androidx.compose.ui.text.TextStyle body2, optional androidx.compose.ui.text.TextStyle button, optional androidx.compose.ui.text.TextStyle caption, optional androidx.compose.ui.text.TextStyle overline);
+    method public androidx.compose.material.Typography copy(optional androidx.compose.ui.text.TextStyle h1, optional androidx.compose.ui.text.TextStyle h2, optional androidx.compose.ui.text.TextStyle h3, optional androidx.compose.ui.text.TextStyle h4, optional androidx.compose.ui.text.TextStyle h5, optional androidx.compose.ui.text.TextStyle h6, optional androidx.compose.ui.text.TextStyle subtitle1, optional androidx.compose.ui.text.TextStyle subtitle2, optional androidx.compose.ui.text.TextStyle body1, optional androidx.compose.ui.text.TextStyle body2, optional androidx.compose.ui.text.TextStyle button, optional androidx.compose.ui.text.TextStyle caption, optional androidx.compose.ui.text.TextStyle overline);
+    method public androidx.compose.ui.text.TextStyle getBody1();
+    method public androidx.compose.ui.text.TextStyle getBody2();
+    method public androidx.compose.ui.text.TextStyle getButton();
+    method public androidx.compose.ui.text.TextStyle getCaption();
+    method public androidx.compose.ui.text.TextStyle getH1();
+    method public androidx.compose.ui.text.TextStyle getH2();
+    method public androidx.compose.ui.text.TextStyle getH3();
+    method public androidx.compose.ui.text.TextStyle getH4();
+    method public androidx.compose.ui.text.TextStyle getH5();
+    method public androidx.compose.ui.text.TextStyle getH6();
+    method public androidx.compose.ui.text.TextStyle getOverline();
+    method public androidx.compose.ui.text.TextStyle getSubtitle1();
+    method public androidx.compose.ui.text.TextStyle getSubtitle2();
+    property public final androidx.compose.ui.text.TextStyle body1;
+    property public final androidx.compose.ui.text.TextStyle body2;
+    property public final androidx.compose.ui.text.TextStyle button;
+    property public final androidx.compose.ui.text.TextStyle caption;
+    property public final androidx.compose.ui.text.TextStyle h1;
+    property public final androidx.compose.ui.text.TextStyle h2;
+    property public final androidx.compose.ui.text.TextStyle h3;
+    property public final androidx.compose.ui.text.TextStyle h4;
+    property public final androidx.compose.ui.text.TextStyle h5;
+    property public final androidx.compose.ui.text.TextStyle h6;
+    property public final androidx.compose.ui.text.TextStyle overline;
+    property public final androidx.compose.ui.text.TextStyle subtitle1;
+    property public final androidx.compose.ui.text.TextStyle subtitle2;
+  }
+
+  public final class TypographyKt {
+  }
+
+}
+
+package androidx.compose.material.internal {
+
+  public final class ExposedDropdownMenuPopupKt {
+  }
+
+}
+
diff --git a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/SelectionControlsDemo.kt b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/SelectionControlsDemo.kt
index 127a3dc..c8343cf 100644
--- a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/SelectionControlsDemo.kt
+++ b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/SelectionControlsDemo.kt
@@ -21,6 +21,7 @@
 import androidx.compose.foundation.lazy.LazyColumn
 import androidx.compose.material.MaterialTheme
 import androidx.compose.material.Text
+import androidx.compose.material.samples.FocusedCheckboxSample
 import androidx.compose.material.samples.RadioButtonSample
 import androidx.compose.material.samples.RadioGroupSample
 import androidx.compose.material.samples.SwitchSample
@@ -40,6 +41,10 @@
             TriStateCheckboxSample()
         }
         item {
+            Text(text = "Programmatically focused checkbox", style = headerStyle)
+            FocusedCheckboxSample()
+        }
+        item {
             Text(text = "Switch", style = headerStyle)
             SwitchSample()
         }
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SelectionControlsSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SelectionControlsSamples.kt
index af94e92..8550650 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SelectionControlsSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SelectionControlsSamples.kt
@@ -24,8 +24,10 @@
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.wrapContentSize
 import androidx.compose.foundation.selection.selectable
 import androidx.compose.foundation.selection.selectableGroup
+import androidx.compose.foundation.layout.Box
 import androidx.compose.material.Checkbox
 import androidx.compose.material.CheckboxDefaults
 import androidx.compose.material.MaterialTheme
@@ -35,14 +37,20 @@
 import androidx.compose.material.TriStateCheckbox
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.getValue
+import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
+import androidx.compose.ui.focus.FocusRequester
+import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.input.InputMode.Companion.Keyboard
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalInputModeManager
 import androidx.compose.ui.semantics.Role
 import androidx.compose.ui.state.ToggleableState
 import androidx.compose.ui.unit.dp
+import androidx.compose.ui.ExperimentalComposeUiApi
 
 @Sampled
 @Composable
@@ -81,6 +89,29 @@
     }
 }
 
+@OptIn(ExperimentalComposeUiApi::class)
+@Composable
+fun FocusedCheckboxSample() {
+    Text("The gray circle around this checkbox means it's non-touch focused.  Press Tab to move it")
+
+    val focusRequester = FocusRequester()
+    Box(Modifier.wrapContentSize(Alignment.TopStart)) {
+        Checkbox(
+            modifier = Modifier.wrapContentSize(Alignment.TopStart)
+                .focusRequester(focusRequester),
+            checked = true,
+            onCheckedChange = { }
+        )
+    }
+
+    val localInputModeManager = LocalInputModeManager.current
+    LaunchedEffect(Unit) {
+        if (localInputModeManager.requestInputMode(Keyboard)) {
+            focusRequester.requestFocus()
+        }
+    }
+}
+
 @Sampled
 @Composable
 fun CheckboxSample() {
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ButtonScreenshotTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ButtonScreenshotTest.kt
index a6b23b8..3843974 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ButtonScreenshotTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ButtonScreenshotTest.kt
@@ -20,10 +20,13 @@
 import androidx.compose.foundation.layout.requiredSize
 import androidx.compose.foundation.layout.wrapContentSize
 import androidx.compose.testutils.assertAgainstGolden
+import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusRequester
-import androidx.compose.ui.focus.focusProperties
 import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.input.InputMode
+import androidx.compose.ui.input.InputModeManager
+import androidx.compose.ui.platform.LocalInputModeManager
 import androidx.compose.ui.test.ExperimentalTestApi
 import androidx.compose.ui.test.captureToImage
 import androidx.compose.ui.test.hasClickAction
@@ -123,21 +126,22 @@
     @Test
     fun focus() {
         val focusRequester = FocusRequester()
+        var localInputModeManager: InputModeManager? = null
 
         rule.setMaterialContent {
+            localInputModeManager = LocalInputModeManager.current
             Box(Modifier.requiredSize(200.dp, 100.dp).wrapContentSize()) {
                 Button(
                     onClick = { },
                     modifier = Modifier
-                        // Normally this is only focusable in non-touch mode, so let's force it to
-                        // always be focusable so we can test how it appears
-                        .focusProperties { canFocus = true }
                         .focusRequester(focusRequester)
                 ) { }
             }
         }
 
         rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            localInputModeManager!!.requestInputMode(InputMode.Keyboard)
             focusRequester.requestFocus()
         }
 
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/CheckboxScreenshotTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/CheckboxScreenshotTest.kt
index 7a60df7..09788e3 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/CheckboxScreenshotTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/CheckboxScreenshotTest.kt
@@ -21,10 +21,13 @@
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.testutils.assertAgainstGolden
 import androidx.compose.ui.Alignment
+import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusRequester
-import androidx.compose.ui.focus.focusProperties
 import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.input.InputMode
+import androidx.compose.ui.input.InputModeManager
+import androidx.compose.ui.platform.LocalInputModeManager
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.state.ToggleableState
 import androidx.compose.ui.test.ExperimentalTestApi
@@ -229,14 +232,13 @@
     @Test
     fun checkBoxTest_focus() {
         val focusRequester = FocusRequester()
+        var localInputModeManager: InputModeManager? = null
 
         rule.setMaterialContent {
+            localInputModeManager = LocalInputModeManager.current
             Box(wrap.testTag(wrapperTestTag)) {
                 Checkbox(
                     modifier = wrap
-                        // Normally this is only focusable in non-touch mode, so let's force it to
-                        // always be focusable so we can test how it appears
-                        .focusProperties { canFocus = true }
                         .focusRequester(focusRequester),
                     checked = true,
                     onCheckedChange = { }
@@ -245,6 +247,8 @@
         }
 
         rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            localInputModeManager!!.requestInputMode(InputMode.Keyboard)
             focusRequester.requestFocus()
         }
 
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/FloatingActionButtonScreenshotTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/FloatingActionButtonScreenshotTest.kt
index 47e9598..d292d7e 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/FloatingActionButtonScreenshotTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/FloatingActionButtonScreenshotTest.kt
@@ -22,10 +22,13 @@
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.Favorite
 import androidx.compose.testutils.assertAgainstGolden
+import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusRequester
-import androidx.compose.ui.focus.focusProperties
 import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.input.InputMode
+import androidx.compose.ui.input.InputModeManager
+import androidx.compose.ui.platform.LocalInputModeManager
 import androidx.compose.ui.test.ExperimentalTestApi
 import androidx.compose.ui.test.captureToImage
 import androidx.compose.ui.test.hasClickAction
@@ -144,15 +147,14 @@
     @Test
     fun focus() {
         val focusRequester = FocusRequester()
+        var localInputModeManager: InputModeManager? = null
 
         rule.setMaterialContent {
+            localInputModeManager = LocalInputModeManager.current
             Box(Modifier.requiredSize(100.dp, 100.dp).wrapContentSize()) {
                 FloatingActionButton(
                     onClick = { },
                     modifier = Modifier
-                        // Normally this is only focusable in non-touch mode, so let's force it to
-                        // always be focusable so we can test how it appears
-                        .focusProperties { canFocus = true }
                         .focusRequester(focusRequester)
                 ) {
                     Icon(Icons.Filled.Favorite, contentDescription = null)
@@ -161,6 +163,8 @@
         }
 
         rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            localInputModeManager!!.requestInputMode(InputMode.Keyboard)
             focusRequester.requestFocus()
         }
 
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/RadioButtonScreenshotTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/RadioButtonScreenshotTest.kt
index 927efa9..41269e3 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/RadioButtonScreenshotTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/RadioButtonScreenshotTest.kt
@@ -23,10 +23,14 @@
 import androidx.compose.runtime.remember
 import androidx.compose.testutils.assertAgainstGolden
 import androidx.compose.ui.Alignment
+import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusRequester
-import androidx.compose.ui.focus.focusProperties
 import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.input.InputMode
+import androidx.compose.ui.input.InputMode.Companion.Keyboard
+import androidx.compose.ui.input.InputModeManager
+import androidx.compose.ui.platform.LocalInputModeManager
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.ExperimentalTestApi
 import androidx.compose.ui.test.captureToImage
@@ -116,25 +120,28 @@
     @Test
     fun radioButtonTest_focused() {
         val focusRequester = FocusRequester()
+        var localInputModeManager: InputModeManager? = null
 
         rule.setMaterialContent {
+            localInputModeManager = LocalInputModeManager.current
             Box(wrap.testTag(wrapperTestTag)) {
                 RadioButton(
                     selected = false,
                     onClick = {},
                     modifier = Modifier
-                        // Normally this is only focusable in non-touch mode, so let's force it to
-                        // always be focusable so we can test how it appears
-                        .focusProperties { canFocus = true }
                         .focusRequester(focusRequester)
                 )
             }
         }
 
         rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            localInputModeManager!!.requestInputMode(InputMode.Keyboard)
             focusRequester.requestFocus()
         }
 
+        rule.waitForIdle()
+
         assertSelectableAgainstGolden("radioButton_focused")
     }
 
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchScreenshotTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchScreenshotTest.kt
index 1727e8c..413caf8 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchScreenshotTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchScreenshotTest.kt
@@ -25,10 +25,13 @@
 import androidx.compose.runtime.remember
 import androidx.compose.testutils.assertAgainstGolden
 import androidx.compose.ui.Alignment
+import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusRequester
-import androidx.compose.ui.focus.focusProperties
 import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.input.InputMode
+import androidx.compose.ui.input.InputModeManager
+import androidx.compose.ui.platform.LocalInputModeManager
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.testTag
@@ -256,22 +259,23 @@
     @Test
     fun switchTest_focus() {
         val focusRequester = FocusRequester()
+        var localInputModeManager: InputModeManager? = null
 
         rule.setMaterialContent {
+            localInputModeManager = LocalInputModeManager.current
             Box(wrapperModifier) {
                 Switch(
                     checked = true,
                     onCheckedChange = { },
                     modifier = Modifier
-                        // Normally this is only focusable in non-touch mode, so let's force it to
-                        // always be focusable so we can test how it appears
-                        .focusProperties { canFocus = true }
                         .focusRequester(focusRequester)
                 )
             }
         }
 
         rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            localInputModeManager!!.requestInputMode(InputMode.Keyboard)
             focusRequester.requestFocus()
         }
 
diff --git a/compose/material/material/src/androidMain/kotlin/androidx/compose/material/AndroidMenu.android.kt b/compose/material/material/src/androidMain/kotlin/androidx/compose/material/AndroidMenu.android.kt
index e03a11a..94c0373 100644
--- a/compose/material/material/src/androidMain/kotlin/androidx/compose/material/AndroidMenu.android.kt
+++ b/compose/material/material/src/androidMain/kotlin/androidx/compose/material/AndroidMenu.android.kt
@@ -70,7 +70,6 @@
  * tapping outside the menu's bounds
  * @param offset [DpOffset] to be added to the position of the menu
  */
-@Suppress("ModifierParameter")
 @Composable
 fun DropdownMenu(
     expanded: Boolean,
diff --git a/compose/material/material/src/androidMain/kotlin/androidx/compose/material/internal/ExposedDropdownMenuPopup.kt b/compose/material/material/src/androidMain/kotlin/androidx/compose/material/internal/ExposedDropdownMenuPopup.kt
index e6adabb..a8f5d7e4 100644
--- a/compose/material/material/src/androidMain/kotlin/androidx/compose/material/internal/ExposedDropdownMenuPopup.kt
+++ b/compose/material/material/src/androidMain/kotlin/androidx/compose/material/internal/ExposedDropdownMenuPopup.kt
@@ -234,7 +234,9 @@
     // Track parent bounds and content size; only show popup once we have both
     val canCalculatePosition by derivedStateOf { parentBounds != null && popupContentSize != null }
 
-    private val maxSupportedElevation = 30.dp
+    // On systems older than Android S, there is a bug in the surface insets matrix math used by
+    // elevation, so high values of maxSupportedElevation break accessibility services: b/232788477.
+    private val maxSupportedElevation = 8.dp
 
     // The window visible frame used for the last popup position calculation.
     private val previousWindowVisibleFrame = Rect()
diff --git a/compose/material3/material3-window-size-class/api/1.0.0-beta01.txt b/compose/material3/material3-window-size-class/api/1.0.0-beta01.txt
new file mode 100644
index 0000000..8522c90
--- /dev/null
+++ b/compose/material3/material3-window-size-class/api/1.0.0-beta01.txt
@@ -0,0 +1,50 @@
+// 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;
+  }
+
+  public static final class WindowHeightSizeClass.Companion {
+    method public int getCompact();
+    method public int getExpanded();
+    method public int getMedium();
+    property public final int Compact;
+    property public final int Expanded;
+    property public final int Medium;
+  }
+
+  @androidx.compose.runtime.Immutable public final class WindowSizeClass {
+    method public int getHeightSizeClass();
+    method public int getWidthSizeClass();
+    property public final int heightSizeClass;
+    property public final int widthSizeClass;
+    field public static final androidx.compose.material3.windowsizeclass.WindowSizeClass.Companion Companion;
+  }
+
+  public static final class WindowSizeClass.Companion {
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class WindowWidthSizeClass implements java.lang.Comparable<androidx.compose.material3.windowsizeclass.WindowWidthSizeClass> {
+    method public operator int compareTo(int other);
+    field public static final androidx.compose.material3.windowsizeclass.WindowWidthSizeClass.Companion Companion;
+  }
+
+  public static final class WindowWidthSizeClass.Companion {
+    method public int getCompact();
+    method public int getExpanded();
+    method public int getMedium();
+    property public final int Compact;
+    property public final int Expanded;
+    property public final int Medium;
+  }
+
+}
+
diff --git a/compose/material3/material3-window-size-class/api/public_plus_experimental_1.0.0-beta01.txt b/compose/material3/material3-window-size-class/api/public_plus_experimental_1.0.0-beta01.txt
new file mode 100644
index 0000000..e1590d8
--- /dev/null
+++ b/compose/material3/material3-window-size-class/api/public_plus_experimental_1.0.0-beta01.txt
@@ -0,0 +1,55 @@
+// Signature format: 4.0
+package androidx.compose.material3.windowsizeclass {
+
+  public final class AndroidWindowSizeClass_androidKt {
+    method @androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi @androidx.compose.runtime.Composable public static androidx.compose.material3.windowsizeclass.WindowSizeClass calculateWindowSizeClass(android.app.Activity activity);
+  }
+
+  @kotlin.RequiresOptIn(message="This material3-window-size-class API is experimental and is likely to change or to " + "be removed in the future.") 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;
+  }
+
+  public static final class WindowHeightSizeClass.Companion {
+    method public int getCompact();
+    method public int getExpanded();
+    method public int getMedium();
+    property public final int Compact;
+    property public final int Expanded;
+    property public final int Medium;
+  }
+
+  @androidx.compose.runtime.Immutable public final class WindowSizeClass {
+    method public int getHeightSizeClass();
+    method public int getWidthSizeClass();
+    property public final int heightSizeClass;
+    property public final int widthSizeClass;
+    field public static final androidx.compose.material3.windowsizeclass.WindowSizeClass.Companion Companion;
+  }
+
+  public static final class WindowSizeClass.Companion {
+    method @androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi @org.jetbrains.annotations.TestOnly public androidx.compose.material3.windowsizeclass.WindowSizeClass calculateFromSize(long size);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class WindowWidthSizeClass implements java.lang.Comparable<androidx.compose.material3.windowsizeclass.WindowWidthSizeClass> {
+    method public operator int compareTo(int other);
+    field public static final androidx.compose.material3.windowsizeclass.WindowWidthSizeClass.Companion Companion;
+  }
+
+  public static final class WindowWidthSizeClass.Companion {
+    method public int getCompact();
+    method public int getExpanded();
+    method public int getMedium();
+    property public final int Compact;
+    property public final int Expanded;
+    property public final int Medium;
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/compose/material3/material3-window-size-class/api/res-1.0.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/material3/material3-window-size-class/api/res-1.0.0-beta01.txt
diff --git a/compose/material3/material3-window-size-class/api/restricted_1.0.0-beta01.txt b/compose/material3/material3-window-size-class/api/restricted_1.0.0-beta01.txt
new file mode 100644
index 0000000..8522c90
--- /dev/null
+++ b/compose/material3/material3-window-size-class/api/restricted_1.0.0-beta01.txt
@@ -0,0 +1,50 @@
+// 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;
+  }
+
+  public static final class WindowHeightSizeClass.Companion {
+    method public int getCompact();
+    method public int getExpanded();
+    method public int getMedium();
+    property public final int Compact;
+    property public final int Expanded;
+    property public final int Medium;
+  }
+
+  @androidx.compose.runtime.Immutable public final class WindowSizeClass {
+    method public int getHeightSizeClass();
+    method public int getWidthSizeClass();
+    property public final int heightSizeClass;
+    property public final int widthSizeClass;
+    field public static final androidx.compose.material3.windowsizeclass.WindowSizeClass.Companion Companion;
+  }
+
+  public static final class WindowSizeClass.Companion {
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class WindowWidthSizeClass implements java.lang.Comparable<androidx.compose.material3.windowsizeclass.WindowWidthSizeClass> {
+    method public operator int compareTo(int other);
+    field public static final androidx.compose.material3.windowsizeclass.WindowWidthSizeClass.Companion Companion;
+  }
+
+  public static final class WindowWidthSizeClass.Companion {
+    method public int getCompact();
+    method public int getExpanded();
+    method public int getMedium();
+    property public final int Compact;
+    property public final int Expanded;
+    property public final int Medium;
+  }
+
+}
+
diff --git a/compose/material3/material3-window-size-class/build.gradle b/compose/material3/material3-window-size-class/build.gradle
index 68297e9..bcd29e9 100644
--- a/compose/material3/material3-window-size-class/build.gradle
+++ b/compose/material3/material3-window-size-class/build.gradle
@@ -38,7 +38,7 @@
         api("androidx.compose.runtime:runtime:1.2.0")
         api("androidx.compose.ui:ui:1.2.0")
         api("androidx.compose.ui:ui-unit:1.2.0")
-        implementation("androidx.window:window:1.1.0-alpha02")
+        implementation("androidx.window:window:1.0.0")
 
         testImplementation(libs.kotlinTest)
         testImplementation(libs.truth)
@@ -76,7 +76,7 @@
             }
 
             androidMain.dependencies {
-                implementation("androidx.window:window:1.1.0-alpha02")
+                implementation("androidx.window:window:1.0.0")
             }
 
             androidMain.dependsOn(jvmMain)
diff --git a/compose/material3/material3/api/1.0.0-beta01.txt b/compose/material3/material3/api/1.0.0-beta01.txt
new file mode 100644
index 0000000..a5cf8de
--- /dev/null
+++ b/compose/material3/material3/api/1.0.0-beta01.txt
@@ -0,0 +1,683 @@
+// Signature format: 4.0
+package androidx.compose.material3 {
+
+  public final class AlertDialogDefaults {
+    method @androidx.compose.runtime.Composable public long getContainerColor();
+    method @androidx.compose.runtime.Composable public long getIconContentColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getShape();
+    method @androidx.compose.runtime.Composable public long getTextContentColor();
+    method @androidx.compose.runtime.Composable public long getTitleContentColor();
+    method public float getTonalElevation();
+    property public final float TonalElevation;
+    property @androidx.compose.runtime.Composable public final long containerColor;
+    property @androidx.compose.runtime.Composable public final long iconContentColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape shape;
+    property @androidx.compose.runtime.Composable public final long textContentColor;
+    property @androidx.compose.runtime.Composable public final long titleContentColor;
+    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);
+  }
+
+  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> text, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean enabled, optional androidx.compose.material3.MenuItemColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+  }
+
+  public final class AppBarKt {
+    method @androidx.compose.runtime.Composable public static void BottomAppBar(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? floatingActionButton, optional long containerColor, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.layout.WindowInsets windowInsets);
+    method @androidx.compose.runtime.Composable public static void BottomAppBar(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.layout.WindowInsets windowInsets, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  public final class BadgeKt {
+  }
+
+  public final class BottomAppBarDefaults {
+    method @androidx.compose.runtime.Composable public long getBottomAppBarFabColor();
+    method @androidx.compose.runtime.Composable public long getContainerColor();
+    method public float getContainerElevation();
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.WindowInsets getWindowInsets();
+    property public final float ContainerElevation;
+    property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
+    property @androidx.compose.runtime.Composable public final long bottomAppBarFabColor;
+    property @androidx.compose.runtime.Composable public final long containerColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.layout.WindowInsets windowInsets;
+    field public static final androidx.compose.material3.BottomAppBarDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public final class ButtonColors {
+  }
+
+  public final class ButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors buttonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonElevation buttonElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float disabledElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors elevatedButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonElevation elevatedButtonElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float disabledElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors filledTonalButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonElevation filledTonalButtonElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float disabledElevation);
+    method public androidx.compose.foundation.layout.PaddingValues getButtonWithIconContentPadding();
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getElevatedShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getFilledTonalShape();
+    method public float getIconSize();
+    method public float getIconSpacing();
+    method public float getMinHeight();
+    method public float getMinWidth();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke getOutlinedButtonBorder();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getOutlinedShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getShape();
+    method public androidx.compose.foundation.layout.PaddingValues getTextButtonContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getTextShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors outlinedButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors textButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    property public final androidx.compose.foundation.layout.PaddingValues ButtonWithIconContentPadding;
+    property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
+    property public final float IconSize;
+    property public final float IconSpacing;
+    property public final float MinHeight;
+    property public final float MinWidth;
+    property public final androidx.compose.foundation.layout.PaddingValues TextButtonContentPadding;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape elevatedShape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape filledTonalShape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.BorderStroke outlinedButtonBorder;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape outlinedShape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape shape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape textShape;
+    field public static final androidx.compose.material3.ButtonDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public final class ButtonElevation {
+  }
+
+  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.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);
+    method @androidx.compose.runtime.Composable public static void ElevatedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.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);
+    method @androidx.compose.runtime.Composable public static void FilledTonalButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.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);
+    method @androidx.compose.runtime.Composable public static void OutlinedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.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);
+    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);
+  }
+
+  @androidx.compose.runtime.Immutable public final class CardColors {
+  }
+
+  public final class CardDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CardColors cardColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CardElevation cardElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation, optional float disabledElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CardColors elevatedCardColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CardElevation elevatedCardElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation, optional float disabledElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getElevatedShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getOutlinedShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke outlinedCardBorder(optional boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CardColors outlinedCardColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CardElevation outlinedCardElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation, optional float disabledElevation);
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape elevatedShape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape outlinedShape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape shape;
+    field public static final androidx.compose.material3.CardDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public final class CardElevation {
+  }
+
+  public final class CardKt {
+    method @androidx.compose.runtime.Composable public static void Card(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, optional androidx.compose.foundation.BorderStroke? border, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void ElevatedCard(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void OutlinedCard(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, optional androidx.compose.foundation.BorderStroke border, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Immutable public final class CheckboxColors {
+  }
+
+  public final class CheckboxDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CheckboxColors colors(optional long checkedColor, optional long uncheckedColor, optional long checkmarkColor, optional long disabledCheckedColor, optional long disabledUncheckedColor, optional long disabledIndeterminateColor);
+    field public static final androidx.compose.material3.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.material3.CheckboxColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+    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.material3.CheckboxColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+  }
+
+  public final class ChipKt {
+  }
+
+  @androidx.compose.runtime.Stable public final class ColorScheme {
+    ctor public ColorScheme(long primary, long onPrimary, long primaryContainer, long onPrimaryContainer, long inversePrimary, long secondary, long onSecondary, long secondaryContainer, long onSecondaryContainer, long tertiary, long onTertiary, long tertiaryContainer, long onTertiaryContainer, long background, long onBackground, long surface, long onSurface, long surfaceVariant, long onSurfaceVariant, long surfaceTint, long inverseSurface, long inverseOnSurface, long error, long onError, long errorContainer, long onErrorContainer, long outline, long outlineVariant, long scrim);
+    method public androidx.compose.material3.ColorScheme copy(optional long primary, optional long onPrimary, optional long primaryContainer, optional long onPrimaryContainer, optional long inversePrimary, optional long secondary, optional long onSecondary, optional long secondaryContainer, optional long onSecondaryContainer, optional long tertiary, optional long onTertiary, optional long tertiaryContainer, optional long onTertiaryContainer, optional long background, optional long onBackground, optional long surface, optional long onSurface, optional long surfaceVariant, optional long onSurfaceVariant, optional long 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);
+    method public long getBackground();
+    method public long getError();
+    method public long getErrorContainer();
+    method public long getInverseOnSurface();
+    method public long getInversePrimary();
+    method public long getInverseSurface();
+    method public long getOnBackground();
+    method public long getOnError();
+    method public long getOnErrorContainer();
+    method public long getOnPrimary();
+    method public long getOnPrimaryContainer();
+    method public long getOnSecondary();
+    method public long getOnSecondaryContainer();
+    method public long getOnSurface();
+    method public long getOnSurfaceVariant();
+    method public long getOnTertiary();
+    method public long getOnTertiaryContainer();
+    method public long getOutline();
+    method public long getOutlineVariant();
+    method public long getPrimary();
+    method public long getPrimaryContainer();
+    method public long getScrim();
+    method public long getSecondary();
+    method public long getSecondaryContainer();
+    method public long getSurface();
+    method public long getSurfaceTint();
+    method public long getSurfaceVariant();
+    method public long getTertiary();
+    method public long getTertiaryContainer();
+    property public final long background;
+    property public final long error;
+    property public final long errorContainer;
+    property public final long inverseOnSurface;
+    property public final long inversePrimary;
+    property public final long inverseSurface;
+    property public final long onBackground;
+    property public final long onError;
+    property public final long onErrorContainer;
+    property public final long onPrimary;
+    property public final long onPrimaryContainer;
+    property public final long onSecondary;
+    property public final long onSecondaryContainer;
+    property public final long onSurface;
+    property public final long onSurfaceVariant;
+    property public final long onTertiary;
+    property public final long onTertiaryContainer;
+    property public final long outline;
+    property public final long outlineVariant;
+    property public final long primary;
+    property public final long primaryContainer;
+    property public final long scrim;
+    property public final long secondary;
+    property public final long secondaryContainer;
+    property public final long surface;
+    property public final long surfaceTint;
+    property public final long surfaceVariant;
+    property public final long tertiary;
+    property public final long tertiaryContainer;
+  }
+
+  public final class ColorSchemeKt {
+    method public static long contentColorFor(androidx.compose.material3.ColorScheme, long backgroundColor);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static long contentColorFor(long backgroundColor);
+    method public static androidx.compose.material3.ColorScheme darkColorScheme(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);
+    method public static androidx.compose.material3.ColorScheme lightColorScheme(optional long primary, optional long onPrimary, optional long primaryContainer, optional long onPrimaryContainer, optional long inversePrimary, optional long secondary, optional long onSecondary, optional long secondaryContainer, optional long onSecondaryContainer, optional long tertiary, optional long onTertiary, optional long tertiaryContainer, optional long onTertiaryContainer, optional long background, optional long onBackground, optional long surface, optional long 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);
+    method public static long surfaceColorAtElevation(androidx.compose.material3.ColorScheme, float elevation);
+  }
+
+  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 DividerDefaults {
+    method @androidx.compose.runtime.Composable public long getColor();
+    method public float getThickness();
+    property public final float Thickness;
+    property @androidx.compose.runtime.Composable public final long color;
+    field public static final androidx.compose.material3.DividerDefaults INSTANCE;
+  }
+
+  public final class DividerKt {
+    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 DynamicTonalPaletteKt {
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) public static androidx.compose.material3.ColorScheme dynamicDarkColorScheme(android.content.Context context);
+    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 {
+  }
+
+  public final class FloatingActionButtonDefaults {
+    method public androidx.compose.material3.FloatingActionButtonElevation bottomAppBarFabElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.FloatingActionButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation);
+    method @androidx.compose.runtime.Composable public long getContainerColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getExtendedFabShape();
+    method public float getLargeIconSize();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getLargeShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getSmallShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.FloatingActionButtonElevation loweredElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation);
+    property public final float LargeIconSize;
+    property @androidx.compose.runtime.Composable public final long containerColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape extendedFabShape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape largeShape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape shape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape smallShape;
+    field public static final androidx.compose.material3.FloatingActionButtonDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public class FloatingActionButtonElevation {
+  }
+
+  public final class FloatingActionButtonKt {
+    method @androidx.compose.runtime.Composable public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean expanded, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+    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.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void LargeFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void SmallFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Immutable public final class IconButtonColors {
+  }
+
+  public final class IconButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.IconButtonColors filledIconButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.IconToggleButtonColors filledIconToggleButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor, optional long checkedContainerColor, optional long checkedContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.IconButtonColors filledTonalIconButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.IconToggleButtonColors filledTonalIconToggleButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor, optional long checkedContainerColor, optional long checkedContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getFilledShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getOutlinedShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.IconButtonColors iconButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.IconToggleButtonColors iconToggleButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor, optional long checkedContainerColor, optional long checkedContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke outlinedIconButtonBorder(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.IconButtonColors outlinedIconButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke? outlinedIconToggleButtonBorder(boolean enabled, boolean checked);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.IconToggleButtonColors outlinedIconToggleButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor, optional long checkedContainerColor, optional long checkedContentColor);
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape filledShape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape outlinedShape;
+    field public static final androidx.compose.material3.IconButtonDefaults INSTANCE;
+  }
+
+  public final class IconButtonKt {
+    method @androidx.compose.runtime.Composable public static void FilledIconButton(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.IconButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void FilledIconToggleButton(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 androidx.compose.material3.IconToggleButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void FilledTonalIconButton(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.IconButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void FilledTonalIconToggleButton(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 androidx.compose.material3.IconToggleButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    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.material3.IconButtonColors colors, 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.material3.IconToggleButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void OutlinedIconButton(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.IconButtonColors colors, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void OutlinedIconToggleButton(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 androidx.compose.material3.IconToggleButtonColors colors, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class IconKt {
+    method @androidx.compose.runtime.Composable public static void Icon(androidx.compose.ui.graphics.vector.ImageVector imageVector, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+    method @androidx.compose.runtime.Composable public static void Icon(androidx.compose.ui.graphics.ImageBitmap bitmap, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+    method @androidx.compose.runtime.Composable public static void Icon(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+  }
+
+  @androidx.compose.runtime.Immutable public final class IconToggleButtonColors {
+  }
+
+  public final class IncludeFontPaddingHelper_androidKt {
+  }
+
+  public final class ListItemKt {
+  }
+
+  public final class MaterialTheme {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material3.ColorScheme getColorScheme();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material3.Shapes getShapes();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material3.Typography getTypography();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material3.ColorScheme colorScheme;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material3.Shapes shapes;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material3.Typography typography;
+    field public static final androidx.compose.material3.MaterialTheme INSTANCE;
+  }
+
+  public final class MaterialThemeKt {
+    method @androidx.compose.runtime.Composable public static void MaterialTheme(optional androidx.compose.material3.ColorScheme colorScheme, optional androidx.compose.material3.Shapes shapes, optional androidx.compose.material3.Typography typography, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class MenuDefaults {
+    method public androidx.compose.foundation.layout.PaddingValues getDropdownMenuItemContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.MenuItemColors itemColors(optional long textColor, optional long leadingIconColor, optional long trailingIconColor, optional long disabledTextColor, optional long disabledLeadingIconColor, optional long disabledTrailingIconColor);
+    property public final androidx.compose.foundation.layout.PaddingValues DropdownMenuItemContentPadding;
+    field public static final androidx.compose.material3.MenuDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public final class MenuItemColors {
+  }
+
+  public final class MenuKt {
+  }
+
+  public final class NavigationBarDefaults {
+    method @androidx.compose.runtime.Composable public long getContainerColor();
+    method public float getElevation();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.WindowInsets getWindowInsets();
+    property public final float Elevation;
+    property @androidx.compose.runtime.Composable public final long containerColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.layout.WindowInsets windowInsets;
+    field public static final androidx.compose.material3.NavigationBarDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public final class NavigationBarItemColors {
+  }
+
+  public final class NavigationBarItemDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.NavigationBarItemColors colors(optional long selectedIconColor, optional long selectedTextColor, optional long indicatorColor, optional long unselectedIconColor, optional long unselectedTextColor);
+    field public static final androidx.compose.material3.NavigationBarItemDefaults INSTANCE;
+  }
+
+  public final class NavigationBarKt {
+    method @androidx.compose.runtime.Composable public static void NavigationBar(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.layout.WindowInsets windowInsets, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void NavigationBarItem(androidx.compose.foundation.layout.RowScope, boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.material3.NavigationBarItemColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+  }
+
+  public final class NavigationDrawerKt {
+  }
+
+  public final class NavigationRailDefaults {
+    method @androidx.compose.runtime.Composable public long getContainerColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.WindowInsets getWindowInsets();
+    property @androidx.compose.runtime.Composable public final long ContainerColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.layout.WindowInsets windowInsets;
+    field public static final androidx.compose.material3.NavigationRailDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public final class NavigationRailItemColors {
+  }
+
+  public final class NavigationRailItemDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.NavigationRailItemColors colors(optional long selectedIconColor, optional long selectedTextColor, optional long indicatorColor, optional long unselectedIconColor, optional long unselectedTextColor);
+    field public static final androidx.compose.material3.NavigationRailItemDefaults INSTANCE;
+  }
+
+  public final class NavigationRailKt {
+    method @androidx.compose.runtime.Composable public static void NavigationRail(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? header, optional androidx.compose.foundation.layout.WindowInsets windowInsets, 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.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 float getCircularStrokeWidth();
+    method @androidx.compose.runtime.Composable public long getLinearColor();
+    method @androidx.compose.runtime.Composable public long getLinearTrackColor();
+    method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getProgressAnimationSpec();
+    property public final float CircularStrokeWidth;
+    property public final androidx.compose.animation.core.SpringSpec<java.lang.Float> ProgressAnimationSpec;
+    property @androidx.compose.runtime.Composable public final long circularColor;
+    property @androidx.compose.runtime.Composable public final long linearColor;
+    property @androidx.compose.runtime.Composable public final long linearTrackColor;
+    field public static final androidx.compose.material3.ProgressIndicatorDefaults INSTANCE;
+  }
+
+  public final class ProgressIndicatorKt {
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional long trackColor);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional long trackColor);
+  }
+
+  @androidx.compose.runtime.Immutable public final class RadioButtonColors {
+  }
+
+  public final class RadioButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.RadioButtonColors colors(optional long selectedColor, optional long unselectedColor, optional long disabledSelectedColor, optional long disabledUnselectedColor);
+    field public static final androidx.compose.material3.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.material3.RadioButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+  }
+
+  public final class SafeDrawingInsets_androidKt {
+  }
+
+  public final class ScaffoldKt {
+  }
+
+  public final class ShapeDefaults {
+    method public androidx.compose.foundation.shape.CornerBasedShape getExtraLarge();
+    method public androidx.compose.foundation.shape.CornerBasedShape getExtraSmall();
+    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 ExtraLarge;
+    property public final androidx.compose.foundation.shape.CornerBasedShape ExtraSmall;
+    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;
+    field public static final androidx.compose.material3.ShapeDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public final class Shapes {
+    ctor public Shapes(optional androidx.compose.foundation.shape.CornerBasedShape extraSmall, optional androidx.compose.foundation.shape.CornerBasedShape small, optional androidx.compose.foundation.shape.CornerBasedShape medium, optional androidx.compose.foundation.shape.CornerBasedShape large, optional androidx.compose.foundation.shape.CornerBasedShape extraLarge);
+    method public androidx.compose.material3.Shapes copy(optional androidx.compose.foundation.shape.CornerBasedShape extraSmall, optional androidx.compose.foundation.shape.CornerBasedShape small, optional androidx.compose.foundation.shape.CornerBasedShape medium, optional androidx.compose.foundation.shape.CornerBasedShape large, optional androidx.compose.foundation.shape.CornerBasedShape extraLarge);
+    method public androidx.compose.foundation.shape.CornerBasedShape getExtraLarge();
+    method public androidx.compose.foundation.shape.CornerBasedShape getExtraSmall();
+    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 extraLarge;
+    property public final androidx.compose.foundation.shape.CornerBasedShape extraSmall;
+    property public final androidx.compose.foundation.shape.CornerBasedShape large;
+    property public final androidx.compose.foundation.shape.CornerBasedShape medium;
+    property public final androidx.compose.foundation.shape.CornerBasedShape small;
+  }
+
+  public final class ShapesKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class SliderColors {
+  }
+
+  public final class SliderDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.SliderColors colors(optional long thumbColor, optional long activeTrackColor, optional long activeTickColor, optional long inactiveTrackColor, optional long inactiveTickColor, optional long disabledThumbColor, optional long disabledActiveTrackColor, optional long disabledActiveTickColor, optional long disabledInactiveTrackColor, optional long disabledInactiveTickColor);
+    field public static final androidx.compose.material3.SliderDefaults INSTANCE;
+  }
+
+  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.material3.SliderColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+  }
+
+  @androidx.compose.runtime.Stable public interface SnackbarData {
+    method public void dismiss();
+    method public androidx.compose.material3.SnackbarVisuals getVisuals();
+    method public void performAction();
+    property public abstract androidx.compose.material3.SnackbarVisuals visuals;
+  }
+
+  public final class SnackbarDefaults {
+    method @androidx.compose.runtime.Composable public long getActionColor();
+    method @androidx.compose.runtime.Composable public long getActionContentColor();
+    method @androidx.compose.runtime.Composable public long getColor();
+    method @androidx.compose.runtime.Composable public long getContentColor();
+    method @androidx.compose.runtime.Composable public long getDismissActionContentColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getShape();
+    property @androidx.compose.runtime.Composable public final long actionColor;
+    property @androidx.compose.runtime.Composable public final long actionContentColor;
+    property @androidx.compose.runtime.Composable public final long color;
+    property @androidx.compose.runtime.Composable public final long contentColor;
+    property @androidx.compose.runtime.Composable public final long dismissActionContentColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape shape;
+    field public static final androidx.compose.material3.SnackbarDefaults INSTANCE;
+  }
+
+  public enum SnackbarDuration {
+    method public static androidx.compose.material3.SnackbarDuration valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.material3.SnackbarDuration[] values();
+    enum_constant public static final androidx.compose.material3.SnackbarDuration Indefinite;
+    enum_constant public static final androidx.compose.material3.SnackbarDuration Long;
+    enum_constant public static final androidx.compose.material3.SnackbarDuration Short;
+  }
+
+  public final class SnackbarHostKt {
+    method @androidx.compose.runtime.Composable public static void SnackbarHost(androidx.compose.material3.SnackbarHostState hostState, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.material3.SnackbarData,kotlin.Unit> snackbar);
+  }
+
+  @androidx.compose.runtime.Stable public final class SnackbarHostState {
+    ctor public SnackbarHostState();
+    method public androidx.compose.material3.SnackbarData? getCurrentSnackbarData();
+    method public suspend Object? showSnackbar(String message, optional String? actionLabel, optional boolean withDismissAction, optional androidx.compose.material3.SnackbarDuration duration, optional kotlin.coroutines.Continuation<? super androidx.compose.material3.SnackbarResult>);
+    property public final androidx.compose.material3.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 kotlin.jvm.functions.Function0<kotlin.Unit>? dismissAction, optional boolean actionOnNewLine, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional long actionContentColor, optional long dismissActionContentColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Snackbar(androidx.compose.material3.SnackbarData snackbarData, optional androidx.compose.ui.Modifier modifier, optional boolean actionOnNewLine, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional long actionColor, optional long actionContentColor, optional long dismissActionContentColor);
+  }
+
+  public enum SnackbarResult {
+    method public static androidx.compose.material3.SnackbarResult valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.material3.SnackbarResult[] values();
+    enum_constant public static final androidx.compose.material3.SnackbarResult ActionPerformed;
+    enum_constant public static final androidx.compose.material3.SnackbarResult Dismissed;
+  }
+
+  @androidx.compose.runtime.Stable public interface SnackbarVisuals {
+    method public String? getActionLabel();
+    method public androidx.compose.material3.SnackbarDuration getDuration();
+    method public String getMessage();
+    method public boolean getWithDismissAction();
+    property public abstract String? actionLabel;
+    property public abstract androidx.compose.material3.SnackbarDuration duration;
+    property public abstract String message;
+    property public abstract boolean withDismissAction;
+  }
+
+  public final class Strings_androidKt {
+  }
+
+  public final class SurfaceKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Surface(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional float tonalElevation, optional float shadowElevation, optional androidx.compose.foundation.BorderStroke? border, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteTonalElevation();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> LocalAbsoluteTonalElevation;
+  }
+
+  public final class SwipeableKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class SwitchColors {
+  }
+
+  public final class SwitchDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.SwitchColors colors(optional long checkedThumbColor, optional long checkedTrackColor, optional long checkedBorderColor, optional long checkedIconColor, optional long uncheckedThumbColor, optional long uncheckedTrackColor, optional long uncheckedBorderColor, optional long uncheckedIconColor, optional long disabledCheckedThumbColor, optional long disabledCheckedTrackColor, optional long disabledCheckedBorderColor, optional long disabledCheckedIconColor, optional long disabledUncheckedThumbColor, optional long disabledUncheckedTrackColor, optional long disabledUncheckedBorderColor, optional long disabledUncheckedIconColor);
+    method public float getIconSize();
+    property public final float IconSize;
+    field public static final androidx.compose.material3.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 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 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);
+    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 long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, 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 Indicator(optional androidx.compose.ui.Modifier modifier, optional float height, optional long color);
+    method @androidx.compose.runtime.Composable public long getContainerColor();
+    method @androidx.compose.runtime.Composable public long getContentColor();
+    method public androidx.compose.ui.Modifier tabIndicatorOffset(androidx.compose.ui.Modifier, androidx.compose.material3.TabPosition currentTabPosition);
+    property @androidx.compose.runtime.Composable public final long containerColor;
+    property @androidx.compose.runtime.Composable public final long contentColor;
+    field public static final androidx.compose.material3.TabRowDefaults INSTANCE;
+  }
+
+  public final class TabRowKt {
+    method @androidx.compose.runtime.Composable public static void ScrollableTabRow(int selectedTabIndex, optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float edgePadding, optional kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.material3.TabPosition>,kotlin.Unit> indicator, optional kotlin.jvm.functions.Function0<kotlin.Unit> divider, kotlin.jvm.functions.Function0<kotlin.Unit> tabs);
+    method @androidx.compose.runtime.Composable public static void TabRow(int selectedTabIndex, optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.material3.TabPosition>,kotlin.Unit> indicator, optional kotlin.jvm.functions.Function0<kotlin.Unit> divider, kotlin.jvm.functions.Function0<kotlin.Unit> tabs);
+  }
+
+  @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 kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
+    method @androidx.compose.runtime.Composable public static void Text(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.Map<java.lang.String,androidx.compose.foundation.text.InlineTextContent> inlineContent, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> getLocalTextStyle();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> LocalTextStyle;
+  }
+
+  public final class TonalPaletteKt {
+  }
+
+  public final class TouchTargetKt {
+  }
+
+  @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);
+    method public androidx.compose.ui.text.TextStyle getBodyLarge();
+    method public androidx.compose.ui.text.TextStyle getBodyMedium();
+    method public androidx.compose.ui.text.TextStyle getBodySmall();
+    method public androidx.compose.ui.text.TextStyle getDisplayLarge();
+    method public androidx.compose.ui.text.TextStyle getDisplayMedium();
+    method public androidx.compose.ui.text.TextStyle getDisplaySmall();
+    method public androidx.compose.ui.text.TextStyle getHeadlineLarge();
+    method public androidx.compose.ui.text.TextStyle getHeadlineMedium();
+    method public androidx.compose.ui.text.TextStyle getHeadlineSmall();
+    method public androidx.compose.ui.text.TextStyle getLabelLarge();
+    method public androidx.compose.ui.text.TextStyle getLabelMedium();
+    method public androidx.compose.ui.text.TextStyle getLabelSmall();
+    method public androidx.compose.ui.text.TextStyle getTitleLarge();
+    method public androidx.compose.ui.text.TextStyle getTitleMedium();
+    method public androidx.compose.ui.text.TextStyle getTitleSmall();
+    property public final androidx.compose.ui.text.TextStyle bodyLarge;
+    property public final androidx.compose.ui.text.TextStyle bodyMedium;
+    property public final androidx.compose.ui.text.TextStyle bodySmall;
+    property public final androidx.compose.ui.text.TextStyle displayLarge;
+    property public final androidx.compose.ui.text.TextStyle displayMedium;
+    property public final androidx.compose.ui.text.TextStyle displaySmall;
+    property public final androidx.compose.ui.text.TextStyle headlineLarge;
+    property public final androidx.compose.ui.text.TextStyle headlineMedium;
+    property public final androidx.compose.ui.text.TextStyle headlineSmall;
+    property public final androidx.compose.ui.text.TextStyle labelLarge;
+    property public final androidx.compose.ui.text.TextStyle labelMedium;
+    property public final androidx.compose.ui.text.TextStyle labelSmall;
+    property public final androidx.compose.ui.text.TextStyle titleLarge;
+    property public final androidx.compose.ui.text.TextStyle titleMedium;
+    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/current.txt b/compose/material3/material3/api/current.txt
index 20967a5..a5cf8de 100644
--- a/compose/material3/material3/api/current.txt
+++ b/compose/material3/material3/api/current.txt
@@ -30,8 +30,8 @@
   }
 
   public final class AppBarKt {
-    method @androidx.compose.runtime.Composable public static void BottomAppBar(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? floatingActionButton, optional long containerColor, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding);
-    method @androidx.compose.runtime.Composable public static void BottomAppBar(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float tonalElevation, 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 BottomAppBar(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? floatingActionButton, optional long containerColor, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.layout.WindowInsets windowInsets);
+    method @androidx.compose.runtime.Composable public static void BottomAppBar(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.layout.WindowInsets windowInsets, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
   }
 
   public final class BadgeKt {
@@ -42,22 +42,16 @@
     method @androidx.compose.runtime.Composable public long getContainerColor();
     method public float getContainerElevation();
     method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.WindowInsets getWindowInsets();
     property public final float ContainerElevation;
     property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
     property @androidx.compose.runtime.Composable public final long bottomAppBarFabColor;
     property @androidx.compose.runtime.Composable public final long containerColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.layout.WindowInsets windowInsets;
     field public static final androidx.compose.material3.BottomAppBarDefaults INSTANCE;
   }
 
-  public static final class BottomAppBarDefaults.BottomAppBarFabElevation implements androidx.compose.material3.FloatingActionButtonElevation {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.MutableState<androidx.compose.ui.unit.Dp> shadowElevation(androidx.compose.foundation.interaction.InteractionSource interactionSource);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.MutableState<androidx.compose.ui.unit.Dp> tonalElevation(androidx.compose.foundation.interaction.InteractionSource interactionSource);
-    field public static final androidx.compose.material3.BottomAppBarDefaults.BottomAppBarFabElevation INSTANCE;
-  }
-
-  @androidx.compose.runtime.Stable public interface ButtonColors {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> containerColor(boolean enabled);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled);
+  @androidx.compose.runtime.Immutable public final class ButtonColors {
   }
 
   public final class ButtonDefaults {
@@ -98,9 +92,7 @@
     field public static final androidx.compose.material3.ButtonDefaults INSTANCE;
   }
 
-  @androidx.compose.runtime.Stable public interface ButtonElevation {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> shadowElevation(boolean enabled, androidx.compose.foundation.interaction.InteractionSource interactionSource);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> tonalElevation(boolean enabled, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  @androidx.compose.runtime.Stable public final class ButtonElevation {
   }
 
   public final class ButtonKt {
@@ -111,9 +103,7 @@
     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);
   }
 
-  @androidx.compose.runtime.Stable public interface CardColors {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> containerColor(boolean enabled);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled);
+  @androidx.compose.runtime.Immutable public final class CardColors {
   }
 
   public final class CardDefaults {
@@ -133,9 +123,7 @@
     field public static final androidx.compose.material3.CardDefaults INSTANCE;
   }
 
-  @androidx.compose.runtime.Stable public interface CardElevation {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> shadowElevation(boolean enabled, androidx.compose.foundation.interaction.InteractionSource? interactionSource);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> tonalElevation(boolean enabled, androidx.compose.foundation.interaction.InteractionSource? interactionSource);
+  @androidx.compose.runtime.Immutable public final class CardElevation {
   }
 
   public final class CardKt {
@@ -144,10 +132,7 @@
     method @androidx.compose.runtime.Composable public static void OutlinedCard(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, optional androidx.compose.foundation.BorderStroke border, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,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);
+  @androidx.compose.runtime.Immutable public final class CheckboxColors {
   }
 
   public final class CheckboxDefaults {
@@ -248,7 +233,7 @@
   }
 
   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);
+    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 {
@@ -266,6 +251,7 @@
   }
 
   public final class FloatingActionButtonDefaults {
+    method public androidx.compose.material3.FloatingActionButtonElevation bottomAppBarFabElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation);
     method @androidx.compose.runtime.Composable public androidx.compose.material3.FloatingActionButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation);
     method @androidx.compose.runtime.Composable public long getContainerColor();
     method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getExtendedFabShape();
@@ -283,22 +269,18 @@
     field public static final androidx.compose.material3.FloatingActionButtonDefaults INSTANCE;
   }
 
-  @androidx.compose.runtime.Stable public interface FloatingActionButtonElevation {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> shadowElevation(androidx.compose.foundation.interaction.InteractionSource interactionSource);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> tonalElevation(androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  @androidx.compose.runtime.Stable public class FloatingActionButtonElevation {
   }
 
   public final class FloatingActionButtonKt {
-    method @androidx.compose.runtime.Composable public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
-    method @androidx.compose.runtime.Composable public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean expanded, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation);
+    method @androidx.compose.runtime.Composable public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean expanded, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
     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.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method @androidx.compose.runtime.Composable public static void LargeFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method @androidx.compose.runtime.Composable public static void SmallFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void LargeFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void SmallFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
-  @androidx.compose.runtime.Stable public interface IconButtonColors {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> containerColor(boolean enabled);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled);
+  @androidx.compose.runtime.Immutable public final class IconButtonColors {
   }
 
   public final class IconButtonDefaults {
@@ -336,9 +318,7 @@
     method @androidx.compose.runtime.Composable public static void Icon(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
   }
 
-  @androidx.compose.runtime.Stable public interface IconToggleButtonColors {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> containerColor(boolean enabled, boolean checked);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled, boolean checked);
+  @androidx.compose.runtime.Immutable public final class IconToggleButtonColors {
   }
 
   public final class IncludeFontPaddingHelper_androidKt {
@@ -368,10 +348,7 @@
     field public static final androidx.compose.material3.MenuDefaults INSTANCE;
   }
 
-  @androidx.compose.runtime.Stable public interface MenuItemColors {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> leadingIconColor(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);
+  @androidx.compose.runtime.Immutable public final class MenuItemColors {
   }
 
   public final class MenuKt {
@@ -380,16 +357,14 @@
   public final class NavigationBarDefaults {
     method @androidx.compose.runtime.Composable public long getContainerColor();
     method public float getElevation();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.WindowInsets getWindowInsets();
     property public final float Elevation;
     property @androidx.compose.runtime.Composable public final long containerColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.layout.WindowInsets windowInsets;
     field public static final androidx.compose.material3.NavigationBarDefaults INSTANCE;
   }
 
-  @androidx.compose.runtime.Stable public interface NavigationBarItemColors {
-    method @androidx.compose.runtime.Composable public long getIndicatorColor();
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> iconColor(boolean selected);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> textColor(boolean selected);
-    property @androidx.compose.runtime.Composable public abstract long indicatorColor;
+  @androidx.compose.runtime.Stable public final class NavigationBarItemColors {
   }
 
   public final class NavigationBarItemDefaults {
@@ -398,7 +373,7 @@
   }
 
   public final class NavigationBarKt {
-    method @androidx.compose.runtime.Composable public static void NavigationBar(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float tonalElevation, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void NavigationBar(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.layout.WindowInsets windowInsets, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void NavigationBarItem(androidx.compose.foundation.layout.RowScope, boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.material3.NavigationBarItemColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
@@ -407,15 +382,13 @@
 
   public final class NavigationRailDefaults {
     method @androidx.compose.runtime.Composable public long getContainerColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.WindowInsets getWindowInsets();
     property @androidx.compose.runtime.Composable public final long ContainerColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.layout.WindowInsets windowInsets;
     field public static final androidx.compose.material3.NavigationRailDefaults INSTANCE;
   }
 
-  @androidx.compose.runtime.Stable public interface NavigationRailItemColors {
-    method @androidx.compose.runtime.Composable public long getIndicatorColor();
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> iconColor(boolean selected);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> textColor(boolean selected);
-    property @androidx.compose.runtime.Composable public abstract long indicatorColor;
+  @androidx.compose.runtime.Stable public final class NavigationRailItemColors {
   }
 
   public final class NavigationRailItemDefaults {
@@ -424,7 +397,7 @@
   }
 
   public final class NavigationRailKt {
-    method @androidx.compose.runtime.Composable public static void NavigationRail(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? header, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void NavigationRail(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? header, optional androidx.compose.foundation.layout.WindowInsets windowInsets, 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.material3.NavigationRailItemColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
@@ -452,8 +425,7 @@
     method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional long trackColor);
   }
 
-  @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);
+  @androidx.compose.runtime.Immutable public final class RadioButtonColors {
   }
 
   public final class RadioButtonDefaults {
@@ -465,6 +437,9 @@
     method @androidx.compose.runtime.Composable public static void RadioButton(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.material3.RadioButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
+  public final class SafeDrawingInsets_androidKt {
+  }
+
   public final class ScaffoldKt {
   }
 
@@ -500,10 +475,7 @@
   public final class ShapesKt {
   }
 
-  @androidx.compose.runtime.Stable public interface SliderColors {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> thumbColor(boolean enabled);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> tickColor(boolean enabled, boolean active);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trackColor(boolean enabled, boolean active);
+  @androidx.compose.runtime.Immutable public final class SliderColors {
   }
 
   public final class SliderDefaults {
@@ -592,11 +564,7 @@
   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> borderColor(boolean enabled, boolean checked);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> iconColor(boolean enabled, boolean checked);
-    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);
+  @androidx.compose.runtime.Immutable public final class SwitchColors {
   }
 
   public final class SwitchDefaults {
@@ -640,6 +608,9 @@
     method @androidx.compose.runtime.Composable public static void TabRow(int selectedTabIndex, optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.material3.TabPosition>,kotlin.Unit> indicator, optional kotlin.jvm.functions.Function0<kotlin.Unit> divider, kotlin.jvm.functions.Function0<kotlin.Unit> tabs);
   }
 
+  @androidx.compose.runtime.Immutable public final class TextFieldColors {
+  }
+
   public final class TextFieldDefaultsKt {
   }
 
@@ -660,21 +631,6 @@
   public final class TonalPaletteKt {
   }
 
-  @androidx.compose.runtime.Stable public interface TopAppBarColors {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> actionIconContentColor(float colorTransitionFraction);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> containerColor(float colorTransitionFraction);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> navigationIconContentColor(float colorTransitionFraction);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> titleContentColor(float colorTransitionFraction);
-  }
-
-  public final class TopAppBarDefaults {
-    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors centerAlignedTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor);
-    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors largeTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor);
-    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors mediumTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor);
-    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors smallTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor);
-    field public static final androidx.compose.material3.TopAppBarDefaults INSTANCE;
-  }
-
   public final class TouchTargetKt {
   }
 
diff --git a/compose/material3/material3/api/public_plus_experimental_1.0.0-beta01.txt b/compose/material3/material3/api/public_plus_experimental_1.0.0-beta01.txt
new file mode 100644
index 0000000..4e26755
--- /dev/null
+++ b/compose/material3/material3/api/public_plus_experimental_1.0.0-beta01.txt
@@ -0,0 +1,987 @@
+// Signature format: 4.0
+package androidx.compose.material3 {
+
+  public final class AlertDialogDefaults {
+    method @androidx.compose.runtime.Composable public long getContainerColor();
+    method @androidx.compose.runtime.Composable public long getIconContentColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getShape();
+    method @androidx.compose.runtime.Composable public long getTextContentColor();
+    method @androidx.compose.runtime.Composable public long getTitleContentColor();
+    method public float getTonalElevation();
+    property public final float TonalElevation;
+    property @androidx.compose.runtime.Composable public final long containerColor;
+    property @androidx.compose.runtime.Composable public final long iconContentColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape shape;
+    property @androidx.compose.runtime.Composable public final long textContentColor;
+    property @androidx.compose.runtime.Composable public final long titleContentColor;
+    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);
+  }
+
+  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> text, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean enabled, optional androidx.compose.material3.MenuItemColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+  }
+
+  public final class AppBarKt {
+    method @androidx.compose.runtime.Composable public static void BottomAppBar(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? floatingActionButton, optional long containerColor, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.layout.WindowInsets windowInsets);
+    method @androidx.compose.runtime.Composable public static void BottomAppBar(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.layout.WindowInsets windowInsets, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void CenterAlignedTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.foundation.layout.WindowInsets windowInsets, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void LargeTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.foundation.layout.WindowInsets windowInsets, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void MediumTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.foundation.layout.WindowInsets windowInsets, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void SmallTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.foundation.layout.WindowInsets windowInsets, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static androidx.compose.material3.TopAppBarState rememberTopAppBarState(optional float initialHeightOffsetLimit, optional float initialHeightOffset, optional float initialContentOffset);
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api public final class AssistChipDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ChipBorder assistChipBorder(optional long borderColor, optional long disabledBorderColor, optional float borderWidth);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ChipColors assistChipColors(optional long containerColor, optional long labelColor, optional long leadingIconContentColor, optional long trailingIconContentColor, optional long disabledContainerColor, optional long disabledLabelColor, optional long disabledLeadingIconContentColor, optional long disabledTrailingIconContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ChipElevation assistChipElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation, optional float disabledElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ChipColors elevatedAssistChipColors(optional long containerColor, optional long labelColor, optional long leadingIconContentColor, optional long trailingIconContentColor, optional long disabledContainerColor, optional long disabledLabelColor, optional long disabledLeadingIconContentColor, optional long disabledTrailingIconContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ChipElevation elevatedAssistChipElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation, optional float disabledElevation);
+    method public float getHeight();
+    method public float getIconSize();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getShape();
+    property public final float Height;
+    property public final float IconSize;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape shape;
+    field public static final androidx.compose.material3.AssistChipDefaults INSTANCE;
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api public final class BadgeDefaults {
+    method @androidx.compose.runtime.Composable public long getContainerColor();
+    property @androidx.compose.runtime.Composable public final long containerColor;
+    field public static final androidx.compose.material3.BadgeDefaults INSTANCE;
+  }
+
+  public final class BadgeKt {
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void Badge(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? content);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @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 BottomAppBarDefaults {
+    method @androidx.compose.runtime.Composable public long getBottomAppBarFabColor();
+    method @androidx.compose.runtime.Composable public long getContainerColor();
+    method public float getContainerElevation();
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.WindowInsets getWindowInsets();
+    property public final float ContainerElevation;
+    property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
+    property @androidx.compose.runtime.Composable public final long bottomAppBarFabColor;
+    property @androidx.compose.runtime.Composable public final long containerColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.layout.WindowInsets windowInsets;
+    field public static final androidx.compose.material3.BottomAppBarDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public final class ButtonColors {
+  }
+
+  public final class ButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors buttonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonElevation buttonElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float disabledElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors elevatedButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonElevation elevatedButtonElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float disabledElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors filledTonalButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonElevation filledTonalButtonElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float disabledElevation);
+    method public androidx.compose.foundation.layout.PaddingValues getButtonWithIconContentPadding();
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getElevatedShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getFilledTonalShape();
+    method public float getIconSize();
+    method public float getIconSpacing();
+    method public float getMinHeight();
+    method public float getMinWidth();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke getOutlinedButtonBorder();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getOutlinedShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getShape();
+    method public androidx.compose.foundation.layout.PaddingValues getTextButtonContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getTextShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors outlinedButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors textButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    property public final androidx.compose.foundation.layout.PaddingValues ButtonWithIconContentPadding;
+    property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
+    property public final float IconSize;
+    property public final float IconSpacing;
+    property public final float MinHeight;
+    property public final float MinWidth;
+    property public final androidx.compose.foundation.layout.PaddingValues TextButtonContentPadding;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape elevatedShape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape filledTonalShape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.BorderStroke outlinedButtonBorder;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape outlinedShape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape shape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape textShape;
+    field public static final androidx.compose.material3.ButtonDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public final class ButtonElevation {
+  }
+
+  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.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);
+    method @androidx.compose.runtime.Composable public static void ElevatedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.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);
+    method @androidx.compose.runtime.Composable public static void FilledTonalButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.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);
+    method @androidx.compose.runtime.Composable public static void OutlinedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.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);
+    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);
+  }
+
+  @androidx.compose.runtime.Immutable public final class CardColors {
+  }
+
+  public final class CardDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CardColors cardColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CardElevation cardElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation, optional float disabledElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CardColors elevatedCardColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CardElevation elevatedCardElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation, optional float disabledElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getElevatedShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getOutlinedShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke outlinedCardBorder(optional boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CardColors outlinedCardColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CardElevation outlinedCardElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation, optional float disabledElevation);
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape elevatedShape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape outlinedShape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape shape;
+    field public static final androidx.compose.material3.CardDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public final class CardElevation {
+  }
+
+  public final class CardKt {
+    method @androidx.compose.runtime.Composable public static void Card(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, optional androidx.compose.foundation.BorderStroke? border, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable 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 androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void ElevatedCard(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void ElevatedCard(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.CardColors colors, optional androidx.compose.material3.CardElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void OutlinedCard(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, optional androidx.compose.foundation.BorderStroke border, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void OutlinedCard(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.CardColors colors, optional androidx.compose.material3.CardElevation elevation, optional androidx.compose.foundation.BorderStroke border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Immutable public final class CheckboxColors {
+  }
+
+  public final class CheckboxDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CheckboxColors colors(optional long checkedColor, optional long uncheckedColor, optional long checkmarkColor, optional long disabledCheckedColor, optional long disabledUncheckedColor, optional long disabledIndeterminateColor);
+    field public static final androidx.compose.material3.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.material3.CheckboxColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+    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.material3.CheckboxColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Immutable public final class ChipBorder {
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Immutable public final class ChipColors {
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Immutable public final class ChipElevation {
+  }
+
+  public final class ChipKt {
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void AssistChip(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> label, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.ChipColors colors, optional androidx.compose.material3.ChipElevation? elevation, optional androidx.compose.material3.ChipBorder? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void ElevatedAssistChip(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> label, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.ChipColors colors, optional androidx.compose.material3.ChipElevation? elevation, optional androidx.compose.material3.ChipBorder? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void ElevatedFilterChip(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> label, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.SelectableChipColors colors, optional androidx.compose.material3.SelectableChipElevation? elevation, optional androidx.compose.material3.SelectableChipBorder? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void ElevatedSuggestionChip(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> label, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.ChipColors colors, optional androidx.compose.material3.ChipElevation? elevation, optional androidx.compose.material3.ChipBorder? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void FilterChip(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> label, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.SelectableChipColors colors, optional androidx.compose.material3.SelectableChipElevation? elevation, optional androidx.compose.material3.SelectableChipBorder? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void InputChip(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> label, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? avatar, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.SelectableChipColors colors, optional androidx.compose.material3.SelectableChipElevation? elevation, optional androidx.compose.material3.SelectableChipBorder? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void SuggestionChip(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> label, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.ChipColors colors, optional androidx.compose.material3.ChipElevation? elevation, optional androidx.compose.material3.ChipBorder? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+  }
+
+  @androidx.compose.runtime.Stable public final class ColorScheme {
+    ctor public ColorScheme(long primary, long onPrimary, long primaryContainer, long onPrimaryContainer, long inversePrimary, long secondary, long onSecondary, long secondaryContainer, long onSecondaryContainer, long tertiary, long onTertiary, long tertiaryContainer, long onTertiaryContainer, long background, long onBackground, long surface, long onSurface, long surfaceVariant, long onSurfaceVariant, long surfaceTint, long inverseSurface, long inverseOnSurface, long error, long onError, long errorContainer, long onErrorContainer, long outline, long outlineVariant, long scrim);
+    method public androidx.compose.material3.ColorScheme copy(optional long primary, optional long onPrimary, optional long primaryContainer, optional long onPrimaryContainer, optional long inversePrimary, optional long secondary, optional long onSecondary, optional long secondaryContainer, optional long onSecondaryContainer, optional long tertiary, optional long onTertiary, optional long tertiaryContainer, optional long onTertiaryContainer, optional long background, optional long onBackground, optional long surface, optional long onSurface, optional long surfaceVariant, optional long onSurfaceVariant, optional long 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);
+    method public long getBackground();
+    method public long getError();
+    method public long getErrorContainer();
+    method public long getInverseOnSurface();
+    method public long getInversePrimary();
+    method public long getInverseSurface();
+    method public long getOnBackground();
+    method public long getOnError();
+    method public long getOnErrorContainer();
+    method public long getOnPrimary();
+    method public long getOnPrimaryContainer();
+    method public long getOnSecondary();
+    method public long getOnSecondaryContainer();
+    method public long getOnSurface();
+    method public long getOnSurfaceVariant();
+    method public long getOnTertiary();
+    method public long getOnTertiaryContainer();
+    method public long getOutline();
+    method public long getOutlineVariant();
+    method public long getPrimary();
+    method public long getPrimaryContainer();
+    method public long getScrim();
+    method public long getSecondary();
+    method public long getSecondaryContainer();
+    method public long getSurface();
+    method public long getSurfaceTint();
+    method public long getSurfaceVariant();
+    method public long getTertiary();
+    method public long getTertiaryContainer();
+    property public final long background;
+    property public final long error;
+    property public final long errorContainer;
+    property public final long inverseOnSurface;
+    property public final long inversePrimary;
+    property public final long inverseSurface;
+    property public final long onBackground;
+    property public final long onError;
+    property public final long onErrorContainer;
+    property public final long onPrimary;
+    property public final long onPrimaryContainer;
+    property public final long onSecondary;
+    property public final long onSecondaryContainer;
+    property public final long onSurface;
+    property public final long onSurfaceVariant;
+    property public final long onTertiary;
+    property public final long onTertiaryContainer;
+    property public final long outline;
+    property public final long outlineVariant;
+    property public final long primary;
+    property public final long primaryContainer;
+    property public final long scrim;
+    property public final long secondary;
+    property public final long secondaryContainer;
+    property public final long surface;
+    property public final long surfaceTint;
+    property public final long surfaceVariant;
+    property public final long tertiary;
+    property public final long tertiaryContainer;
+  }
+
+  public final class ColorSchemeKt {
+    method public static long contentColorFor(androidx.compose.material3.ColorScheme, long backgroundColor);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static long contentColorFor(long backgroundColor);
+    method public static androidx.compose.material3.ColorScheme darkColorScheme(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);
+    method public static androidx.compose.material3.ColorScheme lightColorScheme(optional long primary, optional long onPrimary, optional long primaryContainer, optional long onPrimaryContainer, optional long inversePrimary, optional long secondary, optional long onSecondary, optional long secondaryContainer, optional long onSecondaryContainer, optional long tertiary, optional long onTertiary, optional long tertiaryContainer, optional long onTertiaryContainer, optional long background, optional long onBackground, optional long surface, optional long 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);
+    method public static long surfaceColorAtElevation(androidx.compose.material3.ColorScheme, float elevation);
+  }
+
+  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 DividerDefaults {
+    method @androidx.compose.runtime.Composable public long getColor();
+    method public float getThickness();
+    property public final float Thickness;
+    property @androidx.compose.runtime.Composable public final long color;
+    field public static final androidx.compose.material3.DividerDefaults INSTANCE;
+  }
+
+  public final class DividerKt {
+    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 {
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api public final class DrawerDefaults {
+    method @androidx.compose.runtime.Composable public long getContainerColor();
+    method public float getDismissibleDrawerElevation();
+    method public float getMaximumDrawerWidth();
+    method public float getModalDrawerElevation();
+    method public float getPermanentDrawerElevation();
+    method @androidx.compose.runtime.Composable public long getScrimColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.WindowInsets getWindowInsets();
+    property public final float DismissibleDrawerElevation;
+    property public final float MaximumDrawerWidth;
+    property public final float ModalDrawerElevation;
+    property public final float PermanentDrawerElevation;
+    property @androidx.compose.runtime.Composable public final long containerColor;
+    property @androidx.compose.runtime.Composable public final long scrimColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape shape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.layout.WindowInsets windowInsets;
+    field public static final androidx.compose.material3.DrawerDefaults INSTANCE;
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Stable public final class DrawerState {
+    ctor public DrawerState(androidx.compose.material3.DrawerValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material3.DrawerValue,java.lang.Boolean> confirmStateChange);
+    method @androidx.compose.material3.ExperimentalMaterial3Api public suspend Object? animateTo(androidx.compose.material3.DrawerValue targetValue, androidx.compose.animation.core.AnimationSpec<java.lang.Float> anim, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public suspend Object? close(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public androidx.compose.material3.DrawerValue getCurrentValue();
+    method @androidx.compose.material3.ExperimentalMaterial3Api public androidx.compose.runtime.State<java.lang.Float> getOffset();
+    method @androidx.compose.material3.ExperimentalMaterial3Api public androidx.compose.material3.DrawerValue getTargetValue();
+    method public boolean isAnimationRunning();
+    method public boolean isClosed();
+    method public boolean isOpen();
+    method public suspend Object? open(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method @androidx.compose.material3.ExperimentalMaterial3Api public suspend Object? snapTo(androidx.compose.material3.DrawerValue targetValue, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    property public final androidx.compose.material3.DrawerValue currentValue;
+    property public final boolean isAnimationRunning;
+    property public final boolean isClosed;
+    property public final boolean isOpen;
+    property @androidx.compose.material3.ExperimentalMaterial3Api public final androidx.compose.runtime.State<java.lang.Float> offset;
+    property @androidx.compose.material3.ExperimentalMaterial3Api public final androidx.compose.material3.DrawerValue targetValue;
+    field public static final androidx.compose.material3.DrawerState.Companion Companion;
+  }
+
+  public static final class DrawerState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.material3.DrawerState,androidx.compose.material3.DrawerValue> Saver(kotlin.jvm.functions.Function1<? super androidx.compose.material3.DrawerValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api public enum DrawerValue {
+    method public static androidx.compose.material3.DrawerValue valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.material3.DrawerValue[] values();
+    enum_constant public static final androidx.compose.material3.DrawerValue Closed;
+    enum_constant public static final androidx.compose.material3.DrawerValue Open;
+  }
+
+  public final class DynamicTonalPaletteKt {
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) public static androidx.compose.material3.ColorScheme dynamicDarkColorScheme(android.content.Context context);
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) public static androidx.compose.material3.ColorScheme dynamicLightColorScheme(android.content.Context context);
+  }
+
+  public final class ElevationKt {
+  }
+
+  @kotlin.RequiresOptIn(message="This material API is experimental and is likely to change or to be removed in" + " the future.") public @interface ExperimentalMaterial3Api {
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api 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.material3.ExperimentalMaterial3Api public final class ExposedDropdownMenuDefaults {
+    method @androidx.compose.material3.ExperimentalMaterial3Api @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.material3.TextFieldColors outlinedTextFieldColors(optional long textColor, optional long disabledTextColor, optional long containerColor, optional long cursorColor, optional long errorCursorColor, optional androidx.compose.foundation.text.selection.TextSelectionColors selectionColors, optional long focusedBorderColor, optional long unfocusedBorderColor, optional long disabledBorderColor, optional long errorBorderColor, optional long focusedLeadingIconColor, optional long unfocusedLeadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long focusedTrailingIconColor, optional long unfocusedTrailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long placeholderColor, optional long disabledPlaceholderColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.TextFieldColors textFieldColors(optional long textColor, optional long disabledTextColor, optional long containerColor, optional long cursorColor, optional long errorCursorColor, optional androidx.compose.foundation.text.selection.TextSelectionColors selectionColors, optional long focusedIndicatorColor, optional long unfocusedIndicatorColor, optional long disabledIndicatorColor, optional long errorIndicatorColor, optional long focusedLeadingIconColor, optional long unfocusedLeadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long focusedTrailingIconColor, optional long unfocusedTrailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long placeholderColor, optional long disabledPlaceholderColor);
+    field public static final androidx.compose.material3.ExposedDropdownMenuDefaults INSTANCE;
+  }
+
+  public final class ExposedDropdownMenuKt {
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void ExposedDropdownMenuBox(boolean expanded, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onExpandedChange, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.material3.ExposedDropdownMenuBoxScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api @kotlin.jvm.JvmInline public final value class FabPosition {
+    field public static final androidx.compose.material3.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.material3.ExperimentalMaterial3Api public final class FilterChipDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.SelectableChipColors elevatedFilterChipColors(optional long containerColor, optional long labelColor, optional long iconColor, optional long disabledContainerColor, optional long disabledLabelColor, optional long disabledLeadingIconColor, optional long disabledTrailingIconColor, optional long selectedContainerColor, optional long disabledSelectedContainerColor, optional long selectedLabelColor, optional long selectedLeadingIconColor, optional long selectedTrailingIconColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.SelectableChipElevation elevatedFilterChipElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation, optional float disabledElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.SelectableChipBorder filterChipBorder(optional long borderColor, optional long selectedBorderColor, optional long disabledBorderColor, optional long disabledSelectedBorderColor, optional float borderWidth, optional float selectedBorderWidth);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.SelectableChipColors filterChipColors(optional long containerColor, optional long labelColor, optional long iconColor, optional long disabledContainerColor, optional long disabledLabelColor, optional long disabledLeadingIconColor, optional long disabledTrailingIconColor, optional long selectedContainerColor, optional long disabledSelectedContainerColor, optional long selectedLabelColor, optional long selectedLeadingIconColor, optional long selectedTrailingIconColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.SelectableChipElevation filterChipElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation, optional float disabledElevation);
+    method public float getHeight();
+    method public float getIconSize();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getShape();
+    property public final float Height;
+    property public final float IconSize;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape shape;
+    field public static final androidx.compose.material3.FilterChipDefaults INSTANCE;
+  }
+
+  public final class FloatingActionButtonDefaults {
+    method public androidx.compose.material3.FloatingActionButtonElevation bottomAppBarFabElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.FloatingActionButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation);
+    method @androidx.compose.runtime.Composable public long getContainerColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getExtendedFabShape();
+    method public float getLargeIconSize();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getLargeShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getSmallShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.FloatingActionButtonElevation loweredElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation);
+    property public final float LargeIconSize;
+    property @androidx.compose.runtime.Composable public final long containerColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape extendedFabShape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape largeShape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape shape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape smallShape;
+    field public static final androidx.compose.material3.FloatingActionButtonDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public class FloatingActionButtonElevation {
+  }
+
+  public final class FloatingActionButtonKt {
+    method @androidx.compose.runtime.Composable public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean expanded, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+    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.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void LargeFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void SmallFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Immutable public final class IconButtonColors {
+  }
+
+  public final class IconButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.IconButtonColors filledIconButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.IconToggleButtonColors filledIconToggleButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor, optional long checkedContainerColor, optional long checkedContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.IconButtonColors filledTonalIconButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.IconToggleButtonColors filledTonalIconToggleButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor, optional long checkedContainerColor, optional long checkedContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getFilledShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getOutlinedShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.IconButtonColors iconButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.IconToggleButtonColors iconToggleButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor, optional long checkedContainerColor, optional long checkedContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke outlinedIconButtonBorder(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.IconButtonColors outlinedIconButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke? outlinedIconToggleButtonBorder(boolean enabled, boolean checked);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.IconToggleButtonColors outlinedIconToggleButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor, optional long checkedContainerColor, optional long checkedContentColor);
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape filledShape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape outlinedShape;
+    field public static final androidx.compose.material3.IconButtonDefaults INSTANCE;
+  }
+
+  public final class IconButtonKt {
+    method @androidx.compose.runtime.Composable public static void FilledIconButton(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.IconButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void FilledIconToggleButton(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 androidx.compose.material3.IconToggleButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void FilledTonalIconButton(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.IconButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void FilledTonalIconToggleButton(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 androidx.compose.material3.IconToggleButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    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.material3.IconButtonColors colors, 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.material3.IconToggleButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void OutlinedIconButton(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.IconButtonColors colors, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void OutlinedIconToggleButton(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 androidx.compose.material3.IconToggleButtonColors colors, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class IconKt {
+    method @androidx.compose.runtime.Composable public static void Icon(androidx.compose.ui.graphics.vector.ImageVector imageVector, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+    method @androidx.compose.runtime.Composable public static void Icon(androidx.compose.ui.graphics.ImageBitmap bitmap, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+    method @androidx.compose.runtime.Composable public static void Icon(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+  }
+
+  @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();
+    method public float getIconSize();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.SelectableChipBorder inputChipBorder(optional long borderColor, optional long selectedBorderColor, optional long disabledBorderColor, optional long disabledSelectedBorderColor, optional float borderWidth, optional float selectedBorderWidth);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.SelectableChipColors inputChipColors(optional long containerColor, optional long labelColor, optional long leadingIconColor, optional long trailingIconColor, optional long disabledContainerColor, optional long disabledLabelColor, optional long disabledLeadingIconColor, optional long disabledTrailingIconColor, optional long selectedContainerColor, optional long disabledSelectedContainerColor, optional long selectedLabelColor, optional long selectedLeadingIconColor, optional long selectedTrailingIconColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.SelectableChipElevation inputChipElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation, optional float disabledElevation);
+    property public final float AvatarSize;
+    property public final float Height;
+    property public final float IconSize;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape shape;
+    field public static final androidx.compose.material3.InputChipDefaults INSTANCE;
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Immutable public final class ListItemColors {
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api public final class ListItemDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ListItemColors colors(optional long containerColor, optional long headlineColor, optional long leadingIconColor, optional long overlineColor, optional long supportingColor, optional long trailingIconColor, optional long disabledHeadlineColor, optional long disabledLeadingIconColor, optional long disabledTrailingIconColor);
+    method @androidx.compose.runtime.Composable public long getContainerColor();
+    method @androidx.compose.runtime.Composable public long getContentColor();
+    method public float getElevation();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getShape();
+    property public final float Elevation;
+    property @androidx.compose.runtime.Composable public final long containerColor;
+    property @androidx.compose.runtime.Composable public final long contentColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape shape;
+    field public static final androidx.compose.material3.ListItemDefaults INSTANCE;
+  }
+
+  public final class ListItemKt {
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void ListItem(kotlin.jvm.functions.Function0<kotlin.Unit> headlineText, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? overlineText, optional kotlin.jvm.functions.Function0<kotlin.Unit>? supportingText, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingContent, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingContent, optional androidx.compose.material3.ListItemColors colors, optional float tonalElevation, optional float shadowElevation);
+  }
+
+  public final class MaterialTheme {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material3.ColorScheme getColorScheme();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material3.Shapes getShapes();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material3.Typography getTypography();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material3.ColorScheme colorScheme;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material3.Shapes shapes;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material3.Typography typography;
+    field public static final androidx.compose.material3.MaterialTheme INSTANCE;
+  }
+
+  public final class MaterialThemeKt {
+    method @androidx.compose.runtime.Composable public static void MaterialTheme(optional androidx.compose.material3.ColorScheme colorScheme, optional androidx.compose.material3.Shapes shapes, optional androidx.compose.material3.Typography typography, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class MenuDefaults {
+    method public androidx.compose.foundation.layout.PaddingValues getDropdownMenuItemContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.MenuItemColors itemColors(optional long textColor, optional long leadingIconColor, optional long trailingIconColor, optional long disabledTextColor, optional long disabledLeadingIconColor, optional long disabledTrailingIconColor);
+    property public final androidx.compose.foundation.layout.PaddingValues DropdownMenuItemContentPadding;
+    field public static final androidx.compose.material3.MenuDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public final class MenuItemColors {
+  }
+
+  public final class MenuKt {
+  }
+
+  public final class NavigationBarDefaults {
+    method @androidx.compose.runtime.Composable public long getContainerColor();
+    method public float getElevation();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.WindowInsets getWindowInsets();
+    property public final float Elevation;
+    property @androidx.compose.runtime.Composable public final long containerColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.layout.WindowInsets windowInsets;
+    field public static final androidx.compose.material3.NavigationBarDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public final class NavigationBarItemColors {
+  }
+
+  public final class NavigationBarItemDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.NavigationBarItemColors colors(optional long selectedIconColor, optional long selectedTextColor, optional long indicatorColor, optional long unselectedIconColor, optional long unselectedTextColor);
+    field public static final androidx.compose.material3.NavigationBarItemDefaults INSTANCE;
+  }
+
+  public final class NavigationBarKt {
+    method @androidx.compose.runtime.Composable public static void NavigationBar(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.layout.WindowInsets windowInsets, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void NavigationBarItem(androidx.compose.foundation.layout.RowScope, boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.material3.NavigationBarItemColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Stable public interface NavigationDrawerItemColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> badgeColor(boolean selected);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> containerColor(boolean selected);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> iconColor(boolean selected);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> textColor(boolean selected);
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api public final class NavigationDrawerItemDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.NavigationDrawerItemColors colors(optional long selectedContainerColor, optional long unselectedContainerColor, optional long selectedIconColor, optional long unselectedIconColor, optional long selectedTextColor, optional long unselectedTextColor, optional long selectedBadgeColor, optional long unselectedBadgeColor);
+    method public androidx.compose.foundation.layout.PaddingValues getItemPadding();
+    property public final androidx.compose.foundation.layout.PaddingValues ItemPadding;
+    field public static final androidx.compose.material3.NavigationDrawerItemDefaults INSTANCE;
+  }
+
+  public final class NavigationDrawerKt {
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void DismissibleDrawerSheet(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape drawerShape, optional long drawerContainerColor, optional long drawerContentColor, optional float drawerTonalElevation, optional androidx.compose.foundation.layout.WindowInsets windowInsets, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void DismissibleNavigationDrawer(kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material3.DrawerState drawerState, optional boolean gesturesEnabled, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void ModalDrawerSheet(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape drawerShape, optional long drawerContainerColor, optional long drawerContentColor, optional float drawerTonalElevation, optional androidx.compose.foundation.layout.WindowInsets windowInsets, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void ModalNavigationDrawer(kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material3.DrawerState drawerState, optional boolean gesturesEnabled, optional long scrimColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void NavigationDrawerItem(kotlin.jvm.functions.Function0<kotlin.Unit> label, boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? badge, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.NavigationDrawerItemColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void PermanentDrawerSheet(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape drawerShape, optional long drawerContainerColor, optional long drawerContentColor, optional float drawerTonalElevation, optional androidx.compose.foundation.layout.WindowInsets windowInsets, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void PermanentNavigationDrawer(kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static androidx.compose.material3.DrawerState rememberDrawerState(androidx.compose.material3.DrawerValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material3.DrawerValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  public final class NavigationRailDefaults {
+    method @androidx.compose.runtime.Composable public long getContainerColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.WindowInsets getWindowInsets();
+    property @androidx.compose.runtime.Composable public final long ContainerColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.layout.WindowInsets windowInsets;
+    field public static final androidx.compose.material3.NavigationRailDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public final class NavigationRailItemColors {
+  }
+
+  public final class NavigationRailItemDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.NavigationRailItemColors colors(optional long selectedIconColor, optional long selectedTextColor, optional long indicatorColor, optional long unselectedIconColor, optional long unselectedTextColor);
+    field public static final androidx.compose.material3.NavigationRailItemDefaults INSTANCE;
+  }
+
+  public final class NavigationRailKt {
+    method @androidx.compose.runtime.Composable public static void NavigationRail(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? header, optional androidx.compose.foundation.layout.WindowInsets windowInsets, 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.material3.NavigationRailItemColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+  }
+
+  public final class OutlinedTextFieldKt {
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void OutlinedTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.TextFieldColors colors);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void OutlinedTextField(androidx.compose.ui.text.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.TextFieldValue,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.TextFieldColors colors);
+  }
+
+  public final class ProgressIndicatorDefaults {
+    method @androidx.compose.runtime.Composable public long getCircularColor();
+    method public float getCircularStrokeWidth();
+    method @androidx.compose.runtime.Composable public long getLinearColor();
+    method @androidx.compose.runtime.Composable public long getLinearTrackColor();
+    method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getProgressAnimationSpec();
+    property public final float CircularStrokeWidth;
+    property public final androidx.compose.animation.core.SpringSpec<java.lang.Float> ProgressAnimationSpec;
+    property @androidx.compose.runtime.Composable public final long circularColor;
+    property @androidx.compose.runtime.Composable public final long linearColor;
+    property @androidx.compose.runtime.Composable public final long linearTrackColor;
+    field public static final androidx.compose.material3.ProgressIndicatorDefaults INSTANCE;
+  }
+
+  public final class ProgressIndicatorKt {
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional long trackColor);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional long trackColor);
+  }
+
+  @androidx.compose.runtime.Immutable public final class RadioButtonColors {
+  }
+
+  public final class RadioButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.RadioButtonColors colors(optional long selectedColor, optional long unselectedColor, optional long disabledSelectedColor, optional long disabledUnselectedColor);
+    field public static final androidx.compose.material3.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.material3.RadioButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+  }
+
+  public final class SafeDrawingInsets_androidKt {
+  }
+
+  public final class ScaffoldKt {
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void Scaffold(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional int floatingActionButtonPosition, optional long containerColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Immutable public final class SelectableChipBorder {
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Immutable public final class SelectableChipColors {
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Immutable public final class SelectableChipElevation {
+  }
+
+  public final class ShapeDefaults {
+    method public androidx.compose.foundation.shape.CornerBasedShape getExtraLarge();
+    method public androidx.compose.foundation.shape.CornerBasedShape getExtraSmall();
+    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 ExtraLarge;
+    property public final androidx.compose.foundation.shape.CornerBasedShape ExtraSmall;
+    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;
+    field public static final androidx.compose.material3.ShapeDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public final class Shapes {
+    ctor public Shapes(optional androidx.compose.foundation.shape.CornerBasedShape extraSmall, optional androidx.compose.foundation.shape.CornerBasedShape small, optional androidx.compose.foundation.shape.CornerBasedShape medium, optional androidx.compose.foundation.shape.CornerBasedShape large, optional androidx.compose.foundation.shape.CornerBasedShape extraLarge);
+    method public androidx.compose.material3.Shapes copy(optional androidx.compose.foundation.shape.CornerBasedShape extraSmall, optional androidx.compose.foundation.shape.CornerBasedShape small, optional androidx.compose.foundation.shape.CornerBasedShape medium, optional androidx.compose.foundation.shape.CornerBasedShape large, optional androidx.compose.foundation.shape.CornerBasedShape extraLarge);
+    method public androidx.compose.foundation.shape.CornerBasedShape getExtraLarge();
+    method public androidx.compose.foundation.shape.CornerBasedShape getExtraSmall();
+    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 extraLarge;
+    property public final androidx.compose.foundation.shape.CornerBasedShape extraSmall;
+    property public final androidx.compose.foundation.shape.CornerBasedShape large;
+    property public final androidx.compose.foundation.shape.CornerBasedShape medium;
+    property public final androidx.compose.foundation.shape.CornerBasedShape small;
+  }
+
+  public final class ShapesKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class SliderColors {
+  }
+
+  public final class SliderDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.SliderColors colors(optional long thumbColor, optional long activeTrackColor, optional long activeTickColor, optional long inactiveTrackColor, optional long inactiveTickColor, optional long disabledThumbColor, optional long disabledActiveTrackColor, optional long disabledActiveTickColor, optional long disabledInactiveTrackColor, optional long disabledInactiveTickColor);
+    field public static final androidx.compose.material3.SliderDefaults INSTANCE;
+  }
+
+  public final class SliderKt {
+    method @androidx.compose.material3.ExperimentalMaterial3Api @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.material3.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.material3.SliderColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+  }
+
+  @androidx.compose.runtime.Stable public interface SnackbarData {
+    method public void dismiss();
+    method public androidx.compose.material3.SnackbarVisuals getVisuals();
+    method public void performAction();
+    property public abstract androidx.compose.material3.SnackbarVisuals visuals;
+  }
+
+  public final class SnackbarDefaults {
+    method @androidx.compose.runtime.Composable public long getActionColor();
+    method @androidx.compose.runtime.Composable public long getActionContentColor();
+    method @androidx.compose.runtime.Composable public long getColor();
+    method @androidx.compose.runtime.Composable public long getContentColor();
+    method @androidx.compose.runtime.Composable public long getDismissActionContentColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getShape();
+    property @androidx.compose.runtime.Composable public final long actionColor;
+    property @androidx.compose.runtime.Composable public final long actionContentColor;
+    property @androidx.compose.runtime.Composable public final long color;
+    property @androidx.compose.runtime.Composable public final long contentColor;
+    property @androidx.compose.runtime.Composable public final long dismissActionContentColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape shape;
+    field public static final androidx.compose.material3.SnackbarDefaults INSTANCE;
+  }
+
+  public enum SnackbarDuration {
+    method public static androidx.compose.material3.SnackbarDuration valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.material3.SnackbarDuration[] values();
+    enum_constant public static final androidx.compose.material3.SnackbarDuration Indefinite;
+    enum_constant public static final androidx.compose.material3.SnackbarDuration Long;
+    enum_constant public static final androidx.compose.material3.SnackbarDuration Short;
+  }
+
+  public final class SnackbarHostKt {
+    method @androidx.compose.runtime.Composable public static void SnackbarHost(androidx.compose.material3.SnackbarHostState hostState, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.material3.SnackbarData,kotlin.Unit> snackbar);
+  }
+
+  @androidx.compose.runtime.Stable public final class SnackbarHostState {
+    ctor public SnackbarHostState();
+    method public androidx.compose.material3.SnackbarData? getCurrentSnackbarData();
+    method public suspend Object? showSnackbar(String message, optional String? actionLabel, optional boolean withDismissAction, optional androidx.compose.material3.SnackbarDuration duration, optional kotlin.coroutines.Continuation<? super androidx.compose.material3.SnackbarResult>);
+    method @androidx.compose.material3.ExperimentalMaterial3Api public suspend Object? showSnackbar(androidx.compose.material3.SnackbarVisuals visuals, kotlin.coroutines.Continuation<? super androidx.compose.material3.SnackbarResult>);
+    property public final androidx.compose.material3.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 kotlin.jvm.functions.Function0<kotlin.Unit>? dismissAction, optional boolean actionOnNewLine, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional long actionContentColor, optional long dismissActionContentColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Snackbar(androidx.compose.material3.SnackbarData snackbarData, optional androidx.compose.ui.Modifier modifier, optional boolean actionOnNewLine, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional long actionColor, optional long actionContentColor, optional long dismissActionContentColor);
+  }
+
+  public enum SnackbarResult {
+    method public static androidx.compose.material3.SnackbarResult valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.material3.SnackbarResult[] values();
+    enum_constant public static final androidx.compose.material3.SnackbarResult ActionPerformed;
+    enum_constant public static final androidx.compose.material3.SnackbarResult Dismissed;
+  }
+
+  @androidx.compose.runtime.Stable public interface SnackbarVisuals {
+    method public String? getActionLabel();
+    method public androidx.compose.material3.SnackbarDuration getDuration();
+    method public String getMessage();
+    method public boolean getWithDismissAction();
+    property public abstract String? actionLabel;
+    property public abstract androidx.compose.material3.SnackbarDuration duration;
+    property public abstract String message;
+    property public abstract boolean withDismissAction;
+  }
+
+  public final class Strings_androidKt {
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api 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);
+    method public float getHeight();
+    method public float getIconSize();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ChipBorder suggestionChipBorder(optional long borderColor, optional long disabledBorderColor, optional float borderWidth);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ChipColors suggestionChipColors(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 suggestionChipElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation, optional float disabledElevation);
+    property public final float Height;
+    property public final float IconSize;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape shape;
+    field public static final androidx.compose.material3.SuggestionChipDefaults INSTANCE;
+  }
+
+  public final class SurfaceKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Surface(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional float tonalElevation, optional float shadowElevation, optional androidx.compose.foundation.BorderStroke? border, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable 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 float tonalElevation, optional float shadowElevation, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable 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 float tonalElevation, optional float shadowElevation, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable 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 float tonalElevation, optional float shadowElevation, optional androidx.compose.foundation.BorderStroke? border, 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;
+  }
+
+  public final class SwipeableKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class SwitchColors {
+  }
+
+  public final class SwitchDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.SwitchColors colors(optional long checkedThumbColor, optional long checkedTrackColor, optional long checkedBorderColor, optional long checkedIconColor, optional long uncheckedThumbColor, optional long uncheckedTrackColor, optional long uncheckedBorderColor, optional long uncheckedIconColor, optional long disabledCheckedThumbColor, optional long disabledCheckedTrackColor, optional long disabledCheckedBorderColor, optional long disabledCheckedIconColor, optional long disabledUncheckedThumbColor, optional long disabledUncheckedTrackColor, optional long disabledUncheckedBorderColor, optional long disabledUncheckedIconColor);
+    method public float getIconSize();
+    property public final float IconSize;
+    field public static final androidx.compose.material3.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 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 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);
+    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 long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, 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 Indicator(optional androidx.compose.ui.Modifier modifier, optional float height, optional long color);
+    method @androidx.compose.runtime.Composable public long getContainerColor();
+    method @androidx.compose.runtime.Composable public long getContentColor();
+    method public androidx.compose.ui.Modifier tabIndicatorOffset(androidx.compose.ui.Modifier, androidx.compose.material3.TabPosition currentTabPosition);
+    property @androidx.compose.runtime.Composable public final long containerColor;
+    property @androidx.compose.runtime.Composable public final long contentColor;
+    field public static final androidx.compose.material3.TabRowDefaults INSTANCE;
+  }
+
+  public final class TabRowKt {
+    method @androidx.compose.runtime.Composable public static void ScrollableTabRow(int selectedTabIndex, optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float edgePadding, optional kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.material3.TabPosition>,kotlin.Unit> indicator, optional kotlin.jvm.functions.Function0<kotlin.Unit> divider, kotlin.jvm.functions.Function0<kotlin.Unit> tabs);
+    method @androidx.compose.runtime.Composable public static void TabRow(int selectedTabIndex, optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.material3.TabPosition>,kotlin.Unit> indicator, optional kotlin.jvm.functions.Function0<kotlin.Unit> divider, kotlin.jvm.functions.Function0<kotlin.Unit> tabs);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextFieldColors {
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Immutable public final class TextFieldDefaults {
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public void BorderBox(boolean enabled, boolean isError, androidx.compose.foundation.interaction.InteractionSource interactionSource, androidx.compose.material3.TextFieldColors colors, optional androidx.compose.ui.graphics.Shape shape, optional float focusedBorderThickness, optional float unfocusedBorderThickness);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @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.material3.TextFieldColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional kotlin.jvm.functions.Function0<kotlin.Unit> border);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @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.material3.TextFieldColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding);
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getFilledShape();
+    method public float getFocusedBorderThickness();
+    method public float getMinHeight();
+    method public float getMinWidth();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getOutlinedShape();
+    method public float getUnfocusedBorderThickness();
+    method @androidx.compose.material3.ExperimentalMaterial3Api public androidx.compose.ui.Modifier indicatorLine(androidx.compose.ui.Modifier, boolean enabled, boolean isError, androidx.compose.foundation.interaction.InteractionSource interactionSource, androidx.compose.material3.TextFieldColors colors, optional float focusedIndicatorLineThickness, optional float unfocusedIndicatorLineThickness);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public androidx.compose.material3.TextFieldColors outlinedTextFieldColors(optional long textColor, optional long disabledTextColor, optional long containerColor, optional long cursorColor, optional long errorCursorColor, optional androidx.compose.foundation.text.selection.TextSelectionColors selectionColors, optional long focusedBorderColor, optional long unfocusedBorderColor, optional long disabledBorderColor, optional long errorBorderColor, optional long focusedLeadingIconColor, optional long unfocusedLeadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long focusedTrailingIconColor, optional long unfocusedTrailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long placeholderColor, optional long disabledPlaceholderColor);
+    method @androidx.compose.material3.ExperimentalMaterial3Api public androidx.compose.foundation.layout.PaddingValues outlinedTextFieldPadding(optional float start, optional float top, optional float end, optional float bottom);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public androidx.compose.material3.TextFieldColors textFieldColors(optional long textColor, optional long disabledTextColor, optional long containerColor, optional long cursorColor, optional long errorCursorColor, optional androidx.compose.foundation.text.selection.TextSelectionColors selectionColors, optional long focusedIndicatorColor, optional long unfocusedIndicatorColor, optional long disabledIndicatorColor, optional long errorIndicatorColor, optional long focusedLeadingIconColor, optional long unfocusedLeadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long focusedTrailingIconColor, optional long unfocusedTrailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long placeholderColor, optional long disabledPlaceholderColor);
+    method @androidx.compose.material3.ExperimentalMaterial3Api public androidx.compose.foundation.layout.PaddingValues textFieldWithLabelPadding(optional float start, optional float end, optional float top, optional float bottom);
+    method @androidx.compose.material3.ExperimentalMaterial3Api public androidx.compose.foundation.layout.PaddingValues textFieldWithoutLabelPadding(optional float start, optional float top, optional float end, optional float bottom);
+    property public final float FocusedBorderThickness;
+    property public final float MinHeight;
+    property public final float MinWidth;
+    property public final float UnfocusedBorderThickness;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape filledShape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape outlinedShape;
+    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 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.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 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.material3.TextFieldColors colors);
+  }
+
+  public final class TextKt {
+    method @androidx.compose.runtime.Composable public static void ProvideTextStyle(androidx.compose.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
+    method @androidx.compose.runtime.Composable public static void Text(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.Map<java.lang.String,androidx.compose.foundation.text.InlineTextContent> inlineContent, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> getLocalTextStyle();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> LocalTextStyle;
+  }
+
+  public final class TonalPaletteKt {
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Stable public final class TopAppBarColors {
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api public final class TopAppBarDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors centerAlignedTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarScrollBehavior enterAlwaysScrollBehavior(optional androidx.compose.material3.TopAppBarState state, optional kotlin.jvm.functions.Function0<java.lang.Boolean> canScroll);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarScrollBehavior exitUntilCollapsedScrollBehavior(optional androidx.compose.material3.TopAppBarState state, optional kotlin.jvm.functions.Function0<java.lang.Boolean> canScroll);
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.WindowInsets getWindowInsets();
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors largeTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors mediumTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarScrollBehavior pinnedScrollBehavior(optional androidx.compose.material3.TopAppBarState state, optional kotlin.jvm.functions.Function0<java.lang.Boolean> canScroll);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors smallTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor);
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.layout.WindowInsets windowInsets;
+    field public static final androidx.compose.material3.TopAppBarDefaults INSTANCE;
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Stable public interface TopAppBarScrollBehavior {
+    method public androidx.compose.ui.input.nestedscroll.NestedScrollConnection getNestedScrollConnection();
+    method public androidx.compose.material3.TopAppBarState getState();
+    method public boolean isPinned();
+    property public abstract boolean isPinned;
+    property public abstract androidx.compose.ui.input.nestedscroll.NestedScrollConnection nestedScrollConnection;
+    property public abstract androidx.compose.material3.TopAppBarState state;
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Stable public final class TopAppBarState {
+    ctor public TopAppBarState(float initialHeightOffsetLimit, float initialHeightOffset, float initialContentOffset);
+    method public float getCollapsedFraction();
+    method public float getContentOffset();
+    method public float getHeightOffset();
+    method public float getHeightOffsetLimit();
+    method public float getOverlappedFraction();
+    method public void setContentOffset(float);
+    method public void setHeightOffset(float);
+    method public void setHeightOffsetLimit(float);
+    property public final float collapsedFraction;
+    property public final float contentOffset;
+    property public final float heightOffset;
+    property public final float heightOffsetLimit;
+    property public final float overlappedFraction;
+    field public static final androidx.compose.material3.TopAppBarState.Companion Companion;
+  }
+
+  public static final class TopAppBarState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.material3.TopAppBarState,?> getSaver();
+    property public final androidx.compose.runtime.saveable.Saver<androidx.compose.material3.TopAppBarState,?> Saver;
+  }
+
+  public final class TouchTargetKt {
+    method @androidx.compose.material3.ExperimentalMaterial3Api public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalMinimumTouchTargetEnforcement();
+    property @androidx.compose.material3.ExperimentalMaterial3Api public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> LocalMinimumTouchTargetEnforcement;
+  }
+
+  @androidx.compose.runtime.Immutable public final class Typography {
+    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);
+    method public androidx.compose.ui.text.TextStyle getBodyLarge();
+    method public androidx.compose.ui.text.TextStyle getBodyMedium();
+    method public androidx.compose.ui.text.TextStyle getBodySmall();
+    method public androidx.compose.ui.text.TextStyle getDisplayLarge();
+    method public androidx.compose.ui.text.TextStyle getDisplayMedium();
+    method public androidx.compose.ui.text.TextStyle getDisplaySmall();
+    method public androidx.compose.ui.text.TextStyle getHeadlineLarge();
+    method public androidx.compose.ui.text.TextStyle getHeadlineMedium();
+    method public androidx.compose.ui.text.TextStyle getHeadlineSmall();
+    method public androidx.compose.ui.text.TextStyle getLabelLarge();
+    method public androidx.compose.ui.text.TextStyle getLabelMedium();
+    method public androidx.compose.ui.text.TextStyle getLabelSmall();
+    method public androidx.compose.ui.text.TextStyle getTitleLarge();
+    method public androidx.compose.ui.text.TextStyle getTitleMedium();
+    method public androidx.compose.ui.text.TextStyle getTitleSmall();
+    property public final androidx.compose.ui.text.TextStyle bodyLarge;
+    property public final androidx.compose.ui.text.TextStyle bodyMedium;
+    property public final androidx.compose.ui.text.TextStyle bodySmall;
+    property public final androidx.compose.ui.text.TextStyle displayLarge;
+    property public final androidx.compose.ui.text.TextStyle displayMedium;
+    property public final androidx.compose.ui.text.TextStyle displaySmall;
+    property public final androidx.compose.ui.text.TextStyle headlineLarge;
+    property public final androidx.compose.ui.text.TextStyle headlineMedium;
+    property public final androidx.compose.ui.text.TextStyle headlineSmall;
+    property public final androidx.compose.ui.text.TextStyle labelLarge;
+    property public final androidx.compose.ui.text.TextStyle labelMedium;
+    property public final androidx.compose.ui.text.TextStyle labelSmall;
+    property public final androidx.compose.ui.text.TextStyle titleLarge;
+    property public final androidx.compose.ui.text.TextStyle titleMedium;
+    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 9982e90..4e26755 100644
--- a/compose/material3/material3/api/public_plus_experimental_current.txt
+++ b/compose/material3/material3/api/public_plus_experimental_current.txt
@@ -30,12 +30,12 @@
   }
 
   public final class AppBarKt {
-    method @androidx.compose.runtime.Composable public static void BottomAppBar(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? floatingActionButton, optional long containerColor, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding);
-    method @androidx.compose.runtime.Composable public static void BottomAppBar(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
-    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void CenterAlignedTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
-    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void LargeTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
-    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void MediumTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
-    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void SmallTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
+    method @androidx.compose.runtime.Composable public static void BottomAppBar(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? floatingActionButton, optional long containerColor, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.layout.WindowInsets windowInsets);
+    method @androidx.compose.runtime.Composable public static void BottomAppBar(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.layout.WindowInsets windowInsets, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void CenterAlignedTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.foundation.layout.WindowInsets windowInsets, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void LargeTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.foundation.layout.WindowInsets windowInsets, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void MediumTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.foundation.layout.WindowInsets windowInsets, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void SmallTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.foundation.layout.WindowInsets windowInsets, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static androidx.compose.material3.TopAppBarState rememberTopAppBarState(optional float initialHeightOffsetLimit, optional float initialHeightOffset, optional float initialContentOffset);
   }
 
@@ -70,22 +70,16 @@
     method @androidx.compose.runtime.Composable public long getContainerColor();
     method public float getContainerElevation();
     method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.WindowInsets getWindowInsets();
     property public final float ContainerElevation;
     property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
     property @androidx.compose.runtime.Composable public final long bottomAppBarFabColor;
     property @androidx.compose.runtime.Composable public final long containerColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.layout.WindowInsets windowInsets;
     field public static final androidx.compose.material3.BottomAppBarDefaults INSTANCE;
   }
 
-  public static final class BottomAppBarDefaults.BottomAppBarFabElevation implements androidx.compose.material3.FloatingActionButtonElevation {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.MutableState<androidx.compose.ui.unit.Dp> shadowElevation(androidx.compose.foundation.interaction.InteractionSource interactionSource);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.MutableState<androidx.compose.ui.unit.Dp> tonalElevation(androidx.compose.foundation.interaction.InteractionSource interactionSource);
-    field public static final androidx.compose.material3.BottomAppBarDefaults.BottomAppBarFabElevation INSTANCE;
-  }
-
-  @androidx.compose.runtime.Stable public interface ButtonColors {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> containerColor(boolean enabled);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled);
+  @androidx.compose.runtime.Immutable public final class ButtonColors {
   }
 
   public final class ButtonDefaults {
@@ -126,9 +120,7 @@
     field public static final androidx.compose.material3.ButtonDefaults INSTANCE;
   }
 
-  @androidx.compose.runtime.Stable public interface ButtonElevation {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> shadowElevation(boolean enabled, androidx.compose.foundation.interaction.InteractionSource interactionSource);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> tonalElevation(boolean enabled, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  @androidx.compose.runtime.Stable public final class ButtonElevation {
   }
 
   public final class ButtonKt {
@@ -139,9 +131,7 @@
     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);
   }
 
-  @androidx.compose.runtime.Stable public interface CardColors {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> containerColor(boolean enabled);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled);
+  @androidx.compose.runtime.Immutable public final class CardColors {
   }
 
   public final class CardDefaults {
@@ -161,9 +151,7 @@
     field public static final androidx.compose.material3.CardDefaults INSTANCE;
   }
 
-  @androidx.compose.runtime.Stable public interface CardElevation {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> shadowElevation(boolean enabled, androidx.compose.foundation.interaction.InteractionSource? interactionSource);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> tonalElevation(boolean enabled, androidx.compose.foundation.interaction.InteractionSource? interactionSource);
+  @androidx.compose.runtime.Immutable public final class CardElevation {
   }
 
   public final class CardKt {
@@ -175,10 +163,7 @@
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void OutlinedCard(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.CardColors colors, optional androidx.compose.material3.CardElevation elevation, optional androidx.compose.foundation.BorderStroke border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,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);
+  @androidx.compose.runtime.Immutable public final class CheckboxColors {
   }
 
   public final class CheckboxDefaults {
@@ -191,20 +176,13 @@
     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.material3.CheckboxColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
-  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Stable public interface ChipBorder {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.foundation.BorderStroke> borderStroke(boolean enabled);
+  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Immutable public final class ChipBorder {
   }
 
-  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Stable public interface ChipColors {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> containerColor(boolean enabled);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> labelColor(boolean enabled);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> leadingIconContentColor(boolean enabled);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trailingIconContentColor(boolean enabled);
+  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Immutable public final class ChipColors {
   }
 
-  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Stable public interface ChipElevation {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> shadowElevation(boolean enabled, androidx.compose.foundation.interaction.InteractionSource interactionSource);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> tonalElevation(boolean enabled, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Immutable public final class ChipElevation {
   }
 
   public final class ChipKt {
@@ -302,7 +280,7 @@
   }
 
   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);
+    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 {
@@ -316,6 +294,7 @@
     method public float getPermanentDrawerElevation();
     method @androidx.compose.runtime.Composable public long getScrimColor();
     method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.WindowInsets getWindowInsets();
     property public final float DismissibleDrawerElevation;
     property public final float MaximumDrawerWidth;
     property public final float ModalDrawerElevation;
@@ -323,6 +302,7 @@
     property @androidx.compose.runtime.Composable public final long containerColor;
     property @androidx.compose.runtime.Composable public final long scrimColor;
     property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape shape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.layout.WindowInsets windowInsets;
     field public static final androidx.compose.material3.DrawerDefaults INSTANCE;
   }
 
@@ -412,6 +392,7 @@
   }
 
   public final class FloatingActionButtonDefaults {
+    method public androidx.compose.material3.FloatingActionButtonElevation bottomAppBarFabElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation);
     method @androidx.compose.runtime.Composable public androidx.compose.material3.FloatingActionButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation);
     method @androidx.compose.runtime.Composable public long getContainerColor();
     method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getExtendedFabShape();
@@ -429,22 +410,18 @@
     field public static final androidx.compose.material3.FloatingActionButtonDefaults INSTANCE;
   }
 
-  @androidx.compose.runtime.Stable public interface FloatingActionButtonElevation {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> shadowElevation(androidx.compose.foundation.interaction.InteractionSource interactionSource);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> tonalElevation(androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  @androidx.compose.runtime.Stable public class FloatingActionButtonElevation {
   }
 
   public final class FloatingActionButtonKt {
-    method @androidx.compose.runtime.Composable public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
-    method @androidx.compose.runtime.Composable public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean expanded, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation);
+    method @androidx.compose.runtime.Composable public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean expanded, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
     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.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method @androidx.compose.runtime.Composable public static void LargeFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method @androidx.compose.runtime.Composable public static void SmallFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void LargeFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void SmallFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
-  @androidx.compose.runtime.Stable public interface IconButtonColors {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> containerColor(boolean enabled);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled);
+  @androidx.compose.runtime.Immutable public final class IconButtonColors {
   }
 
   public final class IconButtonDefaults {
@@ -482,9 +459,7 @@
     method @androidx.compose.runtime.Composable public static void Icon(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
   }
 
-  @androidx.compose.runtime.Stable public interface IconToggleButtonColors {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> containerColor(boolean enabled, boolean checked);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled, boolean checked);
+  @androidx.compose.runtime.Immutable public final class IconToggleButtonColors {
   }
 
   public final class IncludeFontPaddingHelper_androidKt {
@@ -505,13 +480,7 @@
     field public static final androidx.compose.material3.InputChipDefaults INSTANCE;
   }
 
-  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Stable public interface ListItemColors {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> containerColor(boolean enabled);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> headlineColor(boolean enabled);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> leadingIconColor(boolean enabled);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> overlineColor(boolean enabled);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> supportingColor(boolean enabled);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trailingIconColor(boolean enabled);
+  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Immutable public final class ListItemColors {
   }
 
   @androidx.compose.material3.ExperimentalMaterial3Api public final class ListItemDefaults {
@@ -552,10 +521,7 @@
     field public static final androidx.compose.material3.MenuDefaults INSTANCE;
   }
 
-  @androidx.compose.runtime.Stable public interface MenuItemColors {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> leadingIconColor(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);
+  @androidx.compose.runtime.Immutable public final class MenuItemColors {
   }
 
   public final class MenuKt {
@@ -564,16 +530,14 @@
   public final class NavigationBarDefaults {
     method @androidx.compose.runtime.Composable public long getContainerColor();
     method public float getElevation();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.WindowInsets getWindowInsets();
     property public final float Elevation;
     property @androidx.compose.runtime.Composable public final long containerColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.layout.WindowInsets windowInsets;
     field public static final androidx.compose.material3.NavigationBarDefaults INSTANCE;
   }
 
-  @androidx.compose.runtime.Stable public interface NavigationBarItemColors {
-    method @androidx.compose.runtime.Composable public long getIndicatorColor();
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> iconColor(boolean selected);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> textColor(boolean selected);
-    property @androidx.compose.runtime.Composable public abstract long indicatorColor;
+  @androidx.compose.runtime.Stable public final class NavigationBarItemColors {
   }
 
   public final class NavigationBarItemDefaults {
@@ -582,7 +546,7 @@
   }
 
   public final class NavigationBarKt {
-    method @androidx.compose.runtime.Composable public static void NavigationBar(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float tonalElevation, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void NavigationBar(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.layout.WindowInsets windowInsets, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void NavigationBarItem(androidx.compose.foundation.layout.RowScope, boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.material3.NavigationBarItemColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
@@ -601,27 +565,25 @@
   }
 
   public final class NavigationDrawerKt {
-    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void DismissibleDrawerSheet(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape drawerShape, optional long drawerContainerColor, optional long drawerContentColor, optional float drawerTonalElevation, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void DismissibleDrawerSheet(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape drawerShape, optional long drawerContainerColor, optional long drawerContentColor, optional float drawerTonalElevation, optional androidx.compose.foundation.layout.WindowInsets windowInsets, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void DismissibleNavigationDrawer(kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material3.DrawerState drawerState, optional boolean gesturesEnabled, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void ModalDrawerSheet(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape drawerShape, optional long drawerContainerColor, optional long drawerContentColor, optional float drawerTonalElevation, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void ModalDrawerSheet(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape drawerShape, optional long drawerContainerColor, optional long drawerContentColor, optional float drawerTonalElevation, optional androidx.compose.foundation.layout.WindowInsets windowInsets, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void ModalNavigationDrawer(kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material3.DrawerState drawerState, optional boolean gesturesEnabled, optional long scrimColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void NavigationDrawerItem(kotlin.jvm.functions.Function0<kotlin.Unit> label, boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? badge, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.NavigationDrawerItemColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
-    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void PermanentDrawerSheet(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape drawerShape, optional long drawerContainerColor, optional long drawerContentColor, optional float drawerTonalElevation, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void PermanentDrawerSheet(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape drawerShape, optional long drawerContainerColor, optional long drawerContentColor, optional float drawerTonalElevation, optional androidx.compose.foundation.layout.WindowInsets windowInsets, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void PermanentNavigationDrawer(kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static androidx.compose.material3.DrawerState rememberDrawerState(androidx.compose.material3.DrawerValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material3.DrawerValue,java.lang.Boolean> confirmStateChange);
   }
 
   public final class NavigationRailDefaults {
     method @androidx.compose.runtime.Composable public long getContainerColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.WindowInsets getWindowInsets();
     property @androidx.compose.runtime.Composable public final long ContainerColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.layout.WindowInsets windowInsets;
     field public static final androidx.compose.material3.NavigationRailDefaults INSTANCE;
   }
 
-  @androidx.compose.runtime.Stable public interface NavigationRailItemColors {
-    method @androidx.compose.runtime.Composable public long getIndicatorColor();
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> iconColor(boolean selected);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> textColor(boolean selected);
-    property @androidx.compose.runtime.Composable public abstract long indicatorColor;
+  @androidx.compose.runtime.Stable public final class NavigationRailItemColors {
   }
 
   public final class NavigationRailItemDefaults {
@@ -630,7 +592,7 @@
   }
 
   public final class NavigationRailKt {
-    method @androidx.compose.runtime.Composable public static void NavigationRail(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? header, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void NavigationRail(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? header, optional androidx.compose.foundation.layout.WindowInsets windowInsets, 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.material3.NavigationRailItemColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
@@ -660,8 +622,7 @@
     method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional long trackColor);
   }
 
-  @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);
+  @androidx.compose.runtime.Immutable public final class RadioButtonColors {
   }
 
   public final class RadioButtonDefaults {
@@ -673,24 +634,20 @@
     method @androidx.compose.runtime.Composable public static void RadioButton(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.material3.RadioButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
+  public final class SafeDrawingInsets_androidKt {
+  }
+
   public final class ScaffoldKt {
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void Scaffold(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional int floatingActionButtonPosition, optional long containerColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
   }
 
-  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Stable public interface SelectableChipBorder {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.foundation.BorderStroke> borderStroke(boolean enabled, boolean selected);
+  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Immutable public final class SelectableChipBorder {
   }
 
-  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Stable public interface SelectableChipColors {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> containerColor(boolean enabled, boolean selected);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> labelColor(boolean enabled, boolean selected);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> leadingIconContentColor(boolean enabled, boolean selected);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trailingIconContentColor(boolean enabled, boolean selected);
+  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Immutable public final class SelectableChipColors {
   }
 
-  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Stable public interface SelectableChipElevation {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> shadowElevation(boolean enabled, boolean selected, androidx.compose.foundation.interaction.InteractionSource interactionSource);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> tonalElevation(boolean enabled, boolean selected, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Immutable public final class SelectableChipElevation {
   }
 
   public final class ShapeDefaults {
@@ -725,10 +682,7 @@
   public final class ShapesKt {
   }
 
-  @androidx.compose.runtime.Stable public interface SliderColors {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> thumbColor(boolean enabled);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> tickColor(boolean enabled, boolean active);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trackColor(boolean enabled, boolean active);
+  @androidx.compose.runtime.Immutable public final class SliderColors {
   }
 
   public final class SliderDefaults {
@@ -837,11 +791,7 @@
   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> borderColor(boolean enabled, boolean checked);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> iconColor(boolean enabled, boolean checked);
-    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);
+  @androidx.compose.runtime.Immutable public final class SwitchColors {
   }
 
   public final class SwitchDefaults {
@@ -885,17 +835,7 @@
     method @androidx.compose.runtime.Composable public static void TabRow(int selectedTabIndex, optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.material3.TabPosition>,kotlin.Unit> indicator, optional kotlin.jvm.functions.Function0<kotlin.Unit> divider, kotlin.jvm.functions.Function0<kotlin.Unit> tabs);
   }
 
-  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Stable public interface TextFieldColors {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> containerColor(boolean enabled);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> cursorColor(boolean isError);
-    method @androidx.compose.runtime.Composable public androidx.compose.foundation.text.selection.TextSelectionColors getSelectionColors();
-    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 isError, 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, androidx.compose.foundation.interaction.InteractionSource interactionSource);
-    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.foundation.interaction.InteractionSource interactionSource);
-    property @androidx.compose.runtime.Composable public abstract androidx.compose.foundation.text.selection.TextSelectionColors selectionColors;
+  @androidx.compose.runtime.Immutable public final class TextFieldColors {
   }
 
   @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Immutable public final class TextFieldDefaults {
@@ -945,21 +885,19 @@
   public final class TonalPaletteKt {
   }
 
-  @androidx.compose.runtime.Stable public interface TopAppBarColors {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> actionIconContentColor(float colorTransitionFraction);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> containerColor(float colorTransitionFraction);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> navigationIconContentColor(float colorTransitionFraction);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> titleContentColor(float colorTransitionFraction);
+  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Stable public final class TopAppBarColors {
   }
 
-  public final class TopAppBarDefaults {
+  @androidx.compose.material3.ExperimentalMaterial3Api public final class TopAppBarDefaults {
     method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors centerAlignedTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor);
-    method @androidx.compose.material3.ExperimentalMaterial3Api public androidx.compose.material3.TopAppBarScrollBehavior enterAlwaysScrollBehavior(androidx.compose.material3.TopAppBarState state, optional kotlin.jvm.functions.Function0<java.lang.Boolean> canScroll);
-    method @androidx.compose.material3.ExperimentalMaterial3Api public androidx.compose.material3.TopAppBarScrollBehavior exitUntilCollapsedScrollBehavior(androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float> decayAnimationSpec, androidx.compose.material3.TopAppBarState state, optional kotlin.jvm.functions.Function0<java.lang.Boolean> canScroll);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarScrollBehavior enterAlwaysScrollBehavior(optional androidx.compose.material3.TopAppBarState state, optional kotlin.jvm.functions.Function0<java.lang.Boolean> canScroll);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarScrollBehavior exitUntilCollapsedScrollBehavior(optional androidx.compose.material3.TopAppBarState state, optional kotlin.jvm.functions.Function0<java.lang.Boolean> canScroll);
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.WindowInsets getWindowInsets();
     method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors largeTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor);
     method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors mediumTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor);
-    method @androidx.compose.material3.ExperimentalMaterial3Api public androidx.compose.material3.TopAppBarScrollBehavior pinnedScrollBehavior(androidx.compose.material3.TopAppBarState state, optional kotlin.jvm.functions.Function0<java.lang.Boolean> canScroll);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarScrollBehavior pinnedScrollBehavior(optional androidx.compose.material3.TopAppBarState state, optional kotlin.jvm.functions.Function0<java.lang.Boolean> canScroll);
     method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors smallTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor);
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.layout.WindowInsets windowInsets;
     field public static final androidx.compose.material3.TopAppBarDefaults INSTANCE;
   }
 
diff --git a/health/health-connect-client/api/res-current.txt b/compose/material3/material3/api/res-1.0.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/material3/material3/api/res-1.0.0-beta01.txt
diff --git a/compose/material3/material3/api/restricted_1.0.0-beta01.txt b/compose/material3/material3/api/restricted_1.0.0-beta01.txt
new file mode 100644
index 0000000..a5cf8de
--- /dev/null
+++ b/compose/material3/material3/api/restricted_1.0.0-beta01.txt
@@ -0,0 +1,683 @@
+// Signature format: 4.0
+package androidx.compose.material3 {
+
+  public final class AlertDialogDefaults {
+    method @androidx.compose.runtime.Composable public long getContainerColor();
+    method @androidx.compose.runtime.Composable public long getIconContentColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getShape();
+    method @androidx.compose.runtime.Composable public long getTextContentColor();
+    method @androidx.compose.runtime.Composable public long getTitleContentColor();
+    method public float getTonalElevation();
+    property public final float TonalElevation;
+    property @androidx.compose.runtime.Composable public final long containerColor;
+    property @androidx.compose.runtime.Composable public final long iconContentColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape shape;
+    property @androidx.compose.runtime.Composable public final long textContentColor;
+    property @androidx.compose.runtime.Composable public final long titleContentColor;
+    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);
+  }
+
+  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> text, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean enabled, optional androidx.compose.material3.MenuItemColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+  }
+
+  public final class AppBarKt {
+    method @androidx.compose.runtime.Composable public static void BottomAppBar(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? floatingActionButton, optional long containerColor, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.layout.WindowInsets windowInsets);
+    method @androidx.compose.runtime.Composable public static void BottomAppBar(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.layout.WindowInsets windowInsets, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  public final class BadgeKt {
+  }
+
+  public final class BottomAppBarDefaults {
+    method @androidx.compose.runtime.Composable public long getBottomAppBarFabColor();
+    method @androidx.compose.runtime.Composable public long getContainerColor();
+    method public float getContainerElevation();
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.WindowInsets getWindowInsets();
+    property public final float ContainerElevation;
+    property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
+    property @androidx.compose.runtime.Composable public final long bottomAppBarFabColor;
+    property @androidx.compose.runtime.Composable public final long containerColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.layout.WindowInsets windowInsets;
+    field public static final androidx.compose.material3.BottomAppBarDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public final class ButtonColors {
+  }
+
+  public final class ButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors buttonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonElevation buttonElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float disabledElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors elevatedButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonElevation elevatedButtonElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float disabledElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors filledTonalButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonElevation filledTonalButtonElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float disabledElevation);
+    method public androidx.compose.foundation.layout.PaddingValues getButtonWithIconContentPadding();
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getElevatedShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getFilledTonalShape();
+    method public float getIconSize();
+    method public float getIconSpacing();
+    method public float getMinHeight();
+    method public float getMinWidth();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke getOutlinedButtonBorder();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getOutlinedShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getShape();
+    method public androidx.compose.foundation.layout.PaddingValues getTextButtonContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getTextShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors outlinedButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors textButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    property public final androidx.compose.foundation.layout.PaddingValues ButtonWithIconContentPadding;
+    property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
+    property public final float IconSize;
+    property public final float IconSpacing;
+    property public final float MinHeight;
+    property public final float MinWidth;
+    property public final androidx.compose.foundation.layout.PaddingValues TextButtonContentPadding;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape elevatedShape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape filledTonalShape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.BorderStroke outlinedButtonBorder;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape outlinedShape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape shape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape textShape;
+    field public static final androidx.compose.material3.ButtonDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public final class ButtonElevation {
+  }
+
+  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.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);
+    method @androidx.compose.runtime.Composable public static void ElevatedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.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);
+    method @androidx.compose.runtime.Composable public static void FilledTonalButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.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);
+    method @androidx.compose.runtime.Composable public static void OutlinedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.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);
+    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);
+  }
+
+  @androidx.compose.runtime.Immutable public final class CardColors {
+  }
+
+  public final class CardDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CardColors cardColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CardElevation cardElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation, optional float disabledElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CardColors elevatedCardColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CardElevation elevatedCardElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation, optional float disabledElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getElevatedShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getOutlinedShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke outlinedCardBorder(optional boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CardColors outlinedCardColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CardElevation outlinedCardElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation, optional float disabledElevation);
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape elevatedShape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape outlinedShape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape shape;
+    field public static final androidx.compose.material3.CardDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public final class CardElevation {
+  }
+
+  public final class CardKt {
+    method @androidx.compose.runtime.Composable public static void Card(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, optional androidx.compose.foundation.BorderStroke? border, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void ElevatedCard(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void OutlinedCard(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, optional androidx.compose.foundation.BorderStroke border, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Immutable public final class CheckboxColors {
+  }
+
+  public final class CheckboxDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CheckboxColors colors(optional long checkedColor, optional long uncheckedColor, optional long checkmarkColor, optional long disabledCheckedColor, optional long disabledUncheckedColor, optional long disabledIndeterminateColor);
+    field public static final androidx.compose.material3.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.material3.CheckboxColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+    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.material3.CheckboxColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+  }
+
+  public final class ChipKt {
+  }
+
+  @androidx.compose.runtime.Stable public final class ColorScheme {
+    ctor public ColorScheme(long primary, long onPrimary, long primaryContainer, long onPrimaryContainer, long inversePrimary, long secondary, long onSecondary, long secondaryContainer, long onSecondaryContainer, long tertiary, long onTertiary, long tertiaryContainer, long onTertiaryContainer, long background, long onBackground, long surface, long onSurface, long surfaceVariant, long onSurfaceVariant, long surfaceTint, long inverseSurface, long inverseOnSurface, long error, long onError, long errorContainer, long onErrorContainer, long outline, long outlineVariant, long scrim);
+    method public androidx.compose.material3.ColorScheme copy(optional long primary, optional long onPrimary, optional long primaryContainer, optional long onPrimaryContainer, optional long inversePrimary, optional long secondary, optional long onSecondary, optional long secondaryContainer, optional long onSecondaryContainer, optional long tertiary, optional long onTertiary, optional long tertiaryContainer, optional long onTertiaryContainer, optional long background, optional long onBackground, optional long surface, optional long onSurface, optional long surfaceVariant, optional long onSurfaceVariant, optional long 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);
+    method public long getBackground();
+    method public long getError();
+    method public long getErrorContainer();
+    method public long getInverseOnSurface();
+    method public long getInversePrimary();
+    method public long getInverseSurface();
+    method public long getOnBackground();
+    method public long getOnError();
+    method public long getOnErrorContainer();
+    method public long getOnPrimary();
+    method public long getOnPrimaryContainer();
+    method public long getOnSecondary();
+    method public long getOnSecondaryContainer();
+    method public long getOnSurface();
+    method public long getOnSurfaceVariant();
+    method public long getOnTertiary();
+    method public long getOnTertiaryContainer();
+    method public long getOutline();
+    method public long getOutlineVariant();
+    method public long getPrimary();
+    method public long getPrimaryContainer();
+    method public long getScrim();
+    method public long getSecondary();
+    method public long getSecondaryContainer();
+    method public long getSurface();
+    method public long getSurfaceTint();
+    method public long getSurfaceVariant();
+    method public long getTertiary();
+    method public long getTertiaryContainer();
+    property public final long background;
+    property public final long error;
+    property public final long errorContainer;
+    property public final long inverseOnSurface;
+    property public final long inversePrimary;
+    property public final long inverseSurface;
+    property public final long onBackground;
+    property public final long onError;
+    property public final long onErrorContainer;
+    property public final long onPrimary;
+    property public final long onPrimaryContainer;
+    property public final long onSecondary;
+    property public final long onSecondaryContainer;
+    property public final long onSurface;
+    property public final long onSurfaceVariant;
+    property public final long onTertiary;
+    property public final long onTertiaryContainer;
+    property public final long outline;
+    property public final long outlineVariant;
+    property public final long primary;
+    property public final long primaryContainer;
+    property public final long scrim;
+    property public final long secondary;
+    property public final long secondaryContainer;
+    property public final long surface;
+    property public final long surfaceTint;
+    property public final long surfaceVariant;
+    property public final long tertiary;
+    property public final long tertiaryContainer;
+  }
+
+  public final class ColorSchemeKt {
+    method public static long contentColorFor(androidx.compose.material3.ColorScheme, long backgroundColor);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static long contentColorFor(long backgroundColor);
+    method public static androidx.compose.material3.ColorScheme darkColorScheme(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);
+    method public static androidx.compose.material3.ColorScheme lightColorScheme(optional long primary, optional long onPrimary, optional long primaryContainer, optional long onPrimaryContainer, optional long inversePrimary, optional long secondary, optional long onSecondary, optional long secondaryContainer, optional long onSecondaryContainer, optional long tertiary, optional long onTertiary, optional long tertiaryContainer, optional long onTertiaryContainer, optional long background, optional long onBackground, optional long surface, optional long 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);
+    method public static long surfaceColorAtElevation(androidx.compose.material3.ColorScheme, float elevation);
+  }
+
+  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 DividerDefaults {
+    method @androidx.compose.runtime.Composable public long getColor();
+    method public float getThickness();
+    property public final float Thickness;
+    property @androidx.compose.runtime.Composable public final long color;
+    field public static final androidx.compose.material3.DividerDefaults INSTANCE;
+  }
+
+  public final class DividerKt {
+    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 DynamicTonalPaletteKt {
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) public static androidx.compose.material3.ColorScheme dynamicDarkColorScheme(android.content.Context context);
+    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 {
+  }
+
+  public final class FloatingActionButtonDefaults {
+    method public androidx.compose.material3.FloatingActionButtonElevation bottomAppBarFabElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.FloatingActionButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation);
+    method @androidx.compose.runtime.Composable public long getContainerColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getExtendedFabShape();
+    method public float getLargeIconSize();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getLargeShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getSmallShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.FloatingActionButtonElevation loweredElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation);
+    property public final float LargeIconSize;
+    property @androidx.compose.runtime.Composable public final long containerColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape extendedFabShape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape largeShape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape shape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape smallShape;
+    field public static final androidx.compose.material3.FloatingActionButtonDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public class FloatingActionButtonElevation {
+  }
+
+  public final class FloatingActionButtonKt {
+    method @androidx.compose.runtime.Composable public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean expanded, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+    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.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void LargeFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void SmallFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Immutable public final class IconButtonColors {
+  }
+
+  public final class IconButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.IconButtonColors filledIconButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.IconToggleButtonColors filledIconToggleButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor, optional long checkedContainerColor, optional long checkedContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.IconButtonColors filledTonalIconButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.IconToggleButtonColors filledTonalIconToggleButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor, optional long checkedContainerColor, optional long checkedContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getFilledShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getOutlinedShape();
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.IconButtonColors iconButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.IconToggleButtonColors iconToggleButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor, optional long checkedContainerColor, optional long checkedContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke outlinedIconButtonBorder(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.IconButtonColors outlinedIconButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke? outlinedIconToggleButtonBorder(boolean enabled, boolean checked);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.IconToggleButtonColors outlinedIconToggleButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor, optional long checkedContainerColor, optional long checkedContentColor);
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape filledShape;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape outlinedShape;
+    field public static final androidx.compose.material3.IconButtonDefaults INSTANCE;
+  }
+
+  public final class IconButtonKt {
+    method @androidx.compose.runtime.Composable public static void FilledIconButton(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.IconButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void FilledIconToggleButton(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 androidx.compose.material3.IconToggleButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void FilledTonalIconButton(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.IconButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void FilledTonalIconToggleButton(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 androidx.compose.material3.IconToggleButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    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.material3.IconButtonColors colors, 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.material3.IconToggleButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void OutlinedIconButton(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.IconButtonColors colors, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void OutlinedIconToggleButton(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 androidx.compose.material3.IconToggleButtonColors colors, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class IconKt {
+    method @androidx.compose.runtime.Composable public static void Icon(androidx.compose.ui.graphics.vector.ImageVector imageVector, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+    method @androidx.compose.runtime.Composable public static void Icon(androidx.compose.ui.graphics.ImageBitmap bitmap, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+    method @androidx.compose.runtime.Composable public static void Icon(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+  }
+
+  @androidx.compose.runtime.Immutable public final class IconToggleButtonColors {
+  }
+
+  public final class IncludeFontPaddingHelper_androidKt {
+  }
+
+  public final class ListItemKt {
+  }
+
+  public final class MaterialTheme {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material3.ColorScheme getColorScheme();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material3.Shapes getShapes();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material3.Typography getTypography();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material3.ColorScheme colorScheme;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material3.Shapes shapes;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material3.Typography typography;
+    field public static final androidx.compose.material3.MaterialTheme INSTANCE;
+  }
+
+  public final class MaterialThemeKt {
+    method @androidx.compose.runtime.Composable public static void MaterialTheme(optional androidx.compose.material3.ColorScheme colorScheme, optional androidx.compose.material3.Shapes shapes, optional androidx.compose.material3.Typography typography, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class MenuDefaults {
+    method public androidx.compose.foundation.layout.PaddingValues getDropdownMenuItemContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.MenuItemColors itemColors(optional long textColor, optional long leadingIconColor, optional long trailingIconColor, optional long disabledTextColor, optional long disabledLeadingIconColor, optional long disabledTrailingIconColor);
+    property public final androidx.compose.foundation.layout.PaddingValues DropdownMenuItemContentPadding;
+    field public static final androidx.compose.material3.MenuDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public final class MenuItemColors {
+  }
+
+  public final class MenuKt {
+  }
+
+  public final class NavigationBarDefaults {
+    method @androidx.compose.runtime.Composable public long getContainerColor();
+    method public float getElevation();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.WindowInsets getWindowInsets();
+    property public final float Elevation;
+    property @androidx.compose.runtime.Composable public final long containerColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.layout.WindowInsets windowInsets;
+    field public static final androidx.compose.material3.NavigationBarDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public final class NavigationBarItemColors {
+  }
+
+  public final class NavigationBarItemDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.NavigationBarItemColors colors(optional long selectedIconColor, optional long selectedTextColor, optional long indicatorColor, optional long unselectedIconColor, optional long unselectedTextColor);
+    field public static final androidx.compose.material3.NavigationBarItemDefaults INSTANCE;
+  }
+
+  public final class NavigationBarKt {
+    method @androidx.compose.runtime.Composable public static void NavigationBar(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.layout.WindowInsets windowInsets, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void NavigationBarItem(androidx.compose.foundation.layout.RowScope, boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.material3.NavigationBarItemColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+  }
+
+  public final class NavigationDrawerKt {
+  }
+
+  public final class NavigationRailDefaults {
+    method @androidx.compose.runtime.Composable public long getContainerColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.WindowInsets getWindowInsets();
+    property @androidx.compose.runtime.Composable public final long ContainerColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.layout.WindowInsets windowInsets;
+    field public static final androidx.compose.material3.NavigationRailDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public final class NavigationRailItemColors {
+  }
+
+  public final class NavigationRailItemDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.NavigationRailItemColors colors(optional long selectedIconColor, optional long selectedTextColor, optional long indicatorColor, optional long unselectedIconColor, optional long unselectedTextColor);
+    field public static final androidx.compose.material3.NavigationRailItemDefaults INSTANCE;
+  }
+
+  public final class NavigationRailKt {
+    method @androidx.compose.runtime.Composable public static void NavigationRail(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? header, optional androidx.compose.foundation.layout.WindowInsets windowInsets, 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.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 float getCircularStrokeWidth();
+    method @androidx.compose.runtime.Composable public long getLinearColor();
+    method @androidx.compose.runtime.Composable public long getLinearTrackColor();
+    method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getProgressAnimationSpec();
+    property public final float CircularStrokeWidth;
+    property public final androidx.compose.animation.core.SpringSpec<java.lang.Float> ProgressAnimationSpec;
+    property @androidx.compose.runtime.Composable public final long circularColor;
+    property @androidx.compose.runtime.Composable public final long linearColor;
+    property @androidx.compose.runtime.Composable public final long linearTrackColor;
+    field public static final androidx.compose.material3.ProgressIndicatorDefaults INSTANCE;
+  }
+
+  public final class ProgressIndicatorKt {
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional long trackColor);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional long trackColor);
+  }
+
+  @androidx.compose.runtime.Immutable public final class RadioButtonColors {
+  }
+
+  public final class RadioButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.RadioButtonColors colors(optional long selectedColor, optional long unselectedColor, optional long disabledSelectedColor, optional long disabledUnselectedColor);
+    field public static final androidx.compose.material3.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.material3.RadioButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+  }
+
+  public final class SafeDrawingInsets_androidKt {
+  }
+
+  public final class ScaffoldKt {
+  }
+
+  public final class ShapeDefaults {
+    method public androidx.compose.foundation.shape.CornerBasedShape getExtraLarge();
+    method public androidx.compose.foundation.shape.CornerBasedShape getExtraSmall();
+    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 ExtraLarge;
+    property public final androidx.compose.foundation.shape.CornerBasedShape ExtraSmall;
+    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;
+    field public static final androidx.compose.material3.ShapeDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public final class Shapes {
+    ctor public Shapes(optional androidx.compose.foundation.shape.CornerBasedShape extraSmall, optional androidx.compose.foundation.shape.CornerBasedShape small, optional androidx.compose.foundation.shape.CornerBasedShape medium, optional androidx.compose.foundation.shape.CornerBasedShape large, optional androidx.compose.foundation.shape.CornerBasedShape extraLarge);
+    method public androidx.compose.material3.Shapes copy(optional androidx.compose.foundation.shape.CornerBasedShape extraSmall, optional androidx.compose.foundation.shape.CornerBasedShape small, optional androidx.compose.foundation.shape.CornerBasedShape medium, optional androidx.compose.foundation.shape.CornerBasedShape large, optional androidx.compose.foundation.shape.CornerBasedShape extraLarge);
+    method public androidx.compose.foundation.shape.CornerBasedShape getExtraLarge();
+    method public androidx.compose.foundation.shape.CornerBasedShape getExtraSmall();
+    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 extraLarge;
+    property public final androidx.compose.foundation.shape.CornerBasedShape extraSmall;
+    property public final androidx.compose.foundation.shape.CornerBasedShape large;
+    property public final androidx.compose.foundation.shape.CornerBasedShape medium;
+    property public final androidx.compose.foundation.shape.CornerBasedShape small;
+  }
+
+  public final class ShapesKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class SliderColors {
+  }
+
+  public final class SliderDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.SliderColors colors(optional long thumbColor, optional long activeTrackColor, optional long activeTickColor, optional long inactiveTrackColor, optional long inactiveTickColor, optional long disabledThumbColor, optional long disabledActiveTrackColor, optional long disabledActiveTickColor, optional long disabledInactiveTrackColor, optional long disabledInactiveTickColor);
+    field public static final androidx.compose.material3.SliderDefaults INSTANCE;
+  }
+
+  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.material3.SliderColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+  }
+
+  @androidx.compose.runtime.Stable public interface SnackbarData {
+    method public void dismiss();
+    method public androidx.compose.material3.SnackbarVisuals getVisuals();
+    method public void performAction();
+    property public abstract androidx.compose.material3.SnackbarVisuals visuals;
+  }
+
+  public final class SnackbarDefaults {
+    method @androidx.compose.runtime.Composable public long getActionColor();
+    method @androidx.compose.runtime.Composable public long getActionContentColor();
+    method @androidx.compose.runtime.Composable public long getColor();
+    method @androidx.compose.runtime.Composable public long getContentColor();
+    method @androidx.compose.runtime.Composable public long getDismissActionContentColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getShape();
+    property @androidx.compose.runtime.Composable public final long actionColor;
+    property @androidx.compose.runtime.Composable public final long actionContentColor;
+    property @androidx.compose.runtime.Composable public final long color;
+    property @androidx.compose.runtime.Composable public final long contentColor;
+    property @androidx.compose.runtime.Composable public final long dismissActionContentColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape shape;
+    field public static final androidx.compose.material3.SnackbarDefaults INSTANCE;
+  }
+
+  public enum SnackbarDuration {
+    method public static androidx.compose.material3.SnackbarDuration valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.material3.SnackbarDuration[] values();
+    enum_constant public static final androidx.compose.material3.SnackbarDuration Indefinite;
+    enum_constant public static final androidx.compose.material3.SnackbarDuration Long;
+    enum_constant public static final androidx.compose.material3.SnackbarDuration Short;
+  }
+
+  public final class SnackbarHostKt {
+    method @androidx.compose.runtime.Composable public static void SnackbarHost(androidx.compose.material3.SnackbarHostState hostState, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.material3.SnackbarData,kotlin.Unit> snackbar);
+  }
+
+  @androidx.compose.runtime.Stable public final class SnackbarHostState {
+    ctor public SnackbarHostState();
+    method public androidx.compose.material3.SnackbarData? getCurrentSnackbarData();
+    method public suspend Object? showSnackbar(String message, optional String? actionLabel, optional boolean withDismissAction, optional androidx.compose.material3.SnackbarDuration duration, optional kotlin.coroutines.Continuation<? super androidx.compose.material3.SnackbarResult>);
+    property public final androidx.compose.material3.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 kotlin.jvm.functions.Function0<kotlin.Unit>? dismissAction, optional boolean actionOnNewLine, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional long actionContentColor, optional long dismissActionContentColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Snackbar(androidx.compose.material3.SnackbarData snackbarData, optional androidx.compose.ui.Modifier modifier, optional boolean actionOnNewLine, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional long actionColor, optional long actionContentColor, optional long dismissActionContentColor);
+  }
+
+  public enum SnackbarResult {
+    method public static androidx.compose.material3.SnackbarResult valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.material3.SnackbarResult[] values();
+    enum_constant public static final androidx.compose.material3.SnackbarResult ActionPerformed;
+    enum_constant public static final androidx.compose.material3.SnackbarResult Dismissed;
+  }
+
+  @androidx.compose.runtime.Stable public interface SnackbarVisuals {
+    method public String? getActionLabel();
+    method public androidx.compose.material3.SnackbarDuration getDuration();
+    method public String getMessage();
+    method public boolean getWithDismissAction();
+    property public abstract String? actionLabel;
+    property public abstract androidx.compose.material3.SnackbarDuration duration;
+    property public abstract String message;
+    property public abstract boolean withDismissAction;
+  }
+
+  public final class Strings_androidKt {
+  }
+
+  public final class SurfaceKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Surface(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional float tonalElevation, optional float shadowElevation, optional androidx.compose.foundation.BorderStroke? border, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteTonalElevation();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> LocalAbsoluteTonalElevation;
+  }
+
+  public final class SwipeableKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class SwitchColors {
+  }
+
+  public final class SwitchDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.SwitchColors colors(optional long checkedThumbColor, optional long checkedTrackColor, optional long checkedBorderColor, optional long checkedIconColor, optional long uncheckedThumbColor, optional long uncheckedTrackColor, optional long uncheckedBorderColor, optional long uncheckedIconColor, optional long disabledCheckedThumbColor, optional long disabledCheckedTrackColor, optional long disabledCheckedBorderColor, optional long disabledCheckedIconColor, optional long disabledUncheckedThumbColor, optional long disabledUncheckedTrackColor, optional long disabledUncheckedBorderColor, optional long disabledUncheckedIconColor);
+    method public float getIconSize();
+    property public final float IconSize;
+    field public static final androidx.compose.material3.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 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 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);
+    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 long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, 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 Indicator(optional androidx.compose.ui.Modifier modifier, optional float height, optional long color);
+    method @androidx.compose.runtime.Composable public long getContainerColor();
+    method @androidx.compose.runtime.Composable public long getContentColor();
+    method public androidx.compose.ui.Modifier tabIndicatorOffset(androidx.compose.ui.Modifier, androidx.compose.material3.TabPosition currentTabPosition);
+    property @androidx.compose.runtime.Composable public final long containerColor;
+    property @androidx.compose.runtime.Composable public final long contentColor;
+    field public static final androidx.compose.material3.TabRowDefaults INSTANCE;
+  }
+
+  public final class TabRowKt {
+    method @androidx.compose.runtime.Composable public static void ScrollableTabRow(int selectedTabIndex, optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float edgePadding, optional kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.material3.TabPosition>,kotlin.Unit> indicator, optional kotlin.jvm.functions.Function0<kotlin.Unit> divider, kotlin.jvm.functions.Function0<kotlin.Unit> tabs);
+    method @androidx.compose.runtime.Composable public static void TabRow(int selectedTabIndex, optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.material3.TabPosition>,kotlin.Unit> indicator, optional kotlin.jvm.functions.Function0<kotlin.Unit> divider, kotlin.jvm.functions.Function0<kotlin.Unit> tabs);
+  }
+
+  @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 kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
+    method @androidx.compose.runtime.Composable public static void Text(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.Map<java.lang.String,androidx.compose.foundation.text.InlineTextContent> inlineContent, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> getLocalTextStyle();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> LocalTextStyle;
+  }
+
+  public final class TonalPaletteKt {
+  }
+
+  public final class TouchTargetKt {
+  }
+
+  @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);
+    method public androidx.compose.ui.text.TextStyle getBodyLarge();
+    method public androidx.compose.ui.text.TextStyle getBodyMedium();
+    method public androidx.compose.ui.text.TextStyle getBodySmall();
+    method public androidx.compose.ui.text.TextStyle getDisplayLarge();
+    method public androidx.compose.ui.text.TextStyle getDisplayMedium();
+    method public androidx.compose.ui.text.TextStyle getDisplaySmall();
+    method public androidx.compose.ui.text.TextStyle getHeadlineLarge();
+    method public androidx.compose.ui.text.TextStyle getHeadlineMedium();
+    method public androidx.compose.ui.text.TextStyle getHeadlineSmall();
+    method public androidx.compose.ui.text.TextStyle getLabelLarge();
+    method public androidx.compose.ui.text.TextStyle getLabelMedium();
+    method public androidx.compose.ui.text.TextStyle getLabelSmall();
+    method public androidx.compose.ui.text.TextStyle getTitleLarge();
+    method public androidx.compose.ui.text.TextStyle getTitleMedium();
+    method public androidx.compose.ui.text.TextStyle getTitleSmall();
+    property public final androidx.compose.ui.text.TextStyle bodyLarge;
+    property public final androidx.compose.ui.text.TextStyle bodyMedium;
+    property public final androidx.compose.ui.text.TextStyle bodySmall;
+    property public final androidx.compose.ui.text.TextStyle displayLarge;
+    property public final androidx.compose.ui.text.TextStyle displayMedium;
+    property public final androidx.compose.ui.text.TextStyle displaySmall;
+    property public final androidx.compose.ui.text.TextStyle headlineLarge;
+    property public final androidx.compose.ui.text.TextStyle headlineMedium;
+    property public final androidx.compose.ui.text.TextStyle headlineSmall;
+    property public final androidx.compose.ui.text.TextStyle labelLarge;
+    property public final androidx.compose.ui.text.TextStyle labelMedium;
+    property public final androidx.compose.ui.text.TextStyle labelSmall;
+    property public final androidx.compose.ui.text.TextStyle titleLarge;
+    property public final androidx.compose.ui.text.TextStyle titleMedium;
+    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.txt b/compose/material3/material3/api/restricted_current.txt
index 20967a5..a5cf8de 100644
--- a/compose/material3/material3/api/restricted_current.txt
+++ b/compose/material3/material3/api/restricted_current.txt
@@ -30,8 +30,8 @@
   }
 
   public final class AppBarKt {
-    method @androidx.compose.runtime.Composable public static void BottomAppBar(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? floatingActionButton, optional long containerColor, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding);
-    method @androidx.compose.runtime.Composable public static void BottomAppBar(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float tonalElevation, 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 BottomAppBar(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? floatingActionButton, optional long containerColor, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.layout.WindowInsets windowInsets);
+    method @androidx.compose.runtime.Composable public static void BottomAppBar(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.layout.WindowInsets windowInsets, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
   }
 
   public final class BadgeKt {
@@ -42,22 +42,16 @@
     method @androidx.compose.runtime.Composable public long getContainerColor();
     method public float getContainerElevation();
     method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.WindowInsets getWindowInsets();
     property public final float ContainerElevation;
     property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
     property @androidx.compose.runtime.Composable public final long bottomAppBarFabColor;
     property @androidx.compose.runtime.Composable public final long containerColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.layout.WindowInsets windowInsets;
     field public static final androidx.compose.material3.BottomAppBarDefaults INSTANCE;
   }
 
-  public static final class BottomAppBarDefaults.BottomAppBarFabElevation implements androidx.compose.material3.FloatingActionButtonElevation {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.MutableState<androidx.compose.ui.unit.Dp> shadowElevation(androidx.compose.foundation.interaction.InteractionSource interactionSource);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.MutableState<androidx.compose.ui.unit.Dp> tonalElevation(androidx.compose.foundation.interaction.InteractionSource interactionSource);
-    field public static final androidx.compose.material3.BottomAppBarDefaults.BottomAppBarFabElevation INSTANCE;
-  }
-
-  @androidx.compose.runtime.Stable public interface ButtonColors {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> containerColor(boolean enabled);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled);
+  @androidx.compose.runtime.Immutable public final class ButtonColors {
   }
 
   public final class ButtonDefaults {
@@ -98,9 +92,7 @@
     field public static final androidx.compose.material3.ButtonDefaults INSTANCE;
   }
 
-  @androidx.compose.runtime.Stable public interface ButtonElevation {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> shadowElevation(boolean enabled, androidx.compose.foundation.interaction.InteractionSource interactionSource);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> tonalElevation(boolean enabled, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  @androidx.compose.runtime.Stable public final class ButtonElevation {
   }
 
   public final class ButtonKt {
@@ -111,9 +103,7 @@
     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);
   }
 
-  @androidx.compose.runtime.Stable public interface CardColors {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> containerColor(boolean enabled);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled);
+  @androidx.compose.runtime.Immutable public final class CardColors {
   }
 
   public final class CardDefaults {
@@ -133,9 +123,7 @@
     field public static final androidx.compose.material3.CardDefaults INSTANCE;
   }
 
-  @androidx.compose.runtime.Stable public interface CardElevation {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> shadowElevation(boolean enabled, androidx.compose.foundation.interaction.InteractionSource? interactionSource);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> tonalElevation(boolean enabled, androidx.compose.foundation.interaction.InteractionSource? interactionSource);
+  @androidx.compose.runtime.Immutable public final class CardElevation {
   }
 
   public final class CardKt {
@@ -144,10 +132,7 @@
     method @androidx.compose.runtime.Composable public static void OutlinedCard(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, optional androidx.compose.foundation.BorderStroke border, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,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);
+  @androidx.compose.runtime.Immutable public final class CheckboxColors {
   }
 
   public final class CheckboxDefaults {
@@ -248,7 +233,7 @@
   }
 
   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);
+    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 {
@@ -266,6 +251,7 @@
   }
 
   public final class FloatingActionButtonDefaults {
+    method public androidx.compose.material3.FloatingActionButtonElevation bottomAppBarFabElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation);
     method @androidx.compose.runtime.Composable public androidx.compose.material3.FloatingActionButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation);
     method @androidx.compose.runtime.Composable public long getContainerColor();
     method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getExtendedFabShape();
@@ -283,22 +269,18 @@
     field public static final androidx.compose.material3.FloatingActionButtonDefaults INSTANCE;
   }
 
-  @androidx.compose.runtime.Stable public interface FloatingActionButtonElevation {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> shadowElevation(androidx.compose.foundation.interaction.InteractionSource interactionSource);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> tonalElevation(androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  @androidx.compose.runtime.Stable public class FloatingActionButtonElevation {
   }
 
   public final class FloatingActionButtonKt {
-    method @androidx.compose.runtime.Composable public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
-    method @androidx.compose.runtime.Composable public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean expanded, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation);
+    method @androidx.compose.runtime.Composable public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean expanded, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
     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.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method @androidx.compose.runtime.Composable public static void LargeFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method @androidx.compose.runtime.Composable public static void SmallFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void LargeFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void SmallFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
-  @androidx.compose.runtime.Stable public interface IconButtonColors {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> containerColor(boolean enabled);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled);
+  @androidx.compose.runtime.Immutable public final class IconButtonColors {
   }
 
   public final class IconButtonDefaults {
@@ -336,9 +318,7 @@
     method @androidx.compose.runtime.Composable public static void Icon(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
   }
 
-  @androidx.compose.runtime.Stable public interface IconToggleButtonColors {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> containerColor(boolean enabled, boolean checked);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled, boolean checked);
+  @androidx.compose.runtime.Immutable public final class IconToggleButtonColors {
   }
 
   public final class IncludeFontPaddingHelper_androidKt {
@@ -368,10 +348,7 @@
     field public static final androidx.compose.material3.MenuDefaults INSTANCE;
   }
 
-  @androidx.compose.runtime.Stable public interface MenuItemColors {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> leadingIconColor(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);
+  @androidx.compose.runtime.Immutable public final class MenuItemColors {
   }
 
   public final class MenuKt {
@@ -380,16 +357,14 @@
   public final class NavigationBarDefaults {
     method @androidx.compose.runtime.Composable public long getContainerColor();
     method public float getElevation();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.WindowInsets getWindowInsets();
     property public final float Elevation;
     property @androidx.compose.runtime.Composable public final long containerColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.layout.WindowInsets windowInsets;
     field public static final androidx.compose.material3.NavigationBarDefaults INSTANCE;
   }
 
-  @androidx.compose.runtime.Stable public interface NavigationBarItemColors {
-    method @androidx.compose.runtime.Composable public long getIndicatorColor();
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> iconColor(boolean selected);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> textColor(boolean selected);
-    property @androidx.compose.runtime.Composable public abstract long indicatorColor;
+  @androidx.compose.runtime.Stable public final class NavigationBarItemColors {
   }
 
   public final class NavigationBarItemDefaults {
@@ -398,7 +373,7 @@
   }
 
   public final class NavigationBarKt {
-    method @androidx.compose.runtime.Composable public static void NavigationBar(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float tonalElevation, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void NavigationBar(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.layout.WindowInsets windowInsets, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void NavigationBarItem(androidx.compose.foundation.layout.RowScope, boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.material3.NavigationBarItemColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
@@ -407,15 +382,13 @@
 
   public final class NavigationRailDefaults {
     method @androidx.compose.runtime.Composable public long getContainerColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.WindowInsets getWindowInsets();
     property @androidx.compose.runtime.Composable public final long ContainerColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.layout.WindowInsets windowInsets;
     field public static final androidx.compose.material3.NavigationRailDefaults INSTANCE;
   }
 
-  @androidx.compose.runtime.Stable public interface NavigationRailItemColors {
-    method @androidx.compose.runtime.Composable public long getIndicatorColor();
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> iconColor(boolean selected);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> textColor(boolean selected);
-    property @androidx.compose.runtime.Composable public abstract long indicatorColor;
+  @androidx.compose.runtime.Stable public final class NavigationRailItemColors {
   }
 
   public final class NavigationRailItemDefaults {
@@ -424,7 +397,7 @@
   }
 
   public final class NavigationRailKt {
-    method @androidx.compose.runtime.Composable public static void NavigationRail(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? header, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void NavigationRail(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? header, optional androidx.compose.foundation.layout.WindowInsets windowInsets, 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.material3.NavigationRailItemColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
@@ -452,8 +425,7 @@
     method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional long trackColor);
   }
 
-  @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);
+  @androidx.compose.runtime.Immutable public final class RadioButtonColors {
   }
 
   public final class RadioButtonDefaults {
@@ -465,6 +437,9 @@
     method @androidx.compose.runtime.Composable public static void RadioButton(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.material3.RadioButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
+  public final class SafeDrawingInsets_androidKt {
+  }
+
   public final class ScaffoldKt {
   }
 
@@ -500,10 +475,7 @@
   public final class ShapesKt {
   }
 
-  @androidx.compose.runtime.Stable public interface SliderColors {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> thumbColor(boolean enabled);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> tickColor(boolean enabled, boolean active);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trackColor(boolean enabled, boolean active);
+  @androidx.compose.runtime.Immutable public final class SliderColors {
   }
 
   public final class SliderDefaults {
@@ -592,11 +564,7 @@
   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> borderColor(boolean enabled, boolean checked);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> iconColor(boolean enabled, boolean checked);
-    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);
+  @androidx.compose.runtime.Immutable public final class SwitchColors {
   }
 
   public final class SwitchDefaults {
@@ -640,6 +608,9 @@
     method @androidx.compose.runtime.Composable public static void TabRow(int selectedTabIndex, optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.material3.TabPosition>,kotlin.Unit> indicator, optional kotlin.jvm.functions.Function0<kotlin.Unit> divider, kotlin.jvm.functions.Function0<kotlin.Unit> tabs);
   }
 
+  @androidx.compose.runtime.Immutable public final class TextFieldColors {
+  }
+
   public final class TextFieldDefaultsKt {
   }
 
@@ -660,21 +631,6 @@
   public final class TonalPaletteKt {
   }
 
-  @androidx.compose.runtime.Stable public interface TopAppBarColors {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> actionIconContentColor(float colorTransitionFraction);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> containerColor(float colorTransitionFraction);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> navigationIconContentColor(float colorTransitionFraction);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> titleContentColor(float colorTransitionFraction);
-  }
-
-  public final class TopAppBarDefaults {
-    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors centerAlignedTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor);
-    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors largeTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor);
-    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors mediumTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor);
-    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors smallTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor);
-    field public static final androidx.compose.material3.TopAppBarDefaults INSTANCE;
-  }
-
   public final class TouchTargetKt {
   }
 
diff --git a/compose/material3/material3/build.gradle b/compose/material3/material3/build.gradle
index 5a04d78..5163b14 100644
--- a/compose/material3/material3/build.gradle
+++ b/compose/material3/material3/build.gradle
@@ -37,7 +37,7 @@
          */
         implementation(libs.kotlinStdlibCommon)
         implementation("androidx.compose.animation:animation-core:1.1.1")
-        implementation("androidx.compose.foundation:foundation-layout:1.1.1")
+        implementation("androidx.compose.foundation:foundation-layout:1.2.0")
         implementation("androidx.compose.ui:ui-util:1.0.0")
         api("androidx.compose.foundation:foundation:1.2.0")
         api("androidx.compose.material:material-icons-core:1.0.2")
@@ -59,8 +59,10 @@
         testImplementation(libs.truth)
 
         androidTestImplementation(project(":compose:material3:material3:material3-samples"))
+        androidTestImplementation(project(":compose:foundation:foundation-layout"))
         androidTestImplementation(project(":compose:test-utils"))
         androidTestImplementation(project(":test:screenshot:screenshot"))
+        androidTestImplementation(project(":core:core"))
         androidTestImplementation(libs.testRules)
         androidTestImplementation(libs.testRunner)
         androidTestImplementation(libs.junit)
@@ -98,6 +100,7 @@
                 api(project(":compose:ui:ui-text"))
 
                 implementation(project(":compose:ui:ui-util"))
+                implementation(project(":compose:foundation:foundation-layout"))
             }
 
             androidMain.dependencies {
@@ -127,7 +130,9 @@
             androidAndroidTest.dependencies {
                 implementation(project(":compose:material3:material3:material3-samples"))
                 implementation(project(":compose:test-utils"))
+                implementation(project(':compose:foundation:foundation-layout'))
                 implementation(project(":test:screenshot:screenshot"))
+                implementation(project(":core:core"))
 
                 implementation(libs.testRules)
                 implementation(libs.testRunner)
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/common/CatalogScaffold.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/common/CatalogScaffold.kt
index 885fb6e..c04e2ef 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/common/CatalogScaffold.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/common/CatalogScaffold.kt
@@ -38,7 +38,6 @@
 import androidx.compose.material3.catalog.library.util.TermsUrl
 import androidx.compose.material3.catalog.library.util.openUrl
 import androidx.compose.material3.contentColorFor
-import androidx.compose.material3.rememberTopAppBarState
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.rememberCoroutineScope
@@ -93,8 +92,7 @@
             scrimColor = SheetScrimColor
         ) {
             val context = LocalContext.current
-            val scrollBehavior =
-                TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
+            val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
             Scaffold(
                 topBar = {
                     CatalogTopAppBar(
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/common/CatalogTopAppBar.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/common/CatalogTopAppBar.kt
index 72bcdfc..dd1672d 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/common/CatalogTopAppBar.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/common/CatalogTopAppBar.kt
@@ -18,11 +18,6 @@
 
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Row
-import androidx.compose.foundation.layout.WindowInsets
-import androidx.compose.foundation.layout.WindowInsetsSides
-import androidx.compose.foundation.layout.only
-import androidx.compose.foundation.layout.safeDrawing
-import androidx.compose.foundation.layout.windowInsetsPadding
 import androidx.compose.material.Divider
 import androidx.compose.material.DropdownMenu
 import androidx.compose.material.DropdownMenuItem
@@ -34,9 +29,7 @@
 import androidx.compose.material3.IconButton
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.SmallTopAppBar
-import androidx.compose.material3.Surface
 import androidx.compose.material3.Text
-import androidx.compose.material3.TopAppBarDefaults
 import androidx.compose.material3.TopAppBarScrollBehavior
 import androidx.compose.material3.catalog.library.R
 import androidx.compose.runtime.Composable
@@ -44,8 +37,6 @@
 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.res.painterResource
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.text.style.TextOverflow
@@ -67,94 +58,76 @@
     onLicensesClick: () -> Unit = {}
 ) {
     var moreMenuExpanded by remember { mutableStateOf(false) }
-    val backgroundColors = TopAppBarDefaults.smallTopAppBarColors()
-    val backgroundColor = backgroundColors.containerColor(
-        colorTransitionFraction = scrollBehavior?.state?.overlappedFraction ?: 0f
-    ).value
-    val foregroundColors = TopAppBarDefaults.smallTopAppBarColors(
-        containerColor = Color.Transparent,
-        scrolledContainerColor = Color.Transparent
-    )
-    // Wrapping in a Surface to handle window insets
-    // https://issuetracker.google.com/issues/183161866
-    Surface(color = backgroundColor) {
-        SmallTopAppBar(
-            title = {
-                Text(
-                    text = title,
-                    maxLines = 1,
-                    overflow = TextOverflow.Ellipsis,
-                )
-            },
-            actions = {
-                Box {
-                    Row {
-                        IconButton(onClick = onThemeClick) {
-                            Icon(
-                                painter = painterResource(id = R.drawable.ic_palette_24dp),
-                                contentDescription = null
-                            )
-                        }
-                        IconButton(onClick = { moreMenuExpanded = true }) {
-                            Icon(
-                                imageVector = Icons.Default.MoreVert,
-                                contentDescription = null
-                            )
-                        }
-                    }
-                    MoreMenu(
-                        expanded = moreMenuExpanded,
-                        onDismissRequest = { moreMenuExpanded = false },
-                        onGuidelinesClick = {
-                            onGuidelinesClick()
-                            moreMenuExpanded = false
-                        },
-                        onDocsClick = {
-                            onDocsClick()
-                            moreMenuExpanded = false
-                        },
-                        onSourceClick = {
-                            onSourceClick()
-                            moreMenuExpanded = false
-                        },
-                        onIssueClick = {
-                            onIssueClick()
-                            moreMenuExpanded = false
-                        },
-                        onTermsClick = {
-                            onTermsClick()
-                            moreMenuExpanded = false
-                        },
-                        onPrivacyClick = {
-                            onPrivacyClick()
-                            moreMenuExpanded = false
-                        },
-                        onLicensesClick = {
-                            onLicensesClick()
-                            moreMenuExpanded = false
-                        }
-                    )
-                }
-            },
-            navigationIcon = {
-                if (showBackNavigationIcon) {
-                    IconButton(onClick = onBackClick) {
+    SmallTopAppBar(
+        title = {
+            Text(
+                text = title,
+                maxLines = 1,
+                overflow = TextOverflow.Ellipsis,
+            )
+        },
+        actions = {
+            Box {
+                Row {
+                    IconButton(onClick = onThemeClick) {
                         Icon(
-                            imageVector = Icons.Default.ArrowBack,
+                            painter = painterResource(id = R.drawable.ic_palette_24dp),
+                            contentDescription = null
+                        )
+                    }
+                    IconButton(onClick = { moreMenuExpanded = true }) {
+                        Icon(
+                            imageVector = Icons.Default.MoreVert,
                             contentDescription = null
                         )
                     }
                 }
-            },
-            scrollBehavior = scrollBehavior,
-            colors = foregroundColors,
-            modifier = Modifier.windowInsetsPadding(
-                WindowInsets.safeDrawing.only(
-                    WindowInsetsSides.Horizontal + WindowInsetsSides.Top
+                MoreMenu(
+                    expanded = moreMenuExpanded,
+                    onDismissRequest = { moreMenuExpanded = false },
+                    onGuidelinesClick = {
+                        onGuidelinesClick()
+                        moreMenuExpanded = false
+                    },
+                    onDocsClick = {
+                        onDocsClick()
+                        moreMenuExpanded = false
+                    },
+                    onSourceClick = {
+                        onSourceClick()
+                        moreMenuExpanded = false
+                    },
+                    onIssueClick = {
+                        onIssueClick()
+                        moreMenuExpanded = false
+                    },
+                    onTermsClick = {
+                        onTermsClick()
+                        moreMenuExpanded = false
+                    },
+                    onPrivacyClick = {
+                        onPrivacyClick()
+                        moreMenuExpanded = false
+                    },
+                    onLicensesClick = {
+                        onLicensesClick()
+                        moreMenuExpanded = false
+                    }
                 )
-            )
-        )
-    }
+            }
+        },
+        navigationIcon = {
+            if (showBackNavigationIcon) {
+                IconButton(onClick = onBackClick) {
+                    Icon(
+                        imageVector = Icons.Default.ArrowBack,
+                        contentDescription = null
+                    )
+                }
+            }
+        },
+        scrollBehavior = scrollBehavior
+    )
 }
 
 @Composable
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/component/Component.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/component/Component.kt
index 8b16664..3a3b28d 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/component/Component.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/component/Component.kt
@@ -18,14 +18,15 @@
 
 import androidx.compose.foundation.Image
 import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.ExperimentalLayoutApi
+import androidx.compose.foundation.layout.PaddingValues
 import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.calculateEndPadding
+import androidx.compose.foundation.layout.calculateStartPadding
 import androidx.compose.foundation.layout.WindowInsets
-import androidx.compose.foundation.layout.WindowInsetsSides
-import androidx.compose.foundation.layout.add
-import androidx.compose.foundation.layout.asPaddingValues
+import androidx.compose.foundation.layout.consumedWindowInsets
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.height
-import androidx.compose.foundation.layout.only
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.safeDrawing
 import androidx.compose.foundation.layout.size
@@ -44,10 +45,12 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.ColorFilter
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.res.painterResource
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.unit.dp
 
+@OptIn(ExperimentalLayoutApi::class)
 @Composable
 fun Component(
     component: Component,
@@ -56,6 +59,7 @@
     onExampleClick: (example: Example) -> Unit,
     onBackClick: () -> Unit
 ) {
+    val ltr = LocalLayoutDirection.current
     CatalogScaffold(
         topBarTitle = component.name,
         showBackNavigationIcon = true,
@@ -67,16 +71,13 @@
         onBackClick = onBackClick
     ) { paddingValues ->
         LazyColumn(
-            modifier = Modifier.padding(paddingValues),
-            contentPadding = WindowInsets.safeDrawing
-                .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom)
-                .add(
-                    WindowInsets(
-                        left = ComponentPadding,
-                        right = ComponentPadding
-                    )
-                )
-                .asPaddingValues()
+            modifier = Modifier.consumedWindowInsets(WindowInsets.safeDrawing),
+            contentPadding = PaddingValues(
+                start = paddingValues.calculateStartPadding(ltr) + ComponentPadding,
+                top = paddingValues.calculateTopPadding() + ComponentPadding,
+                end = paddingValues.calculateEndPadding(ltr) + ComponentPadding,
+                bottom = paddingValues.calculateBottomPadding() + ComponentPadding
+            )
         ) {
             item {
                 Box(
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/example/Example.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/example/Example.kt
index 4eefa74..3fc7059 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/example/Example.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/example/Example.kt
@@ -17,13 +17,12 @@
 package androidx.compose.material3.catalog.library.ui.example
 
 import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.ExperimentalLayoutApi
 import androidx.compose.foundation.layout.WindowInsets
-import androidx.compose.foundation.layout.WindowInsetsSides
+import androidx.compose.foundation.layout.consumedWindowInsets
 import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.foundation.layout.only
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.safeDrawing
-import androidx.compose.foundation.layout.windowInsetsPadding
 import androidx.compose.material3.catalog.library.model.Component
 import androidx.compose.material3.catalog.library.model.Example
 import androidx.compose.material3.catalog.library.model.Theme
@@ -32,6 +31,7 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 
+@OptIn(ExperimentalLayoutApi::class)
 @Composable
 fun Example(
     component: Component,
@@ -53,11 +53,8 @@
         Box(
             modifier = Modifier
                 .fillMaxSize()
-                .padding(paddingValues)
-                .windowInsetsPadding(
-                    WindowInsets.safeDrawing
-                        .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom)
-                ),
+                .consumedWindowInsets(WindowInsets.safeDrawing)
+                .padding(paddingValues),
             contentAlignment = Alignment.Center
         ) {
             example.content()
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/home/Home.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/home/Home.kt
index 5a2800d..37c0cc7 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/home/Home.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/home/Home.kt
@@ -16,13 +16,11 @@
 
 package androidx.compose.material3.catalog.library.ui.home
 
-import androidx.compose.foundation.layout.WindowInsets
-import androidx.compose.foundation.layout.WindowInsetsSides
-import androidx.compose.foundation.layout.add
-import androidx.compose.foundation.layout.asPaddingValues
-import androidx.compose.foundation.layout.only
-import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.safeDrawing
+import androidx.compose.foundation.layout.ExperimentalLayoutApi
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.calculateEndPadding
+import androidx.compose.foundation.layout.calculateStartPadding
+import androidx.compose.foundation.layout.consumedWindowInsets
 import androidx.compose.foundation.lazy.grid.GridCells
 import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
 import androidx.compose.foundation.lazy.grid.items
@@ -33,9 +31,11 @@
 import androidx.compose.material3.catalog.library.ui.component.ComponentItem
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.unit.dp
 
+@OptIn(ExperimentalLayoutApi::class)
 @Composable
 fun Home(
     components: List<Component>,
@@ -43,13 +43,14 @@
     onThemeChange: (theme: Theme) -> Unit,
     onComponentClick: (component: Component) -> Unit
 ) {
+    val ltr = LocalLayoutDirection.current
     CatalogScaffold(
         topBarTitle = stringResource(id = R.string.compose_material_3),
         theme = theme,
         onThemeChange = onThemeChange
     ) { paddingValues ->
         LazyVerticalGrid(
-            modifier = Modifier.padding(paddingValues),
+            modifier = Modifier.consumedWindowInsets(paddingValues),
             columns = GridCells.Adaptive(HomeCellMinSize),
             content = {
                 items(components) { component ->
@@ -59,17 +60,12 @@
                     )
                 }
             },
-            contentPadding = WindowInsets.safeDrawing
-                .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom)
-                .add(
-                    WindowInsets(
-                        left = HomePadding,
-                        top = HomePadding,
-                        right = HomePadding,
-                        bottom = HomePadding
-                    )
-                )
-                .asPaddingValues()
+            contentPadding = PaddingValues(
+                start = paddingValues.calculateStartPadding(ltr) + HomePadding,
+                top = paddingValues.calculateTopPadding() + HomePadding,
+                end = paddingValues.calculateEndPadding(ltr) + HomePadding,
+                bottom = paddingValues.calculateBottomPadding() + HomePadding
+            )
         )
     }
 }
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/AppBarSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/AppBarSamples.kt
index e1199d8..e7463be 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/AppBarSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/AppBarSamples.kt
@@ -17,7 +17,6 @@
 package androidx.compose.material3.samples
 
 import androidx.annotation.Sampled
-import androidx.compose.animation.rememberSplineBasedDecay
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.padding
@@ -33,6 +32,7 @@
 import androidx.compose.material3.CenterAlignedTopAppBar
 import androidx.compose.material3.ExperimentalMaterial3Api
 import androidx.compose.material3.FloatingActionButton
+import androidx.compose.material3.FloatingActionButtonDefaults
 import androidx.compose.material3.Icon
 import androidx.compose.material3.IconButton
 import androidx.compose.material3.LargeTopAppBar
@@ -42,7 +42,6 @@
 import androidx.compose.material3.SmallTopAppBar
 import androidx.compose.material3.Text
 import androidx.compose.material3.TopAppBarDefaults
-import androidx.compose.material3.rememberTopAppBarState
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.input.nestedscroll.nestedScroll
@@ -173,7 +172,7 @@
 @Sampled
 @Composable
 fun PinnedSmallTopAppBar() {
-    val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
+    val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
     Scaffold(
         modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
         topBar = {
@@ -239,7 +238,7 @@
 @Sampled
 @Composable
 fun EnterAlwaysSmallTopAppBar() {
-    val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(rememberTopAppBarState())
+    val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior()
     Scaffold(
         modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
         topBar = {
@@ -298,11 +297,7 @@
 @Sampled
 @Composable
 fun ExitUntilCollapsedMediumTopAppBar() {
-    val decayAnimationSpec = rememberSplineBasedDecay<Float>()
-    val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(
-        decayAnimationSpec,
-        rememberTopAppBarState()
-    )
+    val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
     Scaffold(
         modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
         topBar = {
@@ -361,11 +356,7 @@
 @Sampled
 @Composable
 fun ExitUntilCollapsedLargeTopAppBar() {
-    val decayAnimationSpec = rememberSplineBasedDecay<Float>()
-    val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(
-        decayAnimationSpec,
-        rememberTopAppBarState()
-    )
+    val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
     Scaffold(
         modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
         topBar = {
@@ -445,7 +436,7 @@
             FloatingActionButton(
                 onClick = { /* do something */ },
                 containerColor = BottomAppBarDefaults.bottomAppBarFabColor,
-                elevation = BottomAppBarDefaults.BottomAppBarFabElevation
+                elevation = FloatingActionButtonDefaults.bottomAppBarFabElevation()
             ) {
                 Icon(Icons.Filled.Add, "Localized description")
             }
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ScaffoldSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ScaffoldSamples.kt
index d602ea5..8ce6ef3 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ScaffoldSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ScaffoldSamples.kt
@@ -20,10 +20,14 @@
 import androidx.compose.foundation.background
 import androidx.compose.foundation.border
 import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.ExperimentalLayoutApi
+import androidx.compose.foundation.layout.WindowInsets
+import androidx.compose.foundation.layout.consumedWindowInsets
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.safeDrawing
 import androidx.compose.foundation.layout.wrapContentSize
 import androidx.compose.foundation.lazy.LazyColumn
 import androidx.compose.material.icons.Icons
@@ -60,7 +64,7 @@
 import kotlinx.coroutines.flow.receiveAsFlow
 import kotlinx.coroutines.launch
 
-@OptIn(ExperimentalMaterial3Api::class)
+@OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class)
 @Sampled
 @Composable
 fun SimpleScaffoldWithTopBar() {
@@ -94,7 +98,11 @@
             }
         },
         content = { innerPadding ->
-            LazyColumn(contentPadding = innerPadding) {
+            LazyColumn(
+                // consume insets as scaffold doesn't do it by default (yet)
+                modifier = Modifier.consumedWindowInsets(WindowInsets.safeDrawing),
+                contentPadding = innerPadding
+            ) {
                 items(count = 100) {
                     Box(
                         Modifier
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TextFieldSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TextFieldSamples.kt
index f9d6b30..a26aea6 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TextFieldSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TextFieldSamples.kt
@@ -372,7 +372,7 @@
             onValueChange = onValueChange,
             modifier = modifier
                 .background(
-                    color = colors.containerColor(enabled).value,
+                    color = MaterialTheme.colorScheme.surfaceVariant,
                     shape = RoundedCornerShape(
                         topStart = 4.0.dp,
                         topEnd = 4.0.dp,
diff --git a/compose/material3/material3/src/androidAndroidTest/AndroidManifest.xml b/compose/material3/material3/src/androidAndroidTest/AndroidManifest.xml
index e865f27..e650e97 100644
--- a/compose/material3/material3/src/androidAndroidTest/AndroidManifest.xml
+++ b/compose/material3/material3/src/androidAndroidTest/AndroidManifest.xml
@@ -14,4 +14,12 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License.
   -->
-<manifest />
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
+    <application>
+        <activity
+            android:name="androidx.compose.material3.MaterialWindowInsetsActivity"
+            android:windowSoftInputMode="adjustResize"
+            android:theme="@android:style/Theme.Material.NoActionBar.Fullscreen" />
+    </application>
+</manifest>
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AppBarScreenshotTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AppBarScreenshotTest.kt
index faea010..4c3ec55 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AppBarScreenshotTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AppBarScreenshotTest.kt
@@ -18,18 +18,23 @@
 
 import android.os.Build
 import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.WindowInsets
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.Add
 import androidx.compose.material.icons.filled.ArrowBack
 import androidx.compose.material.icons.filled.Favorite
 import androidx.compose.material.icons.filled.Menu
+import androidx.compose.material3.TopAppBarDefaults.enterAlwaysScrollBehavior
+import androidx.compose.material3.tokens.TopAppBarSmallTokens
 import androidx.compose.testutils.assertAgainstGolden
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.platform.testTag
-import androidx.compose.ui.test.ExperimentalTestApi
 import androidx.compose.ui.test.captureToImage
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.performTouchInput
+import androidx.compose.ui.unit.dp
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
@@ -41,7 +46,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
-@OptIn(ExperimentalMaterial3Api::class, ExperimentalTestApi::class)
+@OptIn(ExperimentalMaterial3Api::class)
 class AppBarScreenshotTest {
 
     @get:Rule
@@ -82,6 +87,48 @@
     }
 
     @Test
+    fun smallAppBar_lightTheme_clipsWhenCollapsedWithInsets() {
+        composeTestRule.setMaterialContent(lightColorScheme()) {
+            val behavior = enterAlwaysScrollBehavior(rememberTopAppBarState())
+            Box(Modifier.testTag(TopAppBarTestTag)) {
+                SmallTopAppBar(
+                    navigationIcon = {
+                        IconButton(onClick = { /* doSomething() */ }) {
+                            Icon(
+                                imageVector = Icons.Filled.ArrowBack,
+                                contentDescription = "Back"
+                            )
+                        }
+                    },
+                    scrollBehavior = behavior,
+                    windowInsets = WindowInsets(top = 30.dp),
+                    title = {
+                        Text("Title")
+                    },
+                    actions = {
+                        IconButton(onClick = { /* doSomething() */ }) {
+                            Icon(
+                                imageVector = Icons.Filled.Favorite,
+                                contentDescription = "Like"
+                            )
+                        }
+                    }
+                )
+            }
+        }
+
+        composeTestRule.onNodeWithTag(TopAppBarTestTag).performTouchInput {
+            // start from the bottom so we can drag enough
+            down(bottomCenter - Offset(1f, 1f))
+            moveBy(Offset(0f, -((TopAppBarSmallTokens.ContainerHeight - 10.dp).toPx())))
+        }
+
+        assertAppBarAgainstGolden(
+            goldenIdentifier = "smallAppBar_lightTheme_clipsWhenCollapsedWithInsets"
+        )
+    }
+
+    @Test
     fun smallAppBar_darkTheme() {
         composeTestRule.setMaterialContent(darkColorScheme()) {
             Box(Modifier.testTag(TopAppBarTestTag)) {
@@ -315,7 +362,7 @@
                         FloatingActionButton(
                             onClick = { /* do something */ },
                             containerColor = BottomAppBarDefaults.bottomAppBarFabColor,
-                            elevation = BottomAppBarDefaults.BottomAppBarFabElevation
+                            elevation = FloatingActionButtonDefaults.bottomAppBarFabElevation()
                         ) {
                             Icon(Icons.Filled.Add, "Localized description")
                         }
@@ -347,7 +394,7 @@
                         FloatingActionButton(
                             onClick = { /* do something */ },
                             containerColor = BottomAppBarDefaults.bottomAppBarFabColor,
-                            elevation = BottomAppBarDefaults.BottomAppBarFabElevation
+                            elevation = FloatingActionButtonDefaults.bottomAppBarFabElevation()
                         ) {
                             Icon(Icons.Filled.Add, "Localized description")
                         }
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AppBarTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AppBarTest.kt
index b3c0b8f..2eed1ff 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AppBarTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AppBarTest.kt
@@ -17,8 +17,9 @@
 package androidx.compose.material3
 
 import android.os.Build
-import androidx.compose.animation.rememberSplineBasedDecay
 import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.WindowInsets
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.lazy.LazyColumn
 import androidx.compose.foundation.lazy.LazyListState
@@ -178,29 +179,23 @@
                     FakeIcon(Modifier.testTag(NavigationIconTestTag))
                     navigationIconColor = LocalContentColor.current
                     expectedNavigationIconColor =
-                        TopAppBarDefaults.smallTopAppBarColors()
-                            .navigationIconContentColor(colorTransitionFraction = 0f).value
+                        TopAppBarDefaults.smallTopAppBarColors().navigationIconContentColor
                     // fraction = 0f to indicate no scroll.
                     expectedContainerColor = TopAppBarDefaults
                         .smallTopAppBarColors()
                         .containerColor(colorTransitionFraction = 0f)
-                        .value
                 },
                 title = {
                     Text("Title", Modifier.testTag(TitleTestTag))
                     titleColor = LocalContentColor.current
                     expectedTitleColor = TopAppBarDefaults
-                        .smallTopAppBarColors()
-                        .titleContentColor(colorTransitionFraction = 0f)
-                        .value
+                        .smallTopAppBarColors().titleContentColor
                 },
                 actions = {
                     FakeIcon(Modifier.testTag(ActionsTestTag))
                     actionsColor = LocalContentColor.current
                     expectedActionsColor = TopAppBarDefaults
-                        .smallTopAppBarColors()
-                        .actionIconContentColor(colorTransitionFraction = 0f)
-                        .value
+                        .smallTopAppBarColors().actionIconContentColor
                 }
             )
         }
@@ -222,7 +217,7 @@
         var expectedScrolledContainerColor: Color = Color.Unspecified
         lateinit var scrollBehavior: TopAppBarScrollBehavior
         rule.setMaterialContent(lightColorScheme()) {
-            scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
+            scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
             SmallTopAppBar(
                 modifier = Modifier.testTag(TopAppBarTestTag),
                 title = {
@@ -230,7 +225,7 @@
                     // fraction = 1f to indicate a scroll.
                     expectedScrolledContainerColor =
                         TopAppBarDefaults.smallTopAppBarColors()
-                            .containerColor(colorTransitionFraction = 1f).value
+                            .containerColor(colorTransitionFraction = 1f)
                 },
                 scrollBehavior = scrollBehavior
             )
@@ -253,8 +248,7 @@
         var scrollHeightOffsetPx = 0f
 
         rule.setMaterialContent(lightColorScheme()) {
-            scrollBehavior =
-                TopAppBarDefaults.enterAlwaysScrollBehavior(rememberTopAppBarState())
+            scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior()
             scrollHeightOffsetPx = with(LocalDensity.current) { scrollHeightOffsetDp.toPx() }
             SmallTopAppBar(
                 modifier = Modifier.testTag(TopAppBarTestTag),
@@ -314,6 +308,37 @@
     }
 
     @Test
+    fun centerAlignedTopAppBar_default_positioning_respectsWindowInsets() {
+        val padding = 10.dp
+        rule.setMaterialContent(lightColorScheme()) {
+            Box(Modifier.testTag(TopAppBarTestTag)) {
+                CenterAlignedTopAppBar(
+                    navigationIcon = {
+                        FakeIcon(Modifier.testTag(NavigationIconTestTag))
+                    },
+                    title = {
+                        Text("Title", Modifier.testTag(TitleTestTag))
+                    },
+                    actions = {
+                        FakeIcon(Modifier.testTag(ActionsTestTag))
+                    },
+                    windowInsets = WindowInsets(padding, padding, padding, padding)
+                )
+            }
+        }
+        val appBarBounds = rule.onNodeWithTag(TopAppBarTestTag).getUnclippedBoundsInRoot()
+        val appBarBottomEdgeY = appBarBounds.top + appBarBounds.height
+
+        rule.onNodeWithTag(NavigationIconTestTag)
+            // Navigation icon should be 4.dp from the start
+            .assertLeftPositionInRootIsEqualTo(AppBarStartAndEndPadding + padding)
+            // Navigation icon should be centered within the height of the app bar.
+            .assertTopPositionInRootIsEqualTo(
+                appBarBottomEdgeY - AppBarTopAndBottomPadding - padding - FakeIconSize
+            )
+    }
+
+    @Test
     fun centerAlignedTopAppBar_noNavigationIcon_positioning() {
         rule.setMaterialContent(lightColorScheme()) {
             Box(Modifier.testTag(TopAppBarTestTag)) {
@@ -392,25 +417,25 @@
                     navigationIconColor = LocalContentColor.current
                     expectedNavigationIconColor =
                         TopAppBarDefaults.centerAlignedTopAppBarColors()
-                            .navigationIconContentColor(colorTransitionFraction = 0f).value
+                            .navigationIconContentColor
                     // fraction = 0f to indicate no scroll.
                     expectedContainerColor =
                         TopAppBarDefaults.centerAlignedTopAppBarColors()
-                            .containerColor(colorTransitionFraction = 0f).value
+                            .containerColor(colorTransitionFraction = 0f)
                 },
                 title = {
                     Text("Title", Modifier.testTag(TitleTestTag))
                     titleColor = LocalContentColor.current
                     expectedTitleColor =
                         TopAppBarDefaults.centerAlignedTopAppBarColors()
-                            .titleContentColor(colorTransitionFraction = 0f).value
+                            .titleContentColor
                 },
                 actions = {
                     FakeIcon(Modifier.testTag(ActionsTestTag))
                     actionsColor = LocalContentColor.current
                     expectedActionsColor =
                         TopAppBarDefaults.centerAlignedTopAppBarColors()
-                            .actionIconContentColor(colorTransitionFraction = 0f).value
+                            .actionIconContentColor
                 }
             )
         }
@@ -433,7 +458,7 @@
         lateinit var scrollBehavior: TopAppBarScrollBehavior
 
         rule.setMaterialContent(lightColorScheme()) {
-            scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
+            scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
             CenterAlignedTopAppBar(
                 modifier = Modifier.testTag(TopAppBarTestTag),
                 title = {
@@ -441,7 +466,7 @@
                     // fraction = 1f to indicate a scroll.
                     expectedScrolledContainerColor =
                         TopAppBarDefaults.centerAlignedTopAppBarColors()
-                            .containerColor(colorTransitionFraction = 1f).value
+                            .containerColor(colorTransitionFraction = 1f)
                 },
                 scrollBehavior = scrollBehavior
             )
@@ -492,6 +517,7 @@
 
     @Test
     fun mediumTopAppBar_scrolled_positioning() {
+        val windowInsets = WindowInsets(13.dp, 13.dp, 13.dp, 13.dp)
         val content = @Composable { scrollBehavior: TopAppBarScrollBehavior? ->
             Box(Modifier.testTag(TopAppBarTestTag)) {
                 MediumTopAppBar(
@@ -504,13 +530,15 @@
                     actions = {
                         FakeIcon(Modifier.testTag(ActionsTestTag))
                     },
-                    scrollBehavior = scrollBehavior
+                    scrollBehavior = scrollBehavior,
+                    windowInsets = windowInsets
                 )
             }
         }
         assertMediumOrLargeScrolledHeight(
             TopAppBarMediumTokens.ContainerHeight,
             TopAppBarSmallTokens.ContainerHeight,
+            windowInsets,
             content
         )
     }
@@ -610,6 +638,7 @@
 
     @Test
     fun largeTopAppBar_scrolled_positioning() {
+        val windowInsets = WindowInsets(4.dp, 4.dp, 4.dp, 4.dp)
         val content = @Composable { scrollBehavior: TopAppBarScrollBehavior? ->
             Box(Modifier.testTag(TopAppBarTestTag)) {
                 LargeTopAppBar(
@@ -622,13 +651,15 @@
                     actions = {
                         FakeIcon(Modifier.testTag(ActionsTestTag))
                     },
-                    scrollBehavior = scrollBehavior
+                    scrollBehavior = scrollBehavior,
+                    windowInsets = windowInsets
                 )
             }
         }
         assertMediumOrLargeScrolledHeight(
             TopAppBarLargeTokens.ContainerHeight,
             TopAppBarSmallTokens.ContainerHeight,
+            windowInsets,
             content
         )
     }
@@ -642,7 +673,7 @@
                 title = {
                     Text("Title", Modifier.testTag(TitleTestTag))
                 },
-                scrollBehavior = scrollBehavior
+                scrollBehavior = scrollBehavior,
             )
         }
         assertMediumOrLargeScrolledColors(
@@ -658,11 +689,7 @@
         lateinit var state: LazyListState
         rule.setMaterialContent(lightColorScheme()) {
             state = rememberLazyListState()
-            MultiPageContent(
-                TopAppBarDefaults.enterAlwaysScrollBehavior(
-                    rememberTopAppBarState()
-                ), state
-            )
+            MultiPageContent(TopAppBarDefaults.enterAlwaysScrollBehavior(), state)
         }
 
         rule.onNodeWithTag(LazyListTag).performTouchInput { swipeLeft() }
@@ -682,12 +709,7 @@
         lateinit var state: LazyListState
         rule.setMaterialContent(lightColorScheme()) {
             state = rememberLazyListState()
-            MultiPageContent(
-                TopAppBarDefaults.exitUntilCollapsedScrollBehavior(
-                    rememberSplineBasedDecay(),
-                    rememberTopAppBarState()
-                ), state
-            )
+            MultiPageContent(TopAppBarDefaults.exitUntilCollapsedScrollBehavior(), state)
         }
 
         rule.onNodeWithTag(LazyListTag).performTouchInput { swipeLeft() }
@@ -708,7 +730,7 @@
         rule.setMaterialContent(lightColorScheme()) {
             state = rememberLazyListState()
             MultiPageContent(
-                TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()),
+                TopAppBarDefaults.pinnedScrollBehavior(),
                 state
             )
         }
@@ -732,9 +754,7 @@
                 title = {
                     Text("Title")
                 },
-                scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(
-                    rememberTopAppBarState()
-                )
+                scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
             )
         }
 
@@ -760,10 +780,7 @@
                 title = {
                     Text("Title")
                 },
-                scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(
-                    rememberSplineBasedDecay(),
-                    rememberTopAppBarState()
-                )
+                scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
             )
         }
 
@@ -783,6 +800,47 @@
     }
 
     @Test
+    fun topAppBar_dragSnapToCollapsed() {
+        rule.setMaterialContentForSizeAssertions {
+            LargeTopAppBar(
+                modifier = Modifier.testTag(TopAppBarTestTag),
+                title = {
+                    Text("Title")
+                },
+                scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
+            )
+        }
+
+        rule.onNodeWithTag(TopAppBarTestTag)
+            .assertHeightIsEqualTo(TopAppBarLargeTokens.ContainerHeight)
+
+        // Slightly drag up the app bar.
+        rule.onNodeWithTag(TopAppBarTestTag).performTouchInput {
+            down(Offset(x = 0f, y = height - 20f))
+            moveTo(Offset(x = 0f, y = height - 40f))
+            up()
+        }
+        rule.waitForIdle()
+
+        // Check that the app bar returned to its expanded size (i.e. fully expanded).
+        rule.onNodeWithTag(TopAppBarTestTag)
+            .assertHeightIsEqualTo(TopAppBarLargeTokens.ContainerHeight)
+
+        // Drag up the app bar to the point it should continue to collapse after.
+        rule.onNodeWithTag(TopAppBarTestTag).performTouchInput {
+            down(Offset(x = 0f, y = height - 20f))
+            moveTo(Offset(x = 0f, y = 40f))
+            up()
+        }
+        rule.waitForIdle()
+
+        // Check that the app bar collapsed to its small size constraints (i.e.
+        // TopAppBarSmallTokens.ContainerHeight).
+        rule.onNodeWithTag(TopAppBarTestTag)
+            .assertHeightIsEqualTo(TopAppBarSmallTokens.ContainerHeight)
+    }
+
+    @Test
     fun state_restoresTopAppBarState() {
         val restorationTester = StateRestorationTester(rule)
         var topAppBarState: TopAppBarState? = null
@@ -817,7 +875,7 @@
                         FloatingActionButton(
                             onClick = { /* do something */ },
                             containerColor = BottomAppBarDefaults.bottomAppBarFabColor,
-                            elevation = BottomAppBarDefaults.BottomAppBarFabElevation
+                            elevation = FloatingActionButtonDefaults.bottomAppBarFabElevation()
                         ) {
                             Icon(Icons.Filled.Add, "Localized description")
                         }
@@ -828,6 +886,27 @@
     }
 
     @Test
+    fun bottomAppBarWithFAB_respectsWindowInsets() {
+        rule
+            .setMaterialContentForSizeAssertions {
+                BottomAppBar(
+                    actions = {},
+                    windowInsets = WindowInsets(10.dp, 10.dp, 10.dp, 10.dp),
+                    floatingActionButton = {
+                        FloatingActionButton(
+                            onClick = { /* do something */ },
+                            containerColor = BottomAppBarDefaults.bottomAppBarFabColor,
+                            elevation = FloatingActionButtonDefaults.bottomAppBarFabElevation()
+                        ) {
+                            Icon(Icons.Filled.Add, "Localized description")
+                        }
+                    })
+            }
+            .assertHeightIsEqualTo(BottomAppBarTokens.ContainerHeight + 20.dp)
+            .assertWidthIsEqualTo(rule.rootWidth())
+    }
+
+    @Test
     fun bottomAppBar_widthExpandsToScreen() {
         rule
             .setMaterialContentForSizeAssertions {
@@ -848,13 +927,38 @@
         val appBarBounds = rule.onNodeWithTag("bar").getUnclippedBoundsInRoot()
         val appBarBottomEdgeY = appBarBounds.top + appBarBounds.height
 
+        val defaultPadding = BottomAppBarDefaults.ContentPadding
         rule.onNodeWithTag("icon")
             // Child icon should be 4.dp from the start
             .assertLeftPositionInRootIsEqualTo(AppBarStartAndEndPadding)
             // Child icon should be 10.dp from the top
             .assertTopPositionInRootIsEqualTo(
-                BottomAppBarTopPadding +
-                    (appBarBottomEdgeY - BottomAppBarTopPadding - FakeIconSize) / 2
+                defaultPadding.calculateTopPadding() +
+                    (appBarBottomEdgeY - defaultPadding.calculateTopPadding() - FakeIconSize) / 2
+            )
+    }
+
+    @Test
+    fun bottomAppBar_default_positioning_respectsContentPadding() {
+        val topPadding = 5.dp
+        rule.setMaterialContent(lightColorScheme()) {
+            BottomAppBar(
+                Modifier.testTag("bar"),
+                contentPadding = PaddingValues(top = topPadding, start = 3.dp)
+            ) {
+                FakeIcon(Modifier.testTag("icon"))
+            }
+        }
+
+        val appBarBounds = rule.onNodeWithTag("bar").getUnclippedBoundsInRoot()
+        val appBarBottomEdgeY = appBarBounds.top + appBarBounds.height
+
+        rule.onNodeWithTag("icon")
+            // Child icon should be 4.dp from the start
+            .assertLeftPositionInRootIsEqualTo(3.dp)
+            // Child icon should be 10.dp from the top
+            .assertTopPositionInRootIsEqualTo(
+                (appBarBottomEdgeY - topPadding - FakeIconSize) / 2 + 5.dp
             )
     }
 
@@ -869,7 +973,7 @@
                         onClick = { /* do something */ },
                         modifier = Modifier.testTag("FAB"),
                         containerColor = BottomAppBarDefaults.bottomAppBarFabColor,
-                        elevation = BottomAppBarDefaults.BottomAppBarFabElevation
+                        elevation = FloatingActionButtonDefaults.bottomAppBarFabElevation()
                     ) {
                         Icon(Icons.Filled.Add, "Localized description")
                     }
@@ -1064,19 +1168,19 @@
     private fun assertMediumOrLargeScrolledHeight(
         appBarMaxHeight: Dp,
         appBarMinHeight: Dp,
+        windowInsets: WindowInsets,
         content: @Composable (TopAppBarScrollBehavior?) -> Unit
     ) {
+        val (topInset, bottomInset) = with(rule.density) {
+            windowInsets.getTop(this).toDp() to windowInsets.getBottom(this).toDp()
+        }
         val fullyCollapsedOffsetDp = appBarMaxHeight - appBarMinHeight
         val partiallyCollapsedOffsetDp = fullyCollapsedOffsetDp / 3
         var partiallyCollapsedHeightOffsetPx = 0f
         var fullyCollapsedHeightOffsetPx = 0f
         lateinit var scrollBehavior: TopAppBarScrollBehavior
         rule.setMaterialContent(lightColorScheme()) {
-            scrollBehavior =
-                TopAppBarDefaults.exitUntilCollapsedScrollBehavior(
-                    rememberSplineBasedDecay(),
-                    rememberTopAppBarState()
-                )
+            scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
             with(LocalDensity.current) {
                 partiallyCollapsedHeightOffsetPx = partiallyCollapsedOffsetDp.toPx()
                 fullyCollapsedHeightOffsetPx = fullyCollapsedOffsetDp.toPx()
@@ -1092,7 +1196,9 @@
         }
         rule.waitForIdle()
         rule.onNodeWithTag(TopAppBarTestTag)
-            .assertHeightIsEqualTo(appBarMaxHeight - partiallyCollapsedOffsetDp)
+            .assertHeightIsEqualTo(
+                appBarMaxHeight - partiallyCollapsedOffsetDp + topInset + bottomInset
+            )
 
         // Simulate a fully collapsed app bar.
         rule.runOnIdle {
@@ -1103,7 +1209,9 @@
         }
         rule.waitForIdle()
         // Check that the app bar collapsed to its min height.
-        rule.onNodeWithTag(TopAppBarTestTag).assertHeightIsEqualTo(appBarMinHeight)
+        rule.onNodeWithTag(TopAppBarTestTag).assertHeightIsEqualTo(
+            appBarMinHeight + topInset + bottomInset
+        )
     }
 
     /**
@@ -1132,25 +1240,20 @@
         var titleContentColor: Color = Color.Unspecified
         lateinit var scrollBehavior: TopAppBarScrollBehavior
         rule.setMaterialContent(lightColorScheme()) {
-            scrollBehavior =
-                TopAppBarDefaults.exitUntilCollapsedScrollBehavior(
-                    rememberSplineBasedDecay(),
-                    rememberTopAppBarState()
-                )
+            scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
             // Using the mediumTopAppBarColors for both Medium and Large top app bars, as the
             // current content color settings are the same.
             oneThirdCollapsedContainerColor =
                 TopAppBarDefaults.mediumTopAppBarColors()
-                    .containerColor(colorTransitionFraction = 1 / 3f).value
+                    .containerColor(colorTransitionFraction = 1 / 3f)
             fullyCollapsedContainerColor =
                 TopAppBarDefaults.mediumTopAppBarColors()
-                    .containerColor(colorTransitionFraction = 1f).value
+                    .containerColor(colorTransitionFraction = 1f)
 
             // Resolve the title's content color. The default implementation returns the same color
             // regardless of the fraction, and the color is applied later with alpha.
             titleContentColor =
-                TopAppBarDefaults.mediumTopAppBarColors()
-                    .titleContentColor(colorTransitionFraction = 1f).value
+                TopAppBarDefaults.mediumTopAppBarColors().titleContentColor
 
             with(LocalDensity.current) {
                 oneThirdCollapsedHeightOffsetPx = oneThirdCollapsedOffsetDp.toPx()
@@ -1225,11 +1328,7 @@
         var oneThirdCollapsedHeightOffsetPx = 0f
         lateinit var scrollBehavior: TopAppBarScrollBehavior
         rule.setMaterialContent(lightColorScheme()) {
-            scrollBehavior =
-                TopAppBarDefaults.exitUntilCollapsedScrollBehavior(
-                    rememberSplineBasedDecay(),
-                    rememberTopAppBarState()
-                )
+            scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
             with(LocalDensity.current) {
                 oneThirdCollapsedHeightOffsetPx = oneThirdCollapsedOffsetDp.toPx()
                 fullyCollapsedHeightOffsetPx = fullyCollapsedOffsetDp.toPx()
@@ -1295,7 +1394,6 @@
     private val AppBarStartAndEndPadding = 4.dp
     private val AppBarTopAndBottomPadding =
         (TopAppBarSmallTokens.ContainerHeight - FakeIconSize) / 2
-    private val BottomAppBarTopPadding = 16.dp - 12.dp
 
     private val LazyListTag = "lazyList"
     private val TopAppBarTestTag = "bar"
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/CardScreenshotTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/CardScreenshotTest.kt
index 0db6e1b..c95c2ba 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/CardScreenshotTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/CardScreenshotTest.kt
@@ -22,10 +22,13 @@
 import androidx.compose.foundation.layout.size
 import androidx.compose.testutils.assertAgainstGolden
 import androidx.compose.ui.Alignment
+import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusRequester
-import androidx.compose.ui.focus.focusProperties
 import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.input.InputMode
+import androidx.compose.ui.input.InputModeManager
+import androidx.compose.ui.platform.LocalInputModeManager
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.ExperimentalTestApi
 import androidx.compose.ui.test.captureToImage
@@ -427,14 +430,13 @@
     @Test
     fun filledCard_focused() {
         val focusRequester = FocusRequester()
+        var localInputModeManager: InputModeManager? = null
         rule.setMaterialContent(lightColorScheme()) {
+            localInputModeManager = LocalInputModeManager.current
             Box(wrap.testTag(wrapperTestTag), contentAlignment = Alignment.Center) {
                 Card(
                     onClick = {},
                     Modifier.size(width = 180.dp, height = 100.dp)
-                        // Normally this is only focusable in non-touch mode, so let's force it to
-                        // always be focusable so we can test how it appears
-                        .focusProperties { canFocus = true }
                         .focusRequester(focusRequester)
                 ) {
                     Box(Modifier.fillMaxSize()) {
@@ -447,7 +449,11 @@
             }
         }
 
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            localInputModeManager!!.requestInputMode(InputMode.Keyboard)
+            focusRequester.requestFocus()
+        }
         rule.waitForIdle()
 
         assertAgainstGolden("filledCard_focus")
@@ -456,14 +462,13 @@
     @Test
     fun elevatedCard_focused() {
         val focusRequester = FocusRequester()
+        var localInputModeManager: InputModeManager? = null
         rule.setMaterialContent(lightColorScheme()) {
+            localInputModeManager = LocalInputModeManager.current
             Box(wrap.testTag(wrapperTestTag), contentAlignment = Alignment.Center) {
                 ElevatedCard(
                     onClick = {},
                     Modifier.size(width = 180.dp, height = 100.dp)
-                        // Normally this is only focusable in non-touch mode, so let's force it to
-                        // always be focusable so we can test how it appears
-                        .focusProperties { canFocus = true }
                         .focusRequester(focusRequester)
                 ) {
                     Box(Modifier.fillMaxSize()) {
@@ -476,7 +481,11 @@
             }
         }
 
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            localInputModeManager!!.requestInputMode(InputMode.Keyboard)
+            focusRequester.requestFocus()
+        }
         rule.waitForIdle()
 
         assertAgainstGolden("elevatedCard_focused")
@@ -485,14 +494,13 @@
     @Test
     fun outlinedCard_focused() {
         val focusRequester = FocusRequester()
+        var localInputModeManager: InputModeManager? = null
         rule.setMaterialContent(lightColorScheme()) {
+            localInputModeManager = LocalInputModeManager.current
             Box(wrap.testTag(wrapperTestTag), contentAlignment = Alignment.Center) {
                 OutlinedCard(
                     onClick = {},
                     Modifier.size(width = 180.dp, height = 100.dp)
-                        // Normally this is only focusable in non-touch mode, so let's force it to
-                        // always be focusable so we can test how it appears
-                        .focusProperties { canFocus = true }
                         .focusRequester(focusRequester)
                 ) {
                     Box(Modifier.fillMaxSize()) {
@@ -505,7 +513,11 @@
             }
         }
 
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            localInputModeManager!!.requestInputMode(InputMode.Keyboard)
+            focusRequester.requestFocus()
+        }
         rule.waitForIdle()
 
         assertAgainstGolden("outlinedCard_focused")
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/CheckboxScreenshotTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/CheckboxScreenshotTest.kt
index 3d6aa94..07f862f 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/CheckboxScreenshotTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/CheckboxScreenshotTest.kt
@@ -21,10 +21,13 @@
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.testutils.assertAgainstGolden
 import androidx.compose.ui.Alignment
+import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusRequester
-import androidx.compose.ui.focus.focusProperties
 import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.input.InputMode
+import androidx.compose.ui.input.InputModeManager
+import androidx.compose.ui.platform.LocalInputModeManager
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.state.ToggleableState
 import androidx.compose.ui.test.ExperimentalTestApi
@@ -241,14 +244,13 @@
     @Test
     fun checkBox_focus() {
         val focusRequester = FocusRequester()
+        var localInputModeManager: InputModeManager? = null
 
         rule.setMaterialContent(scheme.colorScheme) {
+            localInputModeManager = LocalInputModeManager.current
             Box(wrap.testTag(wrapperTestTag)) {
                 Checkbox(
                     modifier = wrap
-                        // Normally this is only focusable in non-touch mode, so let's force it to
-                        // always be focusable so we can test how it appears
-                        .focusProperties { canFocus = true }
                         .focusRequester(focusRequester),
                     checked = true,
                     onCheckedChange = { }
@@ -257,6 +259,8 @@
         }
 
         rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            localInputModeManager!!.requestInputMode(InputMode.Keyboard)
             focusRequester.requestFocus()
         }
 
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/DismissibleNavigationDrawerTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/DismissibleNavigationDrawerTest.kt
index 6ede817..2edb2e5 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/DismissibleNavigationDrawerTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/DismissibleNavigationDrawerTest.kt
@@ -20,6 +20,7 @@
 import androidx.compose.foundation.background
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.WindowInsets
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.material3.tokens.NavigationDrawerTokens
 import androidx.compose.runtime.CompositionLocalProvider
@@ -32,6 +33,7 @@
 import androidx.compose.ui.test.SemanticsMatcher
 import androidx.compose.ui.test.assert
 import androidx.compose.ui.test.assertLeftPositionInRootIsEqualTo
+import androidx.compose.ui.test.assertTopPositionInRootIsEqualTo
 import androidx.compose.ui.test.assertWidthIsEqualTo
 import androidx.compose.ui.test.click
 import androidx.compose.ui.test.junit4.createComposeRule
@@ -88,6 +90,30 @@
     }
 
     @Test
+    fun dismissibleNavigationDrawer_sheet_respectsContentPadding() {
+        rule.setMaterialContent(lightColorScheme()) {
+            val drawerState = rememberDrawerState(DrawerValue.Open)
+            DismissibleNavigationDrawer(
+                drawerState = drawerState,
+                drawerContent = {
+                    DismissibleDrawerSheet(windowInsets = WindowInsets(7.dp, 7.dp, 7.dp, 7.dp)) {
+                        Box(
+                            Modifier
+                                .fillMaxSize()
+                                .testTag("content")
+                        )
+                    }
+                },
+                content = {}
+            )
+        }
+
+        rule.onNodeWithTag("content")
+            .assertLeftPositionInRootIsEqualTo(7.dp)
+            .assertTopPositionInRootIsEqualTo(7.dp)
+    }
+
+    @Test
     fun dismissibleNavigationDrawer_testOffset_whenClosed() {
         rule.setMaterialContent(lightColorScheme()) {
             val drawerState = rememberDrawerState(DrawerValue.Closed)
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/DividerUiTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/DividerUiTest.kt
index 84d67c1..a11f610 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/DividerUiTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/DividerUiTest.kt
@@ -20,6 +20,7 @@
 import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.size
 import androidx.compose.testutils.assertPixels
 import androidx.compose.ui.Modifier
@@ -79,7 +80,7 @@
 
         rule
             .setMaterialContentForSizeAssertions {
-                Divider(startIndent = indent, thickness = height)
+                Divider(modifier = Modifier.padding(start = indent), thickness = height)
             }
             .assertHeightIsEqualTo(height)
             .assertWidthIsEqualTo(rule.rootWidth())
@@ -95,7 +96,7 @@
         rule.setContent {
             sizePx = with(LocalDensity.current) { size.toPx().roundToInt() }
             dividerColor =
-                MaterialTheme.colorScheme.surfaceVariant
+                MaterialTheme.colorScheme.outlineVariant
             Box(modifier = Modifier.size(size).background(Color.Black)) {
                 Divider(
                     modifier = Modifier.testTag(testTag).fillMaxWidth(),
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/FloatingActionButtonScreenshotTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/FloatingActionButtonScreenshotTest.kt
index 861e2439..dffaf04 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/FloatingActionButtonScreenshotTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/FloatingActionButtonScreenshotTest.kt
@@ -25,10 +25,13 @@
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.setValue
 import androidx.compose.testutils.assertAgainstGolden
+import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusRequester
-import androidx.compose.ui.focus.focusProperties
 import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.input.InputMode
+import androidx.compose.ui.input.InputModeManager
+import androidx.compose.ui.platform.LocalInputModeManager
 import androidx.compose.ui.test.ExperimentalTestApi
 import androidx.compose.ui.test.captureToImage
 import androidx.compose.ui.test.hasClickAction
@@ -282,15 +285,14 @@
     @Test
     fun focus() {
         val focusRequester = FocusRequester()
+        var localInputModeManager: InputModeManager? = null
 
         rule.setMaterialContent(lightColorScheme()) {
+            localInputModeManager = LocalInputModeManager.current
             Box(Modifier.requiredSize(100.dp, 100.dp).wrapContentSize()) {
                 FloatingActionButton(
                     onClick = { },
                     modifier = Modifier
-                        // Normally this is only focusable in non-touch mode, so let's force it to
-                        // always be focusable so we can test how it appears
-                        .focusProperties { canFocus = true }
                         .focusRequester(focusRequester)
                 ) {
                     Icon(Icons.Filled.Favorite, contentDescription = null)
@@ -299,6 +301,8 @@
         }
 
         rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            localInputModeManager!!.requestInputMode(InputMode.Keyboard)
             focusRequester.requestFocus()
         }
 
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/IconButtonScreenshotTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/IconButtonScreenshotTest.kt
index e84d266..34a9efc 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/IconButtonScreenshotTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/IconButtonScreenshotTest.kt
@@ -24,10 +24,13 @@
 import androidx.compose.material.icons.outlined.FavoriteBorder
 import androidx.compose.testutils.assertAgainstGolden
 import androidx.compose.ui.Alignment
+import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusRequester
-import androidx.compose.ui.focus.focusProperties
 import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.input.InputMode
+import androidx.compose.ui.input.InputModeManager
+import androidx.compose.ui.platform.LocalInputModeManager
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.ExperimentalTestApi
 import androidx.compose.ui.test.captureToImage
@@ -142,14 +145,13 @@
     @Test
     fun iconButton_lightTheme_focused() {
         val focusRequester = FocusRequester()
+        var localInputModeManager: InputModeManager? = null
 
         rule.setMaterialContent(lightColorScheme()) {
+            localInputModeManager = LocalInputModeManager.current
             Box(wrap.testTag(wrapperTestTag)) {
                 IconButton(onClick = { /* doSomething() */ },
                     modifier = Modifier
-                        // Normally this is only focusable in non-touch mode, so let's force it to
-                        // always be focusable so we can test how it appears
-                        .focusProperties { canFocus = true }
                         .focusRequester(focusRequester)
                 ) {
                     Icon(Icons.Filled.Favorite, contentDescription = "Localized description")
@@ -158,6 +160,8 @@
         }
 
         rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            localInputModeManager!!.requestInputMode(InputMode.Keyboard)
             focusRequester.requestFocus()
         }
 
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/MaterialComponentsInsetSupportTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/MaterialComponentsInsetSupportTest.kt
new file mode 100644
index 0000000..8f21ca2
--- /dev/null
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/MaterialComponentsInsetSupportTest.kt
@@ -0,0 +1,150 @@
+/*
+ * 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.compose.material3
+
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.WindowInsets
+import androidx.compose.foundation.layout.WindowInsetsSides
+import androidx.compose.foundation.layout.asPaddingValues
+import androidx.compose.foundation.layout.only
+import androidx.compose.foundation.layout.safeDrawing
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalLayoutDirection
+import androidx.compose.ui.test.junit4.createAndroidComposeRule
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import com.google.common.truth.Truth.assertThat
+import java.util.concurrent.TimeUnit
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@OptIn(ExperimentalMaterial3Api::class)
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class MaterialComponentsInsetSupportTest {
+    @get:Rule
+    val rule = createAndroidComposeRule<MaterialWindowInsetsActivity>()
+
+    @Before
+    fun setup() {
+        rule.activity.createdLatch.await(1, TimeUnit.SECONDS)
+    }
+
+    @Test
+    fun topAppBar_respectsInsetsDefault() {
+        var contentPadding: WindowInsets? = null
+        var expected: WindowInsets? = null
+        rule.setContent {
+            expected = WindowInsets.safeDrawing
+                .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top)
+            contentPadding = TopAppBarDefaults.windowInsets
+        }
+
+        rule.runOnIdle {
+            assertThat(contentPadding).isEqualTo(expected)
+        }
+    }
+
+    @Test
+    fun bottomAppBar_respectsInsetsDefault() {
+        var contentPadding: WindowInsets? = null
+        var expected: WindowInsets? = null
+        rule.setContent {
+            expected = WindowInsets.safeDrawing
+                .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom)
+            contentPadding = BottomAppBarDefaults.windowInsets
+        }
+
+        rule.runOnIdle {
+            // only checking bottom as bottom app bar has special optional padding on the sides
+            assertThat(contentPadding).isEqualTo(expected)
+        }
+    }
+
+    @Test
+    fun drawerSheets_respectsInsetsDefault() {
+        var contentPadding: WindowInsets? = null
+        var expected: WindowInsets? = null
+        rule.setContent {
+            expected = WindowInsets.safeDrawing
+                .only(WindowInsetsSides.Start + WindowInsetsSides.Vertical)
+            contentPadding = DrawerDefaults.windowInsets
+        }
+
+        rule.runOnIdle {
+            assertThat(contentPadding).isEqualTo(expected)
+        }
+    }
+
+    @Test
+    fun navigationBar_respectsInsetsDefault() {
+        var contentPadding: WindowInsets? = null
+        var expected: WindowInsets? = null
+        rule.setContent {
+            expected = WindowInsets.safeDrawing
+                .only(WindowInsetsSides.Bottom + WindowInsetsSides.Horizontal)
+            contentPadding = NavigationBarDefaults.windowInsets
+        }
+
+        rule.runOnIdle {
+            assertThat(contentPadding).isEqualTo(expected)
+        }
+    }
+
+    @Test
+    fun NavRail_respectsInsetsDefault() {
+        var contentPadding: WindowInsets? = null
+        var expected: WindowInsets? = null
+        rule.setContent {
+            expected = WindowInsets.safeDrawing
+                .only(WindowInsetsSides.Start + WindowInsetsSides.Vertical)
+            contentPadding = NavigationRailDefaults.windowInsets
+        }
+
+        rule.runOnIdle {
+            assertThat(contentPadding).isEqualTo(expected)
+        }
+    }
+
+    @Test
+    fun scaffold_providesInsets() {
+        var contentPadding: PaddingValues? = null
+        var expected: PaddingValues? = null
+        var layoutDirection: LayoutDirection? = null
+        rule.setContent {
+            layoutDirection = LocalLayoutDirection.current
+            expected = WindowInsets.safeDrawing
+                .asPaddingValues(LocalDensity.current)
+            Scaffold { paddingValues ->
+                contentPadding = paddingValues
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(contentPadding?.calculateBottomPadding())
+                .isEqualTo(expected?.calculateBottomPadding())
+            assertThat(contentPadding?.calculateTopPadding())
+                .isEqualTo(expected?.calculateTopPadding())
+            assertThat(contentPadding?.calculateLeftPadding(layoutDirection!!))
+                .isEqualTo(expected?.calculateLeftPadding(layoutDirection!!))
+            assertThat(contentPadding?.calculateRightPadding(layoutDirection!!))
+                .isEqualTo(expected?.calculateRightPadding(layoutDirection!!))
+        }
+    }
+}
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/MaterialWindowInsetsActivity.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/MaterialWindowInsetsActivity.kt
new file mode 100644
index 0000000..17d807c
--- /dev/null
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/MaterialWindowInsetsActivity.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.compose.material3
+
+import android.os.Bundle
+import androidx.activity.ComponentActivity
+import androidx.core.view.WindowCompat
+import java.util.concurrent.CountDownLatch
+
+class MaterialWindowInsetsActivity : ComponentActivity() {
+    val createdLatch = CountDownLatch(1)
+    val attachedToWindowLatch = CountDownLatch(1)
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        WindowCompat.setDecorFitsSystemWindows(window, false)
+        super.onCreate(savedInstanceState)
+        createdLatch.countDown()
+    }
+
+    override fun onAttachedToWindow() {
+        attachedToWindowLatch.countDown()
+        super.onAttachedToWindow()
+    }
+}
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/ModalNavigationDrawerTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/ModalNavigationDrawerTest.kt
index a637fd5..409120f 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/ModalNavigationDrawerTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/ModalNavigationDrawerTest.kt
@@ -20,6 +20,7 @@
 import androidx.compose.foundation.background
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.WindowInsets
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.material3.tokens.NavigationDrawerTokens
 import androidx.compose.runtime.CompositionLocalProvider
@@ -33,6 +34,7 @@
 import androidx.compose.ui.test.assert
 import androidx.compose.ui.test.assertHasClickAction
 import androidx.compose.ui.test.assertLeftPositionInRootIsEqualTo
+import androidx.compose.ui.test.assertTopPositionInRootIsEqualTo
 import androidx.compose.ui.test.assertWidthIsEqualTo
 import androidx.compose.ui.test.click
 import androidx.compose.ui.test.junit4.createComposeRule
@@ -141,6 +143,30 @@
     }
 
     @Test
+    fun navigationDrawer_sheet_respectsContentPadding() {
+        rule.setMaterialContent(lightColorScheme()) {
+            val drawerState = rememberDrawerState(DrawerValue.Open)
+            ModalNavigationDrawer(
+                drawerState = drawerState,
+                drawerContent = {
+                    ModalDrawerSheet(windowInsets = WindowInsets(10.dp, 10.dp, 10.dp, 10.dp)) {
+                        Box(
+                            Modifier
+                                .fillMaxSize()
+                                .testTag("content")
+                        )
+                    }
+                },
+                content = {}
+            )
+        }
+
+        rule.onNodeWithTag("content")
+            .assertTopPositionInRootIsEqualTo(10.dp)
+            .assertLeftPositionInRootIsEqualTo(10.dp)
+    }
+
+    @Test
     @SmallTest
     fun navigationDrawer_hasPaneTitle() {
         lateinit var navigationMenu: String
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationBarTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationBarTest.kt
index fef9536..7e29e92 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationBarTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationBarTest.kt
@@ -17,6 +17,8 @@
 package androidx.compose.material3
 
 import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.WindowInsets
+import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.Favorite
 import androidx.compose.material3.tokens.NavigationBarTokens
@@ -53,6 +55,7 @@
 import androidx.compose.ui.test.onNodeWithText
 import androidx.compose.ui.test.onParent
 import androidx.compose.ui.test.performClick
+import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.height
 import androidx.compose.ui.unit.width
 import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -198,6 +201,22 @@
     }
 
     @Test
+    fun navigationBar_respectContentPadding() {
+        rule.setMaterialContentForSizeAssertions {
+            NavigationBar(windowInsets = WindowInsets(17.dp, 17.dp, 17.dp, 17.dp)) {
+                Box(
+                    Modifier
+                        .fillMaxSize()
+                        .testTag("content")
+                )
+            }
+        }
+        rule.onNodeWithTag("content")
+            .assertLeftPositionInRootIsEqualTo(17.dp)
+            .assertTopPositionInRootIsEqualTo(17.dp)
+    }
+
+    @Test
     fun navigationBarItem_sizeAndPositions() {
         lateinit var parentCoords: LayoutCoordinates
         val itemCoords = mutableMapOf<Int, LayoutCoordinates>()
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationRailTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationRailTest.kt
index 8116075..21c5372 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationRailTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationRailTest.kt
@@ -17,6 +17,8 @@
 package androidx.compose.material3
 
 import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.WindowInsets
+import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.Favorite
 import androidx.compose.material.icons.filled.Home
@@ -55,6 +57,7 @@
 import androidx.compose.ui.test.onParent
 import androidx.compose.ui.test.performClick
 import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.height
 import androidx.compose.ui.unit.width
 import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -198,6 +201,21 @@
     }
 
     @Test
+    fun navigationRail_respectsContentPadding() {
+        rule.setMaterialContentForSizeAssertions {
+            NavigationRail(windowInsets = WindowInsets(13.dp, 13.dp, 13.dp, 13.dp)) {
+                Box(
+                    Modifier
+                        .fillMaxSize()
+                        .testTag("content"))
+            }
+        }
+        rule.onNodeWithTag("content")
+            .assertTopPositionInRootIsEqualTo(13.dp + NavigationRailVerticalPadding)
+            .assertLeftPositionInRootIsEqualTo(13.dp)
+    }
+
+    @Test
     fun navigationRailItem_sizeAndPositions() {
         val itemCoords = mutableMapOf<Int, LayoutCoordinates>()
         rule.setMaterialContent(lightColorScheme()) {
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/PermanentNavigationDrawerTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/PermanentNavigationDrawerTest.kt
index 4e90085..b183dd1 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/PermanentNavigationDrawerTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/PermanentNavigationDrawerTest.kt
@@ -17,6 +17,7 @@
 package androidx.compose.material3
 
 import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.WindowInsets
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.width
 import androidx.compose.material3.tokens.NavigationDrawerTokens
@@ -28,6 +29,7 @@
 import androidx.compose.ui.test.SemanticsMatcher
 import androidx.compose.ui.test.assert
 import androidx.compose.ui.test.assertLeftPositionInRootIsEqualTo
+import androidx.compose.ui.test.assertTopPositionInRootIsEqualTo
 import androidx.compose.ui.test.assertWidthIsEqualTo
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithTag
@@ -71,6 +73,28 @@
     }
 
     @Test
+    fun permanentNavigationDrawer_sheet_respectsContentPadding() {
+        rule.setMaterialContent(lightColorScheme()) {
+            PermanentNavigationDrawer(
+                drawerContent = {
+                    PermanentDrawerSheet(windowInsets = WindowInsets(13.dp, 13.dp, 13.dp, 13.dp)) {
+                        Box(
+                            Modifier
+                                .fillMaxSize()
+                                .testTag("content")
+                        )
+                    }
+                },
+                content = {}
+            )
+        }
+
+        rule.onNodeWithTag("content")
+            .assertLeftPositionInRootIsEqualTo(13.dp)
+            .assertTopPositionInRootIsEqualTo(13.dp)
+    }
+
+    @Test
     fun permanentNavigationDrawer_testOffset_rtl() {
         rule.setMaterialContent(lightColorScheme()) {
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/RadioButtonScreenshotTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/RadioButtonScreenshotTest.kt
index 06f365b..81f44e1 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/RadioButtonScreenshotTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/RadioButtonScreenshotTest.kt
@@ -23,10 +23,13 @@
 import androidx.compose.runtime.remember
 import androidx.compose.testutils.assertAgainstGolden
 import androidx.compose.ui.Alignment
+import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusRequester
-import androidx.compose.ui.focus.focusProperties
 import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.input.InputMode
+import androidx.compose.ui.input.InputModeManager
+import androidx.compose.ui.platform.LocalInputModeManager
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.ExperimentalTestApi
 import androidx.compose.ui.test.captureToImage
@@ -175,22 +178,23 @@
     @Test
     fun radioButton_lightTheme_focused() {
         val focusRequester = FocusRequester()
+        var localInputModeManager: InputModeManager? = null
 
         rule.setMaterialContent(lightColorScheme()) {
+            localInputModeManager = LocalInputModeManager.current
             Box(wrap.testTag(wrapperTestTag)) {
                 RadioButton(
                     selected = false,
                     onClick = {},
                     modifier = Modifier
-                        // Normally this is only focusable in non-touch mode, so let's force it to
-                        // always be focusable so we can test how it appears
-                        .focusProperties { canFocus = true }
                         .focusRequester(focusRequester)
                 )
             }
         }
 
         rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            localInputModeManager!!.requestInputMode(InputMode.Keyboard)
             focusRequester.requestFocus()
         }
 
@@ -200,22 +204,23 @@
     @Test
     fun radioButton_darkTheme_focused() {
         val focusRequester = FocusRequester()
+        var localInputModeManager: InputModeManager? = null
 
         rule.setMaterialContent(darkColorScheme()) {
+            localInputModeManager = LocalInputModeManager.current
             Box(wrap.testTag(wrapperTestTag)) {
                 RadioButton(
                     selected = false,
                     onClick = {},
                     modifier = Modifier
-                        // Normally this is only focusable in non-touch mode, so let's force it to
-                        // always be focusable so we can test how it appears
-                        .focusProperties { canFocus = true }
                         .focusRequester(focusRequester)
                 )
             }
         }
 
         rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            localInputModeManager!!.requestInputMode(InputMode.Keyboard)
             focusRequester.requestFocus()
         }
 
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/SliderTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/SliderTest.kt
index 93782c2..01bdce2 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/SliderTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/SliderTest.kt
@@ -399,7 +399,7 @@
                 expected = calculateFraction(left, right, centerX - 100 + slop)
             }
         rule.runOnIdle {
-            Truth.assertThat(state.value).isWithin(0.002f).of(expected)
+            Truth.assertThat(state.value).isWithin(0.003f).of(expected)
         }
     }
 
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/SwitchScreenshotTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/SwitchScreenshotTest.kt
index 3d80b1c..30162ba 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/SwitchScreenshotTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/SwitchScreenshotTest.kt
@@ -29,10 +29,13 @@
 import androidx.compose.runtime.remember
 import androidx.compose.testutils.assertAgainstGolden
 import androidx.compose.ui.Alignment
+import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusRequester
-import androidx.compose.ui.focus.focusProperties
 import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.input.InputMode
+import androidx.compose.ui.input.InputModeManager
+import androidx.compose.ui.platform.LocalInputModeManager
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.testTag
@@ -248,21 +251,23 @@
     @Test
     fun switchTest_focus() {
         val focusRequester = FocusRequester()
+        var localInputModeManager: InputModeManager? = null
+
         rule.setMaterialContent(lightColorScheme()) {
+            localInputModeManager = LocalInputModeManager.current
             Box(wrapperModifier) {
                 Switch(
                     checked = true,
                     onCheckedChange = { },
                     modifier = Modifier
-                        // Normally this is only focusable in non-touch mode, so let's force it to
-                        // always be focusable so we can test how it appears
-                        .focusProperties { canFocus = true }
                         .focusRequester(focusRequester)
                 )
             }
         }
 
         rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            localInputModeManager!!.requestInputMode(InputMode.Keyboard)
             focusRequester.requestFocus()
         }
 
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/AndroidAlertDialog.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/AndroidAlertDialog.android.kt
index abe3066..829511a 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/AndroidAlertDialog.android.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/AndroidAlertDialog.android.kt
@@ -21,6 +21,8 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.semantics.paneTitle
+import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.window.Dialog
@@ -89,6 +91,7 @@
         onDismissRequest = onDismissRequest,
         properties = properties
     ) {
+        val dialogPaneDescription = getString(Strings.Dialog)
         AlertDialogContent(
             buttons = {
                 AlertDialogFlowRow(
@@ -99,7 +102,9 @@
                     confirmButton()
                 }
             },
-            modifier = modifier,
+            modifier = modifier.then(Modifier
+                .semantics { paneTitle = dialogPaneDescription }
+            ),
             icon = icon,
             title = title,
             text = text,
@@ -132,7 +137,7 @@
     val iconContentColor: Color @Composable get() = DialogTokens.IconColor.toColor()
 
     /** The default title color for alert dialogs */
-    val titleContentColor: Color @Composable get() = DialogTokens.SubheadColor.toColor()
+    val titleContentColor: Color @Composable get() = DialogTokens.HeadlineColor.toColor()
 
     /** The default text color for alert dialogs */
     val textContentColor: Color @Composable get() = DialogTokens.SupportingTextColor.toColor()
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/SafeDrawingInsets.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/SafeDrawingInsets.android.kt
new file mode 100644
index 0000000..2b232b0
--- /dev/null
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/SafeDrawingInsets.android.kt
@@ -0,0 +1,25 @@
+/*
+ * 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.WindowInsets
+import androidx.compose.foundation.layout.safeDrawing
+import androidx.compose.runtime.Composable
+
+internal actual val WindowInsets.Companion.safeDrawingForVisualComponents: WindowInsets
+    @Composable
+    get() = safeDrawing
\ No newline at end of file
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 1fbe30c..a88443e 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
@@ -33,6 +33,7 @@
         Strings.ExposedDropdownMenu -> resources.getString(R.string.dropdown_menu)
         Strings.SliderRangeStart -> resources.getString(R.string.range_start)
         Strings.SliderRangeEnd -> resources.getString(R.string.range_end)
+        Strings.Dialog -> resources.getString(androidx.compose.material3.R.string.dialog)
         else -> ""
     }
 }
\ No newline at end of file
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/ExposedDropdownMenuPopup.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/ExposedDropdownMenuPopup.kt
index 2c2d28c..f05f2bf 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/ExposedDropdownMenuPopup.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/ExposedDropdownMenuPopup.kt
@@ -235,7 +235,9 @@
     // Track parent bounds and content size; only show popup once we have both
     val canCalculatePosition by derivedStateOf { parentBounds != null && popupContentSize != null }
 
-    private val maxSupportedElevation = 30.dp
+    // On systems older than Android S, there is a bug in the surface insets matrix math used by
+    // elevation, so high values of maxSupportedElevation break accessibility services: b/232788477.
+    private val maxSupportedElevation = 8.dp
 
     // The window visible frame used for the last popup position calculation.
     private val previousWindowVisibleFrame = Rect()
diff --git a/compose/material3/material3/src/androidMain/res/values/strings.xml b/compose/material3/material3/src/androidMain/res/values/strings.xml
new file mode 100644
index 0000000..5938eaa
--- /dev/null
+++ b/compose/material3/material3/src/androidMain/res/values/strings.xml
@@ -0,0 +1,21 @@
+<?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:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Spoken description of a dialog -->
+    <string name="dialog">"Dialog"</string>
+</resources>
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AlertDialog.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AlertDialog.kt
index c1f3cba..093dc3a 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AlertDialog.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AlertDialog.kt
@@ -74,7 +74,7 @@
             }
             title?.let {
                 CompositionLocalProvider(LocalContentColor provides titleContentColor) {
-                    val textStyle = MaterialTheme.typography.fromToken(DialogTokens.SubheadFont)
+                    val textStyle = MaterialTheme.typography.fromToken(DialogTokens.HeadlineFont)
                     ProvideTextStyle(textStyle) {
                         Box(
                             // Align the title to the center when an icon is present.
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt
index dff4547..f5c170d 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt
@@ -20,14 +20,14 @@
 import androidx.compose.animation.core.AnimationState
 import androidx.compose.animation.core.DecayAnimationSpec
 import androidx.compose.animation.core.FastOutLinearInEasing
-import androidx.compose.animation.core.LinearOutSlowInEasing
+import androidx.compose.animation.core.Spring
 import androidx.compose.animation.core.animateDecay
 import androidx.compose.animation.core.animateTo
-import androidx.compose.animation.core.tween
+import androidx.compose.animation.core.spring
+import androidx.compose.animation.rememberSplineBasedDecay
 import androidx.compose.foundation.gestures.Orientation
 import androidx.compose.foundation.gestures.draggable
 import androidx.compose.foundation.gestures.rememberDraggableState
-import androidx.compose.foundation.interaction.InteractionSource
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
@@ -35,10 +35,14 @@
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.RowScope
 import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.WindowInsets
+import androidx.compose.foundation.layout.WindowInsetsSides
 import androidx.compose.foundation.layout.fillMaxHeight
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.only
 import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.windowInsetsPadding
 import androidx.compose.material3.tokens.BottomAppBarTokens
 import androidx.compose.material3.tokens.FabSecondaryTokens
 import androidx.compose.material3.tokens.TopAppBarLargeTokens
@@ -49,10 +53,8 @@
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.SideEffect
 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.rememberUpdatedState
 import androidx.compose.runtime.saveable.Saver
 import androidx.compose.runtime.saveable.listSaver
@@ -103,6 +105,7 @@
  * typically be an [IconButton] or [IconToggleButton].
  * @param actions the actions displayed at the end of the top app bar. This should typically be
  * [IconButton]s. The default layout here is a [Row], so icons inside will be placed horizontally.
+ * @param windowInsets a window insets that app bar will respect.
  * @param colors [TopAppBarColors] that will be used to resolve the colors used for this top app
  * bar in different states. See [TopAppBarDefaults.smallTopAppBarColors].
  * @param scrollBehavior a [TopAppBarScrollBehavior] which holds various offset values that will be
@@ -117,6 +120,7 @@
     modifier: Modifier = Modifier,
     navigationIcon: @Composable () -> Unit = {},
     actions: @Composable RowScope.() -> Unit = {},
+    windowInsets: WindowInsets = TopAppBarDefaults.windowInsets,
     colors: TopAppBarColors = TopAppBarDefaults.smallTopAppBarColors(),
     scrollBehavior: TopAppBarScrollBehavior? = null
 ) {
@@ -127,6 +131,7 @@
         centeredTitle = false,
         navigationIcon = navigationIcon,
         actions = actions,
+        windowInsets = windowInsets,
         colors = colors,
         scrollBehavior = scrollBehavior
     )
@@ -153,6 +158,7 @@
  * typically be an [IconButton] or [IconToggleButton].
  * @param actions the actions displayed at the end of the top app bar. This should typically be
  * [IconButton]s. The default layout here is a [Row], so icons inside will be placed horizontally.
+ * @param windowInsets a window insets that app bar will respect.
  * @param colors [TopAppBarColors] that will be used to resolve the colors used for this top app
  * bar in different states. See [TopAppBarDefaults.centerAlignedTopAppBarColors].
  * @param scrollBehavior a [TopAppBarScrollBehavior] which holds various offset values that will be
@@ -167,6 +173,7 @@
     modifier: Modifier = Modifier,
     navigationIcon: @Composable () -> Unit = {},
     actions: @Composable RowScope.() -> Unit = {},
+    windowInsets: WindowInsets = TopAppBarDefaults.windowInsets,
     colors: TopAppBarColors = TopAppBarDefaults.centerAlignedTopAppBarColors(),
     scrollBehavior: TopAppBarScrollBehavior? = null
 ) {
@@ -179,6 +186,7 @@
         navigationIcon = navigationIcon,
         actions = actions,
         colors = colors,
+        windowInsets = windowInsets,
         scrollBehavior = scrollBehavior
     )
 }
@@ -205,6 +213,7 @@
  * typically be an [IconButton] or [IconToggleButton].
  * @param actions the actions displayed at the end of the top app bar. This should typically be
  * [IconButton]s. The default layout here is a [Row], so icons inside will be placed horizontally.
+ * @param windowInsets a window insets that app bar will respect.
  * @param colors [TopAppBarColors] that will be used to resolve the colors used for this top app
  * bar in different states. See [TopAppBarDefaults.mediumTopAppBarColors].
  * @param scrollBehavior a [TopAppBarScrollBehavior] which holds various offset values that will be
@@ -219,6 +228,7 @@
     modifier: Modifier = Modifier,
     navigationIcon: @Composable () -> Unit = {},
     actions: @Composable RowScope.() -> Unit = {},
+    windowInsets: WindowInsets = TopAppBarDefaults.windowInsets,
     colors: TopAppBarColors = TopAppBarDefaults.mediumTopAppBarColors(),
     scrollBehavior: TopAppBarScrollBehavior? = null
 ) {
@@ -232,6 +242,7 @@
         navigationIcon = navigationIcon,
         actions = actions,
         colors = colors,
+        windowInsets = windowInsets,
         maxHeight = TopAppBarMediumTokens.ContainerHeight,
         pinnedHeight = TopAppBarSmallTokens.ContainerHeight,
         scrollBehavior = scrollBehavior
@@ -260,6 +271,7 @@
  * typically be an [IconButton] or [IconToggleButton].
  * @param actions the actions displayed at the end of the top app bar. This should typically be
  * [IconButton]s. The default layout here is a [Row], so icons inside will be placed horizontally.
+ * @param windowInsets a window insets that app bar will respect.
  * @param colors [TopAppBarColors] that will be used to resolve the colors used for this top app
  * bar in different states. See [TopAppBarDefaults.largeTopAppBarColors].
  * @param scrollBehavior a [TopAppBarScrollBehavior] which holds various offset values that will be
@@ -274,6 +286,7 @@
     modifier: Modifier = Modifier,
     navigationIcon: @Composable () -> Unit = {},
     actions: @Composable RowScope.() -> Unit = {},
+    windowInsets: WindowInsets = TopAppBarDefaults.windowInsets,
     colors: TopAppBarColors = TopAppBarDefaults.largeTopAppBarColors(),
     scrollBehavior: TopAppBarScrollBehavior? = null
 ) {
@@ -287,6 +300,7 @@
         navigationIcon = navigationIcon,
         actions = actions,
         colors = colors,
+        windowInsets = windowInsets,
         maxHeight = TopAppBarLargeTokens.ContainerHeight,
         pinnedHeight = TopAppBarSmallTokens.ContainerHeight,
         scrollBehavior = scrollBehavior
@@ -321,6 +335,7 @@
  * overlay is applied on top of the container. A higher tonal elevation value will result in a
  * darker color in light theme and lighter color in dark theme. See also: [Surface].
  * @param contentPadding the padding applied to the content of this BottomAppBar
+ * @param windowInsets a window insets that app bar will respect.
  */
 @Composable
 fun BottomAppBar(
@@ -331,11 +346,13 @@
     contentColor: Color = contentColorFor(containerColor),
     tonalElevation: Dp = BottomAppBarDefaults.ContainerElevation,
     contentPadding: PaddingValues = BottomAppBarDefaults.ContentPadding,
+    windowInsets: WindowInsets = BottomAppBarDefaults.windowInsets,
 ) = BottomAppBar(
     modifier = modifier,
     containerColor = containerColor,
     contentColor = contentColor,
     tonalElevation = tonalElevation,
+    windowInsets = windowInsets,
     contentPadding = contentPadding
 ) {
     actions()
@@ -376,6 +393,7 @@
  * overlay is applied on top of the container. A higher tonal elevation value will result in a
  * darker color in light theme and lighter color in dark theme. See also: [Surface].
  * @param contentPadding the padding applied to the content of this BottomAppBar
+ * @param windowInsets a window insets that app bar will respect.
  * @param content the content of this BottomAppBar. The default layout here is a [Row],
  * so content inside will be placed horizontally.
  */
@@ -386,6 +404,7 @@
     contentColor: Color = contentColorFor(containerColor),
     tonalElevation: Dp = BottomAppBarDefaults.ContainerElevation,
     contentPadding: PaddingValues = BottomAppBarDefaults.ContentPadding,
+    windowInsets: WindowInsets = BottomAppBarDefaults.windowInsets,
     content: @Composable RowScope.() -> Unit
 ) {
     Surface(
@@ -399,6 +418,7 @@
         Row(
             Modifier
                 .fillMaxWidth()
+                .windowInsetsPadding(windowInsets)
                 .height(BottomAppBarTokens.ContainerHeight)
                 .padding(contentPadding),
             horizontalArrangement = Arrangement.Start,
@@ -441,68 +461,8 @@
     val nestedScrollConnection: NestedScrollConnection
 }
 
-/**
- * Represents the colors used by a top app bar in different states.
- *
- * Each app bar has their own default implementation available in [TopAppBarDefaults], such as
- * [TopAppBarDefaults.smallTopAppBarColors] for [SmallTopAppBar].
- */
-@Stable
-interface TopAppBarColors {
-    /**
-     * Represents the container color used for the top app bar.
-     *
-     * A [colorTransitionFraction] provides a percentage value that can be used to generate a color.
-     * Usually, an app bar implementation will pass in a [colorTransitionFraction] read from
-     * the [TopAppBarState.collapsedFraction] or the [TopAppBarState.overlappedFraction].
-     *
-     * @param colorTransitionFraction a `0.0` to `1.0` value that represents a color transition
-     * percentage
-     */
-    @Composable
-    fun containerColor(colorTransitionFraction: Float): State<Color>
-
-    /**
-     * Represents the content color used for the top app bar's navigation icon.
-     *
-     * A [colorTransitionFraction] provides a percentage value that can be used to generate a color.
-     * Usually, an app bar implementation will pass in a [colorTransitionFraction] read from
-     * the [TopAppBarState.collapsedFraction] or the [TopAppBarState.overlappedFraction].
-     *
-     * @param colorTransitionFraction a `0.0` to `1.0` value that represents a color transition
-     * percentage
-     */
-    @Composable
-    fun navigationIconContentColor(colorTransitionFraction: Float): State<Color>
-
-    /**
-     * Represents the content color used for the top app bar's title.
-     *
-     * A [colorTransitionFraction] provides a percentage value that can be used to generate a color.
-     * Usually, an app bar implementation will pass in a [colorTransitionFraction] read from
-     * the [TopAppBarState.collapsedFraction] or the [TopAppBarState.overlappedFraction].
-     *
-     * @param colorTransitionFraction a `0.0` to `1.0` value that represents a color transition
-     * percentage
-     */
-    @Composable
-    fun titleContentColor(colorTransitionFraction: Float): State<Color>
-
-    /**
-     * Represents the content color used for the top app bar's action icons.
-     *
-     * A [colorTransitionFraction] provides a percentage value that can be used to generate a color.
-     * Usually, an app bar implementation will pass in a [colorTransitionFraction] read from
-     * the [TopAppBarState.collapsedFraction] or the [TopAppBarState.overlappedFraction].
-     *
-     * @param colorTransitionFraction a `0.0` to `1.0` value that represents a color transition
-     * percentage
-     */
-    @Composable
-    fun actionIconContentColor(colorTransitionFraction: Float): State<Color>
-}
-
 /** Contains default values used for the top app bar implementations. */
+@ExperimentalMaterial3Api
 object TopAppBarDefaults {
 
     /**
@@ -526,23 +486,22 @@
         navigationIconContentColor: Color = TopAppBarSmallTokens.LeadingIconColor.toColor(),
         titleContentColor: Color = TopAppBarSmallTokens.HeadlineColor.toColor(),
         actionIconContentColor: Color = TopAppBarSmallTokens.TrailingIconColor.toColor(),
-    ): TopAppBarColors {
-        return remember(
+    ): TopAppBarColors =
+        TopAppBarColors(
             containerColor,
             scrolledContainerColor,
             navigationIconContentColor,
             titleContentColor,
             actionIconContentColor
-        ) {
-            AnimatingTopAppBarColors(
-                containerColor,
-                scrolledContainerColor,
-                navigationIconContentColor,
-                titleContentColor,
-                actionIconContentColor
-            )
-        }
-    }
+        )
+
+    /**
+     * Default insets to be used and consumed by the top app bars
+     */
+    val windowInsets: WindowInsets
+        @Composable
+        get() = WindowInsets.safeDrawingForVisualComponents
+            .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top)
 
     /**
      * Creates a [TopAppBarColors] for center aligned top app bars. The default implementation
@@ -565,23 +524,14 @@
         navigationIconContentColor: Color = TopAppBarSmallCenteredTokens.LeadingIconColor.toColor(),
         titleContentColor: Color = TopAppBarSmallCenteredTokens.HeadlineColor.toColor(),
         actionIconContentColor: Color = TopAppBarSmallCenteredTokens.TrailingIconColor.toColor(),
-    ): TopAppBarColors {
-        return remember(
+    ): TopAppBarColors =
+        TopAppBarColors(
             containerColor,
             scrolledContainerColor,
             navigationIconContentColor,
             titleContentColor,
             actionIconContentColor
-        ) {
-            AnimatingTopAppBarColors(
-                containerColor,
-                scrolledContainerColor,
-                navigationIconContentColor,
-                titleContentColor,
-                actionIconContentColor
-            )
-        }
-    }
+        )
 
     /**
      * Creates a [TopAppBarColors] for medium top app bars. The default implementation interpolates
@@ -605,23 +555,14 @@
         navigationIconContentColor: Color = TopAppBarMediumTokens.LeadingIconColor.toColor(),
         titleContentColor: Color = TopAppBarMediumTokens.HeadlineColor.toColor(),
         actionIconContentColor: Color = TopAppBarMediumTokens.TrailingIconColor.toColor(),
-    ): TopAppBarColors {
-        return remember(
+    ): TopAppBarColors =
+        TopAppBarColors(
             containerColor,
             scrolledContainerColor,
             navigationIconContentColor,
             titleContentColor,
             actionIconContentColor
-        ) {
-            InterpolatingTopAppBarColors(
-                containerColor,
-                scrolledContainerColor,
-                navigationIconContentColor,
-                titleContentColor,
-                actionIconContentColor
-            )
-        }
-    }
+        )
 
     /**
      * Creates a [TopAppBarColors] for large top app bars. The default implementation interpolates
@@ -645,39 +586,30 @@
         navigationIconContentColor: Color = TopAppBarLargeTokens.LeadingIconColor.toColor(),
         titleContentColor: Color = TopAppBarLargeTokens.HeadlineColor.toColor(),
         actionIconContentColor: Color = TopAppBarLargeTokens.TrailingIconColor.toColor(),
-    ): TopAppBarColors {
-        return remember(
+    ): TopAppBarColors =
+        TopAppBarColors(
             containerColor,
             scrolledContainerColor,
             navigationIconContentColor,
             titleContentColor,
             actionIconContentColor
-        ) {
-            InterpolatingTopAppBarColors(
-                containerColor,
-                scrolledContainerColor,
-                navigationIconContentColor,
-                titleContentColor,
-                actionIconContentColor
-            )
-        }
-    }
+        )
 
     /**
      * Returns a pinned [TopAppBarScrollBehavior] that tracks nested-scroll callbacks and
      * updates its [TopAppBarState.contentOffset] accordingly.
      *
      * @param state the state object to be used to control or observe the top app bar's scroll
-     * state. See also [rememberTopAppBarState] to create a state that is remembered across
-     * compositions.
+     * state. See [rememberTopAppBarState] for a state that is remembered across compositions.
      * @param canScroll a callback used to determine whether scroll events are to be handled by this
      * pinned [TopAppBarScrollBehavior]
      */
     @ExperimentalMaterial3Api
+    @Composable
     fun pinnedScrollBehavior(
-        state: TopAppBarState,
+        state: TopAppBarState = rememberTopAppBarState(),
         canScroll: () -> Boolean = { true }
-    ): TopAppBarScrollBehavior = PinnedScrollBehavior(state, canScroll)
+    ): TopAppBarScrollBehavior = PinnedScrollBehavior(state = state, canScroll = canScroll)
 
     /**
      * Returns a [TopAppBarScrollBehavior]. A top app bar that is set up with this
@@ -685,16 +617,21 @@
      * immediately appear when the content is pulled down.
      *
      * @param state the state object to be used to control or observe the top app bar's scroll
-     * state. See also [rememberTopAppBarState] to create a state that is remembered across
-     * compositions.
+     * state. See [rememberTopAppBarState] for a state that is remembered across compositions.
      * @param canScroll a callback used to determine whether scroll events are to be
      * handled by this [EnterAlwaysScrollBehavior]
      */
     @ExperimentalMaterial3Api
+    @Composable
     fun enterAlwaysScrollBehavior(
-        state: TopAppBarState,
+        state: TopAppBarState = rememberTopAppBarState(),
         canScroll: () -> Boolean = { true }
-    ): TopAppBarScrollBehavior = EnterAlwaysScrollBehavior(state, canScroll)
+    ): TopAppBarScrollBehavior =
+        EnterAlwaysScrollBehavior(
+            state = state,
+            flingAnimationSpec = rememberSplineBasedDecay(),
+            canScroll = canScroll
+        )
 
     /**
      * Returns a [TopAppBarScrollBehavior] that adjusts its properties to affect the colors and
@@ -704,26 +641,21 @@
      * when the nested content is pulled up, and will expand back the collapsed area when the
      * content is  pulled all the way down.
      *
-     * @param decayAnimationSpec a [DecayAnimationSpec] that will be used by the top app bar motion
-     * when the user flings the content. Preferably, this should match the animation spec used by
-     * the scrollable content. See also [androidx.compose.animation.rememberSplineBasedDecay] for a
-     * default [DecayAnimationSpec] that can be used with this behavior.
      * @param state the state object to be used to control or observe the top app bar's scroll
-     * state. See also [rememberTopAppBarState] to create a state that is remembered across
-     * compositions.
+     * state. See [rememberTopAppBarState] for a state that is remembered across compositions.
      * @param canScroll a callback used to determine whether scroll events are to be
      * handled by this [ExitUntilCollapsedScrollBehavior]
      */
     @ExperimentalMaterial3Api
+    @Composable
     fun exitUntilCollapsedScrollBehavior(
-        decayAnimationSpec: DecayAnimationSpec<Float>,
-        state: TopAppBarState,
+        state: TopAppBarState = rememberTopAppBarState(),
         canScroll: () -> Boolean = { true }
     ): TopAppBarScrollBehavior =
         ExitUntilCollapsedScrollBehavior(
-            state,
-            decayAnimationSpec,
-            canScroll
+            state = state,
+            flingAnimationSpec = rememberSplineBasedDecay(),
+            canScroll = canScroll
         )
 }
 
@@ -855,6 +787,64 @@
     private var _heightOffset = mutableStateOf(initialHeightOffset)
 }
 
+/**
+ * Represents the colors used by a top app bar in different states.
+ * This implementation animates the container color according to the top app bar scroll state. It
+ * does not animate the leading, headline, or trailing colors.
+ */
+@ExperimentalMaterial3Api
+@Stable
+class TopAppBarColors internal constructor(
+    private val containerColor: Color,
+    private val scrolledContainerColor: Color,
+    internal val navigationIconContentColor: Color,
+    internal val titleContentColor: Color,
+    internal val actionIconContentColor: Color,
+) {
+
+    /**
+     * Represents the container color used for the top app bar.
+     *
+     * A [colorTransitionFraction] provides a percentage value that can be used to generate a color.
+     * Usually, an app bar implementation will pass in a [colorTransitionFraction] read from
+     * the [TopAppBarState.collapsedFraction] or the [TopAppBarState.overlappedFraction].
+     *
+     * @param colorTransitionFraction a `0.0` to `1.0` value that represents a color transition
+     * percentage
+     */
+    @Composable
+    internal fun containerColor(colorTransitionFraction: Float): Color {
+        return lerp(
+            containerColor,
+            scrolledContainerColor,
+            FastOutLinearInEasing.transform(colorTransitionFraction)
+        )
+    }
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other == null || other !is TopAppBarColors) return false
+
+        if (containerColor != other.containerColor) return false
+        if (scrolledContainerColor != other.scrolledContainerColor) return false
+        if (navigationIconContentColor != other.navigationIconContentColor) return false
+        if (titleContentColor != other.titleContentColor) return false
+        if (actionIconContentColor != other.actionIconContentColor) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = containerColor.hashCode()
+        result = 31 * result + scrolledContainerColor.hashCode()
+        result = 31 * result + navigationIconContentColor.hashCode()
+        result = 31 * result + titleContentColor.hashCode()
+        result = 31 * result + actionIconContentColor.hashCode()
+
+        return result
+    }
+}
+
 /** Contains default values used for the bottom app bar implementations. */
 object BottomAppBarDefaults {
 
@@ -874,20 +864,15 @@
         end = BottomAppBarHorizontalPadding
     )
 
-    // Bottom App Bar FAB Defaults
     /**
-     * Creates a [FloatingActionButtonElevation] that represents the default elevation of a
-     * [FloatingActionButton] used for [BottomAppBar] in different states.
+     * Default insets that will be used and consumed by [BottomAppBar].
      */
-    object BottomAppBarFabElevation : FloatingActionButtonElevation {
-        private val elevation = mutableStateOf(0.dp)
-
+    val windowInsets: WindowInsets
         @Composable
-        override fun shadowElevation(interactionSource: InteractionSource) = elevation
-
-        @Composable
-        override fun tonalElevation(interactionSource: InteractionSource) = elevation
-    }
+        get() {
+            return WindowInsets.safeDrawingForVisualComponents
+                .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom)
+        }
 
     /** The color of a [BottomAppBar]'s [FloatingActionButton] */
     val bottomAppBarFabColor: Color
@@ -897,9 +882,7 @@
 
 // Padding minus IconButton's min touch target expansion
 private val BottomAppBarHorizontalPadding = 16.dp - 12.dp
-
-// Padding minus IconButton's min touch target expansion
-private val BottomAppBarVerticalPadding = 16.dp - 12.dp
+internal val BottomAppBarVerticalPadding = 16.dp - 12.dp
 
 // Padding minus content padding
 private val FABHorizontalPadding = 16.dp - BottomAppBarHorizontalPadding
@@ -922,6 +905,7 @@
     centeredTitle: Boolean,
     navigationIcon: @Composable () -> Unit,
     actions: @Composable RowScope.() -> Unit,
+    windowInsets: WindowInsets,
     colors: TopAppBarColors,
     scrollBehavior: TopAppBarScrollBehavior?
 ) {
@@ -940,7 +924,11 @@
     // This may potentially animate or interpolate a transition between the container-color and the
     // container's scrolled-color according to the app bar's scroll state.
     val colorTransitionFraction = scrollBehavior?.state?.overlappedFraction ?: 0f
-    val appBarContainerColor by colors.containerColor(colorTransitionFraction)
+    val fraction = if (colorTransitionFraction > 0.01f) 1f else 0f
+    val appBarContainerColor by animateColorAsState(
+        targetValue = colors.containerColor(fraction),
+        animationSpec = spring(stiffness = Spring.StiffnessMediumLow)
+    )
 
     // Wrap the given actions in a Row.
     val actionsRow = @Composable {
@@ -952,14 +940,17 @@
     }
 
     // Set up support for resizing the top app bar when vertically dragging the bar itself.
-    val appBarDragModifier = Modifier.draggable(
-        orientation = Orientation.Vertical,
-        state = rememberDraggableState { delta ->
-            if (scrollBehavior != null && !scrollBehavior.isPinned) {
+    val appBarDragModifier = if (scrollBehavior != null && !scrollBehavior.isPinned) {
+        Modifier.draggable(
+            orientation = Orientation.Vertical,
+            state = rememberDraggableState { delta ->
                 scrollBehavior.state.heightOffset = scrollBehavior.state.heightOffset + delta
-            }
-        }
-    )
+            },
+            onDragStopped = { snapTopAppBar(scrollBehavior.state) }
+        )
+    } else {
+        Modifier
+    }
 
     // Compose a Surface with a TopAppBarLayout content.
     // The surface's background color is animated as specified above.
@@ -971,12 +962,14 @@
                 ?: 0f)
         }
         TopAppBarLayout(
-            modifier = Modifier,
+            modifier = Modifier
+                .windowInsetsPadding(windowInsets)
+                // clip after padding so we don't know the title over the inset area
+                .clipToBounds(),
             heightPx = height,
-            navigationIconContentColor =
-            colors.navigationIconContentColor(colorTransitionFraction).value,
-            titleContentColor = colors.titleContentColor(colorTransitionFraction).value,
-            actionIconContentColor = colors.actionIconContentColor(colorTransitionFraction).value,
+            navigationIconContentColor = colors.navigationIconContentColor,
+            titleContentColor = colors.titleContentColor,
+            actionIconContentColor = colors.actionIconContentColor,
             title = title,
             titleTextStyle = titleTextStyle,
             titleAlpha = 1f,
@@ -1009,6 +1002,7 @@
     smallTitleTextStyle: TextStyle,
     navigationIcon: @Composable () -> Unit,
     actions: @Composable RowScope.() -> Unit,
+    windowInsets: WindowInsets,
     colors: TopAppBarColors,
     maxHeight: Dp,
     pinnedHeight: Dp,
@@ -1042,7 +1036,7 @@
     // This will potentially animate or interpolate a transition between the container color and the
     // container's scrolled color according to the app bar's scroll state.
     val colorTransitionFraction = scrollBehavior?.state?.collapsedFraction ?: 0f
-    val appBarContainerColor by colors.containerColor(colorTransitionFraction)
+    val appBarContainerColor by rememberUpdatedState(colors.containerColor(colorTransitionFraction))
 
     // Wrap the given actions in a Row.
     val actionsRow = @Composable {
@@ -1059,25 +1053,33 @@
     val hideBottomRowSemantics = !hideTopRowSemantics
 
     // Set up support for resizing the top app bar when vertically dragging the bar itself.
-    val appBarDragModifier = Modifier.draggable(
-        orientation = Orientation.Vertical,
-        state = rememberDraggableState { delta ->
-            if (scrollBehavior != null && !scrollBehavior.isPinned) {
+    val appBarDragModifier = if (scrollBehavior != null && !scrollBehavior.isPinned) {
+        Modifier.draggable(
+            orientation = Orientation.Vertical,
+            state = rememberDraggableState { delta ->
                 scrollBehavior.state.heightOffset = scrollBehavior.state.heightOffset + delta
-            }
-        }
-    )
+            },
+            onDragStopped = { snapTopAppBar(scrollBehavior.state) }
+        )
+    } else {
+        Modifier
+    }
 
     Surface(modifier = modifier.then(appBarDragModifier), color = appBarContainerColor) {
-        Column {
+        Column(
+            Modifier
+                .windowInsetsPadding(windowInsets)
+                // clip after padding so we don't know the title over the inset area
+                .clipToBounds()
+        ) {
             TopAppBarLayout(
                 modifier = Modifier,
                 heightPx = pinnedHeightPx,
                 navigationIconContentColor =
-                colors.navigationIconContentColor(colorTransitionFraction).value,
-                titleContentColor = colors.titleContentColor(colorTransitionFraction).value,
+                colors.navigationIconContentColor,
+                titleContentColor = colors.titleContentColor,
                 actionIconContentColor =
-                colors.actionIconContentColor(colorTransitionFraction).value,
+                colors.actionIconContentColor,
                 title = smallTitle,
                 titleTextStyle = smallTitleTextStyle,
                 titleAlpha = 1f - titleAlpha,
@@ -1093,10 +1095,10 @@
                 heightPx = maxHeightPx - pinnedHeightPx + (scrollBehavior?.state?.heightOffset
                     ?: 0f),
                 navigationIconContentColor =
-                colors.navigationIconContentColor(colorTransitionFraction).value,
-                titleContentColor = colors.titleContentColor(colorTransitionFraction).value,
+                colors.navigationIconContentColor,
+                titleContentColor = colors.titleContentColor,
                 actionIconContentColor =
-                colors.actionIconContentColor(colorTransitionFraction).value,
+                colors.actionIconContentColor,
                 title = title,
                 titleTextStyle = titleTextStyle,
                 titleAlpha = titleAlpha,
@@ -1262,102 +1264,10 @@
 }
 
 /**
- * A [TopAppBarColors] implementation that animates the container color according to the top app
- * bar scroll state.
- *
- * This default implementation does not animate the leading, headline, or trailing colors.
- */
-@Stable
-private class AnimatingTopAppBarColors(
-    private val containerColor: Color,
-    private val scrolledContainerColor: Color,
-    navigationIconContentColor: Color,
-    titleContentColor: Color,
-    actionIconContentColor: Color
-) : TopAppBarColors {
-
-    // In this TopAppBarColors implementation, the following colors never change their value as the
-    // app bar collapses.
-    private val navigationIconColorState: State<Color> = mutableStateOf(navigationIconContentColor)
-    private val titleColorState: State<Color> = mutableStateOf(titleContentColor)
-    private val actionIconColorState: State<Color> = mutableStateOf(actionIconContentColor)
-
-    @Composable
-    override fun containerColor(colorTransitionFraction: Float): State<Color> {
-        return animateColorAsState(
-            // Check if fraction is slightly over zero to overcome float precision issues.
-            targetValue = if (colorTransitionFraction > 0.01f) {
-                scrolledContainerColor
-            } else {
-                containerColor
-            },
-            animationSpec = tween(
-                durationMillis = TopAppBarAnimationDurationMillis,
-                easing = LinearOutSlowInEasing
-            )
-        )
-    }
-
-    @Composable
-    override fun navigationIconContentColor(colorTransitionFraction: Float): State<Color> =
-        navigationIconColorState
-
-    @Composable
-    override fun titleContentColor(colorTransitionFraction: Float): State<Color> = titleColorState
-
-    @Composable
-    override fun actionIconContentColor(colorTransitionFraction: Float): State<Color> =
-        actionIconColorState
-}
-
-/**
- * A [TopAppBarColors] implementation that interpolates the container color according to the top
- * app bar scroll state percentage.
- *
- * This default implementation does not interpolate the leading, headline, or trailing colors.
- */
-@Stable
-private class InterpolatingTopAppBarColors(
-    private val containerColor: Color,
-    private val scrolledContainerColor: Color,
-    navigationIconContentColor: Color,
-    titleContentColor: Color,
-    actionIconContentColor: Color
-) : TopAppBarColors {
-
-    // In this TopAppBarColors implementation, the following colors never change their value as the
-    // app bar collapses.
-    private val navigationIconColorState: State<Color> = mutableStateOf(navigationIconContentColor)
-    private val titleColorState: State<Color> = mutableStateOf(titleContentColor)
-    private val actionIconColorState: State<Color> = mutableStateOf(actionIconContentColor)
-
-    @Composable
-    override fun containerColor(colorTransitionFraction: Float): State<Color> {
-        return rememberUpdatedState(
-            lerp(
-                containerColor,
-                scrolledContainerColor,
-                FastOutLinearInEasing.transform(colorTransitionFraction)
-            )
-        )
-    }
-
-    @Composable
-    override fun navigationIconContentColor(colorTransitionFraction: Float): State<Color> =
-        navigationIconColorState
-
-    @Composable
-    override fun titleContentColor(colorTransitionFraction: Float): State<Color> = titleColorState
-
-    @Composable
-    override fun actionIconContentColor(colorTransitionFraction: Float): State<Color> =
-        actionIconColorState
-}
-
-/**
  * Returns a [TopAppBarScrollBehavior] that only adjusts its content offset, without adjusting any
  * properties that affect the height of a top app bar.
  *
+ * @param state a [TopAppBarState]
  * @param canScroll a callback used to determine whether scroll events are to be
  * handled by this [PinnedScrollBehavior]
  */
@@ -1394,12 +1304,17 @@
  * A top app bar that is set up with this [TopAppBarScrollBehavior] will immediately collapse when
  * the nested content is pulled up, and will immediately appear when the content is pulled down.
  *
+ * @param state a [TopAppBarState]
+ * @param flingAnimationSpec a [DecayAnimationSpec] that will be used to animate the top app
+ * bar motion when the user flings the content and the app bar should collapse or expand at a
+ * similar fling velocity and decay
  * @param canScroll a callback used to determine whether scroll events are to be
  * handled by this [EnterAlwaysScrollBehavior]
  */
 @OptIn(ExperimentalMaterial3Api::class)
 private class EnterAlwaysScrollBehavior(
     override var state: TopAppBarState,
+    val flingAnimationSpec: DecayAnimationSpec<Float>?,
     val canScroll: () -> Boolean = { true }
 ) : TopAppBarScrollBehavior {
     override val isPinned: Boolean = false
@@ -1435,6 +1350,22 @@
                 state.heightOffset = state.heightOffset + consumed.y
                 return Offset.Zero
             }
+
+            override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
+                var result = super.onPostFling(consumed, available)
+                // Check if the app bar is partially collapsed/expanded.
+                // Note that we don't check for 0f due to float precision with the collapsedFraction
+                // calculation.
+                if (state.collapsedFraction > 0.01f && state.collapsedFraction < 1f) {
+                    result += flingTopAppBar(
+                        state = state,
+                        initialVelocity = available.y,
+                        flingAnimationSpec = flingAnimationSpec
+                    )
+                    snapTopAppBar(state)
+                }
+                return result
+            }
         }
 }
 
@@ -1446,17 +1377,17 @@
  * the nested content is pulled up, and will expand back the collapsed area when the content is
  * pulled all the way down.
  *
- * @param decayAnimationSpec a [DecayAnimationSpec] that will be used by the top app bar motion
- * when the user flings the content. Preferably, this should match the animation spec used by the
- * scrollable content. See also [androidx.compose.animation.rememberSplineBasedDecay] for a
- * default [DecayAnimationSpec] that can be used with this behavior.
+ * @param state a [TopAppBarState]
+ * @param flingAnimationSpec a [DecayAnimationSpec] that will be used to animate the top app
+ * bar motion when the user flings the content and the app bar should collapse or expand at a
+ * similar fling velocity and decay
  * @param canScroll a callback used to determine whether scroll events are to be
  * handled by this [ExitUntilCollapsedScrollBehavior]
  */
 @OptIn(ExperimentalMaterial3Api::class)
 private class ExitUntilCollapsedScrollBehavior(
     override val state: TopAppBarState,
-    val decayAnimationSpec: DecayAnimationSpec<Float>,
+    val flingAnimationSpec: DecayAnimationSpec<Float>?,
     val canScroll: () -> Boolean = { true }
 ) : TopAppBarScrollBehavior {
     override val isPinned: Boolean = false
@@ -1509,19 +1440,17 @@
             }
 
             override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
-                val result = super.onPostFling(consumed, available)
-                // TODO(b/179417109): We get positive Velocity when flinging up while the top app
-                //  bar is changing its height. Track b/179417109 for a fix.
-                if ((available.y < 0f && state.contentOffset == 0f) ||
-                    (available.y > 0f && state.heightOffset < 0f)
-                ) {
-                    return result +
-                        onTopBarFling(
-                            scrollBehavior = this@ExitUntilCollapsedScrollBehavior,
-                            initialVelocity = available.y,
-                            decayAnimationSpec = decayAnimationSpec,
-                            snap = true
-                        )
+                var result = super.onPostFling(consumed, available)
+                // Check if the app bar is partially collapsed/expanded.
+                // Note that we don't check for 0f due to float precision with the collapsedFraction
+                // calculation.
+                if (state.collapsedFraction > 0.01f && state.collapsedFraction < 1f) {
+                    result += flingTopAppBar(
+                        state = state,
+                        initialVelocity = available.y,
+                        flingAnimationSpec = flingAnimationSpec
+                    )
+                    snapTopAppBar(state)
                 }
                 return result
             }
@@ -1529,47 +1458,46 @@
 }
 
 @OptIn(ExperimentalMaterial3Api::class)
-private suspend fun onTopBarFling(
-    scrollBehavior: TopAppBarScrollBehavior,
+private suspend fun flingTopAppBar(
+    state: TopAppBarState,
     initialVelocity: Float,
-    decayAnimationSpec: DecayAnimationSpec<Float>,
-    snap: Boolean
+    flingAnimationSpec: DecayAnimationSpec<Float>?
 ): Velocity {
-    if (abs(initialVelocity) > 1f) {
-        var remainingVelocity = initialVelocity
+    var remainingVelocity = initialVelocity
+    // In case there is an initial velocity that was left after a previous user fling, animate to
+    // continue the motion to expand or collapse the app bar.
+    if (flingAnimationSpec != null && abs(initialVelocity) > 1f) {
         var lastValue = 0f
         AnimationState(
             initialValue = 0f,
             initialVelocity = initialVelocity,
         )
-            .animateDecay(decayAnimationSpec) {
+            .animateDecay(flingAnimationSpec) {
                 val delta = value - lastValue
-                val initialHeightOffset = scrollBehavior.state.heightOffset
-                scrollBehavior.state.heightOffset = initialHeightOffset + delta
-                val consumed = abs(initialHeightOffset - scrollBehavior.state.heightOffset)
+                val initialHeightOffset = state.heightOffset
+                state.heightOffset = initialHeightOffset + delta
+                val consumed = abs(initialHeightOffset - state.heightOffset)
                 lastValue = value
                 remainingVelocity = this.velocity
                 // avoid rounding errors and stop if anything is unconsumed
                 if (abs(delta - consumed) > 0.5f) this.cancelAnimation()
             }
-
-        if (snap &&
-            scrollBehavior.state.heightOffset < 0 &&
-            scrollBehavior.state.heightOffset > scrollBehavior.state.heightOffsetLimit
-        ) {
-            AnimationState(initialValue = scrollBehavior.state.heightOffset).animateTo(
-                // Snap the top app bar height offset to have the bar completely collapse or
-                // completely expand according to the initial velocity direction.
-                if (initialVelocity > 0) 0f else scrollBehavior.state.heightOffsetLimit,
-                animationSpec = tween(
-                    durationMillis = TopAppBarAnimationDurationMillis,
-                    easing = LinearOutSlowInEasing
-                )
-            ) { scrollBehavior.state.heightOffset = value }
-        }
-        return Velocity(0f, remainingVelocity)
     }
-    return Velocity.Zero
+    return Velocity(0f, remainingVelocity)
+}
+
+@OptIn(ExperimentalMaterial3Api::class)
+private suspend fun snapTopAppBar(state: TopAppBarState) {
+    // In case the app bar motion was stopped in a state where it's partially visible, snap it to
+    // the nearest state.
+    if (state.heightOffset < 0 &&
+        state.heightOffset > state.heightOffsetLimit
+    ) {
+        AnimationState(initialValue = state.heightOffset).animateTo(
+            if (state.collapsedFraction < 0.5f) 0f else state.heightOffsetLimit,
+            animationSpec = spring(stiffness = Spring.StiffnessMediumLow)
+        ) { state.heightOffset = value }
+    }
 }
 
 private val MediumTitleBottomPadding = 24.dp
@@ -1579,5 +1507,3 @@
 // A title inset when the App-Bar is a Medium or Large one. Also used to size a spacer when the
 // navigation icon is missing.
 private val TopAppBarTitleInset = 16.dp - TopAppBarHorizontalPadding
-
-private const val TopAppBarAnimationDurationMillis = 500
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 d2e490c..4d3c069 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
@@ -31,6 +31,20 @@
 import androidx.compose.foundation.layout.RowScope
 import androidx.compose.foundation.layout.defaultMinSize
 import androidx.compose.foundation.layout.padding
+import androidx.compose.material3.ButtonDefaults.ContentPadding
+import androidx.compose.material3.ButtonDefaults.IconSize
+import androidx.compose.material3.ButtonDefaults.IconSpacing
+import androidx.compose.material3.ButtonDefaults.MinHeight
+import androidx.compose.material3.ButtonDefaults.MinWidth
+import androidx.compose.material3.ButtonDefaults.TextButtonContentPadding
+import androidx.compose.material3.ButtonDefaults.buttonColors
+import androidx.compose.material3.ButtonDefaults.buttonElevation
+import androidx.compose.material3.ButtonDefaults.elevatedButtonColors
+import androidx.compose.material3.ButtonDefaults.elevatedButtonElevation
+import androidx.compose.material3.ButtonDefaults.filledTonalButtonColors
+import androidx.compose.material3.ButtonDefaults.filledTonalButtonElevation
+import androidx.compose.material3.ButtonDefaults.outlinedButtonColors
+import androidx.compose.material3.ButtonDefaults.textButtonColors
 import androidx.compose.material3.tokens.ElevatedButtonTokens
 import androidx.compose.material3.tokens.FilledButtonTokens
 import androidx.compose.material3.tokens.FilledTonalButtonTokens
@@ -538,14 +552,13 @@
             FilledButtonTokens.DisabledContainerColor.toColor()
                 .copy(alpha = FilledButtonTokens.DisabledContainerOpacity),
         disabledContentColor: Color = FilledButtonTokens.DisabledLabelTextColor.toColor()
-                .copy(alpha = FilledButtonTokens.DisabledLabelTextOpacity),
-    ): ButtonColors =
-        DefaultButtonColors(
-            containerColor = containerColor,
-            contentColor = contentColor,
-            disabledContainerColor = disabledContainerColor,
-            disabledContentColor = disabledContentColor
-        )
+            .copy(alpha = FilledButtonTokens.DisabledLabelTextOpacity),
+    ): ButtonColors = ButtonColors(
+        containerColor = containerColor,
+        contentColor = contentColor,
+        disabledContainerColor = disabledContainerColor,
+        disabledContentColor = disabledContentColor
+    )
 
     /**
      * Creates a [ButtonColors] that represents the default container and content colors used in an
@@ -566,13 +579,12 @@
         disabledContentColor: Color = ElevatedButtonTokens.DisabledLabelTextColor
             .toColor()
             .copy(alpha = ElevatedButtonTokens.DisabledLabelTextOpacity),
-    ): ButtonColors =
-        DefaultButtonColors(
-            containerColor = containerColor,
-            contentColor = contentColor,
-            disabledContainerColor = disabledContainerColor,
-            disabledContentColor = disabledContentColor
-        )
+    ): ButtonColors = ButtonColors(
+        containerColor = containerColor,
+        contentColor = contentColor,
+        disabledContainerColor = disabledContainerColor,
+        disabledContentColor = disabledContentColor
+    )
 
     /**
      * Creates a [ButtonColors] that represents the default container and content colors used in an
@@ -593,13 +605,12 @@
         disabledContentColor: Color = FilledTonalButtonTokens.DisabledLabelTextColor
             .toColor()
             .copy(alpha = FilledTonalButtonTokens.DisabledLabelTextOpacity),
-    ): ButtonColors =
-        DefaultButtonColors(
-            containerColor = containerColor,
-            contentColor = contentColor,
-            disabledContainerColor = disabledContainerColor,
-            disabledContentColor = disabledContentColor
-        )
+    ): ButtonColors = ButtonColors(
+        containerColor = containerColor,
+        contentColor = contentColor,
+        disabledContainerColor = disabledContainerColor,
+        disabledContentColor = disabledContentColor
+    )
 
     /**
      * Creates a [ButtonColors] that represents the default container and content colors used in an
@@ -618,13 +629,12 @@
         disabledContentColor: Color = OutlinedButtonTokens.DisabledLabelTextColor
             .toColor()
             .copy(alpha = OutlinedButtonTokens.DisabledLabelTextOpacity),
-    ): ButtonColors =
-        DefaultButtonColors(
-            containerColor = containerColor,
-            contentColor = contentColor,
-            disabledContainerColor = disabledContainerColor,
-            disabledContentColor = disabledContentColor
-        )
+    ): ButtonColors = ButtonColors(
+        containerColor = containerColor,
+        contentColor = contentColor,
+        disabledContainerColor = disabledContainerColor,
+        disabledContentColor = disabledContentColor
+    )
 
     /**
      * Creates a [ButtonColors] that represents the default container and content colors used in a
@@ -643,13 +653,12 @@
         disabledContentColor: Color = TextButtonTokens.DisabledLabelTextColor
             .toColor()
             .copy(alpha = TextButtonTokens.DisabledLabelTextOpacity),
-    ): ButtonColors =
-        DefaultButtonColors(
-            containerColor = containerColor,
-            contentColor = contentColor,
-            disabledContainerColor = disabledContainerColor,
-            disabledContentColor = disabledContentColor
-        )
+    ): ButtonColors = ButtonColors(
+        containerColor = containerColor,
+        contentColor = contentColor,
+        disabledContainerColor = disabledContainerColor,
+        disabledContentColor = disabledContentColor
+    )
 
     /**
      * Creates a [ButtonElevation] that will animate between the provided values according to the
@@ -669,23 +678,13 @@
         focusedElevation: Dp = FilledButtonTokens.FocusContainerElevation,
         hoveredElevation: Dp = FilledButtonTokens.HoverContainerElevation,
         disabledElevation: Dp = FilledButtonTokens.DisabledContainerElevation,
-    ): ButtonElevation {
-        return remember(
-            defaultElevation,
-            pressedElevation,
-            focusedElevation,
-            hoveredElevation,
-            disabledElevation
-        ) {
-            DefaultButtonElevation(
-                defaultElevation = defaultElevation,
-                pressedElevation = pressedElevation,
-                focusedElevation = focusedElevation,
-                hoveredElevation = hoveredElevation,
-                disabledElevation = disabledElevation,
-            )
-        }
-    }
+    ): ButtonElevation = ButtonElevation(
+        defaultElevation = defaultElevation,
+        pressedElevation = pressedElevation,
+        focusedElevation = focusedElevation,
+        hoveredElevation = hoveredElevation,
+        disabledElevation = disabledElevation,
+    )
 
     /**
      * Creates a [ButtonElevation] that will animate between the provided values according to the
@@ -705,23 +704,13 @@
         focusedElevation: Dp = ElevatedButtonTokens.FocusContainerElevation,
         hoveredElevation: Dp = ElevatedButtonTokens.HoverContainerElevation,
         disabledElevation: Dp = ElevatedButtonTokens.DisabledContainerElevation
-    ): ButtonElevation {
-        return remember(
-            defaultElevation,
-            pressedElevation,
-            focusedElevation,
-            hoveredElevation,
-            disabledElevation
-        ) {
-            DefaultButtonElevation(
-                defaultElevation = defaultElevation,
-                pressedElevation = pressedElevation,
-                focusedElevation = focusedElevation,
-                hoveredElevation = hoveredElevation,
-                disabledElevation = disabledElevation
-            )
-        }
-    }
+    ): ButtonElevation = ButtonElevation(
+        defaultElevation = defaultElevation,
+        pressedElevation = pressedElevation,
+        focusedElevation = focusedElevation,
+        hoveredElevation = hoveredElevation,
+        disabledElevation = disabledElevation
+    )
 
     /**
      * Creates a [ButtonElevation] that will animate between the provided values according to the
@@ -742,23 +731,13 @@
         focusedElevation: Dp = FilledTonalButtonTokens.FocusContainerElevation,
         hoveredElevation: Dp = FilledTonalButtonTokens.HoverContainerElevation,
         disabledElevation: Dp = 0.dp
-    ): ButtonElevation {
-        return remember(
-            defaultElevation,
-            pressedElevation,
-            focusedElevation,
-            hoveredElevation,
-            disabledElevation
-        ) {
-            DefaultButtonElevation(
-                defaultElevation = defaultElevation,
-                pressedElevation = pressedElevation,
-                focusedElevation = focusedElevation,
-                hoveredElevation = hoveredElevation,
-                disabledElevation = disabledElevation
-            )
-        }
-    }
+    ): ButtonElevation = ButtonElevation(
+        defaultElevation = defaultElevation,
+        pressedElevation = pressedElevation,
+        focusedElevation = focusedElevation,
+        hoveredElevation = hoveredElevation,
+        disabledElevation = disabledElevation
+    )
 
     /** The default [BorderStroke] used by [OutlinedButton]. */
     val outlinedButtonBorder: BorderStroke
@@ -777,7 +756,13 @@
  * [ElevatedButton].
  */
 @Stable
-interface ButtonElevation {
+class ButtonElevation internal constructor(
+    private val defaultElevation: Dp,
+    private val pressedElevation: Dp,
+    private val focusedElevation: Dp,
+    private val hoveredElevation: Dp,
+    private val disabledElevation: Dp,
+) {
     /**
      * Represents the tonal elevation used in a button, depending on its [enabled] state and
      * [interactionSource]. This should typically be the same value as the [shadowElevation].
@@ -792,7 +777,9 @@
      * @param interactionSource the [InteractionSource] for this button
      */
     @Composable
-    fun tonalElevation(enabled: Boolean, interactionSource: InteractionSource): State<Dp>
+    internal fun tonalElevation(enabled: Boolean, interactionSource: InteractionSource): State<Dp> {
+        return animateElevation(enabled = enabled, interactionSource = interactionSource)
+    }
 
     /**
      * Represents the shadow elevation used in a button, depending on its [enabled] state and
@@ -806,51 +793,7 @@
      * @param interactionSource the [InteractionSource] for this button
      */
     @Composable
-    fun shadowElevation(enabled: Boolean, interactionSource: InteractionSource): State<Dp>
-}
-
-/**
- * Represents the container and content colors used in a button in different states.
- *
- * - See [ButtonDefaults.buttonColors] for the default colors used in a [Button].
- * - See [ButtonDefaults.elevatedButtonColors] for the default colors used in a [ElevatedButton].
- * - See [ButtonDefaults.textButtonColors] for the default colors used in a [TextButton].
- */
-@Stable
-interface ButtonColors {
-    /**
-     * Represents the container color for this button, depending on [enabled].
-     *
-     * @param enabled whether the button is enabled
-     */
-    @Composable
-    fun containerColor(enabled: Boolean): State<Color>
-
-    /**
-     * Represents the content color for this button, depending on [enabled].
-     *
-     * @param enabled whether the button is enabled
-     */
-    @Composable
-    fun contentColor(enabled: Boolean): State<Color>
-}
-
-/** Default [ButtonElevation] implementation. */
-@Stable
-private class DefaultButtonElevation(
-    private val defaultElevation: Dp,
-    private val pressedElevation: Dp,
-    private val focusedElevation: Dp,
-    private val hoveredElevation: Dp,
-    private val disabledElevation: Dp,
-) : ButtonElevation {
-    @Composable
-    override fun tonalElevation(enabled: Boolean, interactionSource: InteractionSource): State<Dp> {
-        return animateElevation(enabled = enabled, interactionSource = interactionSource)
-    }
-
-    @Composable
-    override fun shadowElevation(
+    internal fun shadowElevation(
         enabled: Boolean,
         interactionSource: InteractionSource
     ): State<Dp> {
@@ -928,31 +871,67 @@
 
         return animatable.asState()
     }
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other == null || other !is ButtonElevation) return false
+
+        if (defaultElevation != other.defaultElevation) return false
+        if (pressedElevation != other.pressedElevation) return false
+        if (focusedElevation != other.focusedElevation) return false
+        if (hoveredElevation != other.hoveredElevation) return false
+        if (disabledElevation != other.disabledElevation) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = defaultElevation.hashCode()
+        result = 31 * result + pressedElevation.hashCode()
+        result = 31 * result + focusedElevation.hashCode()
+        result = 31 * result + hoveredElevation.hashCode()
+        result = 31 * result + disabledElevation.hashCode()
+        return result
+    }
 }
 
-/** Default [ButtonColors] implementation. */
+/**
+ * Represents the container and content colors used in a button in different states.
+ *
+ * - See [ButtonDefaults.buttonColors] for the default colors used in a [Button].
+ * - See [ButtonDefaults.elevatedButtonColors] for the default colors used in a [ElevatedButton].
+ * - See [ButtonDefaults.textButtonColors] for the default colors used in a [TextButton].
+ */
 @Immutable
-private class DefaultButtonColors(
+class ButtonColors internal constructor(
     private val containerColor: Color,
     private val contentColor: Color,
     private val disabledContainerColor: Color,
     private val disabledContentColor: Color,
-) : ButtonColors {
+) {
+    /**
+     * Represents the container color for this button, depending on [enabled].
+     *
+     * @param enabled whether the button is enabled
+     */
     @Composable
-    override fun containerColor(enabled: Boolean): State<Color> {
+    internal fun containerColor(enabled: Boolean): State<Color> {
         return rememberUpdatedState(if (enabled) containerColor else disabledContainerColor)
     }
 
+    /**
+     * Represents the content color for this button, depending on [enabled].
+     *
+     * @param enabled whether the button is enabled
+     */
     @Composable
-    override fun contentColor(enabled: Boolean): State<Color> {
+    internal fun contentColor(enabled: Boolean): State<Color> {
         return rememberUpdatedState(if (enabled) contentColor else disabledContentColor)
     }
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
-        if (other == null || this::class != other::class) return false
-
-        other as DefaultButtonColors
+        if (other == null || other !is ButtonColors) return false
 
         if (containerColor != other.containerColor) return false
         if (contentColor != other.contentColor) return false
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Card.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Card.kt
index 563f3f1..ccdfa68 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Card.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Card.kt
@@ -34,7 +34,6 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Immutable
 import androidx.compose.runtime.LaunchedEffect
-import androidx.compose.runtime.Stable
 import androidx.compose.runtime.State
 import androidx.compose.runtime.mutableStateListOf
 import androidx.compose.runtime.mutableStateOf
@@ -348,72 +347,6 @@
 )
 
 /**
- * Represents the elevation for a card in different states.
- *
- * - See [CardDefaults.cardElevation] for the default elevation used in a [Card].
- * - See [CardDefaults.elevatedCardElevation] for the default elevation used in an [ElevatedCard].
- * - See [CardDefaults.outlinedCardElevation] for the default elevation used in an [OutlinedCard].
- */
-@Stable
-interface CardElevation {
-    /**
-     * Represents the tonal elevation used in a card, depending on its [enabled] state and
-     * [interactionSource]. This should typically be the same value as the [shadowElevation].
-     *
-     * Tonal elevation is used to apply a color shift to the surface to give the it higher emphasis.
-     * When surface's color is [ColorScheme.surface], a higher elevation will result in a darker
-     * color in light theme and lighter color in dark theme.
-     *
-     * See [shadowElevation] which controls the elevation of the shadow drawn around the card.
-     *
-     * @param enabled whether the card is enabled
-     * @param interactionSource the [InteractionSource] for this card
-     */
-    @Composable
-    fun tonalElevation(enabled: Boolean, interactionSource: InteractionSource?): State<Dp>
-
-    /**
-     * Represents the shadow elevation used in a card, depending on its [enabled] state and
-     * [interactionSource]. This should typically be the same value as the [tonalElevation].
-     *
-     * Shadow elevation is used to apply a shadow around the card to give it higher emphasis.
-     *
-     * See [tonalElevation] which controls the elevation with a color shift to the surface.
-     *
-     * @param enabled whether the card is enabled
-     * @param interactionSource the [InteractionSource] for this card
-     */
-    @Composable
-    fun shadowElevation(enabled: Boolean, interactionSource: InteractionSource?): State<Dp>
-}
-
-/**
- * Represents the container and content colors used in a card in different states.
- *
- * - See [CardDefaults.cardColors] for the default colors used in a [Card].
- * - See [CardDefaults.elevatedCardColors] for the default colors used in a [ElevatedCard].
- * - See [CardDefaults.outlinedCardColors] for the default colors used in a [OutlinedCard].
- */
-@Stable
-interface CardColors {
-    /**
-     * Represents the container color for this card, depending on [enabled].
-     *
-     * @param enabled whether the card is enabled
-     */
-    @Composable
-    fun containerColor(enabled: Boolean): State<Color>
-
-    /**
-     * Represents the content color for this card, depending on [enabled].
-     *
-     * @param enabled whether the card is enabled
-     */
-    @Composable
-    fun contentColor(enabled: Boolean): State<Color>
-}
-
-/**
  * Contains the default values used by all card types.
  */
 object CardDefaults {
@@ -445,25 +378,14 @@
         hoveredElevation: Dp = FilledCardTokens.HoverContainerElevation,
         draggedElevation: Dp = FilledCardTokens.DraggedContainerElevation,
         disabledElevation: Dp = FilledCardTokens.DisabledContainerElevation
-    ): CardElevation {
-        return remember(
-            defaultElevation,
-            pressedElevation,
-            focusedElevation,
-            hoveredElevation,
-            draggedElevation,
-            disabledElevation
-        ) {
-            DefaultCardElevation(
-                defaultElevation = defaultElevation,
-                pressedElevation = pressedElevation,
-                focusedElevation = focusedElevation,
-                hoveredElevation = hoveredElevation,
-                draggedElevation = draggedElevation,
-                disabledElevation = disabledElevation
-            )
-        }
-    }
+    ): CardElevation = CardElevation(
+        defaultElevation = defaultElevation,
+        pressedElevation = pressedElevation,
+        focusedElevation = focusedElevation,
+        hoveredElevation = hoveredElevation,
+        draggedElevation = draggedElevation,
+        disabledElevation = disabledElevation
+    )
 
     /**
      * Creates a [CardElevation] that will animate between the provided values according to the
@@ -484,25 +406,14 @@
         hoveredElevation: Dp = ElevatedCardTokens.HoverContainerElevation,
         draggedElevation: Dp = ElevatedCardTokens.DraggedContainerElevation,
         disabledElevation: Dp = ElevatedCardTokens.DisabledContainerElevation
-    ): CardElevation {
-        return remember(
-            defaultElevation,
-            pressedElevation,
-            focusedElevation,
-            hoveredElevation,
-            draggedElevation,
-            disabledElevation
-        ) {
-            DefaultCardElevation(
-                defaultElevation = defaultElevation,
-                pressedElevation = pressedElevation,
-                focusedElevation = focusedElevation,
-                hoveredElevation = hoveredElevation,
-                draggedElevation = draggedElevation,
-                disabledElevation = disabledElevation
-            )
-        }
-    }
+    ): CardElevation = CardElevation(
+        defaultElevation = defaultElevation,
+        pressedElevation = pressedElevation,
+        focusedElevation = focusedElevation,
+        hoveredElevation = hoveredElevation,
+        draggedElevation = draggedElevation,
+        disabledElevation = disabledElevation
+    )
 
     /**
      * Creates a [CardElevation] that will animate between the provided values according to the
@@ -523,25 +434,14 @@
         hoveredElevation: Dp = defaultElevation,
         draggedElevation: Dp = OutlinedCardTokens.DraggedContainerElevation,
         disabledElevation: Dp = OutlinedCardTokens.DisabledContainerElevation
-    ): CardElevation {
-        return remember(
-            defaultElevation,
-            pressedElevation,
-            focusedElevation,
-            hoveredElevation,
-            draggedElevation,
-            disabledElevation
-        ) {
-            DefaultCardElevation(
-                defaultElevation = defaultElevation,
-                pressedElevation = pressedElevation,
-                focusedElevation = focusedElevation,
-                hoveredElevation = hoveredElevation,
-                draggedElevation = draggedElevation,
-                disabledElevation = disabledElevation
-            )
-        }
-    }
+    ): CardElevation = CardElevation(
+        defaultElevation = defaultElevation,
+        pressedElevation = pressedElevation,
+        focusedElevation = focusedElevation,
+        hoveredElevation = hoveredElevation,
+        draggedElevation = draggedElevation,
+        disabledElevation = disabledElevation
+    )
 
     /**
      * Creates a [CardColors] that represents the default container and content colors used in a
@@ -565,13 +465,12 @@
                     )
                 ),
         disabledContentColor: Color = contentColorFor(containerColor).copy(DisabledAlpha),
-    ): CardColors =
-        DefaultCardColors(
-            containerColor = containerColor,
-            contentColor = contentColor,
-            disabledContainerColor = disabledContainerColor,
-            disabledContentColor = disabledContentColor
-        )
+    ): CardColors = CardColors(
+        containerColor = containerColor,
+        contentColor = contentColor,
+        disabledContainerColor = disabledContainerColor,
+        disabledContentColor = disabledContentColor
+    )
 
     /**
      * Creates a [CardColors] that represents the default container and content colors used in an
@@ -596,7 +495,7 @@
                 ),
         disabledContentColor: Color = contentColor.copy(DisabledAlpha),
     ): CardColors =
-        DefaultCardColors(
+        CardColors(
             containerColor = containerColor,
             contentColor = contentColor,
             disabledContainerColor = disabledContainerColor,
@@ -619,7 +518,7 @@
         disabledContainerColor: Color = containerColor,
         disabledContentColor: Color = contentColor.copy(DisabledAlpha),
     ): CardColors =
-        DefaultCardColors(
+        CardColors(
             containerColor = containerColor,
             contentColor = contentColor,
             disabledContainerColor = disabledContainerColor,
@@ -649,22 +548,36 @@
 }
 
 /**
- * Default [CardElevation] implementation.
+ * Represents the elevation for a card in different states.
  *
- * This default implementation supports animating the elevation for pressed, focused, hovered, and
- * dragged interactions.
+ * - See [CardDefaults.cardElevation] for the default elevation used in a [Card].
+ * - See [CardDefaults.elevatedCardElevation] for the default elevation used in an [ElevatedCard].
+ * - See [CardDefaults.outlinedCardElevation] for the default elevation used in an [OutlinedCard].
  */
 @Immutable
-private class DefaultCardElevation(
+class CardElevation internal constructor(
     private val defaultElevation: Dp,
     private val pressedElevation: Dp,
     private val focusedElevation: Dp,
     private val hoveredElevation: Dp,
     private val draggedElevation: Dp,
     private val disabledElevation: Dp
-) : CardElevation {
+) {
+    /**
+     * Represents the tonal elevation used in a card, depending on its [enabled] state and
+     * [interactionSource]. This should typically be the same value as the [shadowElevation].
+     *
+     * Tonal elevation is used to apply a color shift to the surface to give the it higher emphasis.
+     * When surface's color is [ColorScheme.surface], a higher elevation will result in a darker
+     * color in light theme and lighter color in dark theme.
+     *
+     * See [shadowElevation] which controls the elevation of the shadow drawn around the card.
+     *
+     * @param enabled whether the card is enabled
+     * @param interactionSource the [InteractionSource] for this card
+     */
     @Composable
-    override fun tonalElevation(
+    internal fun tonalElevation(
         enabled: Boolean,
         interactionSource: InteractionSource?
     ): State<Dp> {
@@ -674,8 +587,19 @@
         return animateElevation(enabled = enabled, interactionSource = interactionSource)
     }
 
+    /**
+     * Represents the shadow elevation used in a card, depending on its [enabled] state and
+     * [interactionSource]. This should typically be the same value as the [tonalElevation].
+     *
+     * Shadow elevation is used to apply a shadow around the card to give it higher emphasis.
+     *
+     * See [tonalElevation] which controls the elevation with a color shift to the surface.
+     *
+     * @param enabled whether the card is enabled
+     * @param interactionSource the [InteractionSource] for this card
+     */
     @Composable
-    override fun shadowElevation(
+    internal fun shadowElevation(
         enabled: Boolean,
         interactionSource: InteractionSource?
     ): State<Dp> {
@@ -767,31 +691,67 @@
 
         return animatable.asState()
     }
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other == null || other !is CardElevation) return false
+
+        if (defaultElevation != other.defaultElevation) return false
+        if (pressedElevation != other.pressedElevation) return false
+        if (focusedElevation != other.focusedElevation) return false
+        if (hoveredElevation != other.hoveredElevation) return false
+        if (disabledElevation != other.disabledElevation) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = defaultElevation.hashCode()
+        result = 31 * result + pressedElevation.hashCode()
+        result = 31 * result + focusedElevation.hashCode()
+        result = 31 * result + hoveredElevation.hashCode()
+        result = 31 * result + disabledElevation.hashCode()
+        return result
+    }
 }
 
-/** Default [CardColors] implementation. */
+/**
+ * Represents the container and content colors used in a card in different states.
+ *
+ * - See [CardDefaults.cardColors] for the default colors used in a [Card].
+ * - See [CardDefaults.elevatedCardColors] for the default colors used in a [ElevatedCard].
+ * - See [CardDefaults.outlinedCardColors] for the default colors used in a [OutlinedCard].
+ */
 @Immutable
-private class DefaultCardColors(
+class CardColors internal constructor(
     private val containerColor: Color,
     private val contentColor: Color,
     private val disabledContainerColor: Color,
     private val disabledContentColor: Color,
-) : CardColors {
+) {
+    /**
+     * Represents the container color for this card, depending on [enabled].
+     *
+     * @param enabled whether the card is enabled
+     */
     @Composable
-    override fun containerColor(enabled: Boolean): State<Color> {
+    internal fun containerColor(enabled: Boolean): State<Color> {
         return rememberUpdatedState(if (enabled) containerColor else disabledContainerColor)
     }
 
+    /**
+     * Represents the content color for this card, depending on [enabled].
+     *
+     * @param enabled whether the card is enabled
+     */
     @Composable
-    override fun contentColor(enabled: Boolean): State<Color> {
+    internal fun contentColor(enabled: Boolean): State<Color> {
         return rememberUpdatedState(if (enabled) contentColor else disabledContentColor)
     }
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
-        if (other == null || this::class != other::class) return false
-
-        other as DefaultCardColors
+        if (other == null || other !is CardColors) return false
 
         if (containerColor != other.containerColor) return false
         if (contentColor != other.contentColor) return false
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Checkbox.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Checkbox.kt
index c521bd8..f5fde50 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Checkbox.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Checkbox.kt
@@ -33,7 +33,6 @@
 import androidx.compose.material3.tokens.CheckboxTokens
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Immutable
-import androidx.compose.runtime.Stable
 import androidx.compose.runtime.State
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberUpdatedState
@@ -176,44 +175,6 @@
 }
 
 /**
- * Represents the colors used by the three different sections (checkmark, box, and border) of a
- * [Checkbox] or [TriStateCheckbox] in different states.
- *
- * See [CheckboxDefaults.colors] for the default implementation that follows Material
- * specifications.
- */
-@Stable
-interface CheckboxColors {
-
-    /**
-     * Represents the color used for the checkmark inside the checkbox, depending on [state].
-     *
-     * @param state the [ToggleableState] of the checkbox
-     */
-    @Composable
-    fun checkmarkColor(state: ToggleableState): State<Color>
-
-    /**
-     * Represents the color used for the box (background) of the checkbox, depending on [enabled]
-     * and [state].
-     *
-     * @param enabled whether the checkbox is enabled or not
-     * @param state the [ToggleableState] of the checkbox
-     */
-    @Composable
-    fun boxColor(enabled: Boolean, state: ToggleableState): State<Color>
-
-    /**
-     * Represents the color used for the border of the checkbox, depending on [enabled] and [state].
-     *
-     * @param enabled whether the checkbox is enabled or not
-     * @param state the [ToggleableState] of the checkbox
-     */
-    @Composable
-    fun borderColor(enabled: Boolean, state: ToggleableState): State<Color>
-}
-
-/**
  * Defaults used in [Checkbox] and [TriStateCheckbox].
  */
 object CheckboxDefaults {
@@ -248,30 +209,19 @@
                 .fromToken(CheckboxTokens.UnselectedDisabledOutlineColor)
                 .copy(alpha = CheckboxTokens.UnselectedDisabledContainerOpacity),
         disabledIndeterminateColor: Color = disabledCheckedColor
-    ): CheckboxColors {
-        return remember(
-            checkedColor,
-            uncheckedColor,
-            checkmarkColor,
-            disabledCheckedColor,
-            disabledUncheckedColor,
-            disabledIndeterminateColor,
-        ) {
-            DefaultCheckboxColors(
-                checkedBorderColor = checkedColor,
-                checkedBoxColor = checkedColor,
-                checkedCheckmarkColor = checkmarkColor,
-                uncheckedCheckmarkColor = checkmarkColor.copy(alpha = 0f),
-                uncheckedBoxColor = checkedColor.copy(alpha = 0f),
-                disabledCheckedBoxColor = disabledCheckedColor,
-                disabledUncheckedBoxColor = disabledUncheckedColor.copy(alpha = 0f),
-                disabledIndeterminateBoxColor = disabledIndeterminateColor,
-                uncheckedBorderColor = uncheckedColor,
-                disabledBorderColor = disabledCheckedColor,
-                disabledIndeterminateBorderColor = disabledIndeterminateColor,
-            )
-        }
-    }
+    ): CheckboxColors = CheckboxColors(
+        checkedBorderColor = checkedColor,
+        checkedBoxColor = checkedColor,
+        checkedCheckmarkColor = checkmarkColor,
+        uncheckedCheckmarkColor = checkmarkColor.copy(alpha = 0f),
+        uncheckedBoxColor = checkedColor.copy(alpha = 0f),
+        disabledCheckedBoxColor = disabledCheckedColor,
+        disabledUncheckedBoxColor = disabledUncheckedColor.copy(alpha = 0f),
+        disabledIndeterminateBoxColor = disabledIndeterminateColor,
+        uncheckedBorderColor = uncheckedColor,
+        disabledBorderColor = disabledCheckedColor,
+        disabledIndeterminateBorderColor = disabledIndeterminateColor,
+    )
 }
 
 @Composable
@@ -418,10 +368,14 @@
 )
 
 /**
- * Default [CheckboxColors] implementation.
+ * Represents the colors used by the three different sections (checkmark, box, and border) of a
+ * [Checkbox] or [TriStateCheckbox] in different states.
+ *
+ * See [CheckboxDefaults.colors] for the default implementation that follows Material
+ * specifications.
  */
 @Immutable
-private class DefaultCheckboxColors(
+class CheckboxColors internal constructor(
     private val checkedCheckmarkColor: Color,
     private val uncheckedCheckmarkColor: Color,
     private val checkedBoxColor: Color,
@@ -433,9 +387,14 @@
     private val uncheckedBorderColor: Color,
     private val disabledBorderColor: Color,
     private val disabledIndeterminateBorderColor: Color
-) : CheckboxColors {
+) {
+    /**
+     * Represents the color used for the checkmark inside the checkbox, depending on [state].
+     *
+     * @param state the [ToggleableState] of the checkbox
+     */
     @Composable
-    override fun checkmarkColor(state: ToggleableState): State<Color> {
+    internal fun checkmarkColor(state: ToggleableState): State<Color> {
         val target = if (state == ToggleableState.Off) {
             uncheckedCheckmarkColor
         } else {
@@ -446,8 +405,15 @@
         return animateColorAsState(target, tween(durationMillis = duration))
     }
 
+    /**
+     * Represents the color used for the box (background) of the checkbox, depending on [enabled]
+     * and [state].
+     *
+     * @param enabled whether the checkbox is enabled or not
+     * @param state the [ToggleableState] of the checkbox
+     */
     @Composable
-    override fun boxColor(enabled: Boolean, state: ToggleableState): State<Color> {
+    internal fun boxColor(enabled: Boolean, state: ToggleableState): State<Color> {
         val target = if (enabled) {
             when (state) {
                 ToggleableState.On, ToggleableState.Indeterminate -> checkedBoxColor
@@ -471,8 +437,14 @@
         }
     }
 
+    /**
+     * Represents the color used for the border of the checkbox, depending on [enabled] and [state].
+     *
+     * @param enabled whether the checkbox is enabled or not
+     * @param state the [ToggleableState] of the checkbox
+     */
     @Composable
-    override fun borderColor(enabled: Boolean, state: ToggleableState): State<Color> {
+    internal fun borderColor(enabled: Boolean, state: ToggleableState): State<Color> {
         val target = if (enabled) {
             when (state) {
                 ToggleableState.On, ToggleableState.Indeterminate -> checkedBorderColor
@@ -497,9 +469,7 @@
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
-        if (other == null || this::class != other::class) return false
-
-        other as DefaultCheckboxColors
+        if (other == null || other !is CheckboxColors) return false
 
         if (checkedCheckmarkColor != other.checkedCheckmarkColor) return false
         if (uncheckedCheckmarkColor != other.uncheckedCheckmarkColor) return false
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 a66ff79..ecee6e1 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
@@ -42,7 +42,6 @@
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.Immutable
 import androidx.compose.runtime.LaunchedEffect
-import androidx.compose.runtime.Stable
 import androidx.compose.runtime.State
 import androidx.compose.runtime.mutableStateListOf
 import androidx.compose.runtime.remember
@@ -618,211 +617,6 @@
 )
 
 /**
- * Represents the elevation for a chip in different states.
- */
-@Stable
-@ExperimentalMaterial3Api
-interface ChipElevation {
-    /**
-     * Represents the tonal elevation used in a chip, depending on its [enabled] state and
-     * [interactionSource]. This should typically be the same value as the [shadowElevation].
-     *
-     * Tonal elevation is used to apply a color shift to the surface to give the it higher emphasis.
-     * When surface's color is [ColorScheme.surface], a higher elevation will result in a darker
-     * color in light theme and lighter color in dark theme.
-     *
-     * See [shadowElevation] which controls the elevation of the shadow drawn around the chip.
-     *
-     * @param enabled whether the chip is enabled
-     * @param interactionSource the [InteractionSource] for this chip
-     */
-    @Composable
-    fun tonalElevation(enabled: Boolean, interactionSource: InteractionSource): State<Dp>
-
-    /**
-     * Represents the shadow elevation used in a chip, depending on its [enabled] state and
-     * [interactionSource]. This should typically be the same value as the [tonalElevation].
-     *
-     * Shadow elevation is used to apply a shadow around the chip to give it higher emphasis.
-     *
-     * See [tonalElevation] which controls the elevation with a color shift to the surface.
-     *
-     * @param enabled whether the chip is enabled
-     * @param interactionSource the [InteractionSource] for this chip
-     */
-    @Composable
-    fun shadowElevation(enabled: Boolean, interactionSource: InteractionSource): State<Dp>
-}
-
-/**
- * Represents the elevation used in a selectable chip in different states.
- */
-@Stable
-@ExperimentalMaterial3Api
-interface SelectableChipElevation {
-    /**
-     * Represents the tonal elevation used in a chip, depending on [enabled], [selected], and
-     * [interactionSource]. This should typically be the same value as the [shadowElevation].
-     *
-     * Tonal elevation is used to apply a color shift to the surface to give the it higher emphasis.
-     * When surface's color is [ColorScheme.surface], a higher elevation will result in a darker
-     * color in light theme and lighter color in dark theme.
-     *
-     * See [shadowElevation] which controls the elevation of the shadow drawn around the Chip.
-     *
-     * @param enabled whether the chip is enabled
-     * @param selected whether the chip is selected
-     * @param interactionSource the [InteractionSource] for this chip
-     */
-    @Composable
-    fun tonalElevation(
-        enabled: Boolean,
-        selected: Boolean,
-        interactionSource: InteractionSource
-    ): State<Dp>
-
-    /**
-     * Represents the shadow elevation used in a chip, depending on [enabled], [selected], and
-     * [interactionSource]. This should typically be the same value as the [tonalElevation].
-     *
-     * Shadow elevation is used to apply a shadow around the surface to give it higher emphasis.
-     *
-     * See [tonalElevation] which controls the elevation with a color shift to the surface.
-     *
-     * @param enabled whether the chip is enabled
-     * @param selected whether the chip is selected
-     * @param interactionSource the [InteractionSource] for this chip
-     */
-    @Composable
-    fun shadowElevation(
-        enabled: Boolean,
-        selected: Boolean,
-        interactionSource: InteractionSource
-    ): State<Dp>
-}
-
-/**
- * Represents the container and content colors used in a clickable chip in different states.
- *
- * See [AssistChipDefaults], [InputChipDefaults], and [SuggestionChipDefaults] for the default
- * colors used in the various Chip configurations.
- */
-@Stable
-@ExperimentalMaterial3Api
-interface ChipColors {
-    /**
-     * Represents the container color for this chip, depending on [enabled].
-     *
-     * @param enabled whether the chip is enabled
-     */
-    @Composable
-    fun containerColor(enabled: Boolean): State<Color>
-
-    /**
-     * Represents the label color for this chip, depending on [enabled].
-     *
-     * @param enabled whether the chip is enabled
-     */
-    @Composable
-    fun labelColor(enabled: Boolean): State<Color>
-
-    /**
-     * Represents the leading icon's content color for this chip, depending on [enabled].
-     *
-     * @param enabled whether the chip is enabled
-     */
-    @Composable
-    fun leadingIconContentColor(enabled: Boolean): State<Color>
-
-    /**
-     * Represents the trailing icon's content color for this chip, depending on [enabled].
-     *
-     * @param enabled whether the chip is enabled
-     */
-    @Composable
-    fun trailingIconContentColor(enabled: Boolean): State<Color>
-}
-
-/**
- * Represents the container and content colors used in a selectable chip in different states.
- *
- * See [FilterChipDefaults.filterChipColors] and [FilterChipDefaults.elevatedFilterChipColors] for
- * the default colors used in [FilterChip].
- */
-@Stable
-@ExperimentalMaterial3Api
-interface SelectableChipColors {
-    /**
-     * Represents the container color for this chip, depending on [enabled] and [selected].
-     *
-     * @param enabled whether the chip is enabled
-     * @param selected whether the chip is selected
-     */
-    @Composable
-    fun containerColor(enabled: Boolean, selected: Boolean): State<Color>
-
-    /**
-     * Represents the label color for this chip, depending on [enabled] and [selected].
-     *
-     * @param enabled whether the chip is enabled
-     * @param selected whether the chip is selected
-     */
-    @Composable
-    fun labelColor(enabled: Boolean, selected: Boolean): State<Color>
-
-    /**
-     * Represents the leading icon color for this chip, depending on [enabled] and [selected].
-     *
-     * @param enabled whether the chip is enabled
-     * @param selected whether the chip is selected
-     */
-    @Composable
-    fun leadingIconContentColor(enabled: Boolean, selected: Boolean): State<Color>
-
-    /**
-     * Represents the trailing icon color for this chip, depending on [enabled] and [selected].
-     *
-     * @param enabled whether the chip is enabled
-     * @param selected whether the chip is selected
-     */
-    @Composable
-    fun trailingIconContentColor(enabled: Boolean, selected: Boolean): State<Color>
-}
-
-/**
- * Represents the border stroke used in a chip in different states.
- */
-@Stable
-@ExperimentalMaterial3Api
-interface ChipBorder {
-
-    /**
-     * Represents the [BorderStroke] for this chip, depending on [enabled].
-     *
-     * @param enabled whether the chip is enabled
-     */
-    @Composable
-    fun borderStroke(enabled: Boolean): State<BorderStroke?>
-}
-
-/**
- * Represents the border stroke used used in a selectable chip in different states.
- */
-@Stable
-@ExperimentalMaterial3Api
-interface SelectableChipBorder {
-    /**
-     * Represents the [BorderStroke] stroke used for this chip, depending on [enabled] and
-     * [selected].
-     *
-     * @param enabled whether the chip is enabled
-     * @param selected whether the chip is selected
-     */
-    @Composable
-    fun borderStroke(enabled: Boolean, selected: Boolean): State<BorderStroke?>
-}
-
-/**
  * Contains the baseline values used by [AssistChip].
  */
 @ExperimentalMaterial3Api
@@ -864,7 +658,7 @@
             AssistChipTokens.DisabledIconColor.toColor()
                 .copy(alpha = AssistChipTokens.DisabledIconOpacity),
         disabledTrailingIconContentColor: Color = disabledLeadingIconContentColor,
-    ): ChipColors = DefaultChipColors(
+    ): ChipColors = ChipColors(
         containerColor = containerColor,
         labelColor = labelColor,
         leadingIconContentColor = leadingIconContentColor,
@@ -895,25 +689,14 @@
         hoveredElevation: Dp = defaultElevation,
         draggedElevation: Dp = AssistChipTokens.DraggedContainerElevation,
         disabledElevation: Dp = defaultElevation
-    ): ChipElevation {
-        return remember(
-            defaultElevation,
-            pressedElevation,
-            focusedElevation,
-            hoveredElevation,
-            draggedElevation,
-            disabledElevation
-        ) {
-            DefaultChipElevation(
-                defaultElevation = defaultElevation,
-                pressedElevation = pressedElevation,
-                focusedElevation = focusedElevation,
-                hoveredElevation = hoveredElevation,
-                draggedElevation = draggedElevation,
-                disabledElevation = disabledElevation
-            )
-        }
-    }
+    ): ChipElevation = ChipElevation(
+        defaultElevation = defaultElevation,
+        pressedElevation = pressedElevation,
+        focusedElevation = focusedElevation,
+        hoveredElevation = hoveredElevation,
+        draggedElevation = draggedElevation,
+        disabledElevation = disabledElevation
+    )
 
     /**
      * Creates a [ChipBorder] that represents the default border used in a flat [AssistChip].
@@ -928,19 +711,11 @@
         disabledBorderColor: Color = AssistChipTokens.FlatDisabledOutlineColor.toColor()
             .copy(alpha = AssistChipTokens.FlatDisabledOutlineOpacity),
         borderWidth: Dp = AssistChipTokens.FlatOutlineWidth,
-    ): ChipBorder {
-        return remember(
-            borderColor,
-            disabledBorderColor,
-            borderWidth
-        ) {
-            DefaultChipBorder(
-                borderColor = borderColor,
-                disabledBorderColor = disabledBorderColor,
-                borderWidth = borderWidth
-            )
-        }
-    }
+    ): ChipBorder = ChipBorder(
+        borderColor = borderColor,
+        disabledBorderColor = disabledBorderColor,
+        borderWidth = borderWidth
+    )
 
     /**
      * Creates a [ChipColors] that represents the default container, label, and icon colors used in
@@ -969,7 +744,7 @@
             AssistChipTokens.DisabledIconColor.toColor()
                 .copy(alpha = AssistChipTokens.DisabledIconOpacity),
         disabledTrailingIconContentColor: Color = disabledLeadingIconContentColor,
-    ): ChipColors = DefaultChipColors(
+    ): ChipColors = ChipColors(
         containerColor = containerColor,
         labelColor = labelColor,
         leadingIconContentColor = leadingIconContentColor,
@@ -1000,25 +775,14 @@
         hoveredElevation: Dp = AssistChipTokens.ElevatedHoverContainerElevation,
         draggedElevation: Dp = AssistChipTokens.DraggedContainerElevation,
         disabledElevation: Dp = AssistChipTokens.ElevatedDisabledContainerElevation
-    ): ChipElevation {
-        return remember(
-            defaultElevation,
-            pressedElevation,
-            focusedElevation,
-            hoveredElevation,
-            draggedElevation,
-            disabledElevation
-        ) {
-            DefaultChipElevation(
-                defaultElevation = defaultElevation,
-                pressedElevation = pressedElevation,
-                focusedElevation = focusedElevation,
-                hoveredElevation = hoveredElevation,
-                draggedElevation = draggedElevation,
-                disabledElevation = disabledElevation
-            )
-        }
-    }
+    ): ChipElevation = ChipElevation(
+        defaultElevation = defaultElevation,
+        pressedElevation = pressedElevation,
+        focusedElevation = focusedElevation,
+        hoveredElevation = hoveredElevation,
+        draggedElevation = draggedElevation,
+        disabledElevation = disabledElevation
+    )
 
     /** Default shape of an assist chip. */
     val shape: Shape @Composable get() = AssistChipTokens.ContainerShape.toShape()
@@ -1076,7 +840,7 @@
         selectedLabelColor: Color = FilterChipTokens.SelectedLabelTextColor.toColor(),
         selectedLeadingIconColor: Color = FilterChipTokens.SelectedIconColor.toColor(),
         selectedTrailingIconColor: Color = selectedLeadingIconColor
-    ): SelectableChipColors = DefaultSelectableChipColors(
+    ): SelectableChipColors = SelectableChipColors(
         containerColor = containerColor,
         labelColor = labelColor,
         leadingIconColor = iconColor,
@@ -1112,25 +876,14 @@
         hoveredElevation: Dp = FilterChipTokens.FlatSelectedHoverContainerElevation,
         draggedElevation: Dp = FilterChipTokens.DraggedContainerElevation,
         disabledElevation: Dp = defaultElevation
-    ): SelectableChipElevation {
-        return remember(
-            defaultElevation,
-            pressedElevation,
-            focusedElevation,
-            hoveredElevation,
-            draggedElevation,
-            disabledElevation
-        ) {
-            DefaultSelectableChipElevation(
-                defaultElevation = defaultElevation,
-                pressedElevation = pressedElevation,
-                focusedElevation = focusedElevation,
-                hoveredElevation = hoveredElevation,
-                draggedElevation = draggedElevation,
-                disabledElevation = disabledElevation
-            )
-        }
-    }
+    ): SelectableChipElevation = SelectableChipElevation(
+        defaultElevation = defaultElevation,
+        pressedElevation = pressedElevation,
+        focusedElevation = focusedElevation,
+        hoveredElevation = hoveredElevation,
+        draggedElevation = draggedElevation,
+        disabledElevation = disabledElevation
+    )
 
     /**
      * Creates a [SelectableChipBorder] that represents the default border used in a flat
@@ -1154,25 +907,14 @@
         disabledSelectedBorderColor: Color = Color.Transparent,
         borderWidth: Dp = FilterChipTokens.FlatUnselectedOutlineWidth,
         selectedBorderWidth: Dp = FilterChipTokens.FlatSelectedOutlineWidth,
-    ): SelectableChipBorder {
-        return remember(
-            borderColor,
-            selectedBorderColor,
-            disabledBorderColor,
-            disabledSelectedBorderColor,
-            borderWidth,
-            selectedBorderWidth
-        ) {
-            DefaultSelectableChipBorder(
-                borderColor = borderColor,
-                selectedBorderColor = selectedBorderColor,
-                disabledBorderColor = disabledBorderColor,
-                disabledSelectedBorderColor = disabledSelectedBorderColor,
-                borderWidth = borderWidth,
-                selectedBorderWidth = selectedBorderWidth
-            )
-        }
-    }
+    ): SelectableChipBorder = SelectableChipBorder(
+        borderColor = borderColor,
+        selectedBorderColor = selectedBorderColor,
+        disabledBorderColor = disabledBorderColor,
+        disabledSelectedBorderColor = disabledSelectedBorderColor,
+        borderWidth = borderWidth,
+        selectedBorderWidth = selectedBorderWidth
+    )
 
     /**
      * Creates a [SelectableChipColors] that represents the default container and content colors
@@ -1209,7 +951,7 @@
         selectedLabelColor: Color = FilterChipTokens.SelectedLabelTextColor.toColor(),
         selectedLeadingIconColor: Color = FilterChipTokens.SelectedIconColor.toColor(),
         selectedTrailingIconColor: Color = selectedLeadingIconColor
-    ): SelectableChipColors = DefaultSelectableChipColors(
+    ): SelectableChipColors = SelectableChipColors(
         containerColor = containerColor,
         labelColor = labelColor,
         leadingIconColor = iconColor,
@@ -1245,25 +987,14 @@
         hoveredElevation: Dp = FilterChipTokens.ElevatedHoverContainerElevation,
         draggedElevation: Dp = FilterChipTokens.DraggedContainerElevation,
         disabledElevation: Dp = FilterChipTokens.ElevatedDisabledContainerElevation
-    ): SelectableChipElevation {
-        return remember(
-            defaultElevation,
-            pressedElevation,
-            focusedElevation,
-            hoveredElevation,
-            draggedElevation,
-            disabledElevation
-        ) {
-            DefaultSelectableChipElevation(
-                defaultElevation = defaultElevation,
-                pressedElevation = pressedElevation,
-                focusedElevation = focusedElevation,
-                hoveredElevation = hoveredElevation,
-                draggedElevation = draggedElevation,
-                disabledElevation = disabledElevation
-            )
-        }
-    }
+    ): SelectableChipElevation = SelectableChipElevation(
+        defaultElevation = defaultElevation,
+        pressedElevation = pressedElevation,
+        focusedElevation = focusedElevation,
+        hoveredElevation = hoveredElevation,
+        draggedElevation = draggedElevation,
+        disabledElevation = disabledElevation
+    )
 
     /** Default shape of a filter chip. */
     val shape: Shape @Composable get() = FilterChipTokens.ContainerShape.toShape()
@@ -1329,7 +1060,7 @@
         selectedLabelColor: Color = InputChipTokens.SelectedLabelTextColor.toColor(),
         selectedLeadingIconColor: Color = InputChipTokens.SelectedLeadingIconColor.toColor(),
         selectedTrailingIconColor: Color = InputChipTokens.SelectedTrailingIconColor.toColor()
-    ): SelectableChipColors = DefaultSelectableChipColors(
+    ): SelectableChipColors = SelectableChipColors(
         containerColor = containerColor,
         labelColor = labelColor,
         leadingIconColor = leadingIconColor,
@@ -1365,25 +1096,14 @@
         hoveredElevation: Dp = defaultElevation,
         draggedElevation: Dp = InputChipTokens.DraggedContainerElevation,
         disabledElevation: Dp = defaultElevation
-    ): SelectableChipElevation {
-        return remember(
-            defaultElevation,
-            pressedElevation,
-            focusedElevation,
-            hoveredElevation,
-            draggedElevation,
-            disabledElevation
-        ) {
-            DefaultSelectableChipElevation(
-                defaultElevation = defaultElevation,
-                pressedElevation = pressedElevation,
-                focusedElevation = focusedElevation,
-                hoveredElevation = hoveredElevation,
-                draggedElevation = draggedElevation,
-                disabledElevation = disabledElevation
-            )
-        }
-    }
+    ): SelectableChipElevation = SelectableChipElevation(
+        defaultElevation = defaultElevation,
+        pressedElevation = pressedElevation,
+        focusedElevation = focusedElevation,
+        hoveredElevation = hoveredElevation,
+        draggedElevation = draggedElevation,
+        disabledElevation = disabledElevation
+    )
 
     /**
      * Creates a [SelectableChipBorder] that represents the default border used in an [InputChip].
@@ -1406,25 +1126,14 @@
         disabledSelectedBorderColor: Color = Color.Transparent,
         borderWidth: Dp = InputChipTokens.UnselectedOutlineWidth,
         selectedBorderWidth: Dp = InputChipTokens.SelectedOutlineWidth,
-    ): SelectableChipBorder {
-        return remember(
-            borderColor,
-            selectedBorderColor,
-            disabledBorderColor,
-            disabledSelectedBorderColor,
-            borderWidth,
-            selectedBorderWidth
-        ) {
-            DefaultSelectableChipBorder(
-                borderColor = borderColor,
-                selectedBorderColor = selectedBorderColor,
-                disabledBorderColor = disabledBorderColor,
-                disabledSelectedBorderColor = disabledSelectedBorderColor,
-                borderWidth = borderWidth,
-                selectedBorderWidth = selectedBorderWidth
-            )
-        }
-    }
+    ): SelectableChipBorder = SelectableChipBorder(
+        borderColor = borderColor,
+        selectedBorderColor = selectedBorderColor,
+        disabledBorderColor = disabledBorderColor,
+        disabledSelectedBorderColor = disabledSelectedBorderColor,
+        borderWidth = borderWidth,
+        selectedBorderWidth = selectedBorderWidth
+    )
 
     /** Default shape of an input chip. */
     val shape: Shape @Composable get() = InputChipTokens.ContainerShape.toShape()
@@ -1444,8 +1153,7 @@
     /**
      * The size of a suggestion chip icon.
      */
-    // TODO(b/229778210): Read from the tokens when available.
-    val IconSize = 18.dp
+    val IconSize = SuggestionChipTokens.LeadingIconSize
 
     /**
      * Creates a [ChipColors] that represents the default container, label, and icon colors used in
@@ -1462,15 +1170,13 @@
     fun suggestionChipColors(
         containerColor: Color = Color.Transparent,
         labelColor: Color = SuggestionChipTokens.LabelTextColor.toColor(),
-        // TODO(b/229778210): Read from the tokens when available
-        //  (i.e. SuggestionChipTokens.IconColor.toColor()).
-        iconContentColor: Color = MaterialTheme.colorScheme.onSurfaceVariant,
+        iconContentColor: Color = SuggestionChipTokens.LeadingIconColor.toColor(),
         disabledContainerColor: Color = Color.Transparent,
         disabledLabelColor: Color = SuggestionChipTokens.DisabledLabelTextColor.toColor()
             .copy(alpha = SuggestionChipTokens.DisabledLabelTextOpacity),
-        // TODO(b/229778210): Read from the tokens when available.
-        disabledIconContentColor: Color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f)
-    ): ChipColors = DefaultChipColors(
+        disabledIconContentColor: Color = SuggestionChipTokens.DisabledLeadingIconColor.toColor()
+            .copy(alpha = SuggestionChipTokens.DisabledLeadingIconOpacity)
+    ): ChipColors = ChipColors(
         containerColor = containerColor,
         labelColor = labelColor,
         leadingIconContentColor = iconContentColor,
@@ -1501,25 +1207,14 @@
         hoveredElevation: Dp = defaultElevation,
         draggedElevation: Dp = SuggestionChipTokens.DraggedContainerElevation,
         disabledElevation: Dp = defaultElevation
-    ): ChipElevation {
-        return remember(
-            defaultElevation,
-            pressedElevation,
-            focusedElevation,
-            hoveredElevation,
-            draggedElevation,
-            disabledElevation
-        ) {
-            DefaultChipElevation(
-                defaultElevation = defaultElevation,
-                pressedElevation = pressedElevation,
-                focusedElevation = focusedElevation,
-                hoveredElevation = hoveredElevation,
-                draggedElevation = draggedElevation,
-                disabledElevation = disabledElevation
-            )
-        }
-    }
+    ): ChipElevation = ChipElevation(
+        defaultElevation = defaultElevation,
+        pressedElevation = pressedElevation,
+        focusedElevation = focusedElevation,
+        hoveredElevation = hoveredElevation,
+        draggedElevation = draggedElevation,
+        disabledElevation = disabledElevation
+    )
 
     /**
      * Creates a [ChipBorder] that represents the default border used in a flat [SuggestionChip].
@@ -1534,17 +1229,11 @@
         disabledBorderColor: Color = SuggestionChipTokens.FlatDisabledOutlineColor.toColor()
             .copy(alpha = SuggestionChipTokens.FlatDisabledOutlineOpacity),
         borderWidth: Dp = SuggestionChipTokens.FlatOutlineWidth,
-    ): ChipBorder {
-        return remember(
-            borderColor, disabledBorderColor, borderWidth
-        ) {
-            DefaultChipBorder(
-                borderColor = borderColor,
-                disabledBorderColor = disabledBorderColor,
-                borderWidth = borderWidth
-            )
-        }
-    }
+    ): ChipBorder = ChipBorder(
+        borderColor = borderColor,
+        disabledBorderColor = disabledBorderColor,
+        borderWidth = borderWidth
+    )
 
     /**
      * Creates a [ChipColors] that represents the default container, label, and icon colors used in
@@ -1571,7 +1260,7 @@
             .copy(alpha = SuggestionChipTokens.DisabledLabelTextOpacity),
         // TODO(b/229778210): Read from the tokens when available.
         disabledIconContentColor: Color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f)
-    ): ChipColors = DefaultChipColors(
+    ): ChipColors = ChipColors(
         containerColor = containerColor,
         labelColor = labelColor,
         leadingIconContentColor = iconContentColor,
@@ -1602,25 +1291,14 @@
         hoveredElevation: Dp = SuggestionChipTokens.ElevatedHoverContainerElevation,
         draggedElevation: Dp = SuggestionChipTokens.DraggedContainerElevation,
         disabledElevation: Dp = SuggestionChipTokens.ElevatedDisabledContainerElevation
-    ): ChipElevation {
-        return remember(
-            defaultElevation,
-            pressedElevation,
-            focusedElevation,
-            hoveredElevation,
-            draggedElevation,
-            disabledElevation
-        ) {
-            DefaultChipElevation(
-                defaultElevation = defaultElevation,
-                pressedElevation = pressedElevation,
-                focusedElevation = focusedElevation,
-                hoveredElevation = hoveredElevation,
-                draggedElevation = draggedElevation,
-                disabledElevation = disabledElevation
-            )
-        }
-    }
+    ): ChipElevation = ChipElevation(
+        defaultElevation = defaultElevation,
+        pressedElevation = pressedElevation,
+        focusedElevation = focusedElevation,
+        hoveredElevation = hoveredElevation,
+        draggedElevation = draggedElevation,
+        disabledElevation = disabledElevation
+    )
 
     /** Default shape of a suggestion chip. */
     val shape: Shape @Composable get() = SuggestionChipTokens.ContainerShape.toShape()
@@ -1699,9 +1377,9 @@
         enabled = enabled,
         shape = shape,
         color = colors.containerColor(enabled, selected).value,
-        tonalElevation = elevation?.tonalElevation(enabled, selected, interactionSource)?.value
+        tonalElevation = elevation?.tonalElevation(enabled, interactionSource)?.value
             ?: 0.dp,
-        shadowElevation = elevation?.shadowElevation(enabled, selected, interactionSource)?.value
+        shadowElevation = elevation?.shadowElevation(enabled, interactionSource)?.value
             ?: 0.dp,
         border = border,
         interactionSource = interactionSource,
@@ -1764,27 +1442,53 @@
     }
 }
 
-/** Default [ChipElevation] implementation. */
+/**
+ * Represents the elevation for a chip in different states.
+ */
 @ExperimentalMaterial3Api
 @Immutable
-private class DefaultChipElevation(
+class ChipElevation internal constructor(
     private val defaultElevation: Dp,
     private val pressedElevation: Dp,
     private val focusedElevation: Dp,
     private val hoveredElevation: Dp,
     private val draggedElevation: Dp,
     private val disabledElevation: Dp
-) : ChipElevation {
+) {
+    /**
+     * Represents the tonal elevation used in a chip, depending on its [enabled] state and
+     * [interactionSource]. This should typically be the same value as the [shadowElevation].
+     *
+     * Tonal elevation is used to apply a color shift to the surface to give the it higher emphasis.
+     * When surface's color is [ColorScheme.surface], a higher elevation will result in a darker
+     * color in light theme and lighter color in dark theme.
+     *
+     * See [shadowElevation] which controls the elevation of the shadow drawn around the chip.
+     *
+     * @param enabled whether the chip is enabled
+     * @param interactionSource the [InteractionSource] for this chip
+     */
     @Composable
-    override fun tonalElevation(
+    internal fun tonalElevation(
         enabled: Boolean,
         interactionSource: InteractionSource
     ): State<Dp> {
         return animateElevation(enabled = enabled, interactionSource = interactionSource)
     }
 
+    /**
+     * Represents the shadow elevation used in a chip, depending on its [enabled] state and
+     * [interactionSource]. This should typically be the same value as the [tonalElevation].
+     *
+     * Shadow elevation is used to apply a shadow around the chip to give it higher emphasis.
+     *
+     * See [tonalElevation] which controls the elevation with a color shift to the surface.
+     *
+     * @param enabled whether the chip is enabled
+     * @param interactionSource the [InteractionSource] for this chip
+     */
     @Composable
-    override fun shadowElevation(
+    internal fun shadowElevation(
         enabled: Boolean,
         interactionSource: InteractionSource
     ): State<Dp> {
@@ -1870,10 +1574,32 @@
 
         return animatable.asState()
     }
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other == null || other !is ChipElevation) return false
+
+        if (defaultElevation != other.defaultElevation) return false
+        if (pressedElevation != other.pressedElevation) return false
+        if (focusedElevation != other.focusedElevation) return false
+        if (hoveredElevation != other.hoveredElevation) return false
+        if (disabledElevation != other.disabledElevation) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = defaultElevation.hashCode()
+        result = 31 * result + pressedElevation.hashCode()
+        result = 31 * result + focusedElevation.hashCode()
+        result = 31 * result + hoveredElevation.hashCode()
+        result = 31 * result + disabledElevation.hashCode()
+        return result
+    }
 }
 
 /**
- * Default [SelectableChipElevation] implementation.
+ * Represents the elevation used in a selectable chip in different states.
  *
  * Note that this default implementation does not take into consideration the `selectable` state
  * passed into its [tonalElevation] and [shadowElevation]. If you wish to apply that state, use a
@@ -1881,27 +1607,49 @@
  */
 @ExperimentalMaterial3Api
 @Immutable
-private class DefaultSelectableChipElevation(
+class SelectableChipElevation internal constructor(
     private val defaultElevation: Dp,
     private val pressedElevation: Dp,
     private val focusedElevation: Dp,
     private val hoveredElevation: Dp,
     private val draggedElevation: Dp,
     private val disabledElevation: Dp
-) : SelectableChipElevation {
+) {
+    /**
+     * Represents the tonal elevation used in a chip, depending on [enabled] and
+     * [interactionSource]. This should typically be the same value as the [shadowElevation].
+     *
+     * Tonal elevation is used to apply a color shift to the surface to give the it higher emphasis.
+     * When surface's color is [ColorScheme.surface], a higher elevation will result in a darker
+     * color in light theme and lighter color in dark theme.
+     *
+     * See [shadowElevation] which controls the elevation of the shadow drawn around the Chip.
+     *
+     * @param enabled whether the chip is enabled
+     * @param interactionSource the [InteractionSource] for this chip
+     */
     @Composable
-    override fun tonalElevation(
+    internal fun tonalElevation(
         enabled: Boolean,
-        selected: Boolean,
         interactionSource: InteractionSource
     ): State<Dp> {
         return animateElevation(enabled = enabled, interactionSource = interactionSource)
     }
 
+    /**
+     * Represents the shadow elevation used in a chip, depending on [enabled] and
+     * [interactionSource]. This should typically be the same value as the [tonalElevation].
+     *
+     * Shadow elevation is used to apply a shadow around the surface to give it higher emphasis.
+     *
+     * See [tonalElevation] which controls the elevation with a color shift to the surface.
+     *
+     * @param enabled whether the chip is enabled
+     * @param interactionSource the [InteractionSource] for this chip
+     */
     @Composable
-    override fun shadowElevation(
+    internal fun shadowElevation(
         enabled: Boolean,
-        selected: Boolean,
         interactionSource: InteractionSource
     ): State<Dp> {
         return animateElevation(enabled = enabled, interactionSource = interactionSource)
@@ -1986,14 +1734,39 @@
 
         return animatable.asState()
     }
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other == null || other !is SelectableChipElevation) return false
+
+        if (defaultElevation != other.defaultElevation) return false
+        if (pressedElevation != other.pressedElevation) return false
+        if (focusedElevation != other.focusedElevation) return false
+        if (hoveredElevation != other.hoveredElevation) return false
+        if (disabledElevation != other.disabledElevation) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = defaultElevation.hashCode()
+        result = 31 * result + pressedElevation.hashCode()
+        result = 31 * result + focusedElevation.hashCode()
+        result = 31 * result + hoveredElevation.hashCode()
+        result = 31 * result + disabledElevation.hashCode()
+        return result
+    }
 }
 
 /**
- * Default [ChipColors] implementation.
+ * Represents the container and content colors used in a clickable chip in different states.
+ *
+ * See [AssistChipDefaults], [InputChipDefaults], and [SuggestionChipDefaults] for the default
+ * colors used in the various Chip configurations.
  */
 @ExperimentalMaterial3Api
 @Immutable
-private class DefaultChipColors(
+class ChipColors internal constructor(
     private val containerColor: Color,
     private val labelColor: Color,
     private val leadingIconContentColor: Color,
@@ -2003,26 +1776,46 @@
     private val disabledLeadingIconContentColor: Color,
     private val disabledTrailingIconContentColor: Color
     // TODO(b/113855296): Support other states: hover, focus, drag
-) : ChipColors {
+) {
+    /**
+     * Represents the container color for this chip, depending on [enabled].
+     *
+     * @param enabled whether the chip is enabled
+     */
     @Composable
-    override fun containerColor(enabled: Boolean): State<Color> {
+    internal fun containerColor(enabled: Boolean): State<Color> {
         return rememberUpdatedState(if (enabled) containerColor else disabledContainerColor)
     }
 
+    /**
+     * Represents the label color for this chip, depending on [enabled].
+     *
+     * @param enabled whether the chip is enabled
+     */
     @Composable
-    override fun labelColor(enabled: Boolean): State<Color> {
+    internal fun labelColor(enabled: Boolean): State<Color> {
         return rememberUpdatedState(if (enabled) labelColor else disabledLabelColor)
     }
 
+    /**
+     * Represents the leading icon's content color for this chip, depending on [enabled].
+     *
+     * @param enabled whether the chip is enabled
+     */
     @Composable
-    override fun leadingIconContentColor(enabled: Boolean): State<Color> {
+    internal fun leadingIconContentColor(enabled: Boolean): State<Color> {
         return rememberUpdatedState(
             if (enabled) leadingIconContentColor else disabledLeadingIconContentColor
         )
     }
 
+    /**
+     * Represents the trailing icon's content color for this chip, depending on [enabled].
+     *
+     * @param enabled whether the chip is enabled
+     */
     @Composable
-    override fun trailingIconContentColor(enabled: Boolean): State<Color> {
+    internal fun trailingIconContentColor(enabled: Boolean): State<Color> {
         return rememberUpdatedState(
             if (enabled) trailingIconContentColor else disabledTrailingIconContentColor
         )
@@ -2030,9 +1823,7 @@
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
-        if (other == null || this::class != other::class) return false
-
-        other as DefaultChipColors
+        if (other == null || other !is ChipColors) return false
 
         if (containerColor != other.containerColor) return false
         if (labelColor != other.labelColor) return false
@@ -2061,11 +1852,14 @@
 }
 
 /**
- * Default [SelectableChipColors] implementation.
+ * Represents the container and content colors used in a selectable chip in different states.
+ *
+ * See [FilterChipDefaults.filterChipColors] and [FilterChipDefaults.elevatedFilterChipColors] for
+ * the default colors used in [FilterChip].
  */
 @ExperimentalMaterial3Api
 @Immutable
-private class DefaultSelectableChipColors(
+class SelectableChipColors internal constructor(
     private val containerColor: Color,
     private val labelColor: Color,
     private val leadingIconColor: Color,
@@ -2080,9 +1874,15 @@
     private val selectedLeadingIconColor: Color,
     private val selectedTrailingIconColor: Color
     // TODO(b/113855296): Support other states: hover, focus, drag
-) : SelectableChipColors {
+) {
+    /**
+     * Represents the container color for this chip, depending on [enabled] and [selected].
+     *
+     * @param enabled whether the chip is enabled
+     * @param selected whether the chip is selected
+     */
     @Composable
-    override fun containerColor(enabled: Boolean, selected: Boolean): State<Color> {
+    internal fun containerColor(enabled: Boolean, selected: Boolean): State<Color> {
         val target = when {
             !enabled -> if (selected) disabledSelectedContainerColor else disabledContainerColor
             !selected -> containerColor
@@ -2091,8 +1891,14 @@
         return rememberUpdatedState(target)
     }
 
+    /**
+     * Represents the label color for this chip, depending on [enabled] and [selected].
+     *
+     * @param enabled whether the chip is enabled
+     * @param selected whether the chip is selected
+     */
     @Composable
-    override fun labelColor(enabled: Boolean, selected: Boolean): State<Color> {
+    internal fun labelColor(enabled: Boolean, selected: Boolean): State<Color> {
         val target = when {
             !enabled -> disabledLabelColor
             !selected -> labelColor
@@ -2101,8 +1907,14 @@
         return rememberUpdatedState(target)
     }
 
+    /**
+     * Represents the leading icon color for this chip, depending on [enabled] and [selected].
+     *
+     * @param enabled whether the chip is enabled
+     * @param selected whether the chip is selected
+     */
     @Composable
-    override fun leadingIconContentColor(enabled: Boolean, selected: Boolean): State<Color> {
+    internal fun leadingIconContentColor(enabled: Boolean, selected: Boolean): State<Color> {
         val target = when {
             !enabled -> disabledLeadingIconColor
             !selected -> leadingIconColor
@@ -2111,8 +1923,14 @@
         return rememberUpdatedState(target)
     }
 
+    /**
+     * Represents the trailing icon color for this chip, depending on [enabled] and [selected].
+     *
+     * @param enabled whether the chip is enabled
+     * @param selected whether the chip is selected
+     */
     @Composable
-    override fun trailingIconContentColor(enabled: Boolean, selected: Boolean): State<Color> {
+    internal fun trailingIconContentColor(enabled: Boolean, selected: Boolean): State<Color> {
         val target = when {
             !enabled -> disabledTrailingIconColor
             !selected -> trailingIconColor
@@ -2123,9 +1941,7 @@
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
-        if (other == null || this::class != other::class) return false
-
-        other as DefaultSelectableChipColors
+        if (other == null || other !is SelectableChipColors) return false
 
         if (containerColor != other.containerColor) return false
         if (labelColor != other.labelColor) return false
@@ -2164,20 +1980,27 @@
 }
 
 /**
- * Default [SelectableChipBorder] implementation.
+ * Represents the border stroke used used in a selectable chip in different states.
  */
 @ExperimentalMaterial3Api
 @Immutable
-private class DefaultSelectableChipBorder(
+class SelectableChipBorder internal constructor(
     private val borderColor: Color,
     private val selectedBorderColor: Color,
     private val disabledBorderColor: Color,
     private val disabledSelectedBorderColor: Color,
     private val borderWidth: Dp,
     private val selectedBorderWidth: Dp
-) : SelectableChipBorder {
+) {
+    /**
+     * Represents the [BorderStroke] stroke used for this chip, depending on [enabled] and
+     * [selected].
+     *
+     * @param enabled whether the chip is enabled
+     * @param selected whether the chip is selected
+     */
     @Composable
-    override fun borderStroke(enabled: Boolean, selected: Boolean): State<BorderStroke?> {
+    internal fun borderStroke(enabled: Boolean, selected: Boolean): State<BorderStroke?> {
         val color = if (enabled) {
             if (selected) selectedBorderColor else borderColor
         } else {
@@ -2190,9 +2013,7 @@
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
-        if (other == null || this::class != other::class) return false
-
-        other as DefaultSelectableChipBorder
+        if (other == null || other !is SelectableChipBorder) return false
 
         if (borderColor != other.borderColor) return false
         if (selectedBorderColor != other.selectedBorderColor) return false
@@ -2217,17 +2038,22 @@
 }
 
 /**
- * Default [ChipBorder] implementation.
+ * Represents the border stroke used in a chip in different states.
  */
 @ExperimentalMaterial3Api
 @Immutable
-private class DefaultChipBorder(
+class ChipBorder internal constructor(
     private val borderColor: Color,
     private val disabledBorderColor: Color,
     private val borderWidth: Dp,
-) : ChipBorder {
+) {
+    /**
+     * Represents the [BorderStroke] for this chip, depending on [enabled].
+     *
+     * @param enabled whether the chip is enabled
+     */
     @Composable
-    override fun borderStroke(enabled: Boolean): State<BorderStroke?> {
+    internal fun borderStroke(enabled: Boolean): State<BorderStroke?> {
         return rememberUpdatedState(
             BorderStroke(borderWidth, if (enabled) borderColor else disabledBorderColor)
         )
@@ -2235,9 +2061,7 @@
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
-        if (other == null || this::class != other::class) return false
-
-        other as DefaultChipBorder
+        if (other == null || other !is ChipBorder) return false
 
         if (borderColor != other.borderColor) return false
         if (disabledBorderColor != other.disabledBorderColor) return false
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ColorScheme.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ColorScheme.kt
index f43dc91..19b5893 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ColorScheme.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ColorScheme.kt
@@ -607,6 +607,7 @@
 internal const val DisabledAlpha = 0.38f
 
 /** Converts a color token key to the local color scheme provided by the theme */
+@ReadOnlyComposable
 @Composable
 internal fun ColorSchemeKeyTokens.toColor(): Color {
     return MaterialTheme.colorScheme.fromToken(this)
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Divider.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Divider.kt
index 5dd5a33..73e47de 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Divider.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Divider.kt
@@ -19,7 +19,6 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.height
 import androidx.compose.material3.tokens.DividerTokens
 import androidx.compose.runtime.Composable
@@ -29,39 +28,31 @@
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
 
-// TODO: Link to M3 spec when available.
 /**
- * <a href="https://material.io/components/dividers" class="external" target="_blank">Material Design divider</a>.
+ * <a href="https://m3.material.io/components/divider/overview" class="external" target="_blank">Material Design divider</a>.
  *
  * A divider is a thin line that groups content in lists and layouts.
  *
  * ![Divider image](https://developer.android.com/images/reference/androidx/compose/material3/divider.png)
  *
- * @param modifier the [Modifier] to be applied to this divider line
- * @param color color of this divider line
+ * @param modifier the [Modifier] to be applied to this divider line.
  * @param thickness thickness of this divider line. Using [Dp.Hairline] will produce a single pixel
  * divider regardless of screen density.
- * @param startIndent start offset of this line. No offset by default.
+ * @param color color of this divider line.
  */
 @Composable
 fun Divider(
     modifier: Modifier = Modifier,
-    color: Color = DividerDefaults.color,
     thickness: Dp = DividerDefaults.Thickness,
-    startIndent: Dp = 0.dp
+    color: Color = DividerDefaults.color,
 ) {
-    val indentMod = if (startIndent.value != 0f) {
-        Modifier.padding(start = startIndent)
-    } else {
-        Modifier
-    }
     val targetThickness = if (thickness == Dp.Hairline) {
         (1f / LocalDensity.current.density).dp
     } else {
         thickness
     }
     Box(
-        modifier.then(indentMod)
+        modifier
             .fillMaxWidth()
             .height(targetThickness)
             .background(color = color)
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 8783c11..75933e7d 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
@@ -143,9 +143,6 @@
  *
  * @param onClick called when this FAB is clicked
  * @param modifier the [Modifier] to be applied to this FAB
- * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
- * for this FAB. You can create and pass in your own `remember`ed instance to observe [Interaction]s
- * and customize the appearance / behavior of this FAB in different states.
  * @param shape defines the shape of this FAB's container and shadow (when using [elevation])
  * @param containerColor the color used for the background of this FAB. Use [Color.Transparent] to
  * have no color.
@@ -156,17 +153,20 @@
  * different states. This controls the size of the shadow below the FAB. Additionally, when the
  * container color is [ColorScheme.surface], this controls the amount of primary color applied as an
  * overlay. See also: [Surface].
+ * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
+ * for this FAB. You can create and pass in your own `remember`ed instance to observe [Interaction]s
+ * and customize the appearance / behavior of this FAB in different states.
  * @param content the content of this FAB, typically an [Icon]
  */
 @Composable
 fun SmallFloatingActionButton(
     onClick: () -> Unit,
     modifier: Modifier = Modifier,
-    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
     shape: Shape = FloatingActionButtonDefaults.smallShape,
     containerColor: Color = FloatingActionButtonDefaults.containerColor,
     contentColor: Color = contentColorFor(containerColor),
     elevation: FloatingActionButtonElevation = FloatingActionButtonDefaults.elevation(),
+    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
     content: @Composable () -> Unit,
 ) {
     FloatingActionButton(
@@ -175,11 +175,11 @@
             minWidth = FabPrimarySmallTokens.ContainerWidth,
             minHeight = FabPrimarySmallTokens.ContainerHeight,
         ),
-        interactionSource = interactionSource,
         shape = shape,
         containerColor = containerColor,
         contentColor = contentColor,
         elevation = elevation,
+        interactionSource = interactionSource,
         content = content,
     )
 }
@@ -195,9 +195,6 @@
  *
  * @param onClick called when this FAB is clicked
  * @param modifier the [Modifier] to be applied to this FAB
- * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
- * for this FAB. You can create and pass in your own `remember`ed instance to observe [Interaction]s
- * and customize the appearance / behavior of this FAB in different states.
  * @param shape defines the shape of this FAB's container and shadow (when using [elevation])
  * @param containerColor the color used for the background of this FAB. Use [Color.Transparent] to
  * have no color.
@@ -208,17 +205,20 @@
  * different states. This controls the size of the shadow below the FAB. Additionally, when the
  * container color is [ColorScheme.surface], this controls the amount of primary color applied as an
  * overlay. See also: [Surface].
+ * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
+ * for this FAB. You can create and pass in your own `remember`ed instance to observe [Interaction]s
+ * and customize the appearance / behavior of this FAB in different states.
  * @param content the content of this FAB, typically an [Icon]
  */
 @Composable
 fun LargeFloatingActionButton(
     onClick: () -> Unit,
     modifier: Modifier = Modifier,
-    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
     shape: Shape = FloatingActionButtonDefaults.largeShape,
     containerColor: Color = FloatingActionButtonDefaults.containerColor,
     contentColor: Color = contentColorFor(containerColor),
     elevation: FloatingActionButtonElevation = FloatingActionButtonDefaults.elevation(),
+    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
     content: @Composable () -> Unit,
 ) {
     FloatingActionButton(
@@ -227,11 +227,11 @@
             minWidth = FabPrimaryLargeTokens.ContainerWidth,
             minHeight = FabPrimaryLargeTokens.ContainerHeight,
         ),
-        interactionSource = interactionSource,
         shape = shape,
         containerColor = containerColor,
         contentColor = contentColor,
         elevation = elevation,
+        interactionSource = interactionSource,
         content = content,
     )
 }
@@ -250,9 +250,6 @@
  *
  * @param onClick called when this FAB is clicked
  * @param modifier the [Modifier] to be applied to this FAB
- * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
- * for this FAB. You can create and pass in your own `remember`ed instance to observe [Interaction]s
- * and customize the appearance / behavior of this FAB in different states.
  * @param shape defines the shape of this FAB's container and shadow (when using [elevation])
  * @param containerColor the color used for the background of this FAB. Use [Color.Transparent] to
  * have no color.
@@ -263,27 +260,30 @@
  * different states. This controls the size of the shadow below the FAB. Additionally, when the
  * container color is [ColorScheme.surface], this controls the amount of primary color applied as an
  * overlay. See also: [Surface].
+ * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
+ * for this FAB. You can create and pass in your own `remember`ed instance to observe [Interaction]s
+ * and customize the appearance / behavior of this FAB in different states.
  * @param content the content of this FAB, typically a [Text] label
  */
 @Composable
 fun ExtendedFloatingActionButton(
     onClick: () -> Unit,
     modifier: Modifier = Modifier,
-    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
     shape: Shape = FloatingActionButtonDefaults.extendedFabShape,
     containerColor: Color = FloatingActionButtonDefaults.containerColor,
     contentColor: Color = contentColorFor(containerColor),
     elevation: FloatingActionButtonElevation = FloatingActionButtonDefaults.elevation(),
+    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
     content: @Composable RowScope.() -> Unit,
 ) {
     FloatingActionButton(
-        modifier = modifier,
         onClick = onClick,
-        interactionSource = interactionSource,
+        modifier = modifier,
         shape = shape,
         containerColor = containerColor,
         contentColor = contentColor,
         elevation = elevation,
+        interactionSource = interactionSource,
     ) {
         Row(
             modifier = Modifier
@@ -318,9 +318,6 @@
  * @param modifier the [Modifier] to be applied to this FAB
  * @param expanded controls the expansion state of this FAB. In an expanded state, the FAB will show
  * both the [icon] and [text]. In a collapsed state, the FAB will show only the [icon].
- * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
- * for this FAB. You can create and pass in your own `remember`ed instance to observe [Interaction]s
- * and customize the appearance / behavior of this FAB in different states.
  * @param shape defines the shape of this FAB's container and shadow (when using [elevation])
  * @param containerColor the color used for the background of this FAB. Use [Color.Transparent] to
  * have no color.
@@ -331,6 +328,9 @@
  * different states. This controls the size of the shadow below the FAB. Additionally, when the
  * container color is [ColorScheme.surface], this controls the amount of primary color applied as an
  * overlay. See also: [Surface].
+ * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
+ * for this FAB. You can create and pass in your own `remember`ed instance to observe [Interaction]s
+ * and customize the appearance / behavior of this FAB in different states.
  */
 @Composable
 fun ExtendedFloatingActionButton(
@@ -339,20 +339,20 @@
     onClick: () -> Unit,
     modifier: Modifier = Modifier,
     expanded: Boolean = true,
-    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
     shape: Shape = FloatingActionButtonDefaults.extendedFabShape,
     containerColor: Color = FloatingActionButtonDefaults.containerColor,
     contentColor: Color = contentColorFor(containerColor),
     elevation: FloatingActionButtonElevation = FloatingActionButtonDefaults.elevation(),
+    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
 ) {
     FloatingActionButton(
-        modifier = modifier,
         onClick = onClick,
-        interactionSource = interactionSource,
+        modifier = modifier,
         shape = shape,
         containerColor = containerColor,
         contentColor = contentColor,
         elevation = elevation,
+        interactionSource = interactionSource,
     ) {
         val startPadding = if (expanded) ExtendedFabStartIconPadding else 0.dp
         val endPadding = if (expanded) ExtendedFabTextPadding else 0.dp
@@ -383,43 +383,6 @@
 }
 
 /**
- * Represents the tonal and shadow elevation for a floating action button in different states.
- *
- * See [FloatingActionButtonDefaults.elevation] for the default elevation used in a
- * [FloatingActionButton] and [ExtendedFloatingActionButton].
- */
-@Stable
-interface FloatingActionButtonElevation {
-    /**
-     * Represents the tonal elevation used in a floating action button, depending on
-     * [interactionSource]. This should typically be the same value as the [shadowElevation].
-     *
-     * Tonal elevation is used to apply a color shift to the surface to give the it higher emphasis.
-     * When surface's color is [ColorScheme.surface], a higher the elevation will result in a darker
-     * color in light theme and lighter color in dark theme.
-     *
-     * See [shadowElevation] which controls the elevation of the shadow drawn around the FAB.
-     *
-     * @param interactionSource the [InteractionSource] for this floating action button
-     */
-    @Composable
-    fun tonalElevation(interactionSource: InteractionSource): State<Dp>
-
-    /**
-     * Represents the shadow elevation used in a floating action button, depending on
-     * [interactionSource]. This should typically be the same value as the [tonalElevation].
-     *
-     * Shadow elevation is used to apply a shadow around the FAB to give it higher emphasis.
-     *
-     * See [tonalElevation] which controls the elevation with a color shift to the surface.
-     *
-     * @param interactionSource the [InteractionSource] for this floating action button
-     */
-    @Composable
-    fun shadowElevation(interactionSource: InteractionSource): State<Dp>
-}
-
-/**
  * Contains the default values used by [FloatingActionButton]
  */
 object FloatingActionButtonDefaults {
@@ -461,21 +424,12 @@
         pressedElevation: Dp = FabPrimaryTokens.PressedContainerElevation,
         focusedElevation: Dp = FabPrimaryTokens.FocusContainerElevation,
         hoveredElevation: Dp = FabPrimaryTokens.HoverContainerElevation,
-    ): FloatingActionButtonElevation {
-        return remember(
-            defaultElevation,
-            pressedElevation,
-            focusedElevation,
-            hoveredElevation,
-        ) {
-            DefaultFloatingActionButtonElevation(
-                defaultElevation = defaultElevation,
-                pressedElevation = pressedElevation,
-                focusedElevation = focusedElevation,
-                hoveredElevation = hoveredElevation,
-            )
-        }
-    }
+    ): FloatingActionButtonElevation = FloatingActionButtonElevation(
+        defaultElevation = defaultElevation,
+        pressedElevation = pressedElevation,
+        focusedElevation = focusedElevation,
+        hoveredElevation = hoveredElevation,
+    )
 
     /**
      * Use this to create a [FloatingActionButton] with a lowered elevation for less emphasis. Use
@@ -493,40 +447,56 @@
         pressedElevation: Dp = FabPrimaryTokens.LoweredPressedContainerElevation,
         focusedElevation: Dp = FabPrimaryTokens.LoweredFocusContainerElevation,
         hoveredElevation: Dp = FabPrimaryTokens.LoweredHoverContainerElevation,
-    ): FloatingActionButtonElevation {
-        return remember(
-            defaultElevation,
-            pressedElevation,
-            focusedElevation,
-            hoveredElevation,
-        ) {
-            DefaultFloatingActionButtonElevation(
-                defaultElevation = defaultElevation,
-                pressedElevation = pressedElevation,
-                focusedElevation = focusedElevation,
-                hoveredElevation = hoveredElevation,
-            )
-        }
-    }
+    ): FloatingActionButtonElevation = FloatingActionButtonElevation(
+        defaultElevation = defaultElevation,
+        pressedElevation = pressedElevation,
+        focusedElevation = focusedElevation,
+        hoveredElevation = hoveredElevation,
+    )
+
+    /**
+     * Use this to create a [FloatingActionButton] that represents the default elevation of a
+     * [FloatingActionButton] used for [BottomAppBar] in different states.
+     *
+     * @param defaultElevation the elevation used when the [FloatingActionButton] has no other
+     * [Interaction]s.
+     * @param pressedElevation the elevation used when the [FloatingActionButton] is pressed.
+     * @param focusedElevation the elevation used when the [FloatingActionButton] is focused.
+     * @param hoveredElevation the elevation used when the [FloatingActionButton] is hovered.
+     */
+    fun bottomAppBarFabElevation(
+        defaultElevation: Dp = 0.dp,
+        pressedElevation: Dp = 0.dp,
+        focusedElevation: Dp = 0.dp,
+        hoveredElevation: Dp = 0.dp
+    ): FloatingActionButtonElevation = FloatingActionButtonElevation(
+        defaultElevation,
+        pressedElevation,
+        focusedElevation,
+        hoveredElevation
+    )
 }
 
 /**
- * Default [FloatingActionButtonElevation] implementation.
+ * Represents the tonal and shadow elevation for a floating action button in different states.
+ *
+ * See [FloatingActionButtonDefaults.elevation] for the default elevation used in a
+ * [FloatingActionButton] and [ExtendedFloatingActionButton].
  */
 @Stable
-private class DefaultFloatingActionButtonElevation(
+ open class FloatingActionButtonElevation internal constructor(
     private val defaultElevation: Dp,
     private val pressedElevation: Dp,
     private val focusedElevation: Dp,
     private val hoveredElevation: Dp,
-) : FloatingActionButtonElevation {
+) {
     @Composable
-    override fun shadowElevation(interactionSource: InteractionSource): State<Dp> {
+    internal fun shadowElevation(interactionSource: InteractionSource): State<Dp> {
         return animateElevation(interactionSource = interactionSource)
     }
 
     @Composable
-    override fun tonalElevation(interactionSource: InteractionSource): State<Dp> {
+    internal fun tonalElevation(interactionSource: InteractionSource): State<Dp> {
         return animateElevation(interactionSource = interactionSource)
     }
 
@@ -588,6 +558,26 @@
         }
         return animatable.asState()
     }
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other == null || other !is FloatingActionButtonElevation) return false
+
+        if (defaultElevation != other.defaultElevation) return false
+        if (pressedElevation != other.pressedElevation) return false
+        if (focusedElevation != other.focusedElevation) return false
+        if (hoveredElevation != other.hoveredElevation) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = defaultElevation.hashCode()
+        result = 31 * result + pressedElevation.hashCode()
+        result = 31 * result + focusedElevation.hashCode()
+        result = 31 * result + hoveredElevation.hashCode()
+        return result
+    }
 }
 
 private val ExtendedFabStartIconPadding = 16.dp
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 e231a10..1893d1a 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
@@ -31,7 +31,6 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.Immutable
-import androidx.compose.runtime.Stable
 import androidx.compose.runtime.State
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberUpdatedState
@@ -534,65 +533,6 @@
 }
 
 /**
- * Represents the container and content colors used in an icon button in different states.
- *
- * - See [IconButtonDefaults.filledIconButtonColors] and
- * [IconButtonDefaults.filledTonalIconButtonColors] for the default colors used in a
- * [FilledIconButton].
- * - See [IconButtonDefaults.outlinedIconButtonColors] for the default colors used in an
- * [OutlinedIconButton].
- */
-@Stable
-interface IconButtonColors {
-    /**
-     * Represents the container color for this icon button, depending on [enabled].
-     *
-     * @param enabled whether the icon button is enabled
-     */
-    @Composable
-    fun containerColor(enabled: Boolean): State<Color>
-
-    /**
-     * Represents the content color for this icon button, depending on [enabled].
-     *
-     * @param enabled whether the icon button is enabled
-     */
-    @Composable
-    fun contentColor(enabled: Boolean): State<Color>
-}
-
-/**
- * Represents the container and content colors used in a toggleable icon button in
- * different states.
- *
- * - See [IconButtonDefaults.filledIconToggleButtonColors] and
- * [IconButtonDefaults.filledTonalIconToggleButtonColors] for the default colors used in a
- * [FilledIconButton].
- * - See [IconButtonDefaults.outlinedIconToggleButtonColors] for the default colors used in a
- *  toggleable [OutlinedIconButton].
- */
-@Stable
-interface IconToggleButtonColors {
-    /**
-     * Represents the container color for this icon button, depending on [enabled] and [checked].
-     *
-     * @param enabled whether the icon button is enabled
-     * @param checked whether the icon button is checked
-     */
-    @Composable
-    fun containerColor(enabled: Boolean, checked: Boolean): State<Color>
-
-    /**
-     * Represents the content color for this icon button, depending on [enabled] and [checked].
-     *
-     * @param enabled whether the icon button is enabled
-     * @param checked whether the icon button is checked
-     */
-    @Composable
-    fun contentColor(enabled: Boolean, checked: Boolean): State<Color>
-}
-
-/**
  * Contains the default values used by all icon button types.
  */
 object IconButtonDefaults {
@@ -620,7 +560,7 @@
         disabledContentColor: Color =
             contentColor.copy(alpha = IconButtonTokens.DisabledIconOpacity)
     ): IconButtonColors =
-        DefaultIconButtonColors(
+        IconButtonColors(
             containerColor = containerColor,
             contentColor = contentColor,
             disabledContainerColor = disabledContainerColor,
@@ -648,7 +588,7 @@
         checkedContainerColor: Color = Color.Transparent,
         checkedContentColor: Color = IconButtonTokens.SelectedIconColor.toColor()
     ): IconToggleButtonColors =
-        DefaultIconToggleButtonColors(
+        IconToggleButtonColors(
             containerColor = containerColor,
             contentColor = contentColor,
             disabledContainerColor = disabledContainerColor,
@@ -674,7 +614,7 @@
         disabledContentColor: Color = FilledIconButtonTokens.DisabledColor.toColor()
             .copy(alpha = FilledIconButtonTokens.DisabledOpacity)
     ): IconButtonColors =
-        DefaultIconButtonColors(
+        IconButtonColors(
             containerColor = containerColor,
             contentColor = contentColor,
             disabledContainerColor = disabledContainerColor,
@@ -705,7 +645,7 @@
         checkedContainerColor: Color = FilledIconButtonTokens.SelectedContainerColor.toColor(),
         checkedContentColor: Color = contentColorFor(checkedContainerColor)
     ): IconToggleButtonColors =
-        DefaultIconToggleButtonColors(
+        IconToggleButtonColors(
             containerColor = containerColor,
             contentColor = contentColor,
             disabledContainerColor = disabledContainerColor,
@@ -732,7 +672,7 @@
         disabledContentColor: Color = FilledTonalIconButtonTokens.DisabledColor.toColor()
             .copy(alpha = FilledTonalIconButtonTokens.DisabledOpacity)
     ): IconButtonColors =
-        DefaultIconButtonColors(
+        IconButtonColors(
             containerColor = containerColor,
             contentColor = contentColor,
             disabledContainerColor = disabledContainerColor,
@@ -762,7 +702,7 @@
             FilledTonalIconButtonTokens.SelectedContainerColor.toColor(),
         checkedContentColor: Color = FilledTonalIconButtonTokens.ToggleSelectedColor.toColor()
     ): IconToggleButtonColors =
-        DefaultIconToggleButtonColors(
+        IconToggleButtonColors(
             containerColor = containerColor,
             contentColor = contentColor,
             disabledContainerColor = disabledContainerColor,
@@ -788,7 +728,7 @@
         disabledContentColor: Color =
             contentColor.copy(alpha = OutlinedIconButtonTokens.DisabledOpacity)
     ): IconButtonColors =
-        DefaultIconButtonColors(
+        IconButtonColors(
             containerColor = containerColor,
             contentColor = contentColor,
             disabledContainerColor = disabledContainerColor,
@@ -817,7 +757,7 @@
             OutlinedIconButtonTokens.SelectedContainerColor.toColor(),
         checkedContentColor: Color = contentColorFor(checkedContainerColor)
     ): IconToggleButtonColors =
-        DefaultIconToggleButtonColors(
+        IconToggleButtonColors(
             containerColor = containerColor,
             contentColor = contentColor,
             disabledContainerColor = disabledContainerColor,
@@ -861,30 +801,44 @@
 }
 
 /**
- * Default [IconButtonColors] implementation.
+ * Represents the container and content colors used in an icon button in different states.
+ *
+ * - See [IconButtonDefaults.filledIconButtonColors] and
+ * [IconButtonDefaults.filledTonalIconButtonColors] for the default colors used in a
+ * [FilledIconButton].
+ * - See [IconButtonDefaults.outlinedIconButtonColors] for the default colors used in an
+ * [OutlinedIconButton].
  */
 @Immutable
-private class DefaultIconButtonColors(
+class IconButtonColors internal constructor(
     private val containerColor: Color,
     private val contentColor: Color,
     private val disabledContainerColor: Color,
     private val disabledContentColor: Color,
-) : IconButtonColors {
+) {
+    /**
+     * Represents the container color for this icon button, depending on [enabled].
+     *
+     * @param enabled whether the icon button is enabled
+     */
     @Composable
-    override fun containerColor(enabled: Boolean): State<Color> {
+    internal fun containerColor(enabled: Boolean): State<Color> {
         return rememberUpdatedState(if (enabled) containerColor else disabledContainerColor)
     }
 
+    /**
+     * Represents the content color for this icon button, depending on [enabled].
+     *
+     * @param enabled whether the icon button is enabled
+     */
     @Composable
-    override fun contentColor(enabled: Boolean): State<Color> {
+    internal fun contentColor(enabled: Boolean): State<Color> {
         return rememberUpdatedState(if (enabled) contentColor else disabledContentColor)
     }
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
-        if (other == null || this::class != other::class) return false
-
-        other as DefaultIconButtonColors
+        if (other == null || other !is IconButtonColors) return false
 
         if (containerColor != other.containerColor) return false
         if (contentColor != other.contentColor) return false
@@ -905,19 +859,32 @@
 }
 
 /**
- * Default [IconToggleButtonColors] implementation.
+ * Represents the container and content colors used in a toggleable icon button in
+ * different states.
+ *
+ * - See [IconButtonDefaults.filledIconToggleButtonColors] and
+ * [IconButtonDefaults.filledTonalIconToggleButtonColors] for the default colors used in a
+ * [FilledIconButton].
+ * - See [IconButtonDefaults.outlinedIconToggleButtonColors] for the default colors used in a
+ *  toggleable [OutlinedIconButton].
  */
 @Immutable
-private class DefaultIconToggleButtonColors(
+class IconToggleButtonColors internal constructor(
     private val containerColor: Color,
     private val contentColor: Color,
     private val disabledContainerColor: Color,
     private val disabledContentColor: Color,
     private val checkedContainerColor: Color,
     private val checkedContentColor: Color,
-) : IconToggleButtonColors {
+) {
+    /**
+     * Represents the container color for this icon button, depending on [enabled] and [checked].
+     *
+     * @param enabled whether the icon button is enabled
+     * @param checked whether the icon button is checked
+     */
     @Composable
-    override fun containerColor(enabled: Boolean, checked: Boolean): State<Color> {
+    internal fun containerColor(enabled: Boolean, checked: Boolean): State<Color> {
         val target = when {
             !enabled -> disabledContainerColor
             !checked -> containerColor
@@ -926,8 +893,14 @@
         return rememberUpdatedState(target)
     }
 
+    /**
+     * Represents the content color for this icon button, depending on [enabled] and [checked].
+     *
+     * @param enabled whether the icon button is enabled
+     * @param checked whether the icon button is checked
+     */
     @Composable
-    override fun contentColor(enabled: Boolean, checked: Boolean): State<Color> {
+    internal fun contentColor(enabled: Boolean, checked: Boolean): State<Color> {
         val target = when {
             !enabled -> disabledContentColor
             !checked -> contentColor
@@ -938,9 +911,7 @@
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
-        if (other == null || this::class != other::class) return false
-
-        other as DefaultIconToggleButtonColors
+        if (other == null || other !is IconToggleButtonColors) return false
 
         if (containerColor != other.containerColor) return false
         if (contentColor != other.contentColor) return false
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ListItem.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ListItem.kt
index cdca4adc..1e8f666 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ListItem.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ListItem.kt
@@ -28,7 +28,6 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.Immutable
-import androidx.compose.runtime.Stable
 import androidx.compose.runtime.State
 import androidx.compose.runtime.rememberUpdatedState
 import androidx.compose.ui.Alignment
@@ -83,7 +82,7 @@
         // One-Line List Item
         ListItem(
             modifier = modifier,
-            containerColor = colors.containerColor(enabled = true).value,
+            containerColor = colors.containerColor().value,
             contentColor = colors.headlineColor(enabled = true).value,
             tonalElevation = tonalElevation,
             shadowElevation = shadowElevation,
@@ -120,7 +119,7 @@
         // Two-Line List Item
         ListItem(
             modifier = modifier,
-            containerColor = colors.containerColor(enabled = true).value,
+            containerColor = colors.containerColor().value,
             contentColor = colors.headlineColor(enabled = true).value,
             tonalElevation = tonalElevation,
             shadowElevation = shadowElevation,
@@ -146,7 +145,7 @@
                         headlineText
                     )
                     ProvideTextStyleFromToken(
-                        colors.supportingColor(enabled = true).value,
+                        colors.supportingColor().value,
                         ListTokens.ListItemSupportingTextFont,
                         supportingText!!
                     )
@@ -164,7 +163,7 @@
         // Two-Line List Item
         ListItem(
             modifier = modifier,
-            containerColor = colors.containerColor(enabled = true).value,
+            containerColor = colors.containerColor().value,
             contentColor = colors.headlineColor(enabled = true).value,
             tonalElevation = tonalElevation,
             shadowElevation = shadowElevation,
@@ -185,7 +184,7 @@
             ) {
                 Column {
                     ProvideTextStyleFromToken(
-                        colors.overlineColor(enabled = true).value,
+                        colors.overlineColor().value,
                         ListTokens.ListItemOverlineFont,
                         overlineText
                     )
@@ -208,7 +207,7 @@
         // Three-Line List Item
         ListItem(
             modifier = modifier,
-            containerColor = colors.containerColor(enabled = true).value,
+            containerColor = colors.containerColor().value,
             contentColor = colors.headlineColor(enabled = true).value,
             tonalElevation = tonalElevation,
             shadowElevation = shadowElevation,
@@ -232,7 +231,7 @@
             ) {
                 Column {
                     ProvideTextStyleFromToken(
-                        colors.overlineColor(enabled = true).value,
+                        colors.overlineColor().value,
                         ListTokens.ListItemOverlineFont,
                         overlineText
                     )
@@ -242,7 +241,7 @@
                         headlineText
                     )
                     ProvideTextStyleFromToken(
-                        colors.supportingColor(enabled = true).value,
+                        colors.supportingColor().value,
                         ListTokens.ListItemSupportingTextFont,
                         supportingText
                     )
@@ -411,7 +410,7 @@
         disabledTrailingIconColor: Color = ListTokens.ListItemDisabledTrailingIconColor.toColor()
             .copy(alpha = ListTokens.ListItemDisabledTrailingIconOpacity)
     ): ListItemColors =
-        DefaultListItemColors(
+        ListItemColors(
             containerColor = containerColor,
             headlineColor = headlineColor,
             leadingIconColor = leadingIconColor,
@@ -429,39 +428,9 @@
  *
  * - See [ListItemDefaults.colors] for the default colors used in a [ListItem].
  */
-@Stable
-@ExperimentalMaterial3Api
-interface ListItemColors {
-
-    /** The container color of this [ListItem] based on enabled state */
-    @Composable
-    fun containerColor(enabled: Boolean): State<Color>
-
-    /** The color of this [ListItem]'s headline text based on enabled state */
-    @Composable
-    fun headlineColor(enabled: Boolean): State<Color>
-
-    /** The color of this [ListItem]'s leading content based on enabled state */
-    @Composable
-    fun leadingIconColor(enabled: Boolean): State<Color>
-
-    /** The color of this [ListItem]'s overline text based on enabled state */
-    @Composable
-    fun overlineColor(enabled: Boolean): State<Color>
-
-    /** The color of this [ListItem]'s supporting text based on enabled state */
-    @Composable
-    fun supportingColor(enabled: Boolean): State<Color>
-
-    /** The color of this [ListItem]'s trailing content based on enabled state */
-    @Composable
-    fun trailingIconColor(enabled: Boolean): State<Color>
-}
-
-/** Default [ListItemColors] implementation. */
 @ExperimentalMaterial3Api
 @Immutable
-private class DefaultListItemColors(
+class ListItemColors internal constructor(
     private val containerColor: Color,
     private val headlineColor: Color,
     private val leadingIconColor: Color,
@@ -471,38 +440,44 @@
     private val disabledHeadlineColor: Color,
     private val disabledLeadingIconColor: Color,
     private val disabledTrailingIconColor: Color,
-) : ListItemColors {
+) {
+    /** The container color of this [ListItem] based on enabled state */
     @Composable
-    override fun containerColor(enabled: Boolean): State<Color> {
+    internal fun containerColor(): State<Color> {
         return rememberUpdatedState(containerColor)
     }
 
+    /** The color of this [ListItem]'s headline text based on enabled state */
     @Composable
-    override fun headlineColor(enabled: Boolean): State<Color> {
+    internal fun headlineColor(enabled: Boolean): State<Color> {
         return rememberUpdatedState(
             if (enabled) headlineColor else disabledHeadlineColor
         )
     }
 
+    /** The color of this [ListItem]'s leading content based on enabled state */
     @Composable
-    override fun leadingIconColor(enabled: Boolean): State<Color> {
+    internal fun leadingIconColor(enabled: Boolean): State<Color> {
         return rememberUpdatedState(
             if (enabled) leadingIconColor else disabledLeadingIconColor
         )
     }
 
+    /** The color of this [ListItem]'s overline text based on enabled state */
     @Composable
-    override fun overlineColor(enabled: Boolean): State<Color> {
+    internal fun overlineColor(): State<Color> {
         return rememberUpdatedState(overlineColor)
     }
 
+    /** The color of this [ListItem]'s supporting text based on enabled state */
     @Composable
-    override fun supportingColor(enabled: Boolean): State<Color> {
+    internal fun supportingColor(): State<Color> {
         return rememberUpdatedState(supportingTextColor)
     }
 
+    /** The color of this [ListItem]'s trailing content based on enabled state */
     @Composable
-    override fun trailingIconColor(enabled: Boolean): State<Color> {
+    internal fun trailingIconColor(enabled: Boolean): State<Color> {
         return rememberUpdatedState(
             if (enabled) trailingIconColor else disabledTrailingIconColor
         )
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Menu.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Menu.kt
index c78fa9f..0ff7c120 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Menu.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Menu.kt
@@ -42,7 +42,6 @@
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.Immutable
 import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.Stable
 import androidx.compose.runtime.State
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.rememberUpdatedState
@@ -182,7 +181,8 @@
             }
             CompositionLocalProvider(LocalContentColor provides colors.textColor(enabled).value) {
                 Box(
-                    Modifier.weight(1f)
+                    Modifier
+                        .weight(1f)
                         .padding(
                             start = if (leadingIcon != null) {
                                 DropdownMenuItemHorizontalPadding
@@ -243,15 +243,14 @@
             .copy(alpha = MenuTokens.ListItemDisabledLeadingIconOpacity),
         disabledTrailingIconColor: Color = MenuTokens.ListItemDisabledTrailingIconColor.toColor()
             .copy(alpha = MenuTokens.ListItemDisabledTrailingIconOpacity),
-    ): MenuItemColors =
-        DefaultMenuItemColors(
-            textColor = textColor,
-            leadingIconColor = leadingIconColor,
-            trailingIconColor = trailingIconColor,
-            disabledTextColor = disabledTextColor,
-            disabledLeadingIconColor = disabledLeadingIconColor,
-            disabledTrailingIconColor = disabledTrailingIconColor,
-        )
+    ): MenuItemColors = MenuItemColors(
+        textColor = textColor,
+        leadingIconColor = leadingIconColor,
+        trailingIconColor = trailingIconColor,
+        disabledTextColor = disabledTextColor,
+        disabledLeadingIconColor = disabledLeadingIconColor,
+        disabledTrailingIconColor = disabledTrailingIconColor,
+    )
 
     /**
      * Default padding used for [DropdownMenuItem].
@@ -262,39 +261,6 @@
     )
 }
 
-/**
- * Represents the text and icon colors used in a menu item at different states.
- *
- * - See [MenuDefaults.itemColors] for the default colors used in a [DropdownMenuItemContent].
- */
-@Stable
-interface MenuItemColors {
-
-    /**
-     * Represents the text color for a menu item, depending on its [enabled] state.
-     *
-     * @param enabled whether the menu item is enabled
-     */
-    @Composable
-    fun textColor(enabled: Boolean): State<Color>
-
-    /**
-     * Represents the leading icon color for a menu item, depending on its [enabled] state.
-     *
-     * @param enabled whether the menu item is enabled
-     */
-    @Composable
-    fun leadingIconColor(enabled: Boolean): State<Color>
-
-    /**
-     * Represents the trailing icon color for a menu item, depending on its [enabled] state.
-     *
-     * @param enabled whether the menu item is enabled
-     */
-    @Composable
-    fun trailingIconColor(enabled: Boolean): State<Color>
-}
-
 internal fun calculateTransformOrigin(
     parentBounds: IntRect,
     menuBounds: IntRect
@@ -395,37 +361,53 @@
     }
 }
 
-/** Default [MenuItemColors] implementation. */
+/**
+ * Represents the text and icon colors used in a menu item at different states.
+ *
+ * - See [MenuDefaults.itemColors] for the default colors used in a [DropdownMenuItemContent].
+ */
 @Immutable
-private class DefaultMenuItemColors(
+class MenuItemColors internal constructor(
     private val textColor: Color,
     private val leadingIconColor: Color,
     private val trailingIconColor: Color,
     private val disabledTextColor: Color,
     private val disabledLeadingIconColor: Color,
     private val disabledTrailingIconColor: Color,
-) : MenuItemColors {
-
+) {
+    /**
+     * Represents the text color for a menu item, depending on its [enabled] state.
+     *
+     * @param enabled whether the menu item is enabled
+     */
     @Composable
-    override fun textColor(enabled: Boolean): State<Color> {
+    internal fun textColor(enabled: Boolean): State<Color> {
         return rememberUpdatedState(if (enabled) textColor else disabledTextColor)
     }
 
+    /**
+     * Represents the leading icon color for a menu item, depending on its [enabled] state.
+     *
+     * @param enabled whether the menu item is enabled
+     */
     @Composable
-    override fun leadingIconColor(enabled: Boolean): State<Color> {
+    internal fun leadingIconColor(enabled: Boolean): State<Color> {
         return rememberUpdatedState(if (enabled) leadingIconColor else disabledLeadingIconColor)
     }
 
+    /**
+     * Represents the trailing icon color for a menu item, depending on its [enabled] state.
+     *
+     * @param enabled whether the menu item is enabled
+     */
     @Composable
-    override fun trailingIconColor(enabled: Boolean): State<Color> {
+    internal fun trailingIconColor(enabled: Boolean): State<Color> {
         return rememberUpdatedState(if (enabled) trailingIconColor else disabledTrailingIconColor)
     }
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
-        if (other == null || this::class != other::class) return false
-
-        other as DefaultMenuItemColors
+        if (other == null || other !is MenuItemColors) return false
 
         if (textColor != other.textColor) return false
         if (leadingIconColor != other.leadingIconColor) return false
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt
index a6ffd46..bf42087 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt
@@ -27,9 +27,13 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.RowScope
+import androidx.compose.foundation.layout.WindowInsets
+import androidx.compose.foundation.layout.WindowInsetsSides
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.only
 import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.windowInsetsPadding
 import androidx.compose.foundation.selection.selectable
 import androidx.compose.foundation.selection.selectableGroup
 import androidx.compose.material.ripple.rememberRipple
@@ -88,6 +92,7 @@
  * @param tonalElevation when [containerColor] is [ColorScheme.surface], a translucent primary color
  * overlay is applied on top of the container. A higher tonal elevation value will result in a
  * darker color in light theme and lighter color in dark theme. See also: [Surface].
+ * @param windowInsets a window insets of the navigation bar.
  * @param content the content of this navigation bar, typically 3-5 [NavigationBarItem]s
  */
 @Composable
@@ -96,6 +101,7 @@
     containerColor: Color = NavigationBarDefaults.containerColor,
     contentColor: Color = MaterialTheme.colorScheme.contentColorFor(containerColor),
     tonalElevation: Dp = NavigationBarDefaults.Elevation,
+    windowInsets: WindowInsets = NavigationBarDefaults.windowInsets,
     content: @Composable RowScope.() -> Unit
 ) {
     Surface(
@@ -105,7 +111,11 @@
         modifier = modifier
     ) {
         Row(
-            modifier = Modifier.fillMaxWidth().height(NavigationBarHeight).selectableGroup(),
+            modifier = Modifier
+                .fillMaxWidth()
+                .windowInsetsPadding(windowInsets)
+                .height(NavigationBarHeight)
+                .selectableGroup(),
             horizontalArrangement = Arrangement.spacedBy(NavigationBarItemHorizontalPadding),
             content = content
         )
@@ -219,14 +229,16 @@
         // ripple, which is why they are separate composables
         val indicatorRipple = @Composable {
             Box(
-                Modifier.layoutId(IndicatorRippleLayoutIdTag)
+                Modifier
+                    .layoutId(IndicatorRippleLayoutIdTag)
                     .clip(NavigationBarTokens.ActiveIndicatorShape.toShape())
                     .indication(offsetInteractionSource, rememberRipple())
             )
         }
         val indicator = @Composable {
             Box(
-                Modifier.layoutId(IndicatorLayoutIdTag)
+                Modifier
+                    .layoutId(IndicatorLayoutIdTag)
                     .background(
                         color = colors.indicatorColor.copy(alpha = animationProgress),
                         shape = NavigationBarTokens.ActiveIndicatorShape.toShape(),
@@ -252,6 +264,14 @@
 
     /** Default color for a navigation bar. */
     val containerColor: Color @Composable get() = NavigationBarTokens.ContainerColor.toColor()
+
+    /**
+     * Default window insets to be used and consumed by navigation bar
+     */
+    val windowInsets: WindowInsets
+        @Composable
+        get() = WindowInsets.safeDrawingForVisualComponents
+            .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom)
 }
 
 /** Defaults used in [NavigationBarItem]. */
@@ -275,33 +295,35 @@
         indicatorColor: Color = NavigationBarTokens.ActiveIndicatorColor.toColor(),
         unselectedIconColor: Color = NavigationBarTokens.InactiveIconColor.toColor(),
         unselectedTextColor: Color = NavigationBarTokens.InactiveLabelTextColor.toColor(),
-    ): NavigationBarItemColors = remember(
-        selectedIconColor,
-        unselectedIconColor,
-        selectedTextColor,
-        unselectedTextColor,
-        indicatorColor
-    ) {
-        DefaultNavigationBarItemColors(
-            selectedIconColor = selectedIconColor,
-            selectedTextColor = selectedTextColor,
-            selectedIndicatorColor = indicatorColor,
-            unselectedIconColor = unselectedIconColor,
-            unselectedTextColor = unselectedTextColor,
-        )
-    }
+    ): NavigationBarItemColors = NavigationBarItemColors(
+        selectedIconColor = selectedIconColor,
+        selectedTextColor = selectedTextColor,
+        selectedIndicatorColor = indicatorColor,
+        unselectedIconColor = unselectedIconColor,
+        unselectedTextColor = unselectedTextColor,
+    )
 }
 
-/** Represents the colors of the various elements of a navigation item. */
 @Stable
-interface NavigationBarItemColors {
+class NavigationBarItemColors internal constructor(
+    private val selectedIconColor: Color,
+    private val selectedTextColor: Color,
+    private val selectedIndicatorColor: Color,
+    private val unselectedIconColor: Color,
+    private val unselectedTextColor: Color,
+) {
     /**
      * Represents the icon color for this item, depending on whether it is [selected].
      *
      * @param selected whether the item is selected
      */
     @Composable
-    fun iconColor(selected: Boolean): State<Color>
+    internal fun iconColor(selected: Boolean): State<Color> {
+        return animateColorAsState(
+            targetValue = if (selected) selectedIconColor else unselectedIconColor,
+            animationSpec = tween(ItemAnimationDurationMillis)
+        )
+    }
 
     /**
      * Represents the text color for this item, depending on whether it is [selected].
@@ -309,40 +331,38 @@
      * @param selected whether the item is selected
      */
     @Composable
-    fun textColor(selected: Boolean): State<Color>
-
-    /** Represents the color of the indicator used for selected items. */
-    val indicatorColor: Color
-        @Composable get
-}
-
-@Stable
-private class DefaultNavigationBarItemColors(
-    private val selectedIconColor: Color,
-    private val selectedTextColor: Color,
-    private val selectedIndicatorColor: Color,
-    private val unselectedIconColor: Color,
-    private val unselectedTextColor: Color,
-) : NavigationBarItemColors {
-    @Composable
-    override fun iconColor(selected: Boolean): State<Color> {
-        return animateColorAsState(
-            targetValue = if (selected) selectedIconColor else unselectedIconColor,
-            animationSpec = tween(ItemAnimationDurationMillis)
-        )
-    }
-
-    @Composable
-    override fun textColor(selected: Boolean): State<Color> {
+    internal fun textColor(selected: Boolean): State<Color> {
         return animateColorAsState(
             targetValue = if (selected) selectedTextColor else unselectedTextColor,
             animationSpec = tween(ItemAnimationDurationMillis)
         )
     }
 
-    override val indicatorColor: Color
-        @Composable
+    /** Represents the color of the indicator used for selected items. */
+    internal val indicatorColor: Color
         get() = selectedIndicatorColor
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other == null || other !is NavigationBarItemColors) return false
+
+        if (selectedIconColor != other.selectedIconColor) return false
+        if (unselectedIconColor != other.unselectedIconColor) return false
+        if (selectedTextColor != other.selectedTextColor) return false
+        if (unselectedTextColor != other.unselectedTextColor) return false
+        if (selectedIndicatorColor != other.selectedIndicatorColor) return false
+
+        return true
+    }
+    override fun hashCode(): Int {
+        var result = selectedIconColor.hashCode()
+        result = 31 * result + unselectedIconColor.hashCode()
+        result = 31 * result + selectedTextColor.hashCode()
+        result = 31 * result + unselectedTextColor.hashCode()
+        result = 31 * result + selectedIndicatorColor.hashCode()
+
+        return result
+    }
 }
 
 /**
@@ -377,7 +397,8 @@
 
         if (label != null) {
             Box(
-                Modifier.layoutId(LabelLayoutIdTag)
+                Modifier
+                    .layoutId(LabelLayoutIdTag)
                     .alpha(if (alwaysShowLabel) 1f else animationProgress)
                     .padding(horizontal = NavigationBarItemHorizontalPadding / 2)
             ) { label() }
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 d1f14be..8c8f77c 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
@@ -29,15 +29,20 @@
 import androidx.compose.foundation.layout.PaddingValues
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.WindowInsets
+import androidx.compose.foundation.layout.WindowInsetsSides
 import androidx.compose.foundation.layout.fillMaxHeight
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.offset
+import androidx.compose.foundation.layout.only
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.sizeIn
 import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.layout.windowInsetsPadding
 import androidx.compose.material3.tokens.NavigationDrawerTokens
+import androidx.compose.material3.tokens.ScrimTokens
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.Stable
@@ -446,6 +451,7 @@
  * @param drawerTonalElevation when [drawerContainerColor] is [ColorScheme.surface], a translucent
  * primary color overlay is applied on top of the container. A higher tonal elevation value will
  * result in a darker color in light theme and lighter color in dark theme. See also: [Surface].
+ * @param windowInsets a window insets for the sheet.
  * @param content content inside of a modal navigation drawer
  */
 @ExperimentalMaterial3Api
@@ -456,9 +462,11 @@
     drawerContainerColor: Color = MaterialTheme.colorScheme.surface,
     drawerContentColor: Color = contentColorFor(drawerContainerColor),
     drawerTonalElevation: Dp = DrawerDefaults.ModalDrawerElevation,
+    windowInsets: WindowInsets = DrawerDefaults.windowInsets,
     content: @Composable ColumnScope.() -> Unit
 ) {
     DrawerSheet(
+        windowInsets,
         modifier,
         drawerShape,
         drawerContainerColor,
@@ -481,6 +489,7 @@
  * @param drawerTonalElevation when [drawerContainerColor] is [ColorScheme.surface], a translucent
  * primary color overlay is applied on top of the container. A higher tonal elevation value will
  * result in a darker color in light theme and lighter color in dark theme. See also: [Surface].
+ * @param windowInsets a window insets for the sheet.
  * @param content content inside of a dismissible navigation drawer
  */
 @ExperimentalMaterial3Api
@@ -491,9 +500,11 @@
     drawerContainerColor: Color = MaterialTheme.colorScheme.surface,
     drawerContentColor: Color = contentColorFor(drawerContainerColor),
     drawerTonalElevation: Dp = DrawerDefaults.DismissibleDrawerElevation,
+    windowInsets: WindowInsets = DrawerDefaults.windowInsets,
     content: @Composable ColumnScope.() -> Unit
 ) {
     DrawerSheet(
+        windowInsets,
         modifier,
         drawerShape,
         drawerContainerColor,
@@ -516,6 +527,7 @@
  * @param drawerTonalElevation when [drawerContainerColor] is [ColorScheme.surface], a translucent
  * primary color overlay is applied on top of the container. A higher tonal elevation value will
  * result in a darker color in light theme and lighter color in dark theme. See also: [Surface].
+ * @param windowInsets a window insets for the sheet.
  * @param content content inside a permanent navigation drawer
  */
 @ExperimentalMaterial3Api
@@ -526,10 +538,12 @@
     drawerContainerColor: Color = MaterialTheme.colorScheme.surface,
     drawerContentColor: Color = contentColorFor(drawerContainerColor),
     drawerTonalElevation: Dp = DrawerDefaults.PermanentDrawerElevation,
+    windowInsets: WindowInsets = DrawerDefaults.windowInsets,
     content: @Composable ColumnScope.() -> Unit
 ) {
     val navigationMenu = getString(Strings.NavigationMenu)
     DrawerSheet(
+        windowInsets,
         modifier.semantics {
             paneTitle = navigationMenu
         },
@@ -544,6 +558,7 @@
 @ExperimentalMaterial3Api
 @Composable
 private fun DrawerSheet(
+    windowInsets: WindowInsets,
     modifier: Modifier = Modifier,
     drawerShape: Shape = RectangleShape,
     drawerContainerColor: Color = MaterialTheme.colorScheme.surface,
@@ -568,7 +583,8 @@
                 .sizeIn(
                     minWidth = MinimumDrawerWidth,
                     maxWidth = DrawerDefaults.MaximumDrawerWidth
-                ),
+                )
+                .windowInsetsPadding(windowInsets),
             content = content
         )
     }
@@ -602,13 +618,21 @@
 
     /** Default color of the scrim that obscures content when the drawer is open */
     val scrimColor: Color
-        @Composable get() = MaterialTheme.colorScheme.scrim.copy(.32f)
+        @Composable get() = ScrimTokens.ContainerColor.toColor().copy(ScrimTokens.ContainerOpacity)
 
     /** Default container color for a navigation drawer */
     val containerColor: Color @Composable get() = NavigationDrawerTokens.ContainerColor.toColor()
 
     /** Default and maximum width of a navigation drawer **/
     val MaximumDrawerWidth = NavigationDrawerTokens.ContainerWidth
+
+    /**
+     * Default window insets for drawer sheets
+     */
+    val windowInsets: WindowInsets
+        @Composable
+        get() = WindowInsets.safeDrawingForVisualComponents
+            .only(WindowInsetsSides.Vertical + WindowInsetsSides.Start)
 }
 
 /**
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationRail.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationRail.kt
index f23f0ed..b5f0582 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationRail.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationRail.kt
@@ -28,10 +28,14 @@
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.ColumnScope
 import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.WindowInsets
+import androidx.compose.foundation.layout.WindowInsetsSides
 import androidx.compose.foundation.layout.fillMaxHeight
 import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.only
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.widthIn
+import androidx.compose.foundation.layout.windowInsetsPadding
 import androidx.compose.foundation.selection.selectable
 import androidx.compose.foundation.selection.selectableGroup
 import androidx.compose.material.ripple.rememberRipple
@@ -90,6 +94,7 @@
  * either the matching content color for [containerColor], or to the current [LocalContentColor] if
  * [containerColor] is not a color from the theme.
  * @param header optional header that may hold a [FloatingActionButton] or a logo
+ * @param windowInsets a window insets of the navigation rail.
  * @param content the content of this navigation rail, typically 3-7 [NavigationRailItem]s
  */
 @Composable
@@ -98,6 +103,7 @@
     containerColor: Color = NavigationRailDefaults.ContainerColor,
     contentColor: Color = contentColorFor(containerColor),
     header: @Composable (ColumnScope.() -> Unit)? = null,
+    windowInsets: WindowInsets = NavigationRailDefaults.windowInsets,
     content: @Composable ColumnScope.() -> Unit
 ) {
     Surface(
@@ -108,6 +114,7 @@
         Column(
             Modifier
                 .fillMaxHeight()
+                .windowInsetsPadding(windowInsets)
                 .widthIn(min = NavigationRailTokens.ContainerWidth)
                 .padding(vertical = NavigationRailVerticalPadding)
                 .selectableGroup(),
@@ -255,6 +262,14 @@
 object NavigationRailDefaults {
     /** Default container color of a navigation rail. */
     val ContainerColor: Color @Composable get() = NavigationRailTokens.ContainerColor.toColor()
+
+    /**
+     * Default window insets for navigation rail.
+     */
+    val windowInsets: WindowInsets
+        @Composable
+        get() = WindowInsets.safeDrawingForVisualComponents
+            .only(WindowInsetsSides.Vertical + WindowInsetsSides.Start)
 }
 
 /** Defaults used in [NavigationRailItem]. */
@@ -277,33 +292,36 @@
         indicatorColor: Color = NavigationRailTokens.ActiveIndicatorColor.toColor(),
         unselectedIconColor: Color = NavigationRailTokens.InactiveIconColor.toColor(),
         unselectedTextColor: Color = NavigationRailTokens.InactiveLabelTextColor.toColor(),
-    ): NavigationRailItemColors = remember(
-        selectedIconColor,
-        unselectedIconColor,
-        selectedTextColor,
-        unselectedTextColor,
-        indicatorColor
-    ) {
-        DefaultNavigationRailItemColors(
-            selectedIconColor = selectedIconColor,
-            unselectedIconColor = unselectedIconColor,
-            selectedTextColor = selectedTextColor,
-            unselectedTextColor = unselectedTextColor,
-            selectedIndicatorColor = indicatorColor,
-        )
-    }
+    ): NavigationRailItemColors = NavigationRailItemColors(
+        selectedIconColor = selectedIconColor,
+        selectedTextColor = selectedTextColor,
+        selectedIndicatorColor = indicatorColor,
+        unselectedIconColor = unselectedIconColor,
+        unselectedTextColor = unselectedTextColor,
+    )
 }
 
 /** Represents the colors of the various elements of a navigation item. */
 @Stable
-interface NavigationRailItemColors {
+class NavigationRailItemColors internal constructor(
+    private val selectedIconColor: Color,
+    private val selectedTextColor: Color,
+    private val selectedIndicatorColor: Color,
+    private val unselectedIconColor: Color,
+    private val unselectedTextColor: Color,
+) {
     /**
      * Represents the icon color for this item, depending on whether it is [selected].
      *
      * @param selected whether the item is selected
      */
     @Composable
-    fun iconColor(selected: Boolean): State<Color>
+    internal fun iconColor(selected: Boolean): State<Color> {
+        return animateColorAsState(
+            targetValue = if (selected) selectedIconColor else unselectedIconColor,
+            animationSpec = tween(ItemAnimationDurationMillis)
+        )
+    }
 
     /**
      * Represents the text color for this item, depending on whether it is [selected].
@@ -311,40 +329,40 @@
      * @param selected whether the item is selected
      */
     @Composable
-    fun textColor(selected: Boolean): State<Color>
-
-    /** Represents the color of the indicator used for selected items. */
-    val indicatorColor: Color
-        @Composable get
-}
-
-@Stable
-private class DefaultNavigationRailItemColors(
-    private val selectedIconColor: Color,
-    private val selectedTextColor: Color,
-    private val selectedIndicatorColor: Color,
-    private val unselectedIconColor: Color,
-    private val unselectedTextColor: Color,
-) : NavigationRailItemColors {
-    @Composable
-    override fun iconColor(selected: Boolean): State<Color> {
-        return animateColorAsState(
-            targetValue = if (selected) selectedIconColor else unselectedIconColor,
-            animationSpec = tween(ItemAnimationDurationMillis)
-        )
-    }
-
-    @Composable
-    override fun textColor(selected: Boolean): State<Color> {
+    internal fun textColor(selected: Boolean): State<Color> {
         return animateColorAsState(
             targetValue = if (selected) selectedTextColor else unselectedTextColor,
             animationSpec = tween(ItemAnimationDurationMillis)
         )
     }
 
-    override val indicatorColor: Color
+    /** Represents the color of the indicator used for selected items. */
+    internal val indicatorColor: Color
         @Composable
         get() = selectedIndicatorColor
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other == null || other !is NavigationRailItemColors) return false
+
+        if (selectedIconColor != other.selectedIconColor) return false
+        if (unselectedIconColor != other.unselectedIconColor) return false
+        if (selectedTextColor != other.selectedTextColor) return false
+        if (unselectedTextColor != other.unselectedTextColor) return false
+        if (selectedIndicatorColor != other.selectedIndicatorColor) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = selectedIconColor.hashCode()
+        result = 31 * result + unselectedIconColor.hashCode()
+        result = 31 * result + selectedTextColor.hashCode()
+        result = 31 * result + unselectedTextColor.hashCode()
+        result = 31 * result + selectedIndicatorColor.hashCode()
+
+        return result
+    }
 }
 
 /**
@@ -573,7 +591,7 @@
  * Vertical padding between the contents of the [NavigationRail] and its top/bottom, and internally
  * between items.
  */
-private val NavigationRailVerticalPadding: Dp = 4.dp
+internal val NavigationRailVerticalPadding: Dp = 4.dp
 
 /**
  * Padding at the bottom of the [NavigationRail]'s header. This padding will only be added when the
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt
index 66c86c1..e4c464f 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt
@@ -170,7 +170,7 @@
             } else {
                 modifier
             }
-                .background(colors.containerColor(enabled).value, shape)
+                .background(colors.containerColor().value, shape)
                 .defaultMinSize(
                     minWidth = TextFieldDefaults.MinWidth,
                     minHeight = TextFieldDefaults.MinHeight
@@ -319,7 +319,7 @@
             } else {
                 modifier
             }
-                .background(colors.containerColor(enabled).value, shape)
+                .background(colors.containerColor().value, shape)
                 .defaultMinSize(
                     minWidth = TextFieldDefaults.MinWidth,
                     minHeight = TextFieldDefaults.MinHeight
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/RadioButton.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/RadioButton.kt
index 5e1c05d..38636c8 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/RadioButton.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/RadioButton.kt
@@ -32,7 +32,6 @@
 import androidx.compose.material3.tokens.RadioButtonTokens
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Immutable
-import androidx.compose.runtime.Stable
 import androidx.compose.runtime.State
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberUpdatedState
@@ -128,25 +127,6 @@
 }
 
 /**
- * Represents the color used by a [RadioButton] in different states.
- *
- * See [RadioButtonDefaults.colors] for the default implementation that follows Material
- * specifications.
- */
-@Stable
-interface RadioButtonColors {
-    /**
-     * Represents the main color used to draw the outer and inner circles, depending on whether
-     * the [RadioButton] is [enabled] / [selected].
-     *
-     * @param enabled whether the [RadioButton] is enabled
-     * @param selected whether the [RadioButton] is selected
-     */
-    @Composable
-    fun radioColor(enabled: Boolean, selected: Boolean): State<Color>
-}
-
-/**
  * Defaults used in [RadioButton].
  */
 object RadioButtonDefaults {
@@ -171,35 +151,36 @@
         disabledUnselectedColor: Color = RadioButtonTokens.DisabledUnselectedIconColor
             .toColor()
             .copy(alpha = RadioButtonTokens.DisabledUnselectedIconOpacity)
-    ): RadioButtonColors {
-        return remember(
-            selectedColor,
-            unselectedColor,
-            disabledSelectedColor,
-            disabledUnselectedColor
-        ) {
-            DefaultRadioButtonColors(
-                selectedColor,
-                unselectedColor,
-                disabledSelectedColor,
-                disabledUnselectedColor
-            )
-        }
-    }
+    ): RadioButtonColors = RadioButtonColors(
+        selectedColor,
+        unselectedColor,
+        disabledSelectedColor,
+        disabledUnselectedColor
+    )
 }
 
 /**
- * Default [RadioButtonColors] implementation.
+ * Represents the color used by a [RadioButton] in different states.
+ *
+ * See [RadioButtonDefaults.colors] for the default implementation that follows Material
+ * specifications.
  */
 @Immutable
-private class DefaultRadioButtonColors(
+class RadioButtonColors internal constructor(
     private val selectedColor: Color,
     private val unselectedColor: Color,
     private val disabledSelectedColor: Color,
     private val disabledUnselectedColor: Color
-) : RadioButtonColors {
+) {
+    /**
+     * Represents the main color used to draw the outer and inner circles, depending on whether
+     * the [RadioButton] is [enabled] / [selected].
+     *
+     * @param enabled whether the [RadioButton] is enabled
+     * @param selected whether the [RadioButton] is selected
+     */
     @Composable
-    override fun radioColor(enabled: Boolean, selected: Boolean): State<Color> {
+    internal fun radioColor(enabled: Boolean, selected: Boolean): State<Color> {
         val target = when {
             enabled && selected -> selectedColor
             enabled && !selected -> unselectedColor
@@ -218,9 +199,7 @@
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
-        if (other == null || this::class != other::class) return false
-
-        other as DefaultRadioButtonColors
+        if (other == null || other !is RadioButtonColors) return false
 
         if (selectedColor != other.selectedColor) return false
         if (unselectedColor != other.unselectedColor) return false
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SafeDrawingInsets.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SafeDrawingInsets.kt
new file mode 100644
index 0000000..7d8aac1
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SafeDrawingInsets.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.compose.material3
+
+import androidx.compose.foundation.layout.WindowInsets
+import androidx.compose.runtime.Composable
+
+internal expect val WindowInsets.Companion.safeDrawingForVisualComponents: WindowInsets
+    @Composable get
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt
index a3bd39e..fd6cd8e 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt
@@ -17,6 +17,8 @@
 package androidx.compose.material3
 
 import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.WindowInsets
+import androidx.compose.foundation.layout.asPaddingValues
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.Immutable
@@ -57,9 +59,9 @@
  * matching content color for [containerColor], or to the current [LocalContentColor] if
  * [containerColor] is not a color from the theme.
  * @param content content of the screen. The lambda receives a [PaddingValues] that should be
- * applied to the content root via [Modifier.padding] to properly offset top and bottom bars. If
- * using [Modifier.verticalScroll], apply this modifier to the child of the scroll, and not on
- * the scroll itself.
+ * applied to the content root via [Modifier.padding] and [Modifier.consumeWindowInsets] to
+ * properly offset top and bottom bars. If using [Modifier.verticalScroll], apply this modifier to
+ * the child of the scroll, and not on the scroll itself.
  */
 @ExperimentalMaterial3Api
 @Composable
@@ -182,9 +184,17 @@
             }
 
             val bodyContentPlaceables = subcompose(ScaffoldLayoutContent.MainContent) {
+                val insets = WindowInsets.safeDrawingForVisualComponents
+                    .asPaddingValues(this@SubcomposeLayout)
                 val innerPadding = PaddingValues(
-                    top = topBarHeight.toDp(),
-                    bottom = bottomBarHeight.toDp()
+                    top =
+                    if (topBarHeight == 0) insets.calculateTopPadding()
+                    else topBarHeight.toDp(),
+                    bottom =
+                    if (bottomBarHeight == 0) insets.calculateBottomPadding()
+                    else bottomBarHeight.toDp(),
+                    start = insets.calculateLeftPadding((this@SubcomposeLayout).layoutDirection),
+                    end = insets.calculateRightPadding((this@SubcomposeLayout).layoutDirection)
                 )
                 content(innerPadding)
             }.map { it.measure(looseConstraints) }
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Slider.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Slider.kt
index 1be3607..0a1984b 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Slider.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Slider.kt
@@ -55,7 +55,6 @@
 import androidx.compose.runtime.Immutable
 import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.Stable
 import androidx.compose.runtime.State
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateListOf
@@ -456,7 +455,7 @@
 
         disabledInactiveTickColor: Color = SliderTokens.TickMarksDisabledContainerColor.toColor()
             .copy(alpha = SliderTokens.TickMarksDisabledContainerOpacity)
-    ): SliderColors = DefaultSliderColors(
+    ): SliderColors = SliderColors(
         thumbColor = thumbColor,
         activeTrackColor = activeTrackColor,
         activeTickColor = activeTickColor,
@@ -470,50 +469,6 @@
     )
 }
 
-/**
- * Represents the colors used by a [Slider] and its parts in different states
- *
- * See [SliderDefaults.colors] for the default implementation that follows Material
- * specifications.
- */
-@Stable
-interface SliderColors {
-
-    /**
-     * Represents the color used for the slider's thumb, depending on [enabled].
-     *
-     * @param enabled whether the [Slider] is enabled or not
-     */
-    @Composable
-    fun thumbColor(enabled: Boolean): State<Color>
-
-    /**
-     * Represents the color used for the slider's track, depending on [enabled] and [active].
-     *
-     * Active part is filled with progress, so if sliders progress is 30% out of 100%, left (or
-     * right in RTL) 30% of the track will be active, while the rest is inactive.
-     *
-     * @param enabled whether the [Slider] is enabled or not
-     * @param active whether the part of the track is active of not
-     */
-    @Composable
-    fun trackColor(enabled: Boolean, active: Boolean): State<Color>
-
-    /**
-     * Represents the color used for the slider's tick which is the dot separating steps, if
-     * they are set on the slider, depending on [enabled] and [active].
-     *
-     * Active tick is the tick that is in the part of the track filled with progress, so if
-     * sliders progress is 30% out of 100%, left (or right in RTL) 30% of the track and the ticks
-     * in this 30% will be active, the rest is not active.
-     *
-     * @param enabled whether the [Slider] is enabled or not
-     * @param active whether the part of the track this tick is in is active of not
-     */
-    @Composable
-    fun tickColor(enabled: Boolean, active: Boolean): State<Color>
-}
-
 @Composable
 internal fun SliderImpl(
     modifier: Modifier,
@@ -675,7 +630,8 @@
     Box(
         Modifier
             .padding(start = offset)
-            .align(Alignment.CenterStart)) {
+            .align(Alignment.CenterStart)
+    ) {
         val interactions = remember { mutableStateListOf<Interaction>() }
         LaunchedEffect(interactionSource) {
             interactionSource.interactions.collect { interaction ->
@@ -1047,7 +1003,7 @@
 }
 
 @Immutable
-private class DefaultSliderColors(
+class SliderColors internal constructor(
     private val thumbColor: Color,
     private val activeTrackColor: Color,
     private val activeTickColor: Color,
@@ -1058,15 +1014,15 @@
     private val disabledActiveTickColor: Color,
     private val disabledInactiveTrackColor: Color,
     private val disabledInactiveTickColor: Color
-) : SliderColors {
+) {
 
     @Composable
-    override fun thumbColor(enabled: Boolean): State<Color> {
+    internal fun thumbColor(enabled: Boolean): State<Color> {
         return rememberUpdatedState(if (enabled) thumbColor else disabledThumbColor)
     }
 
     @Composable
-    override fun trackColor(enabled: Boolean, active: Boolean): State<Color> {
+    internal fun trackColor(enabled: Boolean, active: Boolean): State<Color> {
         return rememberUpdatedState(
             if (enabled) {
                 if (active) activeTrackColor else inactiveTrackColor
@@ -1077,7 +1033,7 @@
     }
 
     @Composable
-    override fun tickColor(enabled: Boolean, active: Boolean): State<Color> {
+    internal fun tickColor(enabled: Boolean, active: Boolean): State<Color> {
         return rememberUpdatedState(
             if (enabled) {
                 if (active) activeTickColor else inactiveTickColor
@@ -1089,9 +1045,7 @@
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
-        if (other == null || this::class != other::class) return false
-
-        other as DefaultSliderColors
+        if (other == null || other !is SliderColors) return false
 
         if (thumbColor != other.thumbColor) return false
         if (activeTrackColor != other.activeTrackColor) return false
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 25731d5..e491a5d 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
@@ -30,6 +30,7 @@
         val ExposedDropdownMenu = Strings(4)
         val SliderRangeStart = Strings(5)
         val SliderRangeEnd = Strings(6)
+        val Dialog = Strings(7)
     }
 }
 
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Switch.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Switch.kt
index 4e4b645..1fd5978 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Switch.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Switch.kt
@@ -40,7 +40,6 @@
 import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.Immutable
 import androidx.compose.runtime.SideEffect
-import androidx.compose.runtime.Stable
 import androidx.compose.runtime.State
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.remember
@@ -168,52 +167,6 @@
     }
 }
 
-/**
- * Represents the colors used by a [Switch] in different states
- *
- * See [SwitchDefaults.colors] for the default implementation that follows Material
- * specifications.
- */
-@Stable
-interface SwitchColors {
-
-    /**
-     * Represents the color used for the switch's thumb, depending on [enabled] and [checked].
-     *
-     * @param enabled whether the [Switch] is enabled or not
-     * @param checked whether the [Switch] is checked or not
-     */
-    @Composable
-    fun thumbColor(enabled: Boolean, checked: Boolean): State<Color>
-
-    /**
-     * Represents the color used for the switch's track, depending on [enabled] and [checked].
-     *
-     * @param enabled whether the [Switch] is enabled or not
-     * @param checked whether the [Switch] is checked or not
-     */
-    @Composable
-    fun trackColor(enabled: Boolean, checked: Boolean): State<Color>
-
-    /**
-     * Represents the color used for the switch's border, depending on [enabled] and [checked].
-     *
-     * @param enabled whether the [Switch] is enabled or not
-     * @param checked whether the [Switch] is checked or not
-     */
-    @Composable
-    fun borderColor(enabled: Boolean, checked: Boolean): State<Color>
-
-    /**
-     * Represents the content color passed to the icon if used
-     *
-     * @param enabled whether the [Switch] is enabled or not
-     * @param checked whether the [Switch] is checked or not
-     */
-    @Composable
-    fun iconColor(enabled: Boolean, checked: Boolean): State<Color>
-}
-
 @Composable
 @Suppress("ComposableLambdaParameterNaming", "ComposableLambdaParameterPosition")
 private fun BoxScope.SwitchImpl(
@@ -356,7 +309,7 @@
         disabledUncheckedIconColor: Color = SwitchTokens.DisabledUnselectedIconColor.toColor()
             .copy(alpha = SwitchTokens.DisabledUnselectedIconOpacity)
             .compositeOver(MaterialTheme.colorScheme.surface),
-    ): SwitchColors = DefaultSwitchColors(
+    ): SwitchColors = SwitchColors(
         checkedThumbColor = checkedThumbColor,
         checkedTrackColor = checkedTrackColor,
         checkedBorderColor = checkedBorderColor,
@@ -382,10 +335,13 @@
 }
 
 /**
- * Default [SwitchColors] implementation.
+ * Represents the colors used by a [Switch] in different states
+ *
+ * See [SwitchDefaults.colors] for the default implementation that follows Material
+ * specifications.
  */
 @Immutable
-private class DefaultSwitchColors(
+class SwitchColors internal constructor(
     private val checkedThumbColor: Color,
     private val checkedTrackColor: Color,
     private val checkedBorderColor: Color,
@@ -402,9 +358,15 @@
     private val disabledUncheckedTrackColor: Color,
     private val disabledUncheckedBorderColor: Color,
     private val disabledUncheckedIconColor: Color
-) : SwitchColors {
+) {
+    /**
+     * Represents the color used for the switch's thumb, depending on [enabled] and [checked].
+     *
+     * @param enabled whether the [Switch] is enabled or not
+     * @param checked whether the [Switch] is checked or not
+     */
     @Composable
-    override fun thumbColor(enabled: Boolean, checked: Boolean): State<Color> {
+    internal fun thumbColor(enabled: Boolean, checked: Boolean): State<Color> {
         return rememberUpdatedState(
             if (enabled) {
                 if (checked) checkedThumbColor else uncheckedThumbColor
@@ -414,8 +376,14 @@
         )
     }
 
+    /**
+     * Represents the color used for the switch's track, depending on [enabled] and [checked].
+     *
+     * @param enabled whether the [Switch] is enabled or not
+     * @param checked whether the [Switch] is checked or not
+     */
     @Composable
-    override fun trackColor(enabled: Boolean, checked: Boolean): State<Color> {
+    internal fun trackColor(enabled: Boolean, checked: Boolean): State<Color> {
         return rememberUpdatedState(
             if (enabled) {
                 if (checked) checkedTrackColor else uncheckedTrackColor
@@ -425,8 +393,14 @@
         )
     }
 
+    /**
+     * Represents the color used for the switch's border, depending on [enabled] and [checked].
+     *
+     * @param enabled whether the [Switch] is enabled or not
+     * @param checked whether the [Switch] is checked or not
+     */
     @Composable
-    override fun borderColor(enabled: Boolean, checked: Boolean): State<Color> {
+    internal fun borderColor(enabled: Boolean, checked: Boolean): State<Color> {
         return rememberUpdatedState(
             if (enabled) {
                 if (checked) checkedBorderColor else uncheckedBorderColor
@@ -436,8 +410,14 @@
         )
     }
 
+    /**
+     * Represents the content color passed to the icon if used
+     *
+     * @param enabled whether the [Switch] is enabled or not
+     * @param checked whether the [Switch] is checked or not
+     */
     @Composable
-    override fun iconColor(enabled: Boolean, checked: Boolean): State<Color> {
+    internal fun iconColor(enabled: Boolean, checked: Boolean): State<Color> {
         return rememberUpdatedState(
             if (enabled) {
                 if (checked) checkedIconColor else uncheckedIconColor
@@ -449,9 +429,7 @@
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
-        if (other == null || this::class != other::class) return false
-
-        other as DefaultSwitchColors
+        if (other == null || other !is SwitchColors) return false
 
         if (checkedThumbColor != other.checkedThumbColor) return false
         if (checkedTrackColor != other.checkedTrackColor) return false
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextField.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextField.kt
index 63fb471..2c17d6c 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextField.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextField.kt
@@ -187,7 +187,7 @@
         BasicTextField(
             value = value,
             modifier = modifier
-                .background(colors.containerColor(enabled).value, shape)
+                .background(colors.containerColor().value, shape)
                 .indicatorLine(enabled, isError, interactionSource, colors)
                 .defaultMinSize(
                     minWidth = TextFieldDefaults.MinWidth,
@@ -322,7 +322,7 @@
         BasicTextField(
             value = value,
             modifier = modifier
-                .background(colors.containerColor(enabled).value, shape)
+                .background(colors.containerColor().value, shape)
                 .indicatorLine(enabled, isError, interactionSource, colors)
                 .defaultMinSize(
                     minWidth = TextFieldDefaults.MinWidth,
@@ -385,7 +385,9 @@
         content = {
             if (leading != null) {
                 Box(
-                    modifier = Modifier.layoutId(LeadingId).then(IconDefaultSizeModifier),
+                    modifier = Modifier
+                        .layoutId(LeadingId)
+                        .then(IconDefaultSizeModifier),
                     contentAlignment = Alignment.Center
                 ) {
                     leading()
@@ -393,7 +395,9 @@
             }
             if (trailing != null) {
                 Box(
-                    modifier = Modifier.layoutId(TrailingId).then(IconDefaultSizeModifier),
+                    modifier = Modifier
+                        .layoutId(TrailingId)
+                        .then(IconDefaultSizeModifier),
                     contentAlignment = Alignment.Center
                 ) {
                     trailing()
@@ -417,13 +421,21 @@
                 }
             )
             if (placeholder != null) {
-                placeholder(Modifier.layoutId(PlaceholderId).then(padding))
+                placeholder(
+                    Modifier
+                        .layoutId(PlaceholderId)
+                        .then(padding))
             }
             if (label != null) {
-                Box(Modifier.layoutId(LabelId).then(padding)) { label() }
+                Box(
+                    Modifier
+                        .layoutId(LabelId)
+                        .then(padding)) { label() }
             }
             Box(
-                modifier = Modifier.layoutId(TextFieldId).then(padding),
+                modifier = Modifier
+                    .layoutId(TextFieldId)
+                    .then(padding),
                 propagateMinConstraints = true,
             ) {
                 textField()
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextFieldDefaults.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextFieldDefaults.kt
index 4461392..fcbd9af 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextFieldDefaults.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextFieldDefaults.kt
@@ -35,7 +35,6 @@
 import androidx.compose.material3.tokens.OutlinedTextFieldTokens
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Immutable
-import androidx.compose.runtime.Stable
 import androidx.compose.runtime.State
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.rememberUpdatedState
@@ -51,116 +50,6 @@
 import androidx.compose.ui.unit.dp
 
 /**
- * Represents the colors of the input text, container, and content (including label, placeholder,
- * leading and trailing icons) used in a text field in different states.
- *
- * See [TextFieldDefaults.textFieldColors] for the default colors used in [TextField].
- * See [TextFieldDefaults.outlinedTextFieldColors] for the default colors used in
- * [OutlinedTextField].
- */
-@ExperimentalMaterial3Api
-@Stable
-interface TextFieldColors {
-    /**
-     * Represents the color used for the input text of this text field.
-     *
-     * @param enabled whether the text field is enabled
-     */
-    @Composable
-    fun textColor(enabled: Boolean): State<Color>
-
-    /**
-     * Represents the container color for this text field.
-     *
-     * @param enabled whether the text field is enabled
-     */
-    @Composable
-    fun containerColor(enabled: Boolean): State<Color>
-
-    /**
-     * Represents the color used for the placeholder of this text field.
-     *
-     * @param enabled whether the text field is enabled
-     */
-    @Composable
-    fun placeholderColor(enabled: Boolean): State<Color>
-
-    /**
-     * Represents the color used for the label of this text field.
-     *
-     * @param enabled whether the text field is enabled
-     * @param isError whether the text field's current value is in error
-     * @param interactionSource the [InteractionSource] of this text field. Helps to determine if
-     * the text field is in focus or not
-     */
-    @Composable
-    fun labelColor(
-        enabled: Boolean,
-        isError: Boolean,
-        interactionSource: InteractionSource
-    ): State<Color>
-
-    /**
-     * Represents the color used for the leading icon of this text field.
-     *
-     * @param enabled whether the text field is enabled
-     * @param isError whether the text field's current value is in error
-     * @param interactionSource the [InteractionSource] of this text field. Helps to determine if
-     * the text field is in focus or not
-     */
-    @Composable
-    fun leadingIconColor(
-        enabled: Boolean,
-        isError: Boolean,
-        interactionSource: InteractionSource
-    ): State<Color>
-
-    /**
-     * Represents the color used for the trailing icon of this text field.
-     *
-     * @param enabled whether the text field is enabled
-     * @param isError whether the text field's current value is in error
-     * @param interactionSource the [InteractionSource] of this text field. Helps to determine if
-     * the text field is in focus or not
-     */
-    @Composable
-    fun trailingIconColor(
-        enabled: Boolean,
-        isError: Boolean,
-        interactionSource: InteractionSource
-    ): State<Color>
-
-    /**
-     * Represents the color used for the border indicator of this text field.
-     *
-     * @param enabled whether the text field is enabled
-     * @param isError whether the text field's current value is in error
-     * @param interactionSource the [InteractionSource] of this text field. Helps to determine if
-     * the text field is in focus or not
-     */
-    @Composable
-    fun indicatorColor(
-        enabled: Boolean,
-        isError: Boolean,
-        interactionSource: InteractionSource
-    ): State<Color>
-
-    /**
-     * Represents the color used for the cursor of this text field.
-     *
-     * @param isError whether the text field's current value is in error
-     */
-    @Composable
-    fun cursorColor(isError: Boolean): State<Color>
-
-    /**
-     * Represents the colors used for text selection in this text field.
-     */
-    val selectionColors: TextSelectionColors
-        @Composable get
-}
-
-/**
  * Contains the default values used by [TextField] and [OutlinedTextField].
  */
 @ExperimentalMaterial3Api
@@ -382,9 +271,10 @@
         disabledPlaceholderColor: Color = FilledTextFieldTokens.DisabledInputColor.toColor()
             .copy(alpha = FilledTextFieldTokens.DisabledInputOpacity)
     ): TextFieldColors =
-        DefaultTextFieldColors(
+        TextFieldColors(
             textColor = textColor,
             disabledTextColor = disabledTextColor,
+            containerColor = containerColor,
             cursorColor = cursorColor,
             errorCursorColor = errorCursorColor,
             textSelectionColors = selectionColors,
@@ -400,7 +290,6 @@
             unfocusedTrailingIconColor = unfocusedTrailingIconColor,
             disabledTrailingIconColor = disabledTrailingIconColor,
             errorTrailingIconColor = errorTrailingIconColor,
-            containerColor = containerColor,
             focusedLabelColor = focusedLabelColor,
             unfocusedLabelColor = unfocusedLabelColor,
             disabledLabelColor = disabledLabelColor,
@@ -473,7 +362,7 @@
         disabledPlaceholderColor: Color = OutlinedTextFieldTokens.DisabledInputColor.toColor()
             .copy(alpha = OutlinedTextFieldTokens.DisabledInputOpacity)
     ): TextFieldColors =
-        DefaultTextFieldColors(
+        TextFieldColors(
             textColor = textColor,
             disabledTextColor = disabledTextColor,
             cursorColor = cursorColor,
@@ -688,11 +577,20 @@
     }
 }
 
+/**
+ * Represents the colors of the input text, container, and content (including label, placeholder,
+ * leading and trailing icons) used in a text field in different states.
+ *
+ * See [TextFieldDefaults.textFieldColors] for the default colors used in [TextField].
+ * See [TextFieldDefaults.outlinedTextFieldColors] for the default colors used in
+ * [OutlinedTextField].
+ */
 @OptIn(ExperimentalMaterial3Api::class)
 @Immutable
-private class DefaultTextFieldColors(
+class TextFieldColors internal constructor(
     private val textColor: Color,
     private val disabledTextColor: Color,
+    private val containerColor: Color,
     private val cursorColor: Color,
     private val errorCursorColor: Color,
     private val textSelectionColors: TextSelectionColors,
@@ -708,17 +606,23 @@
     private val unfocusedTrailingIconColor: Color,
     private val disabledTrailingIconColor: Color,
     private val errorTrailingIconColor: Color,
-    private val containerColor: Color,
     private val focusedLabelColor: Color,
     private val unfocusedLabelColor: Color,
     private val disabledLabelColor: Color,
     private val errorLabelColor: Color,
     private val placeholderColor: Color,
     private val disabledPlaceholderColor: Color
-) : TextFieldColors {
-
+    ) {
+    /**
+     * Represents the color used for the leading icon of this text field.
+     *
+     * @param enabled whether the text field is enabled
+     * @param isError whether the text field's current value is in error
+     * @param interactionSource the [InteractionSource] of this text field. Helps to determine if
+     * the text field is in focus or not
+     */
     @Composable
-    override fun leadingIconColor(
+    internal fun leadingIconColor(
         enabled: Boolean,
         isError: Boolean,
         interactionSource: InteractionSource
@@ -735,8 +639,16 @@
         )
     }
 
+    /**
+     * Represents the color used for the trailing icon of this text field.
+     *
+     * @param enabled whether the text field is enabled
+     * @param isError whether the text field's current value is in error
+     * @param interactionSource the [InteractionSource] of this text field. Helps to determine if
+     * the text field is in focus or not
+     */
     @Composable
-    override fun trailingIconColor(
+    internal fun trailingIconColor(
         enabled: Boolean,
         isError: Boolean,
         interactionSource: InteractionSource
@@ -753,8 +665,16 @@
         )
     }
 
+    /**
+     * Represents the color used for the border indicator of this text field.
+     *
+     * @param enabled whether the text field is enabled
+     * @param isError whether the text field's current value is in error
+     * @param interactionSource the [InteractionSource] of this text field. Helps to determine if
+     * the text field is in focus or not
+     */
     @Composable
-    override fun indicatorColor(
+    internal fun indicatorColor(
         enabled: Boolean,
         isError: Boolean,
         interactionSource: InteractionSource
@@ -774,18 +694,34 @@
         }
     }
 
+    /**
+     * Represents the container color for this text field.
+     */
     @Composable
-    override fun containerColor(enabled: Boolean): State<Color> {
+    internal fun containerColor(): State<Color> {
         return rememberUpdatedState(containerColor)
     }
 
+    /**
+     * Represents the color used for the placeholder of this text field.
+     *
+     * @param enabled whether the text field is enabled
+     */
     @Composable
-    override fun placeholderColor(enabled: Boolean): State<Color> {
+    internal fun placeholderColor(enabled: Boolean): State<Color> {
         return rememberUpdatedState(if (enabled) placeholderColor else disabledPlaceholderColor)
     }
 
+    /**
+     * Represents the color used for the label of this text field.
+     *
+     * @param enabled whether the text field is enabled
+     * @param isError whether the text field's current value is in error
+     * @param interactionSource the [InteractionSource] of this text field. Helps to determine if
+     * the text field is in focus or not
+     */
     @Composable
-    override fun labelColor(
+    internal fun labelColor(
         enabled: Boolean,
         isError: Boolean,
         interactionSource: InteractionSource
@@ -802,23 +738,29 @@
     }
 
     @Composable
-    override fun textColor(enabled: Boolean): State<Color> {
+    internal fun textColor(enabled: Boolean): State<Color> {
         return rememberUpdatedState(if (enabled) textColor else disabledTextColor)
     }
 
+    /**
+     * Represents the color used for the cursor of this text field.
+     *
+     * @param isError whether the text field's current value is in error
+     */
     @Composable
-    override fun cursorColor(isError: Boolean): State<Color> {
+    internal fun cursorColor(isError: Boolean): State<Color> {
         return rememberUpdatedState(if (isError) errorCursorColor else cursorColor)
     }
 
-    override val selectionColors: TextSelectionColors
+    /**
+     * Represents the colors used for text selection in this text field.
+     */
+    internal val selectionColors: TextSelectionColors
         @Composable get() = textSelectionColors
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
-        if (other == null || this::class != other::class) return false
-
-        other as DefaultTextFieldColors
+        if (other == null || other !is TextFieldColors) return false
 
         if (textColor != other.textColor) return false
         if (disabledTextColor != other.disabledTextColor) return false
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/AssistChipTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/AssistChipTokens.kt
index 481b9e8e..b2c6f2c 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/AssistChipTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/AssistChipTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -55,4 +55,4 @@
     val IconColor = ColorSchemeKeyTokens.Primary
     val IconSize = 18.0.dp
     val PressedIconColor = ColorSchemeKeyTokens.Primary
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/BadgeTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/BadgeTokens.kt
index 25da92a..97c4e3d 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/BadgeTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/BadgeTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/BottomAppBarTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/BottomAppBarTokens.kt
index 45cb254..00655a8 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/BottomAppBarTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/BottomAppBarTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_91
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -26,4 +26,4 @@
     val ContainerHeight = 80.0.dp
     val ContainerShape = ShapeKeyTokens.CornerNone
     val ContainerSurfaceTintLayerColor = ColorSchemeKeyTokens.SurfaceTint
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/CheckboxTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/CheckboxTokens.kt
index 17a321c..5596a1b 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/CheckboxTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/CheckboxTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_117
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -69,7 +69,7 @@
     val UnselectedFocusOutlineWidth = 2.0.dp
     val UnselectedHoverOutlineColor = ColorSchemeKeyTokens.OnSurface
     val UnselectedHoverOutlineWidth = 2.0.dp
-    val UnselectedOutlineColor = ColorSchemeKeyTokens.OnSurface
+    val UnselectedOutlineColor = ColorSchemeKeyTokens.OnSurfaceVariant
     val UnselectedOutlineWidth = 2.0.dp
     val UnselectedPressedOutlineColor = ColorSchemeKeyTokens.OnSurface
     val UnselectedPressedOutlineWidth = 2.0.dp
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/CircularProgressIndicatorTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/CircularProgressIndicatorTokens.kt
index 9be2de2..7e0ea7e 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/CircularProgressIndicatorTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/CircularProgressIndicatorTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -22,11 +22,11 @@
 
 internal object CircularProgressIndicatorTokens {
     val ActiveIndicatorColor = ColorSchemeKeyTokens.Primary
-    val ActiveShape = ShapeTokens.CornerNone
+    val ActiveShape = ShapeKeyTokens.CornerNone
     val ActiveIndicatorWidth = 4.0.dp
     val FourColorActiveIndicatorFourColor = ColorSchemeKeyTokens.TertiaryContainer
     val FourColorActiveIndicatorOneColor = ColorSchemeKeyTokens.Primary
     val FourColorActiveIndicatorThreeColor = ColorSchemeKeyTokens.Tertiary
     val FourColorActiveIndicatorTwoColor = ColorSchemeKeyTokens.PrimaryContainer
     val Size = 48.0.dp
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/DialogTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/DialogTokens.kt
index 0fc01e5..fffa870 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/DialogTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/DialogTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_117
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -30,12 +30,10 @@
     val ContainerElevation = ElevationTokens.Level3
     val ContainerShape = ShapeKeyTokens.CornerExtraLarge
     val ContainerSurfaceTintLayerColor = ColorSchemeKeyTokens.SurfaceTint
-    val SubheadColor = ColorSchemeKeyTokens.OnSurface
-    val SubheadFont = TypographyKeyTokens.HeadlineSmall
+    val HeadlineColor = ColorSchemeKeyTokens.OnSurface
+    val HeadlineFont = TypographyKeyTokens.HeadlineSmall
     val SupportingTextColor = ColorSchemeKeyTokens.OnSurfaceVariant
     val SupportingTextFont = TypographyKeyTokens.BodyMedium
-    val DividerColor = ColorSchemeKeyTokens.Outline
-    val DividerHeight = 1.0.dp
     val IconColor = ColorSchemeKeyTokens.Secondary
     val IconSize = 24.0.dp
 }
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/DividerTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/DividerTokens.kt
index 508aa4e..a9bfc87 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/DividerTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/DividerTokens.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 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.
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_103
+// VERSION: v0_117
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -21,6 +21,6 @@
 import androidx.compose.ui.unit.dp
 
 internal object DividerTokens {
-    val Color = ColorSchemeKeyTokens.SurfaceVariant
+    val Color = ColorSchemeKeyTokens.OutlineVariant
     val Thickness = 1.0.dp
 }
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ElevatedButtonTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ElevatedButtonTokens.kt
index bd81546..fcef087 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ElevatedButtonTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ElevatedButtonTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -46,4 +46,4 @@
     val IconColor = ColorSchemeKeyTokens.Primary
     val IconSize = 18.0.dp
     val PressedIconColor = ColorSchemeKeyTokens.Primary
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ElevatedCardTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ElevatedCardTokens.kt
index eb5e195..ca4729a 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ElevatedCardTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ElevatedCardTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ElevationTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ElevationTokens.kt
index e134f3f..c80ff53 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ElevationTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ElevationTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ExtendedFabPrimaryTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ExtendedFabPrimaryTokens.kt
index b0457dc..1786948 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ExtendedFabPrimaryTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ExtendedFabPrimaryTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -42,4 +42,4 @@
     val PressedContainerElevation = ElevationTokens.Level3
     val PressedIconColor = ColorSchemeKeyTokens.OnPrimaryContainer
     val PressedLabelTextColor = ColorSchemeKeyTokens.OnPrimaryContainer
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FabPrimaryLargeTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FabPrimaryLargeTokens.kt
index f2cf504..9d06a88 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FabPrimaryLargeTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FabPrimaryLargeTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -38,4 +38,4 @@
     val LoweredPressedContainerElevation = ElevationTokens.Level1
     val PressedContainerElevation = ElevationTokens.Level3
     val PressedIconColor = ColorSchemeKeyTokens.OnPrimaryContainer
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FabPrimarySmallTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FabPrimarySmallTokens.kt
index bd1fb84..3cbd45db 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FabPrimarySmallTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FabPrimarySmallTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -38,4 +38,4 @@
     val LoweredPressedContainerElevation = ElevationTokens.Level1
     val PressedContainerElevation = ElevationTokens.Level3
     val PressedIconColor = ColorSchemeKeyTokens.OnPrimaryContainer
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FabPrimaryTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FabPrimaryTokens.kt
index b02d229..2161f4c 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FabPrimaryTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FabPrimaryTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -38,4 +38,4 @@
     val LoweredPressedContainerElevation = ElevationTokens.Level1
     val PressedContainerElevation = ElevationTokens.Level3
     val PressedIconColor = ColorSchemeKeyTokens.OnPrimaryContainer
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FabSecondaryTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FabSecondaryTokens.kt
index c54da1d..774995b 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FabSecondaryTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FabSecondaryTokens.kt
@@ -13,11 +13,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-// VERSION: v0_93
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
+
 package androidx.compose.material3.tokens
+
 import androidx.compose.ui.unit.dp
+
 internal object FabSecondaryTokens {
     val ContainerColor = ColorSchemeKeyTokens.SecondaryContainer
     val ContainerElevation = ElevationTokens.Level3
@@ -36,4 +38,4 @@
     val LoweredPressedContainerElevation = ElevationTokens.Level1
     val PressedContainerElevation = ElevationTokens.Level3
     val PressedIconColor = ColorSchemeKeyTokens.OnSecondaryContainer
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledAutocompleteTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledAutocompleteTokens.kt
index 2af3b58..88fe201 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledAutocompleteTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledAutocompleteTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -95,4 +95,4 @@
     val FieldSupportingTextFont = TypographyKeyTokens.BodySmall
     val TextFieldTrailingIconColor = ColorSchemeKeyTokens.OnSurfaceVariant
     val TextFieldTrailingIconSize = 24.0.dp
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledButtonTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledButtonTokens.kt
index dc7509a..64cb2b1 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledButtonTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledButtonTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -30,8 +30,6 @@
     const val DisabledContainerOpacity = 0.12f
     val DisabledLabelTextColor = ColorSchemeKeyTokens.OnSurface
     const val DisabledLabelTextOpacity = 0.38f
-    val DraggedContainerElevation = ElevationTokens.Level3
-    val DraggedLabelTextColor = ColorSchemeKeyTokens.OnPrimary
     val FocusContainerElevation = ElevationTokens.Level0
     val FocusLabelTextColor = ColorSchemeKeyTokens.OnPrimary
     val HoverContainerElevation = ElevationTokens.Level1
@@ -42,10 +40,9 @@
     val PressedLabelTextColor = ColorSchemeKeyTokens.OnPrimary
     val DisabledIconColor = ColorSchemeKeyTokens.OnSurface
     const val DisabledIconOpacity = 0.38f
-    val DraggedIconColor = ColorSchemeKeyTokens.OnPrimary
     val FocusIconColor = ColorSchemeKeyTokens.OnPrimary
     val HoverIconColor = ColorSchemeKeyTokens.OnPrimary
     val IconColor = ColorSchemeKeyTokens.OnPrimary
     val IconSize = 18.0.dp
     val PressedIconColor = ColorSchemeKeyTokens.OnPrimary
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledCardTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledCardTokens.kt
index 7b095f3..5dad463 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledCardTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledCardTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -33,4 +33,4 @@
     val IconColor = ColorSchemeKeyTokens.Primary
     val IconSize = 24.0.dp
     val PressedContainerElevation = ElevationTokens.Level0
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledTextFieldTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledTextFieldTokens.kt
index 22d0af5..dc067dd 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledTextFieldTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledTextFieldTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -88,4 +88,4 @@
     val SupportingFont = TypographyKeyTokens.BodySmall
     val TrailingIconColor = ColorSchemeKeyTokens.OnSurfaceVariant
     val TrailingIconSize = 24.0.dp
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledTonalButtonTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledTonalButtonTokens.kt
index b36379f..e53ae44 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledTonalButtonTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledTonalButtonTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilterChipTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilterChipTokens.kt
index b88f808..20dec31 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilterChipTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilterChipTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -76,4 +76,4 @@
     val UnselectedHoverIconColor = ColorSchemeKeyTokens.OnSurfaceVariant
     val UnselectedIconColor = ColorSchemeKeyTokens.OnSurfaceVariant
     val UnselectedPressedIconColor = ColorSchemeKeyTokens.OnSurfaceVariant
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/InputChipTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/InputChipTokens.kt
index 98af8af..d309ef6 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/InputChipTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/InputChipTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_101
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -76,4 +76,4 @@
     val UnselectedHoverTrailingIconColor = ColorSchemeKeyTokens.OnSurfaceVariant
     val UnselectedPressedTrailingIconColor = ColorSchemeKeyTokens.OnSurfaceVariant
     val UnselectedTrailingIconColor = ColorSchemeKeyTokens.OnSurfaceVariant
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/LinearProgressIndicatorTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/LinearProgressIndicatorTokens.kt
index 04a0fa0..2fc4755 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/LinearProgressIndicatorTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/LinearProgressIndicatorTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ListTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ListTokens.kt
index a6508a5..b5a7be1 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ListTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ListTokens.kt
@@ -13,16 +13,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_93
+// VERSION: v0_117
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
 
 import androidx.compose.ui.unit.dp
-
 internal object ListTokens {
-    val DividerColor = ColorSchemeKeyTokens.Outline
-    val DividerHeight = 1.0.dp
     val ListItemContainerColor = ColorSchemeKeyTokens.Surface
     val ListItemContainerElevation = ElevationTokens.Level0
     val ListItemContainerHeight = 56.0.dp
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/MenuTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/MenuTokens.kt
index e21780f..fb1718e 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/MenuTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/MenuTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_117
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -25,8 +25,6 @@
     val ContainerElevation = ElevationTokens.Level2
     val ContainerShape = ShapeKeyTokens.CornerExtraSmall
     val ContainerSurfaceTintLayerColor = ColorSchemeKeyTokens.SurfaceTint
-    val DividerColor = ColorSchemeKeyTokens.SurfaceVariant
-    val DividerHeight = 1.0.dp
     val ListItemContainerHeight = 48.0.dp
     val ListItemDisabledLabelTextColor = ColorSchemeKeyTokens.OnSurface
     const val ListItemDisabledLabelTextOpacity = 0.38f
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/NavigationBarTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/NavigationBarTokens.kt
index 374b397..eecfc7e 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/NavigationBarTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/NavigationBarTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -48,4 +48,4 @@
     val InactivePressedIconColor = ColorSchemeKeyTokens.OnSurface
     val InactivePressedLabelTextColor = ColorSchemeKeyTokens.OnSurface
     val LabelTextFont = TypographyKeyTokens.LabelMedium
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/NavigationDrawerTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/NavigationDrawerTokens.kt
index 66d8e0d..72c7a51 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/NavigationDrawerTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/NavigationDrawerTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_117
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -39,7 +39,6 @@
     val ContainerShape = ShapeKeyTokens.CornerLargeEnd
     val ContainerSurfaceTintLayerColor = ColorSchemeKeyTokens.SurfaceTint
     val ContainerWidth = 360.0.dp
-    val DividerColor = ColorSchemeKeyTokens.Outline
     val HeadlineColor = ColorSchemeKeyTokens.OnSurfaceVariant
     val HeadlineFont = TypographyKeyTokens.TitleSmall
     val IconSize = 24.0.dp
@@ -55,6 +54,5 @@
     val LargeBadgeLabelColor = ColorSchemeKeyTokens.OnSurfaceVariant
     val LargeBadgeLabelFont = TypographyKeyTokens.LabelLarge
     val ModalContainerElevation = ElevationTokens.Level1
-    const val ScrimOpacity = 0.4f
     val StandardContainerElevation = ElevationTokens.Level0
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/NavigationRailTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/NavigationRailTokens.kt
index 9d26c8a3..0fb4723 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/NavigationRailTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/NavigationRailTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -54,4 +54,4 @@
     val MenuPressedIconColor = ColorSchemeKeyTokens.OnSurface
     val NoLabelActiveIndicatorHeight = 56.0.dp
     val NoLabelActiveIndicatorShape = ShapeKeyTokens.CornerFull
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/OutlinedAutocompleteTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/OutlinedAutocompleteTokens.kt
index 9b9b240..779a0ff 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/OutlinedAutocompleteTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/OutlinedAutocompleteTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -34,7 +34,7 @@
     val TextFieldCaretColor = ColorSchemeKeyTokens.Primary
     val TextFieldContainerColor = ColorSchemeKeyTokens.SurfaceVariant
     val TextFieldContainerHeight = 56.0.dp
-    val TextFieldContainerShape = ShapeKeyTokens.CornerExtraSmallTop
+    val TextFieldContainerShape = ShapeKeyTokens.CornerExtraSmall
     val FieldDisabledInputTextColor = ColorSchemeKeyTokens.OnSurface
     const val FieldDisabledInputTextOpacity = 0.38f
     val FieldDisabledLabelTextColor = ColorSchemeKeyTokens.OnSurface
@@ -93,4 +93,4 @@
     val FieldSupportingTextFont = TypographyKeyTokens.BodySmall
     val TextFieldTrailingIconColor = ColorSchemeKeyTokens.OnSurfaceVariant
     val TextFieldTrailingIconSize = 24.0.dp
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/OutlinedButtonTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/OutlinedButtonTokens.kt
index 086d710..97c36a5 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/OutlinedButtonTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/OutlinedButtonTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -44,4 +44,4 @@
     val IconColor = ColorSchemeKeyTokens.Primary
     val IconSize = 18.0.dp
     val PressedIconColor = ColorSchemeKeyTokens.Primary
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/OutlinedCardTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/OutlinedCardTokens.kt
index 102500d..c99162b 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/OutlinedCardTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/OutlinedCardTokens.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 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.
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/OutlinedTextFieldTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/OutlinedTextFieldTokens.kt
index 950bbf8..13f1d6b 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/OutlinedTextFieldTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/OutlinedTextFieldTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/PaletteTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/PaletteTokens.kt
index 4657b1f..4384b14 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/PaletteTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/PaletteTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/PrimaryNavigationTabTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/PrimaryNavigationTabTokens.kt
index 59bdace..3fd0e91 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/PrimaryNavigationTabTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/PrimaryNavigationTabTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -50,4 +50,4 @@
     val InactiveLabelTextColor = ColorSchemeKeyTokens.OnSurfaceVariant
     val InactivePressedLabelTextColor = ColorSchemeKeyTokens.OnSurface
     val LabelTextFont = TypographyKeyTokens.TitleSmall
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/RadioButtonTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/RadioButtonTokens.kt
index 5890926..9c3d1a6 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/RadioButtonTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/RadioButtonTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_117
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -33,6 +33,6 @@
     val StateLayerSize = 40.0.dp
     val UnselectedFocusIconColor = ColorSchemeKeyTokens.OnSurface
     val UnselectedHoverIconColor = ColorSchemeKeyTokens.OnSurface
-    val UnselectedIconColor = ColorSchemeKeyTokens.OnSurface
+    val UnselectedIconColor = ColorSchemeKeyTokens.OnSurfaceVariant
     val UnselectedPressedIconColor = ColorSchemeKeyTokens.OnSurface
 }
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ScrimTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ScrimTokens.kt
new file mode 100644
index 0000000..9838003f
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ScrimTokens.kt
@@ -0,0 +1,24 @@
+/*
+ * 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.
+ */
+// VERSION: v0_117
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+package androidx.compose.material3.tokens
+
+internal object ScrimTokens {
+    val ContainerColor = ColorSchemeKeyTokens.Scrim
+    const val ContainerOpacity = 0.32f
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ShapeKeyTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ShapeKeyTokens.kt
index a0538d2..956f53a 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ShapeKeyTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ShapeKeyTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -30,4 +30,4 @@
     CornerMedium,
     CornerNone,
     CornerSmall,
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ShapeTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ShapeTokens.kt
index b77685a..b4e3f61 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ShapeTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ShapeTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -58,4 +58,4 @@
     val CornerMedium = RoundedCornerShape(12.0.dp)
     val CornerNone = RectangleShape
     val CornerSmall = RoundedCornerShape(8.0.dp)
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/SliderTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/SliderTokens.kt
index 0bab299..5506511 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/SliderTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/SliderTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_117
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -22,7 +22,7 @@
 
 internal object SliderTokens {
     val ActiveTrackColor = ColorSchemeKeyTokens.Primary
-    val ActiveTrackHeight = 6.0.dp
+    val ActiveTrackHeight = 4.0.dp
     val ActiveTrackShape = ShapeKeyTokens.CornerFull
     val DisabledActiveTrackColor = ColorSchemeKeyTokens.OnSurface
     const val DisabledActiveTrackOpacity = 0.38f
@@ -59,4 +59,4 @@
     const val TickMarksDisabledContainerOpacity = 0.38f
     val TickMarksInactiveContainerColor = ColorSchemeKeyTokens.OnSurfaceVariant
     const val TickMarksInactiveContainerOpacity = 0.38f
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/SnackbarTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/SnackbarTokens.kt
index 15d24be..ad7994a 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/SnackbarTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/SnackbarTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -38,4 +38,4 @@
     val SupportingTextFont = TypographyKeyTokens.BodyMedium
     val SingleLineContainerHeight = 48.0.dp
     val TwoLinesContainerHeight = 68.0.dp
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/StateTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/StateTokens.kt
index 3607669..38925aa 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/StateTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/StateTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/SuggestionChipTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/SuggestionChipTokens.kt
index 7878f1d..dac1658 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/SuggestionChipTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/SuggestionChipTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_117
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -47,4 +47,12 @@
     val LabelTextColor = ColorSchemeKeyTokens.OnSurfaceVariant
     val LabelTextFont = TypographyKeyTokens.LabelLarge
     val PressedLabelTextColor = ColorSchemeKeyTokens.OnSurfaceVariant
+    val DisabledLeadingIconColor = ColorSchemeKeyTokens.OnSurface
+    const val DisabledLeadingIconOpacity = 0.38f
+    val DraggedLeadingIconColor = ColorSchemeKeyTokens.OnSurfaceVariant
+    val FocusLeadingIconColor = ColorSchemeKeyTokens.OnSurfaceVariant
+    val HoverLeadingIconColor = ColorSchemeKeyTokens.OnSurfaceVariant
+    val LeadingIconColor = ColorSchemeKeyTokens.OnSurfaceVariant
+    val LeadingIconSize = 18.0.dp
+    val PressedLeadingIconColor = ColorSchemeKeyTokens.OnSurfaceVariant
 }
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/SwitchTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/SwitchTokens.kt
index a0e061dd..a359c70 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/SwitchTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/SwitchTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_93
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -75,6 +75,7 @@
     val UnselectedPressedTrackColor = ColorSchemeKeyTokens.SurfaceVariant
     val UnselectedPressedTrackOutlineColor = ColorSchemeKeyTokens.Outline
     val UnselectedTrackColor = ColorSchemeKeyTokens.SurfaceVariant
+    val UnselectedTrackOutlineColor = ColorSchemeKeyTokens.Outline
     val IconHandleHeight = 24.0.dp
     val IconHandleWidth = 24.0.dp
 }
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TextButtonTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TextButtonTokens.kt
index 5ebe3a1..90f2c21 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TextButtonTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TextButtonTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -37,4 +37,4 @@
     val IconColor = ColorSchemeKeyTokens.Primary
     val IconSize = 18.0.dp
     val PressedIconColor = ColorSchemeKeyTokens.Primary
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TopAppBarLargeTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TopAppBarLargeTokens.kt
index c92d666..3713c50 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TopAppBarLargeTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TopAppBarLargeTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -32,4 +32,4 @@
     val LeadingIconSize = 24.0.dp
     val TrailingIconColor = ColorSchemeKeyTokens.OnSurfaceVariant
     val TrailingIconSize = 24.0.dp
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TopAppBarMediumTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TopAppBarMediumTokens.kt
index 51a9051..b2045a5 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TopAppBarMediumTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TopAppBarMediumTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -32,4 +32,4 @@
     val LeadingIconSize = 24.0.dp
     val TrailingIconColor = ColorSchemeKeyTokens.OnSurfaceVariant
     val TrailingIconSize = 24.0.dp
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TopAppBarSmallCenteredTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TopAppBarSmallCenteredTokens.kt
index 36135eb..b684952 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TopAppBarSmallCenteredTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TopAppBarSmallCenteredTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TopAppBarSmallTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TopAppBarSmallTokens.kt
index 84fe498..ebd8114 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TopAppBarSmallTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TopAppBarSmallTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -33,4 +33,4 @@
     val OnScrollContainerElevation = ElevationTokens.Level2
     val TrailingIconColor = ColorSchemeKeyTokens.OnSurfaceVariant
     val TrailingIconSize = 24.0.dp
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TypeScaleTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TypeScaleTokens.kt
index 18945aa..0073539 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TypeScaleTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TypeScaleTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TypefaceTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TypefaceTokens.kt
index 49e3fe6..c5facaa 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TypefaceTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TypefaceTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TypographyKeyTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TypographyKeyTokens.kt
index 5f976f6..848d7a2 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TypographyKeyTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TypographyKeyTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -34,4 +34,4 @@
     TitleLarge,
     TitleMedium,
     TitleSmall,
-}
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TypographyTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TypographyTokens.kt
index 41e0e18..403ced0 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TypographyTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TypographyTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -21,109 +21,124 @@
 import androidx.compose.ui.text.TextStyle
 
 internal object TypographyTokens {
-    val BodyLarge = TextStyle(
-        fontFamily = TypeScaleTokens.BodyLargeFont,
-        fontWeight = TypeScaleTokens.BodyLargeWeight,
-        fontSize = TypeScaleTokens.BodyLargeSize,
-        lineHeight = TypeScaleTokens.BodyLargeLineHeight,
-        letterSpacing = TypeScaleTokens.BodyLargeTracking,
-    )
-    val BodyMedium = TextStyle(
-        fontFamily = TypeScaleTokens.BodyMediumFont,
-        fontWeight = TypeScaleTokens.BodyMediumWeight,
-        fontSize = TypeScaleTokens.BodyMediumSize,
-        lineHeight = TypeScaleTokens.BodyMediumLineHeight,
-        letterSpacing = TypeScaleTokens.BodyMediumTracking,
-    )
-    val BodySmall = TextStyle(
-        fontFamily = TypeScaleTokens.BodySmallFont,
-        fontWeight = TypeScaleTokens.BodySmallWeight,
-        fontSize = TypeScaleTokens.BodySmallSize,
-        lineHeight = TypeScaleTokens.BodySmallLineHeight,
-        letterSpacing = TypeScaleTokens.BodySmallTracking,
-    )
-    val DisplayLarge = TextStyle(
-        fontFamily = TypeScaleTokens.DisplayLargeFont,
-        fontWeight = TypeScaleTokens.DisplayLargeWeight,
-        fontSize = TypeScaleTokens.DisplayLargeSize,
-        lineHeight = TypeScaleTokens.DisplayLargeLineHeight,
-        letterSpacing = TypeScaleTokens.DisplayLargeTracking,
-    )
-    val DisplayMedium = TextStyle(
-        fontFamily = TypeScaleTokens.DisplayMediumFont,
-        fontWeight = TypeScaleTokens.DisplayMediumWeight,
-        fontSize = TypeScaleTokens.DisplayMediumSize,
-        lineHeight = TypeScaleTokens.DisplayMediumLineHeight,
-        letterSpacing = TypeScaleTokens.DisplayMediumTracking,
-    )
-    val DisplaySmall = TextStyle(
-        fontFamily = TypeScaleTokens.DisplaySmallFont,
-        fontWeight = TypeScaleTokens.DisplaySmallWeight,
-        fontSize = TypeScaleTokens.DisplaySmallSize,
-        lineHeight = TypeScaleTokens.DisplaySmallLineHeight,
-        letterSpacing = TypeScaleTokens.DisplaySmallTracking,
-    )
-    val HeadlineLarge = TextStyle(
-        fontFamily = TypeScaleTokens.HeadlineLargeFont,
-        fontWeight = TypeScaleTokens.HeadlineLargeWeight,
-        fontSize = TypeScaleTokens.HeadlineLargeSize,
-        lineHeight = TypeScaleTokens.HeadlineLargeLineHeight,
-        letterSpacing = TypeScaleTokens.HeadlineLargeTracking,
-    )
-    val HeadlineMedium = TextStyle(
-        fontFamily = TypeScaleTokens.HeadlineMediumFont,
-        fontWeight = TypeScaleTokens.HeadlineMediumWeight,
-        fontSize = TypeScaleTokens.HeadlineMediumSize,
-        lineHeight = TypeScaleTokens.HeadlineMediumLineHeight,
-        letterSpacing = TypeScaleTokens.HeadlineMediumTracking,
-    )
-    val HeadlineSmall = TextStyle(
-        fontFamily = TypeScaleTokens.HeadlineSmallFont,
-        fontWeight = TypeScaleTokens.HeadlineSmallWeight,
-        fontSize = TypeScaleTokens.HeadlineSmallSize,
-        lineHeight = TypeScaleTokens.HeadlineSmallLineHeight,
-        letterSpacing = TypeScaleTokens.HeadlineSmallTracking,
-    )
-    val LabelLarge = TextStyle(
-        fontFamily = TypeScaleTokens.LabelLargeFont,
-        fontWeight = TypeScaleTokens.LabelLargeWeight,
-        fontSize = TypeScaleTokens.LabelLargeSize,
-        lineHeight = TypeScaleTokens.LabelLargeLineHeight,
-        letterSpacing = TypeScaleTokens.LabelLargeTracking,
-    )
-    val LabelMedium = TextStyle(
-        fontFamily = TypeScaleTokens.LabelMediumFont,
-        fontWeight = TypeScaleTokens.LabelMediumWeight,
-        fontSize = TypeScaleTokens.LabelMediumSize,
-        lineHeight = TypeScaleTokens.LabelMediumLineHeight,
-        letterSpacing = TypeScaleTokens.LabelMediumTracking,
-    )
-    val LabelSmall = TextStyle(
-        fontFamily = TypeScaleTokens.LabelSmallFont,
-        fontWeight = TypeScaleTokens.LabelSmallWeight,
-        fontSize = TypeScaleTokens.LabelSmallSize,
-        lineHeight = TypeScaleTokens.LabelSmallLineHeight,
-        letterSpacing = TypeScaleTokens.LabelSmallTracking,
-    )
-    val TitleLarge = TextStyle(
-        fontFamily = TypeScaleTokens.TitleLargeFont,
-        fontWeight = TypeScaleTokens.TitleLargeWeight,
-        fontSize = TypeScaleTokens.TitleLargeSize,
-        lineHeight = TypeScaleTokens.TitleLargeLineHeight,
-        letterSpacing = TypeScaleTokens.TitleLargeTracking,
-    )
-    val TitleMedium = TextStyle(
-        fontFamily = TypeScaleTokens.TitleMediumFont,
-        fontWeight = TypeScaleTokens.TitleMediumWeight,
-        fontSize = TypeScaleTokens.TitleMediumSize,
-        lineHeight = TypeScaleTokens.TitleMediumLineHeight,
-        letterSpacing = TypeScaleTokens.TitleMediumTracking,
-    )
-    val TitleSmall = TextStyle(
-        fontFamily = TypeScaleTokens.TitleSmallFont,
-        fontWeight = TypeScaleTokens.TitleSmallWeight,
-        fontSize = TypeScaleTokens.TitleSmallSize,
-        lineHeight = TypeScaleTokens.TitleSmallLineHeight,
-        letterSpacing = TypeScaleTokens.TitleSmallTracking,
-    )
-}
+    val BodyLarge =
+        TextStyle(
+            fontFamily = TypeScaleTokens.BodyLargeFont,
+            fontWeight = TypeScaleTokens.BodyLargeWeight,
+            fontSize = TypeScaleTokens.BodyLargeSize,
+            lineHeight = TypeScaleTokens.BodyLargeLineHeight,
+            letterSpacing = TypeScaleTokens.BodyLargeTracking,
+        )
+    val BodyMedium =
+        TextStyle(
+            fontFamily = TypeScaleTokens.BodyMediumFont,
+            fontWeight = TypeScaleTokens.BodyMediumWeight,
+            fontSize = TypeScaleTokens.BodyMediumSize,
+            lineHeight = TypeScaleTokens.BodyMediumLineHeight,
+            letterSpacing = TypeScaleTokens.BodyMediumTracking,
+        )
+    val BodySmall =
+        TextStyle(
+            fontFamily = TypeScaleTokens.BodySmallFont,
+            fontWeight = TypeScaleTokens.BodySmallWeight,
+            fontSize = TypeScaleTokens.BodySmallSize,
+            lineHeight = TypeScaleTokens.BodySmallLineHeight,
+            letterSpacing = TypeScaleTokens.BodySmallTracking,
+        )
+    val DisplayLarge =
+        TextStyle(
+            fontFamily = TypeScaleTokens.DisplayLargeFont,
+            fontWeight = TypeScaleTokens.DisplayLargeWeight,
+            fontSize = TypeScaleTokens.DisplayLargeSize,
+            lineHeight = TypeScaleTokens.DisplayLargeLineHeight,
+            letterSpacing = TypeScaleTokens.DisplayLargeTracking,
+        )
+    val DisplayMedium =
+        TextStyle(
+            fontFamily = TypeScaleTokens.DisplayMediumFont,
+            fontWeight = TypeScaleTokens.DisplayMediumWeight,
+            fontSize = TypeScaleTokens.DisplayMediumSize,
+            lineHeight = TypeScaleTokens.DisplayMediumLineHeight,
+            letterSpacing = TypeScaleTokens.DisplayMediumTracking,
+        )
+    val DisplaySmall =
+        TextStyle(
+            fontFamily = TypeScaleTokens.DisplaySmallFont,
+            fontWeight = TypeScaleTokens.DisplaySmallWeight,
+            fontSize = TypeScaleTokens.DisplaySmallSize,
+            lineHeight = TypeScaleTokens.DisplaySmallLineHeight,
+            letterSpacing = TypeScaleTokens.DisplaySmallTracking,
+        )
+    val HeadlineLarge =
+        TextStyle(
+            fontFamily = TypeScaleTokens.HeadlineLargeFont,
+            fontWeight = TypeScaleTokens.HeadlineLargeWeight,
+            fontSize = TypeScaleTokens.HeadlineLargeSize,
+            lineHeight = TypeScaleTokens.HeadlineLargeLineHeight,
+            letterSpacing = TypeScaleTokens.HeadlineLargeTracking,
+        )
+    val HeadlineMedium =
+        TextStyle(
+            fontFamily = TypeScaleTokens.HeadlineMediumFont,
+            fontWeight = TypeScaleTokens.HeadlineMediumWeight,
+            fontSize = TypeScaleTokens.HeadlineMediumSize,
+            lineHeight = TypeScaleTokens.HeadlineMediumLineHeight,
+            letterSpacing = TypeScaleTokens.HeadlineMediumTracking,
+        )
+    val HeadlineSmall =
+        TextStyle(
+            fontFamily = TypeScaleTokens.HeadlineSmallFont,
+            fontWeight = TypeScaleTokens.HeadlineSmallWeight,
+            fontSize = TypeScaleTokens.HeadlineSmallSize,
+            lineHeight = TypeScaleTokens.HeadlineSmallLineHeight,
+            letterSpacing = TypeScaleTokens.HeadlineSmallTracking,
+        )
+    val LabelLarge =
+        TextStyle(
+            fontFamily = TypeScaleTokens.LabelLargeFont,
+            fontWeight = TypeScaleTokens.LabelLargeWeight,
+            fontSize = TypeScaleTokens.LabelLargeSize,
+            lineHeight = TypeScaleTokens.LabelLargeLineHeight,
+            letterSpacing = TypeScaleTokens.LabelLargeTracking,
+        )
+    val LabelMedium =
+        TextStyle(
+            fontFamily = TypeScaleTokens.LabelMediumFont,
+            fontWeight = TypeScaleTokens.LabelMediumWeight,
+            fontSize = TypeScaleTokens.LabelMediumSize,
+            lineHeight = TypeScaleTokens.LabelMediumLineHeight,
+            letterSpacing = TypeScaleTokens.LabelMediumTracking,
+        )
+    val LabelSmall =
+        TextStyle(
+            fontFamily = TypeScaleTokens.LabelSmallFont,
+            fontWeight = TypeScaleTokens.LabelSmallWeight,
+            fontSize = TypeScaleTokens.LabelSmallSize,
+            lineHeight = TypeScaleTokens.LabelSmallLineHeight,
+            letterSpacing = TypeScaleTokens.LabelSmallTracking,
+        )
+    val TitleLarge =
+        TextStyle(
+            fontFamily = TypeScaleTokens.TitleLargeFont,
+            fontWeight = TypeScaleTokens.TitleLargeWeight,
+            fontSize = TypeScaleTokens.TitleLargeSize,
+            lineHeight = TypeScaleTokens.TitleLargeLineHeight,
+            letterSpacing = TypeScaleTokens.TitleLargeTracking,
+        )
+    val TitleMedium =
+        TextStyle(
+            fontFamily = TypeScaleTokens.TitleMediumFont,
+            fontWeight = TypeScaleTokens.TitleMediumWeight,
+            fontSize = TypeScaleTokens.TitleMediumSize,
+            lineHeight = TypeScaleTokens.TitleMediumLineHeight,
+            letterSpacing = TypeScaleTokens.TitleMediumTracking,
+        )
+    val TitleSmall =
+        TextStyle(
+            fontFamily = TypeScaleTokens.TitleSmallFont,
+            fontWeight = TypeScaleTokens.TitleSmallWeight,
+            fontSize = TypeScaleTokens.TitleSmallSize,
+            lineHeight = TypeScaleTokens.TitleSmallLineHeight,
+            letterSpacing = TypeScaleTokens.TitleSmallTracking,
+        )
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material/SafeDrawingInsets.desktop.kt b/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material/SafeDrawingInsets.desktop.kt
new file mode 100644
index 0000000..8fa5fb2
--- /dev/null
+++ b/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material/SafeDrawingInsets.desktop.kt
@@ -0,0 +1,25 @@
+/*
+ * 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.WindowInsets
+import androidx.compose.ui.unit.dp
+import androidx.compose.runtime.Composable
+
+internal actual val WindowInsets.Companion.safeDrawingForVisualComponents: WindowInsets
+    @Composable
+    get() = WindowInsets(0.dp, 0.dp, 0.dp, 0.dp)
\ 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 3e75629..bcd0170 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
@@ -27,6 +27,7 @@
         Strings.DefaultErrorMessage -> "Invalid input"
         Strings.SliderRangeStart -> "Range Start"
         Strings.SliderRangeEnd -> "Range End"
+        Strings.Dialog -> "Dialog"
         else -> ""
     }
 }
\ No newline at end of file
diff --git a/compose/runtime/runtime-livedata/api/1.3.0-beta01.txt b/compose/runtime/runtime-livedata/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..e004a29
--- /dev/null
+++ b/compose/runtime/runtime-livedata/api/1.3.0-beta01.txt
@@ -0,0 +1,10 @@
+// Signature format: 4.0
+package androidx.compose.runtime.livedata {
+
+  public final class LiveDataAdapterKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> observeAsState(androidx.lifecycle.LiveData<T>);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> observeAsState(androidx.lifecycle.LiveData<T>, R? initial);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-livedata/api/public_plus_experimental_1.3.0-beta01.txt b/compose/runtime/runtime-livedata/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..e004a29
--- /dev/null
+++ b/compose/runtime/runtime-livedata/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,10 @@
+// Signature format: 4.0
+package androidx.compose.runtime.livedata {
+
+  public final class LiveDataAdapterKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> observeAsState(androidx.lifecycle.LiveData<T>);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> observeAsState(androidx.lifecycle.LiveData<T>, R? initial);
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/compose/runtime/runtime-livedata/api/res-1.3.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/runtime/runtime-livedata/api/res-1.3.0-beta01.txt
diff --git a/compose/runtime/runtime-livedata/api/restricted_1.3.0-beta01.txt b/compose/runtime/runtime-livedata/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..e004a29
--- /dev/null
+++ b/compose/runtime/runtime-livedata/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,10 @@
+// Signature format: 4.0
+package androidx.compose.runtime.livedata {
+
+  public final class LiveDataAdapterKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> observeAsState(androidx.lifecycle.LiveData<T>);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> observeAsState(androidx.lifecycle.LiveData<T>, R? initial);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-rxjava2/api/1.3.0-beta01.txt b/compose/runtime/runtime-rxjava2/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..fb30f38
--- /dev/null
+++ b/compose/runtime/runtime-rxjava2/api/1.3.0-beta01.txt
@@ -0,0 +1,13 @@
+// Signature format: 4.0
+package androidx.compose.runtime.rxjava2 {
+
+  public final class RxJava2AdapterKt {
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Observable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Flowable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Single<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Maybe<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> subscribeAsState(io.reactivex.Completable);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-rxjava2/api/public_plus_experimental_1.3.0-beta01.txt b/compose/runtime/runtime-rxjava2/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..fb30f38
--- /dev/null
+++ b/compose/runtime/runtime-rxjava2/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,13 @@
+// Signature format: 4.0
+package androidx.compose.runtime.rxjava2 {
+
+  public final class RxJava2AdapterKt {
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Observable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Flowable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Single<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Maybe<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> subscribeAsState(io.reactivex.Completable);
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/compose/runtime/runtime-rxjava2/api/res-1.3.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/runtime/runtime-rxjava2/api/res-1.3.0-beta01.txt
diff --git a/compose/runtime/runtime-rxjava2/api/restricted_1.3.0-beta01.txt b/compose/runtime/runtime-rxjava2/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..fb30f38
--- /dev/null
+++ b/compose/runtime/runtime-rxjava2/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,13 @@
+// Signature format: 4.0
+package androidx.compose.runtime.rxjava2 {
+
+  public final class RxJava2AdapterKt {
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Observable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Flowable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Single<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Maybe<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> subscribeAsState(io.reactivex.Completable);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-rxjava3/api/1.3.0-beta01.txt b/compose/runtime/runtime-rxjava3/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..1930cc8
--- /dev/null
+++ b/compose/runtime/runtime-rxjava3/api/1.3.0-beta01.txt
@@ -0,0 +1,13 @@
+// Signature format: 4.0
+package androidx.compose.runtime.rxjava3 {
+
+  public final class RxJava3AdapterKt {
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Observable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Flowable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Single<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Maybe<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> subscribeAsState(io.reactivex.rxjava3.core.Completable);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-rxjava3/api/public_plus_experimental_1.3.0-beta01.txt b/compose/runtime/runtime-rxjava3/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..1930cc8
--- /dev/null
+++ b/compose/runtime/runtime-rxjava3/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,13 @@
+// Signature format: 4.0
+package androidx.compose.runtime.rxjava3 {
+
+  public final class RxJava3AdapterKt {
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Observable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Flowable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Single<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Maybe<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> subscribeAsState(io.reactivex.rxjava3.core.Completable);
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/compose/runtime/runtime-rxjava3/api/res-1.3.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/runtime/runtime-rxjava3/api/res-1.3.0-beta01.txt
diff --git a/compose/runtime/runtime-rxjava3/api/restricted_1.3.0-beta01.txt b/compose/runtime/runtime-rxjava3/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..1930cc8
--- /dev/null
+++ b/compose/runtime/runtime-rxjava3/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,13 @@
+// Signature format: 4.0
+package androidx.compose.runtime.rxjava3 {
+
+  public final class RxJava3AdapterKt {
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Observable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Flowable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Single<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Maybe<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> subscribeAsState(io.reactivex.rxjava3.core.Completable);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-saveable/api/1.3.0-beta01.txt b/compose/runtime/runtime-saveable/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..ce5d51b
--- /dev/null
+++ b/compose/runtime/runtime-saveable/api/1.3.0-beta01.txt
@@ -0,0 +1,58 @@
+// Signature format: 4.0
+package androidx.compose.runtime.saveable {
+
+  public final class ListSaverKt {
+    method public static <Original, Saveable> androidx.compose.runtime.saveable.Saver<Original,java.lang.Object> listSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super Original,? extends java.util.List<? extends Saveable>> save, kotlin.jvm.functions.Function1<? super java.util.List<? extends Saveable>,? extends Original> restore);
+  }
+
+  public final class MapSaverKt {
+    method public static <T> androidx.compose.runtime.saveable.Saver<T,java.lang.Object> mapSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super T,? extends java.util.Map<java.lang.String,?>> save, kotlin.jvm.functions.Function1<? super java.util.Map<java.lang.String,?>,? extends T> restore);
+  }
+
+  public final class RememberSaveableKt {
+    method @androidx.compose.runtime.Composable public static <T> T rememberSaveable(Object![]? inputs, optional androidx.compose.runtime.saveable.Saver<T,?> saver, optional String? key, kotlin.jvm.functions.Function0<? extends T> init);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.MutableState<T> rememberSaveable(Object![]? inputs, androidx.compose.runtime.saveable.Saver<T,?> stateSaver, optional String? key, kotlin.jvm.functions.Function0<? extends androidx.compose.runtime.MutableState<T>> init);
+  }
+
+  public interface SaveableStateHolder {
+    method @androidx.compose.runtime.Composable public void SaveableStateProvider(Object key, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public void removeState(Object key);
+  }
+
+  public final class SaveableStateHolderKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.saveable.SaveableStateHolder rememberSaveableStateHolder();
+  }
+
+  public interface SaveableStateRegistry {
+    method public boolean canBeSaved(Object value);
+    method public Object? consumeRestored(String key);
+    method public java.util.Map<java.lang.String,java.util.List<java.lang.Object>> performSave();
+    method public androidx.compose.runtime.saveable.SaveableStateRegistry.Entry registerProvider(String key, kotlin.jvm.functions.Function0<?> valueProvider);
+  }
+
+  public static interface SaveableStateRegistry.Entry {
+    method public void unregister();
+  }
+
+  public final class SaveableStateRegistryKt {
+    method public static androidx.compose.runtime.saveable.SaveableStateRegistry SaveableStateRegistry(java.util.Map<java.lang.String,? extends java.util.List<?>>? restoredValues, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> canBeSaved);
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> getLocalSaveableStateRegistry();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> LocalSaveableStateRegistry;
+  }
+
+  public interface Saver<Original, Saveable> {
+    method public Original? restore(Saveable value);
+    method public Saveable? save(androidx.compose.runtime.saveable.SaverScope, Original? value);
+  }
+
+  public final class SaverKt {
+    method public static <Original, Saveable> androidx.compose.runtime.saveable.Saver<Original,Saveable> Saver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super Original,? extends Saveable> save, kotlin.jvm.functions.Function1<? super Saveable,? extends Original> restore);
+    method public static <T> androidx.compose.runtime.saveable.Saver<T,java.lang.Object> autoSaver();
+  }
+
+  public fun interface SaverScope {
+    method public boolean canBeSaved(Object value);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-saveable/api/public_plus_experimental_1.3.0-beta01.txt b/compose/runtime/runtime-saveable/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..ce5d51b
--- /dev/null
+++ b/compose/runtime/runtime-saveable/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,58 @@
+// Signature format: 4.0
+package androidx.compose.runtime.saveable {
+
+  public final class ListSaverKt {
+    method public static <Original, Saveable> androidx.compose.runtime.saveable.Saver<Original,java.lang.Object> listSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super Original,? extends java.util.List<? extends Saveable>> save, kotlin.jvm.functions.Function1<? super java.util.List<? extends Saveable>,? extends Original> restore);
+  }
+
+  public final class MapSaverKt {
+    method public static <T> androidx.compose.runtime.saveable.Saver<T,java.lang.Object> mapSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super T,? extends java.util.Map<java.lang.String,?>> save, kotlin.jvm.functions.Function1<? super java.util.Map<java.lang.String,?>,? extends T> restore);
+  }
+
+  public final class RememberSaveableKt {
+    method @androidx.compose.runtime.Composable public static <T> T rememberSaveable(Object![]? inputs, optional androidx.compose.runtime.saveable.Saver<T,?> saver, optional String? key, kotlin.jvm.functions.Function0<? extends T> init);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.MutableState<T> rememberSaveable(Object![]? inputs, androidx.compose.runtime.saveable.Saver<T,?> stateSaver, optional String? key, kotlin.jvm.functions.Function0<? extends androidx.compose.runtime.MutableState<T>> init);
+  }
+
+  public interface SaveableStateHolder {
+    method @androidx.compose.runtime.Composable public void SaveableStateProvider(Object key, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public void removeState(Object key);
+  }
+
+  public final class SaveableStateHolderKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.saveable.SaveableStateHolder rememberSaveableStateHolder();
+  }
+
+  public interface SaveableStateRegistry {
+    method public boolean canBeSaved(Object value);
+    method public Object? consumeRestored(String key);
+    method public java.util.Map<java.lang.String,java.util.List<java.lang.Object>> performSave();
+    method public androidx.compose.runtime.saveable.SaveableStateRegistry.Entry registerProvider(String key, kotlin.jvm.functions.Function0<?> valueProvider);
+  }
+
+  public static interface SaveableStateRegistry.Entry {
+    method public void unregister();
+  }
+
+  public final class SaveableStateRegistryKt {
+    method public static androidx.compose.runtime.saveable.SaveableStateRegistry SaveableStateRegistry(java.util.Map<java.lang.String,? extends java.util.List<?>>? restoredValues, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> canBeSaved);
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> getLocalSaveableStateRegistry();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> LocalSaveableStateRegistry;
+  }
+
+  public interface Saver<Original, Saveable> {
+    method public Original? restore(Saveable value);
+    method public Saveable? save(androidx.compose.runtime.saveable.SaverScope, Original? value);
+  }
+
+  public final class SaverKt {
+    method public static <Original, Saveable> androidx.compose.runtime.saveable.Saver<Original,Saveable> Saver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super Original,? extends Saveable> save, kotlin.jvm.functions.Function1<? super Saveable,? extends Original> restore);
+    method public static <T> androidx.compose.runtime.saveable.Saver<T,java.lang.Object> autoSaver();
+  }
+
+  public fun interface SaverScope {
+    method public boolean canBeSaved(Object value);
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/compose/runtime/runtime-saveable/api/res-1.3.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/runtime/runtime-saveable/api/res-1.3.0-beta01.txt
diff --git a/compose/runtime/runtime-saveable/api/restricted_1.3.0-beta01.txt b/compose/runtime/runtime-saveable/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..ce5d51b
--- /dev/null
+++ b/compose/runtime/runtime-saveable/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,58 @@
+// Signature format: 4.0
+package androidx.compose.runtime.saveable {
+
+  public final class ListSaverKt {
+    method public static <Original, Saveable> androidx.compose.runtime.saveable.Saver<Original,java.lang.Object> listSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super Original,? extends java.util.List<? extends Saveable>> save, kotlin.jvm.functions.Function1<? super java.util.List<? extends Saveable>,? extends Original> restore);
+  }
+
+  public final class MapSaverKt {
+    method public static <T> androidx.compose.runtime.saveable.Saver<T,java.lang.Object> mapSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super T,? extends java.util.Map<java.lang.String,?>> save, kotlin.jvm.functions.Function1<? super java.util.Map<java.lang.String,?>,? extends T> restore);
+  }
+
+  public final class RememberSaveableKt {
+    method @androidx.compose.runtime.Composable public static <T> T rememberSaveable(Object![]? inputs, optional androidx.compose.runtime.saveable.Saver<T,?> saver, optional String? key, kotlin.jvm.functions.Function0<? extends T> init);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.MutableState<T> rememberSaveable(Object![]? inputs, androidx.compose.runtime.saveable.Saver<T,?> stateSaver, optional String? key, kotlin.jvm.functions.Function0<? extends androidx.compose.runtime.MutableState<T>> init);
+  }
+
+  public interface SaveableStateHolder {
+    method @androidx.compose.runtime.Composable public void SaveableStateProvider(Object key, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public void removeState(Object key);
+  }
+
+  public final class SaveableStateHolderKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.saveable.SaveableStateHolder rememberSaveableStateHolder();
+  }
+
+  public interface SaveableStateRegistry {
+    method public boolean canBeSaved(Object value);
+    method public Object? consumeRestored(String key);
+    method public java.util.Map<java.lang.String,java.util.List<java.lang.Object>> performSave();
+    method public androidx.compose.runtime.saveable.SaveableStateRegistry.Entry registerProvider(String key, kotlin.jvm.functions.Function0<?> valueProvider);
+  }
+
+  public static interface SaveableStateRegistry.Entry {
+    method public void unregister();
+  }
+
+  public final class SaveableStateRegistryKt {
+    method public static androidx.compose.runtime.saveable.SaveableStateRegistry SaveableStateRegistry(java.util.Map<java.lang.String,? extends java.util.List<?>>? restoredValues, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> canBeSaved);
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> getLocalSaveableStateRegistry();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> LocalSaveableStateRegistry;
+  }
+
+  public interface Saver<Original, Saveable> {
+    method public Original? restore(Saveable value);
+    method public Saveable? save(androidx.compose.runtime.saveable.SaverScope, Original? value);
+  }
+
+  public final class SaverKt {
+    method public static <Original, Saveable> androidx.compose.runtime.saveable.Saver<Original,Saveable> Saver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super Original,? extends Saveable> save, kotlin.jvm.functions.Function1<? super Saveable,? extends Original> restore);
+    method public static <T> androidx.compose.runtime.saveable.Saver<T,java.lang.Object> autoSaver();
+  }
+
+  public fun interface SaverScope {
+    method public boolean canBeSaved(Object value);
+  }
+
+}
+
diff --git a/compose/runtime/runtime/api/1.3.0-beta01.txt b/compose/runtime/runtime/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..2c2e001
--- /dev/null
+++ b/compose/runtime/runtime/api/1.3.0-beta01.txt
@@ -0,0 +1,998 @@
+// 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 {
+  }
+
+  @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 BitwiseOperatorsKt {
+  }
+
+  public final class BroadcastFrameClock implements androidx.compose.runtime.MonotonicFrameClock {
+    ctor public BroadcastFrameClock(optional kotlin.jvm.functions.Function0<kotlin.Unit>? onNewAwaiters);
+    method public void cancel(optional java.util.concurrent.CancellationException cancellationException);
+    method public boolean getHasAwaiters();
+    method public void sendFrame(long timeNanos);
+    method public suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R>);
+    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 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 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 @androidx.compose.runtime.ComposeCompilerApi public void enableReusing();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endDefaults();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endMovableGroup();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endNode();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endReplaceableGroup();
+    method @androidx.compose.runtime.ComposeCompilerApi public androidx.compose.runtime.ScopeUpdateScope? endRestartGroup();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endReusableGroup();
+    method public androidx.compose.runtime.Applier<?> getApplier();
+    method @org.jetbrains.annotations.TestOnly public kotlin.coroutines.CoroutineContext getApplyCoroutineContext();
+    method @org.jetbrains.annotations.TestOnly public androidx.compose.runtime.ControlledComposition getComposition();
+    method public androidx.compose.runtime.tooling.CompositionData getCompositionData();
+    method public int getCompoundKeyHash();
+    method public boolean getDefaultsInvalid();
+    method public boolean getInserting();
+    method public androidx.compose.runtime.RecomposeScope? getRecomposeScope();
+    method public 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 kotlin.coroutines.CoroutineContext applyCoroutineContext;
+    property @org.jetbrains.annotations.TestOnly public abstract androidx.compose.runtime.ControlledComposition composition;
+    property public abstract androidx.compose.runtime.tooling.CompositionData compositionData;
+    property public abstract int compoundKeyHash;
+    property public abstract boolean defaultsInvalid;
+    property public abstract boolean inserting;
+    property public abstract androidx.compose.runtime.RecomposeScope? recomposeScope;
+    property public abstract 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 CompositionContextKt {
+  }
+
+  public final class CompositionKt {
+    method public static androidx.compose.runtime.Composition Composition(androidx.compose.runtime.Applier<?> applier, androidx.compose.runtime.CompositionContext parent);
+    method @org.jetbrains.annotations.TestOnly public static androidx.compose.runtime.ControlledComposition ControlledComposition(androidx.compose.runtime.Applier<?> applier, androidx.compose.runtime.CompositionContext parent);
+  }
+
+  @androidx.compose.runtime.Stable public abstract sealed class CompositionLocal<T> {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! getCurrent();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! current;
+  }
+
+  @androidx.compose.runtime.Stable public final class CompositionLocalContext {
+  }
+
+  public final class CompositionLocalKt {
+    method @androidx.compose.runtime.Composable public static void CompositionLocalProvider(androidx.compose.runtime.ProvidedValue<?>![] values, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void CompositionLocalProvider(androidx.compose.runtime.CompositionLocalContext context, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> compositionLocalOf(optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy, kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+    method public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> staticCompositionLocalOf(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+  }
+
+  public 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);
+  }
+
+  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 {
+  }
+
+  @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 {
+  }
+
+  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);
+  }
+
+  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);
+  }
+
+  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;
+  }
+
+  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);
+    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.external.kotlinx.collections.immutable {
+
+  public final class ExtensionsKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList {
+
+  public final class UtilsKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap {
+
+  public final class PersistentHashMapContentIteratorsKt {
+  }
+
+  public final class TrieNodeKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableSet {
+
+  public final class TrieNodeKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.internal {
+
+  public final class CommonFunctionsKt {
+  }
+
+  public final class ForEachOneBitKt {
+  }
+
+}
+
+package androidx.compose.runtime.internal {
+
+  @androidx.compose.runtime.ComposeCompilerApi @androidx.compose.runtime.Stable public interface ComposableLambda extends kotlin.jvm.functions.Function2<androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function10<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function11<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function13<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function14<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function15<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function16<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function17<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function18<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function19<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function20<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function21<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function3<java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function4<java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function5<java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function6<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function7<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function8<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function9<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> {
+  }
+
+  public final class ComposableLambdaKt {
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambda composableLambda(androidx.compose.runtime.Composer composer, int key, boolean tracked, Object block);
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambda composableLambdaInstance(int key, boolean tracked, Object block);
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @androidx.compose.runtime.Stable public interface ComposableLambdaN extends kotlin.jvm.functions.FunctionN<java.lang.Object> {
+  }
+
+  public final class ComposableLambdaN_jvmKt {
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambdaN composableLambdaN(androidx.compose.runtime.Composer composer, int key, boolean tracked, int arity, Object block);
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambdaN composableLambdaNInstance(int key, boolean tracked, int arity, Object block);
+  }
+
+  public final class DecoyKt {
+    method @androidx.compose.runtime.ComposeCompilerApi public static Void illegalDecoyCallException(String fName);
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.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;
+  }
+
+  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;
+  }
+
+  @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;
+  }
+
+  public final class ThreadMapKt {
+  }
+
+}
+
+package androidx.compose.runtime.reflect {
+
+  public final class ComposableMethod {
+    method public java.lang.reflect.Method asMethod();
+    method public int getParameterCount();
+    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 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 final class ListUtilsKt {
+  }
+
+  public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
+    method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
+    method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
+    method public boolean getReadOnly();
+    method public androidx.compose.runtime.snapshots.Snapshot getRoot();
+    method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
+    method public boolean hasPendingChanges();
+    method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
+    method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
+    property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
+    property public boolean readOnly;
+    property public androidx.compose.runtime.snapshots.Snapshot root;
+    property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver;
+  }
+
+  public fun interface ObserverHandle {
+    method public void dispose();
+  }
+
+  public abstract sealed class Snapshot {
+    method public void dispose();
+    method public final inline <T> T! enter(kotlin.jvm.functions.Function0<? extends T> block);
+    method public int getId();
+    method public abstract boolean getReadOnly();
+    method public abstract androidx.compose.runtime.snapshots.Snapshot getRoot();
+    method public abstract boolean hasPendingChanges();
+    method public abstract androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
+    property public int id;
+    property public abstract boolean readOnly;
+    property public abstract androidx.compose.runtime.snapshots.Snapshot root;
+    field public static final androidx.compose.runtime.snapshots.Snapshot.Companion Companion;
+  }
+
+  public static final class Snapshot.Companion {
+    method public androidx.compose.runtime.snapshots.Snapshot getCurrent();
+    method public inline <T> T! global(kotlin.jvm.functions.Function0<? extends T> block);
+    method public void notifyObjectsInitialized();
+    method public <T> T! observe(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver, kotlin.jvm.functions.Function0<? extends T> block);
+    method public androidx.compose.runtime.snapshots.ObserverHandle registerApplyObserver(kotlin.jvm.functions.Function2<? super java.util.Set<?>,? super androidx.compose.runtime.snapshots.Snapshot,kotlin.Unit> observer);
+    method public androidx.compose.runtime.snapshots.ObserverHandle registerGlobalWriteObserver(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit> observer);
+    method public void sendApplyNotifications();
+    method public androidx.compose.runtime.snapshots.MutableSnapshot takeMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
+    method public androidx.compose.runtime.snapshots.Snapshot takeSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
+    method public inline <R> R! withMutableSnapshot(kotlin.jvm.functions.Function0<? extends R> block);
+    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 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);
+    method public static inline <T extends androidx.compose.runtime.snapshots.StateRecord, R> R! withCurrent(T, kotlin.jvm.functions.Function1<? super T,? extends R> block);
+    method public static inline <T extends androidx.compose.runtime.snapshots.StateRecord, R> R! writable(T, androidx.compose.runtime.snapshots.StateObject state, androidx.compose.runtime.snapshots.Snapshot snapshot, kotlin.jvm.functions.Function1<? super T,? extends R> block);
+    method public static inline <T extends androidx.compose.runtime.snapshots.StateRecord, R> R! writable(T, androidx.compose.runtime.snapshots.StateObject state, kotlin.jvm.functions.Function1<? super T,? extends R> block);
+  }
+
+  public interface SnapshotMutableState<T> extends androidx.compose.runtime.MutableState<T> {
+    method public androidx.compose.runtime.SnapshotMutationPolicy<T> getPolicy();
+    property public abstract androidx.compose.runtime.SnapshotMutationPolicy<T> policy;
+  }
+
+  @androidx.compose.runtime.Stable public final class SnapshotStateList<T> implements kotlin.jvm.internal.markers.KMutableList java.util.List<T> androidx.compose.runtime.snapshots.StateObject {
+    ctor public SnapshotStateList();
+    method public boolean add(T? element);
+    method public void add(int index, T? element);
+    method public boolean addAll(int index, java.util.Collection<? extends T> elements);
+    method public boolean addAll(java.util.Collection<? extends T> elements);
+    method public void clear();
+    method public boolean contains(T? element);
+    method public boolean containsAll(java.util.Collection<E!> elements);
+    method public T! get(int index);
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
+    method public int getSize();
+    method public int indexOf(T? element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<T> iterator();
+    method public int lastIndexOf(T? element);
+    method public java.util.ListIterator<T> listIterator();
+    method public java.util.ListIterator<T> listIterator(int index);
+    method public void prependStateRecord(androidx.compose.runtime.snapshots.StateRecord value);
+    method public boolean remove(T? element);
+    method public boolean removeAll(java.util.Collection<E!> elements);
+    method public T! removeAt(int index);
+    method public void removeRange(int fromIndex, int toIndex);
+    method public boolean retainAll(java.util.Collection<E!> elements);
+    method public T! set(int index, T? element);
+    method public java.util.List<T> subList(int fromIndex, int toIndex);
+    property public androidx.compose.runtime.snapshots.StateRecord firstStateRecord;
+    property public int size;
+  }
+
+  public final class SnapshotStateListKt {
+  }
+
+  @androidx.compose.runtime.Stable public final class SnapshotStateMap<K, V> implements kotlin.jvm.internal.markers.KMutableMap java.util.Map<K,V> androidx.compose.runtime.snapshots.StateObject {
+    ctor public SnapshotStateMap();
+    method public void clear();
+    method public boolean containsKey(K? key);
+    method public boolean containsValue(V? value);
+    method public V? get(Object? key);
+    method public java.util.Set<java.util.Map.Entry<K,V>> getEntries();
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
+    method public java.util.Set<K> getKeys();
+    method public int getSize();
+    method public java.util.Collection<V> getValues();
+    method public boolean isEmpty();
+    method public void prependStateRecord(androidx.compose.runtime.snapshots.StateRecord value);
+    method public V? put(K? key, V? value);
+    method public void putAll(java.util.Map<? extends K,? extends V> from);
+    method public V? remove(Object? key);
+    property public java.util.Set<java.util.Map.Entry<K,V>> entries;
+    property public androidx.compose.runtime.snapshots.StateRecord firstStateRecord;
+    property public java.util.Set<K> keys;
+    property public int size;
+    property public java.util.Collection<V> values;
+  }
+
+  public final class SnapshotStateMapKt {
+  }
+
+  public final class SnapshotStateObserver {
+    ctor public SnapshotStateObserver(kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> onChangedExecutor);
+    method public void clear(Object scope);
+    method public void clear();
+    method public void clearIf(kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> predicate);
+    method @org.jetbrains.annotations.TestOnly public void notifyChanges(java.util.Set<?> changes, androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method public <T> void observeReads(T scope, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> onValueChangedForScope, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public void start();
+    method public void stop();
+    method @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 Object? getIdentity();
+    method public Object getKey();
+    method public Object? getNode();
+    method public String? getSourceInfo();
+    property public abstract Iterable<java.lang.Object> data;
+    property public default Object? identity;
+    property public abstract Object key;
+    property public abstract Object? node;
+    property public abstract String? sourceInfo;
+  }
+
+  public final class InspectionTablesKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.util.Set<androidx.compose.runtime.tooling.CompositionData>> getLocalInspectionTables();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.util.Set<androidx.compose.runtime.tooling.CompositionData>> LocalInspectionTables;
+  }
+
+}
+
diff --git a/compose/runtime/runtime/api/current.txt b/compose/runtime/runtime/api/current.txt
index a7e4a54..2c2e001 100644
--- a/compose/runtime/runtime/api/current.txt
+++ b/compose/runtime/runtime/api/current.txt
@@ -761,12 +761,18 @@
 
 package androidx.compose.runtime.reflect {
 
-  public final class ComposableMethodInvokerKt {
-    method @kotlin.jvm.Throws(exceptionClasses=NoSuchMethodException::class) public static java.lang.reflect.Method getDeclaredComposableMethod(Class<?>, String methodName, Class<?>... args) throws java.lang.NoSuchMethodException;
-    method public static java.lang.reflect.Parameter![] getRealParameters(java.lang.reflect.Method);
-    method public static int getRealParametersCount(java.lang.reflect.Method);
-    method public static Object? invokeComposable(java.lang.reflect.Method, androidx.compose.runtime.Composer composer, Object? instance, java.lang.Object?... args);
-    method public static boolean isComposable(java.lang.reflect.Method);
+  public final class ComposableMethod {
+    method public java.lang.reflect.Method asMethod();
+    method public int getParameterCount();
+    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 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;
   }
 
 }
@@ -963,6 +969,7 @@
 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;
diff --git a/compose/runtime/runtime/api/public_plus_experimental_1.3.0-beta01.txt b/compose/runtime/runtime/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..0801888
--- /dev/null
+++ b/compose/runtime/runtime/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,1074 @@
+// 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 {
+  }
+
+  @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 BitwiseOperatorsKt {
+  }
+
+  public final class BroadcastFrameClock implements androidx.compose.runtime.MonotonicFrameClock {
+    ctor public BroadcastFrameClock(optional kotlin.jvm.functions.Function0<kotlin.Unit>? onNewAwaiters);
+    method public void cancel(optional java.util.concurrent.CancellationException cancellationException);
+    method public boolean getHasAwaiters();
+    method public void sendFrame(long timeNanos);
+    method public suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R>);
+    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 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 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 @androidx.compose.runtime.ComposeCompilerApi public void enableReusing();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endDefaults();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endMovableGroup();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endNode();
+    method @androidx.compose.runtime.InternalComposeApi public void endProviders();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endReplaceableGroup();
+    method @androidx.compose.runtime.ComposeCompilerApi public androidx.compose.runtime.ScopeUpdateScope? endRestartGroup();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endReusableGroup();
+    method public androidx.compose.runtime.Applier<?> getApplier();
+    method @org.jetbrains.annotations.TestOnly public kotlin.coroutines.CoroutineContext getApplyCoroutineContext();
+    method @org.jetbrains.annotations.TestOnly public androidx.compose.runtime.ControlledComposition getComposition();
+    method public androidx.compose.runtime.tooling.CompositionData getCompositionData();
+    method public int getCompoundKeyHash();
+    method public boolean getDefaultsInvalid();
+    method public boolean getInserting();
+    method public androidx.compose.runtime.RecomposeScope? getRecomposeScope();
+    method public 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 @org.jetbrains.annotations.TestOnly public abstract kotlin.coroutines.CoroutineContext applyCoroutineContext;
+    property @org.jetbrains.annotations.TestOnly public abstract androidx.compose.runtime.ControlledComposition composition;
+    property public abstract androidx.compose.runtime.tooling.CompositionData compositionData;
+    property public abstract int compoundKeyHash;
+    property public abstract boolean defaultsInvalid;
+    property public abstract boolean inserting;
+    property public abstract androidx.compose.runtime.RecomposeScope? recomposeScope;
+    property public abstract 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 CompositionContextKt {
+  }
+
+  public final class CompositionKt {
+    method public static androidx.compose.runtime.Composition Composition(androidx.compose.runtime.Applier<?> applier, androidx.compose.runtime.CompositionContext parent);
+    method @androidx.compose.runtime.ExperimentalComposeApi public static androidx.compose.runtime.Composition Composition(androidx.compose.runtime.Applier<?> applier, androidx.compose.runtime.CompositionContext parent, kotlin.coroutines.CoroutineContext recomposeCoroutineContext);
+    method @org.jetbrains.annotations.TestOnly public static androidx.compose.runtime.ControlledComposition ControlledComposition(androidx.compose.runtime.Applier<?> applier, androidx.compose.runtime.CompositionContext parent);
+    method @androidx.compose.runtime.ExperimentalComposeApi @org.jetbrains.annotations.TestOnly public static androidx.compose.runtime.ControlledComposition ControlledComposition(androidx.compose.runtime.Applier<?> applier, androidx.compose.runtime.CompositionContext parent, kotlin.coroutines.CoroutineContext recomposeCoroutineContext);
+    method @androidx.compose.runtime.ExperimentalComposeApi public static kotlin.coroutines.CoroutineContext getRecomposeCoroutineContext(androidx.compose.runtime.ControlledComposition);
+  }
+
+  @androidx.compose.runtime.Stable public abstract sealed class CompositionLocal<T> {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! getCurrent();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! current;
+  }
+
+  @androidx.compose.runtime.Stable public final class CompositionLocalContext {
+  }
+
+  public final class CompositionLocalKt {
+    method @androidx.compose.runtime.Composable public static void CompositionLocalProvider(androidx.compose.runtime.ProvidedValue<?>![] values, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void CompositionLocalProvider(androidx.compose.runtime.CompositionLocalContext context, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> compositionLocalOf(optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy, kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+    method public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> staticCompositionLocalOf(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+  }
+
+  @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);
+  }
+
+  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.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.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.") 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 RecomposeScopeImplKt {
+  }
+
+  public final class Recomposer extends androidx.compose.runtime.CompositionContext {
+    ctor public Recomposer(kotlin.coroutines.CoroutineContext effectCoroutineContext);
+    method public androidx.compose.runtime.RecomposerInfo asRecomposerInfo();
+    method public suspend Object? awaitIdle(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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);
+  }
+
+  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);
+  }
+
+  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.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static <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.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static <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.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static <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.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static <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.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  @androidx.compose.runtime.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.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;
+  }
+
+  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);
+    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.external.kotlinx.collections.immutable {
+
+  public final class ExtensionsKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList {
+
+  public final class UtilsKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap {
+
+  public final class PersistentHashMapContentIteratorsKt {
+  }
+
+  public final class TrieNodeKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableSet {
+
+  public final class TrieNodeKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.internal {
+
+  public final class CommonFunctionsKt {
+  }
+
+  public final class ForEachOneBitKt {
+  }
+
+}
+
+package androidx.compose.runtime.internal {
+
+  @androidx.compose.runtime.ComposeCompilerApi @androidx.compose.runtime.Stable public interface ComposableLambda extends kotlin.jvm.functions.Function2<androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function10<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function11<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function13<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function14<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function15<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function16<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function17<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function18<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function19<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function20<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function21<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function3<java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function4<java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function5<java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function6<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function7<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function8<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function9<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> {
+  }
+
+  public final class ComposableLambdaKt {
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambda composableLambda(androidx.compose.runtime.Composer composer, int key, boolean tracked, Object block);
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambda composableLambdaInstance(int key, boolean tracked, Object block);
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @androidx.compose.runtime.Stable public interface ComposableLambdaN extends kotlin.jvm.functions.FunctionN<java.lang.Object> {
+  }
+
+  public final class ComposableLambdaN_jvmKt {
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambdaN composableLambdaN(androidx.compose.runtime.Composer composer, int key, boolean tracked, int arity, Object block);
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambdaN composableLambdaNInstance(int key, boolean tracked, int arity, Object block);
+  }
+
+  @androidx.compose.runtime.ExperimentalComposeApi @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.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;
+  }
+
+  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;
+  }
+
+  @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;
+  }
+
+  public final class ThreadMapKt {
+  }
+
+}
+
+package androidx.compose.runtime.reflect {
+
+  public final class ComposableMethod {
+    method public java.lang.reflect.Method asMethod();
+    method public int getParameterCount();
+    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 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 final class ListUtilsKt {
+  }
+
+  public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
+    method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
+    method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
+    method public boolean getReadOnly();
+    method public androidx.compose.runtime.snapshots.Snapshot getRoot();
+    method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
+    method public boolean hasPendingChanges();
+    method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
+    method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
+    property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
+    property public boolean readOnly;
+    property public androidx.compose.runtime.snapshots.Snapshot root;
+    property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver;
+  }
+
+  public fun interface ObserverHandle {
+    method public void dispose();
+  }
+
+  public abstract sealed class Snapshot {
+    method public void dispose();
+    method public final inline <T> T! enter(kotlin.jvm.functions.Function0<? extends T> block);
+    method public int getId();
+    method public abstract boolean getReadOnly();
+    method public abstract androidx.compose.runtime.snapshots.Snapshot getRoot();
+    method public abstract boolean hasPendingChanges();
+    method public abstract androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
+    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 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);
+    method public static inline <T extends androidx.compose.runtime.snapshots.StateRecord, R> R! withCurrent(T, kotlin.jvm.functions.Function1<? super T,? extends R> block);
+    method public static inline <T extends androidx.compose.runtime.snapshots.StateRecord, R> R! writable(T, androidx.compose.runtime.snapshots.StateObject state, androidx.compose.runtime.snapshots.Snapshot snapshot, kotlin.jvm.functions.Function1<? super T,? extends R> block);
+    method public static inline <T extends androidx.compose.runtime.snapshots.StateRecord, R> R! writable(T, androidx.compose.runtime.snapshots.StateObject state, kotlin.jvm.functions.Function1<? super T,? extends R> block);
+  }
+
+  public interface SnapshotMutableState<T> extends androidx.compose.runtime.MutableState<T> {
+    method public androidx.compose.runtime.SnapshotMutationPolicy<T> getPolicy();
+    property public abstract androidx.compose.runtime.SnapshotMutationPolicy<T> policy;
+  }
+
+  @androidx.compose.runtime.Stable public final class SnapshotStateList<T> implements kotlin.jvm.internal.markers.KMutableList java.util.List<T> androidx.compose.runtime.snapshots.StateObject {
+    ctor public SnapshotStateList();
+    method public boolean add(T? element);
+    method public void add(int index, T? element);
+    method public boolean addAll(int index, java.util.Collection<? extends T> elements);
+    method public boolean addAll(java.util.Collection<? extends T> elements);
+    method public void clear();
+    method public boolean contains(T? element);
+    method public boolean containsAll(java.util.Collection<E!> elements);
+    method public T! get(int index);
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
+    method public int getSize();
+    method public int indexOf(T? element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<T> iterator();
+    method public int lastIndexOf(T? element);
+    method public java.util.ListIterator<T> listIterator();
+    method public java.util.ListIterator<T> listIterator(int index);
+    method public void prependStateRecord(androidx.compose.runtime.snapshots.StateRecord value);
+    method public boolean remove(T? element);
+    method public boolean removeAll(java.util.Collection<E!> elements);
+    method public T! removeAt(int index);
+    method public void removeRange(int fromIndex, int toIndex);
+    method public boolean retainAll(java.util.Collection<E!> elements);
+    method public T! set(int index, T? element);
+    method public java.util.List<T> subList(int fromIndex, int toIndex);
+    property public androidx.compose.runtime.snapshots.StateRecord firstStateRecord;
+    property public int size;
+  }
+
+  public final class SnapshotStateListKt {
+  }
+
+  @androidx.compose.runtime.Stable public final class SnapshotStateMap<K, V> implements kotlin.jvm.internal.markers.KMutableMap java.util.Map<K,V> androidx.compose.runtime.snapshots.StateObject {
+    ctor public SnapshotStateMap();
+    method public void clear();
+    method public boolean containsKey(K? key);
+    method public boolean containsValue(V? value);
+    method public V? get(Object? key);
+    method public java.util.Set<java.util.Map.Entry<K,V>> getEntries();
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
+    method public java.util.Set<K> getKeys();
+    method public int getSize();
+    method public java.util.Collection<V> getValues();
+    method public boolean isEmpty();
+    method public void prependStateRecord(androidx.compose.runtime.snapshots.StateRecord value);
+    method public V? put(K? key, V? value);
+    method public void putAll(java.util.Map<? extends K,? extends V> from);
+    method public V? remove(Object? key);
+    property public java.util.Set<java.util.Map.Entry<K,V>> entries;
+    property public androidx.compose.runtime.snapshots.StateRecord firstStateRecord;
+    property public java.util.Set<K> keys;
+    property public int size;
+    property public java.util.Collection<V> values;
+  }
+
+  public final class SnapshotStateMapKt {
+  }
+
+  public final class SnapshotStateObserver {
+    ctor public SnapshotStateObserver(kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> onChangedExecutor);
+    method public void clear(Object scope);
+    method public void clear();
+    method public void clearIf(kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> predicate);
+    method @org.jetbrains.annotations.TestOnly public void notifyChanges(java.util.Set<?> changes, androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method public <T> void observeReads(T scope, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> onValueChangedForScope, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public void start();
+    method public void stop();
+    method @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 Object? getIdentity();
+    method public Object getKey();
+    method public Object? getNode();
+    method public String? getSourceInfo();
+    property public abstract Iterable<java.lang.Object> data;
+    property public default Object? identity;
+    property public abstract Object key;
+    property public abstract Object? node;
+    property public abstract String? sourceInfo;
+  }
+
+  public final class InspectionTablesKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.util.Set<androidx.compose.runtime.tooling.CompositionData>> getLocalInspectionTables();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.util.Set<androidx.compose.runtime.tooling.CompositionData>> LocalInspectionTables;
+  }
+
+}
+
diff --git a/compose/runtime/runtime/api/public_plus_experimental_current.txt b/compose/runtime/runtime/api/public_plus_experimental_current.txt
index 416bb72..0801888 100644
--- a/compose/runtime/runtime/api/public_plus_experimental_current.txt
+++ b/compose/runtime/runtime/api/public_plus_experimental_current.txt
@@ -826,12 +826,18 @@
 
 package androidx.compose.runtime.reflect {
 
-  public final class ComposableMethodInvokerKt {
-    method @kotlin.jvm.Throws(exceptionClasses=NoSuchMethodException::class) public static java.lang.reflect.Method getDeclaredComposableMethod(Class<?>, String methodName, Class<?>... args) throws java.lang.NoSuchMethodException;
-    method public static java.lang.reflect.Parameter![] getRealParameters(java.lang.reflect.Method);
-    method public static int getRealParametersCount(java.lang.reflect.Method);
-    method public static Object? invokeComposable(java.lang.reflect.Method, androidx.compose.runtime.Composer composer, Object? instance, java.lang.Object?... args);
-    method public static boolean isComposable(java.lang.reflect.Method);
+  public final class ComposableMethod {
+    method public java.lang.reflect.Method asMethod();
+    method public int getParameterCount();
+    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 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;
   }
 
 }
@@ -1039,6 +1045,7 @@
 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;
diff --git a/health/health-connect-client/api/res-current.txt b/compose/runtime/runtime/api/res-1.3.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/runtime/runtime/api/res-1.3.0-beta01.txt
diff --git a/compose/runtime/runtime/api/restricted_1.3.0-beta01.txt b/compose/runtime/runtime/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..f82be3b
--- /dev/null
+++ b/compose/runtime/runtime/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,1037 @@
+// 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 BitwiseOperatorsKt {
+  }
+
+  public final class BroadcastFrameClock implements androidx.compose.runtime.MonotonicFrameClock {
+    ctor public BroadcastFrameClock(optional kotlin.jvm.functions.Function0<kotlin.Unit>? onNewAwaiters);
+    method public void cancel(optional java.util.concurrent.CancellationException cancellationException);
+    method public boolean getHasAwaiters();
+    method public void sendFrame(long timeNanos);
+    method public suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R>);
+    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 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 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 @androidx.compose.runtime.ComposeCompilerApi public void enableReusing();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endDefaults();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endMovableGroup();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endNode();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endReplaceableGroup();
+    method @androidx.compose.runtime.ComposeCompilerApi public androidx.compose.runtime.ScopeUpdateScope? endRestartGroup();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endReusableGroup();
+    method public androidx.compose.runtime.Applier<?> getApplier();
+    method @org.jetbrains.annotations.TestOnly public kotlin.coroutines.CoroutineContext getApplyCoroutineContext();
+    method @org.jetbrains.annotations.TestOnly public androidx.compose.runtime.ControlledComposition getComposition();
+    method public androidx.compose.runtime.tooling.CompositionData getCompositionData();
+    method public int getCompoundKeyHash();
+    method public boolean getDefaultsInvalid();
+    method public boolean getInserting();
+    method public androidx.compose.runtime.RecomposeScope? getRecomposeScope();
+    method public 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 kotlin.coroutines.CoroutineContext applyCoroutineContext;
+    property @org.jetbrains.annotations.TestOnly public abstract androidx.compose.runtime.ControlledComposition composition;
+    property public abstract androidx.compose.runtime.tooling.CompositionData compositionData;
+    property public abstract int compoundKeyHash;
+    property public abstract boolean defaultsInvalid;
+    property public abstract boolean inserting;
+    property public abstract androidx.compose.runtime.RecomposeScope? recomposeScope;
+    property public abstract 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 CompositionContextKt {
+  }
+
+  public final class CompositionKt {
+    method public static androidx.compose.runtime.Composition Composition(androidx.compose.runtime.Applier<?> applier, androidx.compose.runtime.CompositionContext parent);
+    method @org.jetbrains.annotations.TestOnly public static androidx.compose.runtime.ControlledComposition ControlledComposition(androidx.compose.runtime.Applier<?> applier, androidx.compose.runtime.CompositionContext parent);
+  }
+
+  @androidx.compose.runtime.Stable public abstract sealed class CompositionLocal<T> {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! getCurrent();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! current;
+  }
+
+  @androidx.compose.runtime.Stable public final class CompositionLocalContext {
+  }
+
+  public final class CompositionLocalKt {
+    method @androidx.compose.runtime.Composable public static void CompositionLocalProvider(androidx.compose.runtime.ProvidedValue<?>![] values, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void CompositionLocalProvider(androidx.compose.runtime.CompositionLocalContext context, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> compositionLocalOf(optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy, kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+    method public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> staticCompositionLocalOf(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+  }
+
+  @kotlin.PublishedApi internal final class CompositionScopedCoroutineScopeCanceller implements androidx.compose.runtime.RememberObserver {
+    ctor public CompositionScopedCoroutineScopeCanceller(kotlinx.coroutines.CoroutineScope coroutineScope);
+    method public kotlinx.coroutines.CoroutineScope getCoroutineScope();
+    method public void onAbandoned();
+    method public void onForgotten();
+    method public void onRemembered();
+    property public final kotlinx.coroutines.CoroutineScope coroutineScope;
+  }
+
+  public 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 {
+  }
+
+  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);
+  }
+
+  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);
+  }
+
+  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;
+  }
+
+  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);
+    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.external.kotlinx.collections.immutable {
+
+  public final class ExtensionsKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList {
+
+  public final class UtilsKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap {
+
+  public final class PersistentHashMapContentIteratorsKt {
+  }
+
+  public final class TrieNodeKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableSet {
+
+  public final class TrieNodeKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.internal {
+
+  public final class CommonFunctionsKt {
+  }
+
+  public final class ForEachOneBitKt {
+  }
+
+}
+
+package androidx.compose.runtime.internal {
+
+  @androidx.compose.runtime.ComposeCompilerApi @androidx.compose.runtime.Stable public interface ComposableLambda extends kotlin.jvm.functions.Function2<androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function10<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function11<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function13<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function14<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function15<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function16<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function17<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function18<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function19<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function20<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function21<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function3<java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function4<java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function5<java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function6<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function7<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function8<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function9<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> {
+  }
+
+  public final class ComposableLambdaKt {
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambda composableLambda(androidx.compose.runtime.Composer composer, int key, boolean tracked, Object block);
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambda composableLambdaInstance(int key, boolean tracked, Object block);
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @androidx.compose.runtime.Stable public interface ComposableLambdaN extends kotlin.jvm.functions.FunctionN<java.lang.Object> {
+  }
+
+  public final class ComposableLambdaN_jvmKt {
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambdaN composableLambdaN(androidx.compose.runtime.Composer composer, int key, boolean tracked, int arity, Object block);
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambdaN composableLambdaNInstance(int key, boolean tracked, int arity, Object block);
+  }
+
+  public final class DecoyKt {
+    method @androidx.compose.runtime.ComposeCompilerApi public static Void illegalDecoyCallException(String fName);
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.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;
+  }
+
+  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;
+  }
+
+  @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;
+  }
+
+  public final class ThreadMapKt {
+  }
+
+}
+
+package androidx.compose.runtime.reflect {
+
+  public final class ComposableMethod {
+    method public java.lang.reflect.Method asMethod();
+    method public int getParameterCount();
+    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 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 final class ListUtilsKt {
+  }
+
+  public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
+    method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
+    method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
+    method public boolean getReadOnly();
+    method public androidx.compose.runtime.snapshots.Snapshot getRoot();
+    method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
+    method public boolean hasPendingChanges();
+    method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
+    method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
+    property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
+    property public boolean readOnly;
+    property public androidx.compose.runtime.snapshots.Snapshot root;
+    property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver;
+  }
+
+  public fun interface ObserverHandle {
+    method public void dispose();
+  }
+
+  public abstract sealed class Snapshot {
+    method public void dispose();
+    method public final inline <T> T! enter(kotlin.jvm.functions.Function0<? extends T> block);
+    method public int getId();
+    method public abstract boolean getReadOnly();
+    method public abstract androidx.compose.runtime.snapshots.Snapshot getRoot();
+    method public abstract boolean hasPendingChanges();
+    method @kotlin.PublishedApi internal androidx.compose.runtime.snapshots.Snapshot? makeCurrent();
+    method @kotlin.PublishedApi internal void restoreCurrent(androidx.compose.runtime.snapshots.Snapshot? snapshot);
+    method public abstract androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
+    property public int id;
+    property public abstract boolean readOnly;
+    property public abstract androidx.compose.runtime.snapshots.Snapshot root;
+    field public static final androidx.compose.runtime.snapshots.Snapshot.Companion Companion;
+  }
+
+  public static final class Snapshot.Companion {
+    method @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 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 void notifyWrite(androidx.compose.runtime.snapshots.Snapshot snapshot, androidx.compose.runtime.snapshots.StateObject state);
+    method public static <T extends androidx.compose.runtime.snapshots.StateRecord> T readable(T, androidx.compose.runtime.snapshots.StateObject state);
+    method public static <T extends androidx.compose.runtime.snapshots.StateRecord> T readable(T, androidx.compose.runtime.snapshots.StateObject state, androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method @kotlin.PublishedApi internal static inline <T> T! sync(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static inline <T extends androidx.compose.runtime.snapshots.StateRecord, R> R! withCurrent(T, kotlin.jvm.functions.Function1<? super T,? extends R> block);
+    method public static inline <T extends androidx.compose.runtime.snapshots.StateRecord, R> R! writable(T, androidx.compose.runtime.snapshots.StateObject state, androidx.compose.runtime.snapshots.Snapshot snapshot, kotlin.jvm.functions.Function1<? super T,? extends R> block);
+    method public static inline <T extends androidx.compose.runtime.snapshots.StateRecord, R> R! writable(T, androidx.compose.runtime.snapshots.StateObject state, kotlin.jvm.functions.Function1<? super T,? extends R> block);
+    method @kotlin.PublishedApi internal static <T extends androidx.compose.runtime.snapshots.StateRecord> T writableRecord(T, androidx.compose.runtime.snapshots.StateObject state, androidx.compose.runtime.snapshots.Snapshot snapshot);
+    field @kotlin.PublishedApi internal static final Object lock;
+    field @kotlin.PublishedApi internal static final androidx.compose.runtime.snapshots.Snapshot snapshotInitializer;
+  }
+
+  public interface SnapshotMutableState<T> extends androidx.compose.runtime.MutableState<T> {
+    method public androidx.compose.runtime.SnapshotMutationPolicy<T> getPolicy();
+    property public abstract androidx.compose.runtime.SnapshotMutationPolicy<T> policy;
+  }
+
+  @androidx.compose.runtime.Stable public final class SnapshotStateList<T> implements kotlin.jvm.internal.markers.KMutableList java.util.List<T> androidx.compose.runtime.snapshots.StateObject {
+    ctor public SnapshotStateList();
+    method public boolean add(T? element);
+    method public void add(int index, T? element);
+    method public boolean addAll(int index, java.util.Collection<? extends T> elements);
+    method public boolean addAll(java.util.Collection<? extends T> elements);
+    method public void clear();
+    method public boolean contains(T? element);
+    method public boolean containsAll(java.util.Collection<E!> elements);
+    method public T! get(int index);
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
+    method public int getSize();
+    method public int indexOf(T? element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<T> iterator();
+    method public int lastIndexOf(T? element);
+    method public java.util.ListIterator<T> listIterator();
+    method public java.util.ListIterator<T> listIterator(int index);
+    method public void prependStateRecord(androidx.compose.runtime.snapshots.StateRecord value);
+    method public boolean remove(T? element);
+    method public boolean removeAll(java.util.Collection<E!> elements);
+    method public T! removeAt(int index);
+    method public void removeRange(int fromIndex, int toIndex);
+    method public boolean retainAll(java.util.Collection<E!> elements);
+    method public T! set(int index, T? element);
+    method public java.util.List<T> subList(int fromIndex, int toIndex);
+    property public androidx.compose.runtime.snapshots.StateRecord firstStateRecord;
+    property public int size;
+  }
+
+  public final class SnapshotStateListKt {
+  }
+
+  @androidx.compose.runtime.Stable public final class SnapshotStateMap<K, V> implements kotlin.jvm.internal.markers.KMutableMap java.util.Map<K,V> androidx.compose.runtime.snapshots.StateObject {
+    ctor public SnapshotStateMap();
+    method public void clear();
+    method public boolean containsKey(K? key);
+    method public boolean containsValue(V? value);
+    method public V? get(Object? key);
+    method public java.util.Set<java.util.Map.Entry<K,V>> getEntries();
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
+    method public java.util.Set<K> getKeys();
+    method public int getSize();
+    method public java.util.Collection<V> getValues();
+    method public boolean isEmpty();
+    method public void prependStateRecord(androidx.compose.runtime.snapshots.StateRecord value);
+    method public V? put(K? key, V? value);
+    method public void putAll(java.util.Map<? extends K,? extends V> from);
+    method public V? remove(Object? key);
+    property public java.util.Set<java.util.Map.Entry<K,V>> entries;
+    property public androidx.compose.runtime.snapshots.StateRecord firstStateRecord;
+    property public java.util.Set<K> keys;
+    property public int size;
+    property public java.util.Collection<V> values;
+  }
+
+  public final class SnapshotStateMapKt {
+  }
+
+  public final class SnapshotStateObserver {
+    ctor public SnapshotStateObserver(kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> onChangedExecutor);
+    method public void clear(Object scope);
+    method public void clear();
+    method public void clearIf(kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> predicate);
+    method @org.jetbrains.annotations.TestOnly public void notifyChanges(java.util.Set<?> changes, androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method public <T> void observeReads(T scope, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> onValueChangedForScope, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public void start();
+    method public void stop();
+    method @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 Object? getIdentity();
+    method public Object getKey();
+    method public Object? getNode();
+    method public String? getSourceInfo();
+    property public abstract Iterable<java.lang.Object> data;
+    property public default Object? identity;
+    property public abstract Object key;
+    property public abstract Object? node;
+    property public abstract String? sourceInfo;
+  }
+
+  public final class InspectionTablesKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.util.Set<androidx.compose.runtime.tooling.CompositionData>> getLocalInspectionTables();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.util.Set<androidx.compose.runtime.tooling.CompositionData>> LocalInspectionTables;
+  }
+
+}
+
diff --git a/compose/runtime/runtime/api/restricted_current.txt b/compose/runtime/runtime/api/restricted_current.txt
index 67b7b6f..f82be3b 100644
--- a/compose/runtime/runtime/api/restricted_current.txt
+++ b/compose/runtime/runtime/api/restricted_current.txt
@@ -789,12 +789,18 @@
 
 package androidx.compose.runtime.reflect {
 
-  public final class ComposableMethodInvokerKt {
-    method @kotlin.jvm.Throws(exceptionClasses=NoSuchMethodException::class) public static java.lang.reflect.Method getDeclaredComposableMethod(Class<?>, String methodName, Class<?>... args) throws java.lang.NoSuchMethodException;
-    method public static java.lang.reflect.Parameter![] getRealParameters(java.lang.reflect.Method);
-    method public static int getRealParametersCount(java.lang.reflect.Method);
-    method public static Object? invokeComposable(java.lang.reflect.Method, androidx.compose.runtime.Composer composer, Object? instance, java.lang.Object?... args);
-    method public static boolean isComposable(java.lang.reflect.Method);
+  public final class ComposableMethod {
+    method public java.lang.reflect.Method asMethod();
+    method public int getParameterCount();
+    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 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;
   }
 
 }
@@ -1002,6 +1008,7 @@
 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;
diff --git a/compose/runtime/runtime/integration-tests/src/androidAndroidTest/kotlin/androidx/compose/runtime/LiveEditApiTests.kt b/compose/runtime/runtime/integration-tests/src/androidAndroidTest/kotlin/androidx/compose/runtime/LiveEditApiTests.kt
index 6d17f5f..3e04f55 100644
--- a/compose/runtime/runtime/integration-tests/src/androidAndroidTest/kotlin/androidx/compose/runtime/LiveEditApiTests.kt
+++ b/compose/runtime/runtime/integration-tests/src/androidAndroidTest/kotlin/androidx/compose/runtime/LiveEditApiTests.kt
@@ -19,13 +19,17 @@
 import androidx.compose.material.Text
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.After
 import org.junit.Assert.assertTrue
+import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
 
 var someData = mutableStateOf(0)
 
+@OptIn(InternalComposeApi::class)
 @RunWith(AndroidJUnit4::class)
 class LiveEditApiTests : BaseComposeTest() {
     @get:Rule
@@ -35,6 +39,20 @@
         invalidateGroupsWithKey(key)
     }
 
+    private fun compositionErrors(): List<Pair<Exception, Boolean>> =
+        currentCompositionErrors()
+
+    @Before
+    fun setUp() {
+        // ensures recomposer knows that hot reload is on
+        invalidateGroupsWithKey(-1)
+    }
+
+    @After
+    fun tearDown() {
+        clearCompositionErrors()
+    }
+
     // IMPORTANT: This must be the first test as the lambda key will change if the lambda is
     // moved this file.
     @Test
@@ -169,6 +187,211 @@
             )
         }
     }
+
+    @Test
+    @MediumTest
+    fun throwError_doesntCrash() {
+        activity.show {
+            TestError()
+        }
+
+        activity.waitForAFrame()
+
+        // Invalidate error scope
+        run {
+            val errorStart = errorInvoked
+            invalidateGroup(errorKey)
+
+            assertTrue(
+                "TestError should have been invoked",
+                errorInvoked > errorStart
+            )
+        }
+    }
+
+    @Test
+    @MediumTest
+    fun throwError_invalidatesOnlyAfterHotReloadCall() {
+        val shouldThrow = mutableStateOf(true)
+
+        activity.show {
+            TestError { shouldThrow.value }
+        }
+
+        activity.waitForAFrame()
+
+        run {
+            val errorStart = errorInvoked
+            shouldThrow.value = false
+
+            activity.waitForAFrame()
+
+            assertTrue(
+                "TestError should not have been invoked",
+                errorInvoked == errorStart
+            )
+
+            invalidateGroup(errorKey)
+            assertTrue(
+                "TestError should have been invoked",
+                errorInvoked > errorStart
+            )
+        }
+    }
+
+    @Test
+    @MediumTest
+    fun throwError_recompose_doesntCrash() {
+        val shouldThrow = mutableStateOf(false)
+        activity.show {
+            TestError { shouldThrow.value }
+        }
+
+        activity.waitForAFrame()
+
+        run {
+            var errors = compositionErrors()
+            assertThat(errors).isEmpty()
+
+            shouldThrow.value = true
+            activity.waitForAFrame()
+
+            errors = compositionErrors()
+            assertThat(errors).hasSize(1)
+            assertThat(errors[0].first.message).isEqualTo("Test crash!")
+            assertThat(errors[0].second).isEqualTo(true)
+        }
+    }
+
+    @Test
+    @MediumTest
+    fun throwError_recompose_clearErrorOnInvalidate() {
+        var shouldThrow by mutableStateOf(false)
+        activity.show {
+            TestError { shouldThrow }
+        }
+
+        activity.waitForAFrame()
+
+        run {
+            var errors = compositionErrors()
+            assertThat(errors).isEmpty()
+
+            shouldThrow = true
+            activity.waitForAFrame()
+
+            errors = compositionErrors()
+            assertThat(errors).hasSize(1)
+
+            shouldThrow = false
+            invalidateGroupsWithKey(errorKey)
+
+            errors = compositionErrors()
+            assertThat(errors).isEmpty()
+        }
+    }
+
+    @Test
+    @MediumTest
+    fun throwError_returnsCurrentError() {
+        var shouldThrow by mutableStateOf(true)
+        activity.show {
+            TestError { shouldThrow }
+        }
+
+        activity.waitForAFrame()
+
+        run {
+            var errors = compositionErrors()
+            assertThat(errors).hasSize(1)
+            assertThat(errors[0].first.message).isEqualTo("Test crash!")
+            assertThat(errors[0].second).isEqualTo(true)
+
+            shouldThrow = false
+            invalidateGroup(errorKey)
+
+            errors = compositionErrors()
+            assertThat(errors).isEmpty()
+        }
+    }
+
+    @Test
+    @MediumTest
+    fun throwErrorInEffect_doesntCrash() {
+        activity.show {
+            TestEffectError()
+        }
+
+        activity.waitForAFrame()
+
+        run {
+            var errors = compositionErrors()
+            assertThat(errors).hasSize(1)
+            assertThat(errors[0].first.message).isEqualTo("Effect error!")
+            assertThat(errors[0].second).isEqualTo(false)
+
+            val start = effectErrorInvoked
+            simulateHotReload(Unit)
+
+            assertTrue("TestEffectError should be invoked!", effectErrorInvoked > start)
+
+            errors = compositionErrors()
+            assertThat(errors).hasSize(1)
+            assertThat(errors[0].first.message).isEqualTo("Effect error!")
+            assertThat(errors[0].second).isEqualTo(false)
+        }
+    }
+
+    @Test
+    @MediumTest
+    fun throwErrorInEffect_doesntRecoverOnInvalidate() {
+        var shouldThrow = true
+        activity.show {
+            TestEffectError { shouldThrow }
+        }
+
+        activity.waitForAFrame()
+
+        run {
+            val start = effectErrorInvoked
+            val errors = compositionErrors()
+            assertThat(errors).hasSize(1)
+            assertThat(errors[0].first.message).isEqualTo("Effect error!")
+            assertThat(errors[0].second).isEqualTo(false)
+
+            shouldThrow = false
+            invalidateGroup(effectErrorKey)
+
+            assertTrue("TestEffectError should not be invoked!", effectErrorInvoked == start)
+        }
+    }
+
+    @Test
+    @MediumTest
+    fun throwErrorInEffect_recoversOnReload() {
+        var shouldThrow = true
+        activity.show {
+            TestEffectError { shouldThrow }
+        }
+
+        activity.waitForAFrame()
+
+        run {
+            val start = effectErrorInvoked
+            var errors = compositionErrors()
+            assertThat(errors).hasSize(1)
+            assertThat(errors[0].first.message).isEqualTo("Effect error!")
+            assertThat(errors[0].second).isEqualTo(false)
+
+            shouldThrow = false
+            simulateHotReload(Unit)
+
+            assertTrue("TestEffectError should be invoked!", effectErrorInvoked > start)
+
+            errors = compositionErrors()
+            assertThat(errors).hasSize(0)
+        }
+    }
 }
 
 const val someFunctionKey = -1580285603 // Extracted from .class file
@@ -256,4 +479,28 @@
     RestartableWrapper {
         ReadOnly()
     }
+}
+
+private const val errorKey = -0x3d6d007a // Extracted from .class file
+private var errorInvoked = 0
+@Composable
+fun TestError(shouldThrow: () -> Boolean = { true }) {
+    errorInvoked++
+
+    if (shouldThrow()) {
+        error("Test crash!")
+    }
+}
+
+private const val effectErrorKey = -0x43852062 // Extracted from .class file
+private var effectErrorInvoked = 0
+@Composable
+fun TestEffectError(shouldThrow: () -> Boolean = { true }) {
+    effectErrorInvoked++
+
+    SideEffect {
+        if (shouldThrow()) {
+            error("Effect error!")
+        }
+    }
 }
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposeVersion.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposeVersion.kt
index 122eb3c..228062f 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposeVersion.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposeVersion.kt
@@ -28,5 +28,5 @@
      * IMPORTANT: Whenever updating this value, please make sure to also update `versionTable` and
      * `minimumRuntimeVersionInt` in `VersionChecker.kt` of the compiler.
      */
-    const val version: Int = 8200
+    const val version: Int = 8300
 }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composer.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composer.kt
index d7d4ddd..4e06f54 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composer.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composer.kt
@@ -1416,10 +1416,14 @@
         entersStack.clear()
         providersInvalidStack.clear()
         providerUpdates.clear()
-        reader.close()
+        if (!reader.closed) { reader.close() }
+        if (!writer.closed) { writer.close() }
+        createFreshInsertTable()
         compoundKeyHash = 0
         childrenComposing = 0
         nodeExpected = false
+        inserting = false
+        reusing = false
         isComposing = false
         forciblyRecompose = false
     }
@@ -2798,53 +2802,73 @@
         // All movable content has a compound hash value rooted at the content itself so the hash
         // value doesn't change as the content moves in the tree.
         val savedCompoundKeyHash = compoundKeyHash
-        compoundKeyHash = movableContentKey
 
-        if (inserting) writer.markGroup()
+        try {
+            compoundKeyHash = movableContentKey
 
-        // Capture the local providers at the point of the invocation. This allows detecting
-        // changes to the locals as the value moves well as enables finding the correct providers
-        // when applying late changes which might be very complicated otherwise.
-        val providersChanged = if (inserting) false else reader.groupAux != locals
-        if (providersChanged) providerUpdates[reader.currentGroup] = locals
-        start(compositionLocalMapKey, compositionLocalMap, false, locals)
+            if (inserting) writer.markGroup()
 
-        // Either insert a place-holder to be inserted later (either created new or moved from
-        // another location) or (re)compose the movable content. This is forced if a new value
-        // needs to be created as a late change.
-        if (inserting && !force) {
-            writerHasAProvider = true
-            providerCache = null
+            // Capture the local providers at the point of the invocation. This allows detecting
+            // changes to the locals as the value moves well as enables finding the correct providers
+            // when applying late changes which might be very complicated otherwise.
+            val providersChanged = if (inserting) false else reader.groupAux != locals
+            if (providersChanged) providerUpdates[reader.currentGroup] = locals
+            start(compositionLocalMapKey, compositionLocalMap, false, locals)
 
-            // Create an anchor to the movable group
-            val anchor = writer.anchor(writer.parent(writer.parent))
-            val reference = MovableContentStateReference(
-                content,
-                parameter,
-                composition,
-                insertTable,
-                anchor,
-                emptyList(),
-                currentCompositionLocalScope()
-            )
-            parentContext.insertMovableContent(reference)
-        } else {
-            val savedProvidersInvalid = providersInvalid
-            providersInvalid = providersChanged
-            invokeComposable(this, { content.content(parameter) })
-            providersInvalid = savedProvidersInvalid
+            // Either insert a place-holder to be inserted later (either created new or moved from
+            // another location) or (re)compose the movable content. This is forced if a new value
+            // needs to be created as a late change.
+            if (inserting && !force) {
+                writerHasAProvider = true
+                providerCache = null
+
+                // Create an anchor to the movable group
+                val anchor = writer.anchor(writer.parent(writer.parent))
+                val reference = MovableContentStateReference(
+                    content,
+                    parameter,
+                    composition,
+                    insertTable,
+                    anchor,
+                    emptyList(),
+                    currentCompositionLocalScope()
+                )
+                parentContext.insertMovableContent(reference)
+            } else {
+                val savedProvidersInvalid = providersInvalid
+                providersInvalid = providersChanged
+                invokeComposable(this, { content.content(parameter) })
+                providersInvalid = savedProvidersInvalid
+            }
+        } finally {
+            // Restore the state back to what is expected by the caller.
+            endGroup()
+            compoundKeyHash = savedCompoundKeyHash
+            endMovableGroup()
         }
-
-        // Restore the state back to what is expected by the caller.
-        endGroup()
-        compoundKeyHash = savedCompoundKeyHash
-        endMovableGroup()
     }
 
     @InternalComposeApi
     override fun insertMovableContentReferences(
         references: List<Pair<MovableContentStateReference, MovableContentStateReference?>>
     ) {
+        var completed = false
+        try {
+            insertMovableContentGuarded(references)
+            completed = true
+        } finally {
+            if (completed) {
+                cleanUpCompose()
+            } else {
+                // if we finished with error, cleanup more aggressively
+                abortRoot()
+            }
+        }
+    }
+
+    private fun insertMovableContentGuarded(
+        references: List<Pair<MovableContentStateReference, MovableContentStateReference?>>
+    ) {
         fun positionToParentOf(slots: SlotWriter, applier: Applier<Any?>, index: Int) {
             while (!slots.indexInParent(index)) {
                 slots.skipToGroupEnd()
@@ -2988,7 +3012,7 @@
                     // Copy the slot table into the anchor location
                     record { _, slots, _ ->
                         val state = resolvedState ?: parentContext.movableContentStateResolve(from)
-                            ?: composeRuntimeError("Could not resolve state for movable content")
+                        ?: composeRuntimeError("Could not resolve state for movable content")
 
                         // The slot table contains the movable content group plus the group
                         // containing the movable content's table which then contains the actual
@@ -3054,7 +3078,6 @@
             }
             writersReaderDelta = 0
         }
-        cleanUpCompose()
     }
 
     private inline fun <R> withChanges(newChanges: MutableList<Change>, block: () -> R): R {
@@ -3632,6 +3655,10 @@
         clearUpdatedNodeCounts()
     }
 
+    internal fun verifyConsistent() {
+        insertTable.verifyWellFormed()
+    }
+
     private var previousRemove = -1
     private var previousMoveFrom = -1
     private var previousMoveTo = -1
@@ -4271,6 +4298,8 @@
 @PublishedApi
 internal const val reuseKey = 207
 
+internal class ComposeRuntimeError(override val message: String) : IllegalStateException()
+
 internal inline fun runtimeCheck(value: Boolean, lazyMessage: () -> Any) {
     if (!value) {
         val message = lazyMessage()
@@ -4281,7 +4310,7 @@
 internal fun runtimeCheck(value: Boolean) = runtimeCheck(value) { "Check failed" }
 
 internal fun composeRuntimeError(message: String): Nothing {
-    error(
+    throw ComposeRuntimeError(
         "Compose Runtime internal error. Unexpected or incorrect use of the Compose " +
             "internal runtime API ($message). Please report to Google or use " +
             "https://goo.gle/compose-feedback"
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composition.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composition.kt
index 65a96b1..a32afee 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composition.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composition.kt
@@ -543,14 +543,16 @@
             null -> {
                 // Do nothing, just start composing.
             }
-            PendingApplyNoModifications -> error("pending composition has not been applied")
+            PendingApplyNoModifications -> {
+                composeRuntimeError("pending composition has not been applied")
+            }
             is Set<*> -> {
                 addPendingInvalidationsLocked(toRecord as Set<Any>, forgetConditionalScopes = true)
             }
             is Array<*> -> for (changed in toRecord as Array<Set<Any>>) {
                 addPendingInvalidationsLocked(changed, forgetConditionalScopes = true)
             }
-            else -> error("corrupt pendingModifications drain: $pendingModifications")
+            else -> composeRuntimeError("corrupt pendingModifications drain: $pendingModifications")
         }
     }
 
@@ -566,10 +568,10 @@
             is Array<*> -> for (changed in toRecord as Array<Set<Any>>) {
                 addPendingInvalidationsLocked(changed, forgetConditionalScopes = false)
             }
-            null -> error(
+            null -> composeRuntimeError(
                 "calling recordModificationsOf and applyChanges concurrently is not supported"
             )
-            else -> error(
+            else -> composeRuntimeError(
                 "corrupt pendingModifications drain: $pendingModifications"
             )
         }
@@ -578,10 +580,12 @@
     override fun composeContent(content: @Composable () -> Unit) {
         // TODO: This should raise a signal to any currently running recompose calls
         // to halt and return
-        trackAbandonedValues {
+        guardChanges {
             synchronized(lock) {
                 drainPendingModificationsForCompositionLocked()
-                composer.composeContent(takeInvalidations(), content)
+                guardInvalidationsLocked { invalidations ->
+                    composer.composeContent(invalidations, content)
+                }
             }
         }
     }
@@ -744,10 +748,12 @@
 
     override fun recompose(): Boolean = synchronized(lock) {
         drainPendingModificationsForCompositionLocked()
-        trackAbandonedValues {
-            composer.recompose(takeInvalidations()).also { shouldDrain ->
-                // Apply would normally do this for us; do it now if apply shouldn't happen.
-                if (!shouldDrain) drainPendingModificationsLocked()
+        guardChanges {
+            guardInvalidationsLocked { invalidations ->
+                composer.recompose(invalidations).also { shouldDrain ->
+                    // Apply would normally do this for us; do it now if apply shouldn't happen.
+                    if (!shouldDrain) drainPendingModificationsLocked()
+                }
             }
         }
     }
@@ -756,7 +762,7 @@
         references: List<Pair<MovableContentStateReference, MovableContentStateReference?>>
     ) {
         runtimeCheck(references.fastAll { it.first.composition == this })
-        trackAbandonedValues {
+        guardChanges {
             composer.insertMovableContentReferences(references)
         }
     }
@@ -812,30 +818,63 @@
 
     override fun applyChanges() {
         synchronized(lock) {
-            applyChangesInLocked(changes)
-            drainPendingModificationsLocked()
+            guardChanges {
+                applyChangesInLocked(changes)
+                drainPendingModificationsLocked()
+            }
         }
     }
 
     override fun applyLateChanges() {
         synchronized(lock) {
-            if (lateChanges.isNotEmpty()) {
-                applyChangesInLocked(lateChanges)
+            guardChanges {
+                if (lateChanges.isNotEmpty()) {
+                    applyChangesInLocked(lateChanges)
+                }
             }
         }
     }
 
     override fun changesApplied() {
         synchronized(lock) {
-            composer.changesApplied()
+            guardChanges {
+                composer.changesApplied()
 
-            // By this time all abandon objects should be notified that they have been abandoned.
-            if (this.abandonSet.isNotEmpty()) {
-                RememberEventDispatcher(abandonSet).dispatchAbandons()
+                // By this time all abandon objects should be notified that they have been abandoned.
+                if (this.abandonSet.isNotEmpty()) {
+                    RememberEventDispatcher(abandonSet).dispatchAbandons()
+                }
             }
         }
     }
 
+    private inline fun <T> guardInvalidationsLocked(
+        block: (changes: IdentityArrayMap<RecomposeScopeImpl, IdentityArraySet<Any>?>) -> T
+    ): T {
+        val invalidations = takeInvalidations()
+        return try {
+            block(invalidations)
+        } catch (e: Exception) {
+            this.invalidations = invalidations
+            throw e
+        }
+    }
+
+    private inline fun <T> guardChanges(block: () -> T): T =
+        try {
+            trackAbandonedValues(block)
+        } catch (e: Exception) {
+            abandonChanges()
+            throw e
+        }
+
+    private fun abandonChanges() {
+        pendingModifications.set(null)
+        changes.clear()
+        lateChanges.clear()
+        abandonSet.clear()
+    }
+
     override fun invalidateAll() {
         synchronized(lock) {
             slotTable.slots.forEach { (it as? RecomposeScopeImpl)?.invalidate() }
@@ -845,6 +884,7 @@
     override fun verifyConsistent() {
         synchronized(lock) {
             if (!isComposing) {
+                composer.verifyConsistent()
                 slotTable.verifyWellFormed()
                 validateRecomposeScopeAnchors(slotTable)
             }
@@ -1094,6 +1134,16 @@
         internal fun invalidateGroupsWithKey(key: Int) {
             return Recomposer.invalidateGroupsWithKey(key)
         }
+
+        @TestOnly
+        internal fun getCurrentErrors(): List<RecomposerErrorInfo> {
+            return Recomposer.getCurrentErrors()
+        }
+
+        @TestOnly
+        internal fun clearErrors() {
+            return Recomposer.clearErrors()
+        }
     }
 }
 
@@ -1109,6 +1159,22 @@
 @TestOnly
 fun invalidateGroupsWithKey(key: Int) = HotReloader.invalidateGroupsWithKey(key)
 
+/**
+ * @suppress
+ */
+// suppressing for test-only api
+@Suppress("ListIterator")
+@TestOnly
+fun currentCompositionErrors(): List<Pair<Exception, Boolean>> =
+    HotReloader.getCurrentErrors()
+        .map { it.cause to it.recoverable }
+
+/**
+ * @suppress
+ */
+@TestOnly
+fun clearCompositionErrors() = HotReloader.clearErrors()
+
 private fun <K : Any, V : Any> IdentityArrayMap<K, IdentityArraySet<V>?>.addValue(
     key: K,
     value: V
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Recomposer.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Recomposer.kt
index efe1d06..c4b90f1 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Recomposer.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Recomposer.kt
@@ -99,6 +99,24 @@
 }
 
 /**
+ * Read only information about [Recomposer] error state.
+ */
+@InternalComposeApi
+internal interface RecomposerErrorInfo {
+    /**
+     * Exception which forced recomposition to halt.
+     */
+    val cause: Exception
+
+    /**
+     * Whether composition can recover from the error by itself.
+     * If the error is not recoverable, recomposer will not react to invalidate calls
+     * until state is reloaded.
+     */
+    val recoverable: Boolean
+}
+
+/**
  * The scheduler for performing recomposition and applying updates to one or more [Composition]s.
  */
 // RedundantVisibilityModifier suppressed because metalava picks up internal function overrides
@@ -246,6 +264,7 @@
     private var workContinuation: CancellableContinuation<Unit>? = null
     private var concurrentCompositionsOutstanding = 0
     private var isClosed: Boolean = false
+    private var errorState: RecomposerErrorState? = null
     // End properties guarded by stateLock
 
     private val _state = MutableStateFlow(State.Inactive)
@@ -267,6 +286,9 @@
         }
 
         val newState = when {
+            errorState != null -> {
+                State.Inactive
+            }
             runnerJob == null -> {
                 snapshotInvalidations.clear()
                 compositionInvalidations.clear()
@@ -318,6 +340,11 @@
             get() = this@Recomposer.hasPendingWork
         override val changeCount: Long
             get() = this@Recomposer.changeCount
+        val currentError: RecomposerErrorInfo?
+            get() = synchronized(stateLock) {
+                this@Recomposer.errorState
+            }
+
         fun invalidateGroupsWithKey(key: Int) {
             val compositions: List<ControlledComposition> = synchronized(stateLock) {
                 knownCompositions.toMutableList()
@@ -334,6 +361,9 @@
                 .fastMapNotNull { it as? CompositionImpl }
                 .fastMap { HotReloadable(it).apply { clearContent() } }
         }
+
+        fun getAndResetErrorState(): RecomposerErrorState? =
+            this@Recomposer.getAndResetErrorState()
     }
 
     private class HotReloadable(
@@ -350,13 +380,23 @@
             composition.composable = composable
         }
 
-        fun recompose() {
-            if (composition.isRoot) {
+        fun recompose(rootOnly: Boolean = true) {
+            if (rootOnly) {
+                if (composition.isRoot) {
+                    composition.setContent(composable)
+                }
+            } else {
                 composition.setContent(composable)
             }
         }
     }
 
+    private class RecomposerErrorState(
+        val failedInitialComposition: HotReloadable?,
+        override val recoverable: Boolean,
+        override val cause: Exception
+    ) : RecomposerErrorInfo
+
     private val recomposerInfo = RecomposerInfoImpl()
 
     /**
@@ -424,6 +464,14 @@
         val toLateApply = mutableSetOf<ControlledComposition>()
         val toComplete = mutableSetOf<ControlledComposition>()
 
+        fun clearRecompositionState() {
+            toRecompose.clear()
+            toInsert.clear()
+            toApply.clear()
+            toLateApply.clear()
+            toComplete.clear()
+        }
+
         fun fillToInsert() {
             toInsert.clear()
             synchronized(stateLock) {
@@ -486,6 +534,10 @@
                                     toApply += it
                                 }
                             }
+                        } catch (e: Exception) {
+                            processCompositionError(e, recoverable = true)
+                            clearRecompositionState()
+                            return@withFrameNanos
                         } finally {
                             toRecompose.clear()
                         }
@@ -508,10 +560,16 @@
                         }
 
                         if (toRecompose.isEmpty()) {
-                            fillToInsert()
-                            while (toInsert.isNotEmpty()) {
-                                toLateApply += performInsertValues(toInsert, modifiedValues)
+                            try {
                                 fillToInsert()
+                                while (toInsert.isNotEmpty()) {
+                                    toLateApply += performInsertValues(toInsert, modifiedValues)
+                                    fillToInsert()
+                                }
+                            } catch (e: Exception) {
+                                processCompositionError(e, recoverable = true)
+                                clearRecompositionState()
+                                return@withFrameNanos
                             }
                         }
                     }
@@ -525,6 +583,10 @@
                             toApply.fastForEach { composition ->
                                 composition.applyChanges()
                             }
+                        } catch (e: Exception) {
+                            processCompositionError(e)
+                            clearRecompositionState()
+                            return@withFrameNanos
                         } finally {
                             toApply.clear()
                         }
@@ -536,6 +598,10 @@
                             toLateApply.forEach { composition ->
                                 composition.applyLateChanges()
                             }
+                        } catch (e: Exception) {
+                            processCompositionError(e)
+                            clearRecompositionState()
+                            return@withFrameNanos
                         } finally {
                             toLateApply.clear()
                         }
@@ -546,6 +612,10 @@
                             toComplete.forEach { composition ->
                                 composition.changesApplied()
                             }
+                        } catch (e: Exception) {
+                            processCompositionError(e)
+                            clearRecompositionState()
+                            return@withFrameNanos
                         } finally {
                             toComplete.clear()
                         }
@@ -561,6 +631,48 @@
         }
     }
 
+    private fun processCompositionError(
+        e: Exception,
+        failedInitialComposition: ControlledComposition? = null,
+        recoverable: Boolean = false,
+    ) {
+        if (_hotReloadEnabled.get() && e !is ComposeRuntimeError) {
+            synchronized(stateLock) {
+                compositionsAwaitingApply.clear()
+                compositionInvalidations.clear()
+                snapshotInvalidations.clear()
+
+                compositionValuesAwaitingInsert.clear()
+                compositionValuesRemoved.clear()
+                compositionValueStatesAvailable.clear()
+
+                errorState = RecomposerErrorState(
+                    failedInitialComposition = (failedInitialComposition as? CompositionImpl)?.let {
+                        HotReloadable(it)
+                    },
+                    recoverable = recoverable,
+                    cause = e
+                )
+
+                deriveStateLocked()
+            }
+        } else {
+            throw e
+        }
+    }
+
+    private fun getAndResetErrorState(): RecomposerErrorState? {
+        val errorState = synchronized(stateLock) {
+            val error = errorState
+            if (error != null) {
+                errorState = null
+                deriveStateLocked()
+            }
+            error
+        }
+        return errorState
+    }
+
     /**
      * Await the invalidation of any associated [Composer]s, recompose them, and apply their
      * changes to their associated [Composition]s if recomposition is successful.
@@ -807,9 +919,15 @@
         content: @Composable () -> Unit
     ) {
         val composerWasComposing = composition.isComposing
-        composing(composition, null) {
-            composition.composeContent(content)
+        try {
+            composing(composition, null) {
+                composition.composeContent(content)
+            }
+        } catch (e: Exception) {
+            processCompositionError(e, composition, recoverable = true)
+            return
         }
+
         // TODO(b/143755743)
         if (!composerWasComposing) {
             Snapshot.notifyObjectsInitialized()
@@ -823,9 +941,23 @@
             }
         }
 
-        performInitialMovableContentInserts(composition)
-        composition.applyChanges()
-        composition.applyLateChanges()
+        try {
+            performInitialMovableContentInserts(composition)
+        } catch (e: Exception) {
+            processCompositionError(e, composition, recoverable = true)
+            synchronized(stateLock) {
+                knownCompositions -= composition
+            }
+            return
+        }
+
+        try {
+            composition.applyChanges()
+            composition.applyLateChanges()
+        } catch (e: Exception) {
+            processCompositionError(e)
+            return
+        }
 
         if (!composerWasComposing) {
             // Ensure that any state objects created during applyChanges are seen as changed
@@ -888,7 +1020,6 @@
             composing(composition, modifiedValues) {
                 // Map insert movable content to movable content states that have been released
                 // during `performRecompose`.
-                // during `performRecompose`.
                 val pairs = synchronized(stateLock) {
                     refs.fastMap { reference ->
                         reference to
@@ -1077,6 +1208,8 @@
 
         private val _runningRecomposers = MutableStateFlow(persistentSetOf<RecomposerInfoImpl>())
 
+        private val _hotReloadEnabled = AtomicReference(false)
+
         /**
          * An observable [Set] of [RecomposerInfo]s for currently
          * [running][runRecomposeAndApplyChanges] [Recomposer]s.
@@ -1085,6 +1218,10 @@
         val runningRecomposers: StateFlow<Set<RecomposerInfo>>
             get() = _runningRecomposers
 
+        internal fun setHotReloadEnabled(value: Boolean) {
+            _hotReloadEnabled.set(value)
+        }
+
         private fun addRunning(info: RecomposerInfoImpl) {
             while (true) {
                 val old = _runningRecomposers.value
@@ -1104,21 +1241,58 @@
         internal fun saveStateAndDisposeForHotReload(): Any {
             // NOTE: when we move composition/recomposition onto multiple threads, we will want
             // to ensure that we pause recompositions before this call.
+            _hotReloadEnabled.set(true)
             return _runningRecomposers.value.flatMap { it.saveStateAndDisposeForHotReload() }
         }
 
         internal fun loadStateAndComposeForHotReload(token: Any) {
             // NOTE: when we move composition/recomposition onto multiple threads, we will want
             // to ensure that we pause recompositions before this call.
+            _hotReloadEnabled.set(true)
+
+            val errorStates = _runningRecomposers.value.map {
+                it.getAndResetErrorState()
+            }
+
             @Suppress("UNCHECKED_CAST")
             val holders = token as List<HotReloadable>
             holders.fastForEach { it.resetContent() }
             holders.fastForEach { it.recompose() }
+
+            errorStates.fastForEach {
+                 it?.failedInitialComposition?.let { c ->
+                     c.resetContent()
+                     c.recompose(rootOnly = false)
+                 }
+            }
         }
 
         internal fun invalidateGroupsWithKey(key: Int) {
+            _hotReloadEnabled.set(true)
             _runningRecomposers.value.forEach {
+                if (it.currentError?.recoverable == false) {
+                    return@forEach
+                }
+
+                val errorState = it.getAndResetErrorState()
+
                 it.invalidateGroupsWithKey(key)
+
+                errorState?.failedInitialComposition?.let { c ->
+                    c.resetContent()
+                    c.recompose(rootOnly = false)
+                }
+            }
+        }
+
+        internal fun getCurrentErrors(): List<RecomposerErrorInfo> =
+            _runningRecomposers.value.mapNotNull {
+                it.currentError
+            }
+
+        internal fun clearErrors() {
+            _runningRecomposers.value.mapNotNull {
+                it.getAndResetErrorState()
             }
         }
     }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SlotTable.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SlotTable.kt
index b60b182..c5a0450 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SlotTable.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SlotTable.kt
@@ -248,7 +248,7 @@
      * Close [reader].
      */
     internal fun close(reader: SlotReader) {
-        require(reader.table === this && readers > 0) { "Unexpected reader close()" }
+        runtimeCheck(reader.table === this && readers > 0) { "Unexpected reader close()" }
         readers--
     }
 
@@ -596,6 +596,9 @@
 
     override fun iterator(): Iterator<CompositionGroup> =
         GroupIterator(this, 0, groupsSize)
+
+    override fun find(identityToFind: Any): CompositionGroup? =
+         SlotTableGroup(this, 0).find(identityToFind)
 }
 
 /**
@@ -644,6 +647,12 @@
     private val slotsSize: Int = table.slotsSize
 
     /**
+     * True if the reader has been closed
+     */
+    var closed: Boolean = false
+        private set
+
+    /**
      * The current group that will be started with [startGroup] or skipped with [skipGroup].
      */
     var currentGroup = 0
@@ -895,7 +904,10 @@
      * Close the slot reader. After all [SlotReader]s have been closed the [SlotTable] a
      * [SlotWriter] can be created.
      */
-    fun close() = table.close(this)
+    fun close() {
+        closed = true
+        table.close(this)
+    }
 
     /**
      * Start a group.
@@ -2963,6 +2975,64 @@
         if (index > parentAnchorPivot) index else size + index - parentAnchorPivot
 }
 
+private class SlotTableGroup(
+    val table: SlotTable,
+    val group: Int,
+    val version: Int = table.version
+) : CompositionGroup, Iterable<CompositionGroup> {
+    override val isEmpty: Boolean get() = table.groups.groupSize(group) == 0
+
+    override val key: Any
+        get() = if (table.groups.hasObjectKey(group))
+            table.slots[table.groups.objectKeyIndex(group)]!!
+        else table.groups.key(group)
+
+    override val sourceInfo: String?
+        get() = if (table.groups.hasAux(group))
+            table.slots[table.groups.auxIndex(group)] as? String
+        else null
+
+    override val node: Any?
+        get() = if (table.groups.isNode(group))
+            table.slots[table.groups.nodeIndex(group)] else
+            null
+
+    override val data: Iterable<Any?> get() = DataIterator(table, group)
+
+    override val identity: Any
+        get() {
+            validateRead()
+            return table.read { it.anchor(group) }
+        }
+
+    override val compositionGroups: Iterable<CompositionGroup> get() = this
+
+    override fun iterator(): Iterator<CompositionGroup> {
+        validateRead()
+        return GroupIterator(
+            table,
+            group + 1,
+            group + table.groups.groupSize(group)
+        )
+    }
+
+    private fun validateRead() {
+        if (table.version != version) {
+            throw ConcurrentModificationException()
+        }
+    }
+
+    override fun find(identityToFind: Any): CompositionGroup? =
+        (identityToFind as? Anchor)?.let { anchor ->
+            if (table.ownsAnchor(anchor)) {
+                val anchorGroup = table.anchorIndex(anchor)
+                if (anchorGroup >= group && (anchorGroup - group < table.groups.groupSize(group)))
+                    SlotTableGroup(table, anchorGroup, version)
+                else null
+            } else null
+        }
+}
+
 private class GroupIterator(
     val table: SlotTable,
     start: Int,
@@ -2982,43 +3052,7 @@
         val group = index
 
         index += table.groups.groupSize(group)
-        return object : CompositionGroup, Iterable<CompositionGroup> {
-            override val isEmpty: Boolean get() = table.groups.groupSize(group) == 0
-
-            override val key: Any
-                get() = if (table.groups.hasObjectKey(group))
-                    table.slots[table.groups.objectKeyIndex(group)]!!
-                else table.groups.key(group)
-
-            override val sourceInfo: String?
-                get() = if (table.groups.hasAux(group))
-                    table.slots[table.groups.auxIndex(group)] as? String
-                else null
-
-            override val node: Any?
-                get() = if (table.groups.isNode(group))
-                    table.slots[table.groups.nodeIndex(group)] else
-                    null
-
-            override val data: Iterable<Any?> get() = DataIterator(table, group)
-
-            override val identity: Any
-                get() {
-                    validateRead()
-                    return table.read { it.anchor(group) }
-                }
-
-            override val compositionGroups: Iterable<CompositionGroup> get() = this
-
-            override fun iterator(): Iterator<CompositionGroup> {
-                validateRead()
-                return GroupIterator(
-                    table,
-                    group + 1,
-                    group + table.groups.groupSize(group)
-                )
-            }
-        }
+        return SlotTableGroup(table, group, version)
     }
 
     private fun validateRead() {
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/collection/IdentityArraySet.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/collection/IdentityArraySet.kt
index 6b31b4e..6bfd57c 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/collection/IdentityArraySet.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/collection/IdentityArraySet.kt
@@ -91,9 +91,7 @@
      * Remove all values from the set.
      */
     fun clear() {
-        for (i in 0 until size) {
-            values[i] = null
-        }
+        values.fill(null)
 
         size = 0
     }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateObserver.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateObserver.kt
index 2e0396c..b7f31f9 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateObserver.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateObserver.kt
@@ -21,6 +21,7 @@
 import androidx.compose.runtime.TestOnly
 import androidx.compose.runtime.collection.IdentityArrayIntMap
 import androidx.compose.runtime.collection.IdentityArrayMap
+import androidx.compose.runtime.collection.IdentityArraySet
 import androidx.compose.runtime.collection.IdentityScopeMap
 import androidx.compose.runtime.collection.mutableVectorOf
 import androidx.compose.runtime.observeDerivedStateRecalculations
@@ -261,7 +262,7 @@
         /**
          * Scopes that were invalidated during previous apply step.
          */
-        private val invalidated = hashSetOf<Any>()
+        private val invalidated = IdentityArraySet<Any>()
 
         // derived state handling
 
@@ -417,7 +418,7 @@
                         // Invalidate only if currentValue is different than observed on read
                         if (!policy.equivalent(derivedState.currentValue, previousValue)) {
                             valueToScopes.forEachScopeOf(derivedState) { scope ->
-                                invalidated += scope
+                                invalidated.add(scope)
                                 hasValues = true
                             }
                         }
@@ -425,7 +426,7 @@
                 }
 
                 valueToScopes.forEachScopeOf(value) { scope ->
-                    invalidated += scope
+                    invalidated.add(scope)
                     hasValues = true
                 }
             }
@@ -436,7 +437,7 @@
          * Call [onChanged] for previously invalidated scopes.
          */
         fun notifyInvalidatedScopes() {
-            invalidated.forEach(onChanged)
+            invalidated.fastForEach(onChanged)
             invalidated.clear()
         }
     }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/tooling/CompositionData.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/tooling/CompositionData.kt
index 856363c..16e9076 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/tooling/CompositionData.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/tooling/CompositionData.kt
@@ -39,6 +39,14 @@
      * doesn't contain any child groups.
      */
     val isEmpty: Boolean
+
+    /**
+     * Find a sub-group by identity. Returns `null` if the group is not found or the implementation
+     * of this interface does not support finding groups by their identity. In other words, a
+     * `null` result from this method should not be interpreted as the identity is not a group in
+     * the composition data.
+     */
+    fun find(identityToFind: Any): CompositionGroup? = null
 }
 
 /**
diff --git a/compose/runtime/runtime/src/commonTest/kotlin/androidx/compose/runtime/tooling/CompositionDataTests.kt b/compose/runtime/runtime/src/commonTest/kotlin/androidx/compose/runtime/tooling/CompositionDataTests.kt
index c68333f..bd2a660 100644
--- a/compose/runtime/runtime/src/commonTest/kotlin/androidx/compose/runtime/tooling/CompositionDataTests.kt
+++ b/compose/runtime/runtime/src/commonTest/kotlin/androidx/compose/runtime/tooling/CompositionDataTests.kt
@@ -232,4 +232,22 @@
             }
         }
     }
+
+    @Test
+    fun canFindAGroupInCompositionData() {
+        val slots = SlotTable().also {
+            it.write { writer ->
+                writer.insert {
+                    writer.group(0) {
+                        repeat(10) { index ->
+                            writer.group(100 + index) { }
+                        }
+                    }
+                }
+            }
+        }
+
+        val identity = slots.compositionGroups.first().compositionGroups.drop(5).first().identity
+        assertEquals(identity, slots.find(identity!!)?.identity)
+    }
 }
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/reflect/ComposableMethod.kt b/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/reflect/ComposableMethod.kt
new file mode 100644
index 0000000..d0b63cc
--- /dev/null
+++ b/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/reflect/ComposableMethod.kt
@@ -0,0 +1,213 @@
+/*
+ * 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.runtime.reflect
+
+import androidx.compose.runtime.Composer
+import androidx.compose.runtime.internal.SLOTS_PER_INT
+import java.lang.reflect.Method
+import java.lang.reflect.Modifier
+import java.lang.reflect.Parameter
+import kotlin.math.ceil
+
+private const val BITS_PER_INT = 31
+
+private fun changedParamCount(realValueParams: Int, thisParams: Int): Int {
+    if (realValueParams == 0) return 1
+    val totalParams = realValueParams + thisParams
+    return ceil(
+        totalParams.toDouble() / SLOTS_PER_INT.toDouble()
+    ).toInt()
+}
+
+private fun defaultParamCount(realValueParams: Int): Int {
+    return ceil(
+        realValueParams.toDouble() / BITS_PER_INT.toDouble()
+    ).toInt()
+}
+
+/**
+ * Structure intended to be used exclusively by [getComposableInfo].
+ */
+internal data class ComposableInfo(
+    val isComposable: Boolean,
+    val realParamsCount: Int,
+    val changedParams: Int,
+    val defaultParams: Int
+)
+
+/**
+ * Checks whether the method is Composable function and returns result along with the real
+ * parameters count and changed parameter count (if composable) and packed in a structure.
+ */
+private fun Method.getComposableInfo(): ComposableInfo {
+    val realParamsCount = parameterTypes.indexOfLast { it == Composer::class.java }
+    if (realParamsCount == -1) {
+        return ComposableInfo(false, parameterTypes.size, 0, 0)
+    }
+    val thisParams = if (Modifier.isStatic(this.modifiers)) 0 else 1
+    val changedParams = changedParamCount(realParamsCount, thisParams)
+    val totalParamsWithoutDefaults = realParamsCount +
+        1 + // composer
+        changedParams
+    val totalParams = parameterTypes.size
+    val isDefault = totalParams != totalParamsWithoutDefaults
+    val defaultParams = if (isDefault)
+        defaultParamCount(realParamsCount)
+    else
+        0
+    return ComposableInfo(
+        totalParamsWithoutDefaults + defaultParams == totalParams,
+        realParamsCount,
+        changedParams,
+        defaultParams
+    )
+}
+
+/**
+ * Returns the default value for the [Class] type. This will be 0 for numeric types, false for
+ * boolean and null for object references.
+ */
+private fun Class<*>.getDefaultValue(): Any? = when (name) {
+    "int" -> 0.toInt()
+    "short" -> 0.toShort()
+    "byte" -> 0.toByte()
+    "long" -> 0.toLong()
+    "double" -> 0.toDouble()
+    "float" -> 0.toFloat()
+    "boolean" -> false
+    "char" -> 0.toChar()
+    else -> null
+}
+
+/**
+ * Represents the @Composable method.
+ */
+class ComposableMethod internal constructor(
+    private val method: Method,
+    private val composableInfo: ComposableInfo
+    ) {
+    /**
+     * Returns the backing [Method].
+     */
+    fun asMethod() = method
+
+    /**
+     * Returns the count of method parameters excluding the utility Compose-specific parameters.
+     */
+    val parameterCount
+        get() = composableInfo.realParamsCount
+
+    /**
+     * Returns method parameters excluding the utility Compose-specific parameters.
+     */
+    val parameters: Array<Parameter>
+        @Suppress("ClassVerificationFailure", "NewApi")
+        get() = method.parameters.copyOfRange(0, composableInfo.realParamsCount)
+
+    /**
+     * Calls the Composable method on the given [instance]. If the method accepts default values,
+     * this function will call it with the correct options set.
+     */
+    @Suppress("BanUncheckedReflection", "ListIterator")
+    operator fun invoke(composer: Composer, instance: Any?, vararg args: Any?): Any? {
+        val (_, realParamsCount, changedParams, defaultParams) = composableInfo
+
+        val totalParams = method.parameterTypes.size
+        val changedStartIndex = realParamsCount + 1
+        val defaultStartIndex = changedStartIndex + changedParams
+
+        val defaultsMasks = Array(defaultParams) { index ->
+            val start = index * BITS_PER_INT
+            val end = minOf(start + BITS_PER_INT, realParamsCount)
+            val useDefault =
+                (start until end).map { if (it >= args.size || args[it] == null) 1 else 0 }
+            val mask = useDefault.foldIndexed(0) { i, mask, default -> mask or (default shl i) }
+            mask
+        }
+
+        val arguments = Array(totalParams) { idx ->
+            when (idx) {
+                // pass in "empty" value for all real parameters since we will be using defaults.
+                in 0 until realParamsCount -> args.getOrElse(idx) {
+                    method.parameterTypes[idx].getDefaultValue()
+                }
+                // the composer is the first synthetic parameter
+                realParamsCount -> composer
+                // since this is the root we don't need to be anything unique. 0 should suffice.
+                // changed parameters should be 0 to indicate "uncertain"
+                changedStartIndex -> 1
+                in changedStartIndex + 1 until defaultStartIndex -> 0
+                // Default values mask, all parameters set to use defaults
+                in defaultStartIndex until totalParams -> defaultsMasks[idx - defaultStartIndex]
+                else -> error("Unexpected index")
+            }
+        }
+        return method.invoke(instance, *arguments)
+    }
+
+    override fun equals(other: Any?) = when (other) {
+        is ComposableMethod -> method == other.method
+        else -> false
+    }
+
+    override fun hashCode() = method.hashCode()
+}
+
+fun Method.asComposableMethod(): ComposableMethod? {
+    val composableInfo = getComposableInfo()
+    if (composableInfo.isComposable) {
+        return ComposableMethod(this, composableInfo)
+    }
+    return null
+}
+
+private inline fun <reified T> T.dup(count: Int): Array<T> {
+    return (0 until count).map { this }.toTypedArray()
+}
+
+/**
+ * Find the given @Composable method by name.
+ */
+@Throws(NoSuchMethodException::class)
+fun Class<*>.getDeclaredComposableMethod(methodName: String, vararg args: Class<*>):
+    ComposableMethod {
+    val changedParams = changedParamCount(args.size, 0)
+    val method = try {
+        // without defaults
+        getDeclaredMethod(
+            methodName,
+            *args,
+            Composer::class.java, // composer param
+            *Int::class.java.dup(changedParams) // changed params
+        )
+    } catch (e: ReflectiveOperationException) {
+        val defaultParams = defaultParamCount(args.size)
+        try {
+            getDeclaredMethod(
+                methodName,
+                *args,
+                Composer::class.java, // composer param
+                *Int::class.java.dup(changedParams), // changed param
+                *Int::class.java.dup(defaultParams) // default param
+            )
+        } catch (e2: ReflectiveOperationException) {
+            null
+        }
+    } ?: throw NoSuchMethodException("$name.$methodName")
+
+    return method.asComposableMethod()!!
+}
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/reflect/ComposableMethodInvoker.kt b/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/reflect/ComposableMethodInvoker.kt
deleted file mode 100644
index 3b7777a..0000000
--- a/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/reflect/ComposableMethodInvoker.kt
+++ /dev/null
@@ -1,211 +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.runtime.reflect
-
-import androidx.compose.runtime.Composer
-import androidx.compose.runtime.internal.SLOTS_PER_INT
-import java.lang.reflect.Method
-import java.lang.reflect.Modifier
-import java.lang.reflect.Parameter
-import kotlin.math.ceil
-
-private inline fun <reified T> T.dup(count: Int): Array<T> {
-    return (0 until count).map { this }.toTypedArray()
-}
-
-/**
- * Find the given @Composable method by name.
- */
-@Throws(NoSuchMethodException::class)
-fun Class<*>.getDeclaredComposableMethod(methodName: String, vararg args: Class<*>): Method {
-    val changedParams = changedParamCount(args.size, 0)
-    val method = try {
-        // without defaults
-        getDeclaredMethod(
-            methodName,
-            *args,
-            Composer::class.java, // composer param
-            *Int::class.java.dup(changedParams) // changed params
-        )
-    } catch (e: ReflectiveOperationException) {
-        val defaultParams = defaultParamCount(args.size)
-        try {
-            getDeclaredMethod(
-                methodName,
-                *args,
-                Composer::class.java, // composer param
-                *Int::class.java.dup(changedParams), // changed param
-                *Int::class.java.dup(defaultParams) // default param
-            )
-        } catch (e2: ReflectiveOperationException) {
-            null
-        }
-    } ?: throw NoSuchMethodException("$name.$methodName")
-
-    return method
-}
-
-/**
- * Returns the default value for the [Class] type. This will be 0 for numeric types, false for
- * boolean and null for object references.
- */
-private fun Class<*>.getDefaultValue(): Any? = when (name) {
-    "int" -> 0.toInt()
-    "short" -> 0.toShort()
-    "byte" -> 0.toByte()
-    "long" -> 0.toLong()
-    "double" -> 0.toDouble()
-    "float" -> 0.toFloat()
-    "boolean" -> false
-    "char" -> 0.toChar()
-    else -> null
-}
-
-/**
- * Structure intended to be used exclusively by [getComposableInfo].
- */
-private data class ComposableInfo(
-    val isComposable: Boolean,
-    val realParamsCount: Int,
-    val changedParams: Int,
-    val defaultParams: Int
-)
-
-/**
- * Checks whether the method is Composable function and returns result along with the real
- * parameters count and changed parameter count (if composable) and packed in a structure.
- */
-private fun Method.getComposableInfo(): ComposableInfo {
-    val realParamsCount = parameterTypes.indexOfLast { it == Composer::class.java }
-    if (realParamsCount == -1) {
-        return ComposableInfo(false, parameterTypes.size, 0, 0)
-    }
-    val thisParams = if (Modifier.isStatic(this.modifiers)) 0 else 1
-    val changedParams = changedParamCount(realParamsCount, thisParams)
-    val totalParamsWithoutDefaults = realParamsCount +
-        1 + // composer
-        changedParams
-    val totalParams = parameterTypes.size
-    val isDefault = totalParams != totalParamsWithoutDefaults
-    val defaultParams = if (isDefault)
-        defaultParamCount(realParamsCount)
-    else
-        0
-    return ComposableInfo(
-        totalParamsWithoutDefaults + defaultParams == totalParams,
-        realParamsCount,
-        changedParams,
-        defaultParams
-    )
-}
-
-/**
- * Calls the Composable method on the given [instance]. If the method accepts default values, this
- * function will call it with the correct options set.
- */
-@Suppress("BanUncheckedReflection", "ListIterator")
-fun Method.invokeComposable(
-    composer: Composer,
-    instance: Any?,
-    vararg args: Any?
-): Any? {
-    val (isComposable, realParamsCount, changedParams, defaultParams) = getComposableInfo()
-
-    check(isComposable)
-
-    val totalParams = parameterTypes.size
-    val changedStartIndex = realParamsCount + 1
-    val defaultStartIndex = changedStartIndex + changedParams
-
-    val defaultsMasks = Array(defaultParams) { index ->
-        val start = index * BITS_PER_INT
-        val end = minOf(start + BITS_PER_INT, realParamsCount)
-        val useDefault =
-            (start until end).map { if (it >= args.size || args[it] == null) 1 else 0 }
-        val mask = useDefault.foldIndexed(0) { i, mask, default -> mask or (default shl i) }
-        mask
-    }
-
-    val arguments = Array(totalParams) { idx ->
-        when (idx) {
-            // pass in "empty" value for all real parameters since we will be using defaults.
-            in 0 until realParamsCount -> args.getOrElse(idx) {
-                parameterTypes[idx].getDefaultValue()
-            }
-            // the composer is the first synthetic parameter
-            realParamsCount -> composer
-            // since this is the root we don't need to be anything unique. 0 should suffice.
-            // changed parameters should be 0 to indicate "uncertain"
-            changedStartIndex -> 1
-            in changedStartIndex + 1 until defaultStartIndex -> 0
-            // Default values mask, all parameters set to use defaults
-            in defaultStartIndex until totalParams -> defaultsMasks[idx - defaultStartIndex]
-            else -> error("Unexpected index")
-        }
-    }
-    return invoke(instance, *arguments)
-}
-
-private const val BITS_PER_INT = 31
-
-private fun changedParamCount(realValueParams: Int, thisParams: Int): Int {
-    if (realValueParams == 0) return 1
-    val totalParams = realValueParams + thisParams
-    return ceil(
-        totalParams.toDouble() / SLOTS_PER_INT.toDouble()
-    ).toInt()
-}
-
-private fun defaultParamCount(realValueParams: Int): Int {
-    return ceil(
-        realValueParams.toDouble() / BITS_PER_INT.toDouble()
-    ).toInt()
-}
-
-/**
- * Returns true if the method is a Composable function and false otherwise.
- */
-val Method.isComposable: Boolean
-    get() = getComposableInfo().isComposable
-
-/**
- * Returns real parameters count for the method, it returns the actual parameters count for the
- * usual methods and for Composable functions it excludes the utility Compose-specific parameters
- * from counting.
- */
-val Method.realParametersCount: Int
-    get() {
-        val (isComposable, realParametersCount, _, _) = getComposableInfo()
-        if (isComposable) {
-            return realParametersCount
-        }
-        return parameterTypes.size
-    }
-
-/**
- * Returns real parameters for the method, it returns the actual parameters for the usual methods
- * and for Composable functions it excludes the utility Compose-specific parameters.
- */
-val Method.realParameters: Array<out Parameter>
-    @Suppress("ClassVerificationFailure", "NewApi")
-    get() {
-        val (isComposable, realParametersCount, _, _) = getComposableInfo()
-        if (isComposable) {
-            return parameters.copyOfRange(0, realParametersCount)
-        }
-        return parameters
-    }
diff --git a/compose/runtime/runtime/src/jvmTest/kotlin/androidx/compose/runtime/LiveEditTests.kt b/compose/runtime/runtime/src/jvmTest/kotlin/androidx/compose/runtime/LiveEditTests.kt
index 6e7b05e..3e2426c 100644
--- a/compose/runtime/runtime/src/jvmTest/kotlin/androidx/compose/runtime/LiveEditTests.kt
+++ b/compose/runtime/runtime/src/jvmTest/kotlin/androidx/compose/runtime/LiveEditTests.kt
@@ -18,12 +18,25 @@
 
 import androidx.compose.runtime.mock.Text
 import androidx.compose.runtime.mock.compositionTest
+import org.junit.After
 import org.junit.Assert
+import org.junit.Before
 import org.junit.Ignore
 import org.junit.Test
 
 class LiveEditTests {
 
+    @Before
+    fun setUp() {
+        Recomposer.setHotReloadEnabled(true)
+    }
+
+    @After
+    fun tearDown() {
+        clearCompositionErrors()
+        Recomposer.setHotReloadEnabled(true)
+    }
+
     @Test
     fun testRestartableFunctionPreservesParentAndSiblingState() = liveEditTest {
         EnsureStatePreservedAndNotRecomposed("a")
@@ -130,6 +143,323 @@
             Text("Hello World")
         }
     }
+
+    @Test
+    fun testThrowing_initialComposition() = liveEditTest {
+        RestartGroup {
+            MarkAsTarget()
+            // Fail once per each reload
+            expectError("throwInCompose", 2)
+            // Composed once - failed once
+            Expect(
+                "throw",
+                compose = 2,
+                onRememberd = 0,
+                onForgotten = 0,
+                onAbandoned = 2
+            )
+            error("throwInCompose")
+        }
+    }
+
+    @Test
+    fun testThrowing_recomposition() {
+        var recomposeCount = 0
+        liveEditTest(reloadCount = 2) {
+            RestartGroup {
+                MarkAsTarget()
+
+                // only failed on 2nd recomposition
+                expectError("throwInCompose", 1)
+                // Composed 3 times, failed once
+                Expect(
+                    "throw",
+                    compose = 3,
+                    onRememberd = 2,
+                    onForgotten = 1,
+                    onAbandoned = 1
+                )
+
+                recomposeCount++
+                if (recomposeCount == 2) {
+                    error("throwInCompose")
+                }
+            }
+        }
+    }
+
+    @Test
+    fun testThrowing_initialComposition_sideEffect() {
+        liveEditTest {
+            RestartGroup {
+                MarkAsTarget()
+
+                // The error is not recoverable, so reload doesn't fix the error
+                expectError("throwInEffect", 1)
+
+                // Composition happens as usual
+                Expect(
+                    "a",
+                    compose = 1,
+                    onRememberd = 1,
+                    onForgotten = 0,
+                    onAbandoned = 0,
+                )
+
+                SideEffect {
+                    error("throwInEffect")
+                }
+            }
+        }
+    }
+
+    @Test
+    fun testThrowing_recomposition_sideEffect() {
+        var recomposeCount = 0
+        liveEditTest {
+            RestartGroup {
+                MarkAsTarget()
+
+                // The error is not recoverable, so reload doesn't fix the error
+                expectError("throwInEffect", 1)
+
+                // Composition happens as usual
+                Expect(
+                    "a",
+                    compose = 2,
+                    onRememberd = 2,
+                    onForgotten = 1,
+                    onAbandoned = 0,
+                )
+
+                recomposeCount++
+
+                SideEffect {
+                    if (recomposeCount == 2) {
+                        error("throwInEffect")
+                    }
+                }
+            }
+        }
+    }
+
+    @Test
+    fun testThrowing_initialComposition_remembered() {
+        liveEditTest {
+            RestartGroup {
+                MarkAsTarget()
+
+                // The error is not recoverable, so reload doesn't fix the error
+                expectError("throwOnRemember", 1)
+
+                // remembers as usual
+                Expect(
+                    "a",
+                    compose = 1,
+                    onRememberd = 1,
+                    onForgotten = 0,
+                    onAbandoned = 0,
+                )
+
+                remember {
+                    object : RememberObserver {
+                        override fun onRemembered() {
+                            error("throwOnRemember")
+                        }
+                        override fun onForgotten() {}
+                        override fun onAbandoned() {}
+                    }
+                }
+
+                // The rest of remembers fail
+                Expect(
+                    "b",
+                    compose = 1,
+                    onRememberd = 0,
+                    onForgotten = 0,
+                    onAbandoned = 1,
+                )
+            }
+        }
+    }
+
+    @Test
+    fun testThrowing_recomposition_remembered() {
+        var recomposeCount = 0
+        liveEditTest {
+            RestartGroup {
+                MarkAsTarget()
+
+                // The error is not recoverable, so reload doesn't fix the error
+                expectError("throwOnRemember", 1)
+
+                recomposeCount++
+
+                // remembers as usual
+                Expect(
+                    "a",
+                    compose = 2,
+                    onRememberd = 2,
+                    onForgotten = 1,
+                    onAbandoned = 0,
+                )
+
+                remember {
+                    object : RememberObserver {
+                        override fun onRemembered() {
+                            if (recomposeCount == 2) {
+                                error("throwOnRemember")
+                            }
+                        }
+                        override fun onForgotten() {}
+                        override fun onAbandoned() {}
+                    }
+                }
+
+                // The rest of remembers fail
+                Expect(
+                    "b",
+                    compose = 2,
+                    onRememberd = 1,
+                    // todo: ensure forgotten is not dispatched for abandons?
+                    onForgotten = 1,
+                    onAbandoned = 1,
+                )
+            }
+        }
+    }
+
+    @Test
+    fun testThrowing_invalidationsCarriedAfterCrash() {
+        var recomposeCount = 0
+        val state = mutableStateOf(0)
+        liveEditTest(reloadCount = 2) {
+            RestartGroup {
+                RestartGroup {
+                    MarkAsTarget()
+
+                    // Only error the first time
+                    expectError("throwInComposition", 1)
+
+                    if (recomposeCount == 0) {
+                        // invalidate sibling group below in first composition
+                        state.value += 1
+                    }
+
+                    if (recomposeCount++ == 1) {
+                        // crash after first reload
+                        error("throwInComposition")
+                    }
+                }
+            }
+
+            RestartGroup {
+                // read state
+                state.value
+
+                // composed initially + invalidated by crashed composition
+                Expect(
+                    "state",
+                    compose = 2,
+                    onRememberd = 1,
+                    onForgotten = 0,
+                    onAbandoned = 0
+                )
+            }
+        }
+    }
+
+    @Test
+    fun testThrowing_movableContent() {
+        liveEditTest {
+            RestartGroup {
+                MarkAsTarget()
+
+                expectError("throwInMovableContent", 2)
+
+                val content = remember {
+                    movableContentOf {
+                        error("throwInMovableContent")
+                    }
+                }
+
+                content()
+            }
+        }
+    }
+
+    @Test
+    fun testThrowing_movableContent_recomposition() {
+        var recomposeCount = 0
+        liveEditTest(reloadCount = 2) {
+            RestartGroup {
+                MarkAsTarget()
+
+                expectError("throwInMovableContent", 1)
+
+                val content = remember {
+                    movableContentOf {
+                        Expect(
+                            "movable",
+                            compose = 3,
+                            onRememberd = 2,
+                            onForgotten = 1,
+                            onAbandoned = 1
+                        )
+
+                        if (recomposeCount == 1) {
+                            error("throwInMovableContent")
+                        }
+                    }
+                }
+
+                content()
+
+                recomposeCount++
+            }
+        }
+    }
+
+    @Test
+    fun testThrowing_movableContent_throwAfterMove() {
+        var recomposeCount = 0
+        liveEditTest(reloadCount = 2) {
+            expectError("throwInMovableContent", 1)
+
+            val content = remember {
+                movableContentOf {
+                    recomposeCount++
+                    Expect(
+                        "movable",
+                        compose = 4,
+                        onRememberd = 3,
+                        onForgotten = 2,
+                        onAbandoned = 1
+                    )
+
+                    if (recomposeCount == 1) {
+                        error("throwInMovableContent")
+                    }
+                }
+            }
+
+            RestartGroup {
+                MarkAsTarget()
+
+                if (recomposeCount == 0) {
+                    content()
+                }
+            }
+
+            RestartGroup {
+                MarkAsTarget()
+
+                if (recomposeCount > 0) {
+                    content()
+                }
+            }
+        }
+    }
 }
 
 @Composable
@@ -237,19 +567,52 @@
     addTargetKey((currentComposer as ComposerImpl).parentKey())
 }
 
-fun liveEditTest(fn: @Composable LiveEditTestScope.() -> Unit) = compositionTest {
+@OptIn(InternalComposeApi::class)
+fun liveEditTest(
+    reloadCount: Int = 1,
+    fn: @Composable LiveEditTestScope.() -> Unit,
+) = compositionTest {
     with(LiveEditTestScope()) {
-        compose { fn(this) }
-        invalidateTargets()
-        advance()
+        addCheck {
+            (composition as? ControlledComposition)?.verifyConsistent()
+        }
+
+        recordErrors {
+            compose { fn(this) }
+        }
+
+        repeat(reloadCount) {
+            invalidateTargets()
+            recordErrors {
+                advance()
+            }
+        }
+
         runChecks()
     }
 }
 
+@OptIn(InternalComposeApi::class)
+private inline fun LiveEditTestScope.recordErrors(
+    block: () -> Unit
+) {
+    try {
+        block()
+    } catch (e: ComposeRuntimeError) {
+        throw e
+    } catch (e: Exception) {
+        addError(e)
+    }
+    currentCompositionErrors().forEach {
+        addError(it.first)
+    }
+}
+
 @Stable
 class LiveEditTestScope {
     private val targetKeys = mutableSetOf<Int>()
     private val checks = mutableListOf<() -> Unit>()
+    private val errors = mutableSetOf<Exception>()
     private val logs = mutableListOf<Pair<String, String>>()
 
     fun invalidateTargets() {
@@ -271,13 +634,18 @@
     fun log(ref: String, msg: String) {
         logs.add(ref to msg)
     }
-    fun addLogCheck(ref: String, validate: (List<String>) -> Unit) {
-        checks.add {
-            validate(logs.filter { it.first == ref }.map { it.second }.toList())
-        }
+
+    fun addError(e: Exception) {
+        errors.add(e)
     }
+
+    fun addCheck(check: () -> Unit) {
+        checks.add(check)
+    }
+
     fun expectLogCount(ref: String, msg: String, expected: Int) {
-        addLogCheck(ref) { logs ->
+        addCheck {
+            val logs = logs.filter { it.first == ref }.map { it.second }.toList()
             val actual = logs.filter { m -> m == msg }.count()
             Assert.assertEquals(
                 "Ref '$ref' had an unexpected # of '$msg' logs",
@@ -286,4 +654,15 @@
             )
         }
     }
+
+    fun expectError(message: String, count: Int) {
+        addCheck {
+            val errors = errors.filter { it.message == message }
+            Assert.assertEquals(
+                "Got ${errors.size} errors with $message",
+                count,
+                errors.size
+            )
+        }
+    }
 }
diff --git a/compose/runtime/runtime/src/jvmTest/kotlin/androidx/compose/runtime/reflect/ComposableMethodInvokerTest.kt b/compose/runtime/runtime/src/jvmTest/kotlin/androidx/compose/runtime/reflect/ComposableMethodInvokerTest.kt
deleted file mode 100644
index a976fad..0000000
--- a/compose/runtime/runtime/src/jvmTest/kotlin/androidx/compose/runtime/reflect/ComposableMethodInvokerTest.kt
+++ /dev/null
@@ -1,581 +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.runtime.reflect
-
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.Composer
-import androidx.compose.runtime.Composition
-import androidx.compose.runtime.MonotonicFrameClock
-import androidx.compose.runtime.Recomposer
-import androidx.compose.runtime.currentComposer
-import androidx.compose.runtime.mock.EmptyApplier
-import androidx.compose.runtime.withRunningRecomposer
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertNotEquals
-import kotlin.test.assertTrue
-import kotlinx.coroutines.runBlocking
-
-@Composable
-private fun composableFunction() {
-}
-
-private fun nonComposableFunction() {
-}
-
-@Suppress("UNUSED_PARAMETER")
-private fun nonComposableFunctionWithComposerParam(unused: Composer) {
-}
-
-@Composable
-private fun composableFunctionWithDefaults(
-    s1: String,
-    s2: String,
-    s3: String = "a",
-    s4: String = "a",
-    s5: String = "a"
-): String { return s1 + s2 + s3 + s4 + s5 }
-
-@Composable
-private fun overloadedComposable() {
-}
-
-@Suppress("UNUSED_PARAMETER")
-@Composable
-private fun overloadedComposable(s: String) {
-}
-
-@Suppress("UNUSED_PARAMETER")
-@Composable
-private fun overloadedComposable(
-    v1: String,
-    v2: String,
-    v3: String,
-    v4: String,
-    v5: String,
-    v6: String,
-    v7: String,
-    v8: String,
-    v9: String,
-    v10: String
-) { }
-
-@Suppress("UNUSED_PARAMETER")
-@Composable
-private fun overloadedComposable(
-    v1: String,
-    v2: String,
-    v3: String,
-    v4: String,
-    v5: String,
-    v6: String,
-    v7: String,
-    v8: String,
-    v9: String,
-    v10: String,
-    v11: String
-) { }
-
-@Suppress("UNUSED_PARAMETER")
-@Composable
-private fun overloadedComposable(
-    v1: String,
-    v2: String,
-    v3: String,
-    v4: String,
-    v5: String,
-    v6: String,
-    v7: String,
-    v8: String,
-    v9: String,
-    v10: String,
-    v11: String,
-    v12: String
-) { }
-
-@Suppress("UNUSED_PARAMETER")
-@Composable
-private fun differentParametersTypes(
-    v1: String,
-    v2: Any,
-    v3: Int,
-    v4: Float,
-    v5: Double,
-    v6: Long
-) { }
-
-private class ComposablesWrapper {
-    @Composable
-    fun composableMethod() {
-    }
-
-    fun nonComposableMethod() {
-    }
-
-    @Suppress("UNUSED_PARAMETER")
-    fun nonComposableMethodWithComposerParam(unused: Composer) {
-    }
-
-    @Composable
-    fun composableMethodWithDefaults(
-        s1: String,
-        s2: String,
-        s3: String = "a",
-        s4: String = "a",
-        s5: String = "a"
-    ): String { return s1 + s2 + s3 + s4 + s5 }
-
-    @Composable
-    fun overloadedComposableMethod() {
-    }
-
-    @Suppress("UNUSED_PARAMETER")
-    @Composable
-    fun overloadedComposableMethod(s: String) {
-    }
-
-    @Suppress("UNUSED_PARAMETER")
-    @Composable
-    fun overloadedComposableMethod(
-        v1: String,
-        v2: String,
-        v3: String,
-        v4: String,
-        v5: String,
-        v6: String,
-        v7: String,
-        v8: String,
-        v9: String,
-        v10: String
-    ) { }
-
-    @Suppress("UNUSED_PARAMETER")
-    @Composable
-    fun overloadedComposableMethod(
-        v1: String,
-        v2: String,
-        v3: String,
-        v4: String,
-        v5: String,
-        v6: String,
-        v7: String,
-        v8: String,
-        v9: String,
-        v10: String,
-        v11: String
-    ) { }
-
-    @Suppress("UNUSED_PARAMETER")
-    @Composable
-    fun overloadedComposableMethod(
-        v1: String,
-        v2: String,
-        v3: String,
-        v4: String,
-        v5: String,
-        v6: String,
-        v7: String,
-        v8: String,
-        v9: String,
-        v10: String,
-        v11: String,
-        v12: String
-    ) { }
-
-    @Suppress("UNUSED_PARAMETER")
-    @Composable
-    fun differentParametersTypesMethod(
-        v1: String,
-        v2: Any,
-        v3: Int,
-        v4: Float,
-        v5: Double,
-        v6: Long
-    ) { }
-}
-
-class ComposableMethodInvokerTest {
-    private val clazz =
-        Class.forName("androidx.compose.runtime.reflect.ComposableMethodInvokerTestKt")
-    private val wrapperClazz =
-        Class.forName("androidx.compose.runtime.reflect.ComposablesWrapper")
-
-    private val composable = clazz.declaredMethods.find { it.name == "composableFunction" }!!
-    private val nonComposable = clazz.declaredMethods.find { it.name == "nonComposableFunction" }!!
-    private val nonComposableWithComposer =
-        clazz.declaredMethods.find { it.name == "nonComposableFunctionWithComposerParam" }!!
-    private val composableMethod =
-        wrapperClazz.declaredMethods.find { it.name == "composableMethod" }!!
-    private val nonComposableMethod =
-        wrapperClazz.declaredMethods.find { it.name == "nonComposableMethod" }!!
-    private val nonComposableMethodWithComposer =
-        wrapperClazz.declaredMethods.find { it.name == "nonComposableMethodWithComposerParam" }!!
-
-    @Test
-    fun test_isComposable_correctly_checks_functions() {
-        assertTrue(composable.isComposable)
-        assertFalse(nonComposable.isComposable)
-        assertFalse(nonComposableWithComposer.isComposable)
-        assertTrue(composableMethod.isComposable)
-        assertFalse(nonComposableMethod.isComposable)
-        assertFalse(nonComposableMethodWithComposer.isComposable)
-    }
-
-    @Throws(NoSuchMethodException::class)
-    @Test
-    fun test_getDeclaredComposableMethod_differentiates_overloaded_functions() {
-        val method0 = clazz.getDeclaredComposableMethod("overloadedComposable")
-        val method1 = clazz.getDeclaredComposableMethod("overloadedComposable", String::class.java)
-        val method10 =
-            clazz.getDeclaredComposableMethod(
-                "overloadedComposable",
-                *Array(10) { String::class.java }
-            )
-        val method11 =
-            clazz.getDeclaredComposableMethod(
-                "overloadedComposable",
-                *Array(11) { String::class.java }
-            )
-        val method12 =
-            clazz.getDeclaredComposableMethod(
-                "overloadedComposable",
-                *Array(12) { String::class.java }
-            )
-
-        assertNotEquals(method0, method1)
-        assertNotEquals(method0, method10)
-        assertNotEquals(method0, method11)
-        assertNotEquals(method0, method12)
-        assertNotEquals(method1, method10)
-        assertNotEquals(method1, method11)
-        assertNotEquals(method1, method12)
-        assertNotEquals(method10, method11)
-        assertNotEquals(method10, method12)
-        assertNotEquals(method11, method12)
-    }
-
-    @Throws(NoSuchMethodException::class)
-    @Test
-    fun test_getDeclaredComposableMethod_differentiates_overloaded_methods() {
-        val method0 = wrapperClazz.getDeclaredComposableMethod("overloadedComposableMethod")
-        val method1 =
-            wrapperClazz.getDeclaredComposableMethod(
-                "overloadedComposableMethod",
-                String::class.java
-            )
-        val method10 =
-            wrapperClazz.getDeclaredComposableMethod(
-                "overloadedComposableMethod",
-                *Array(10) { String::class.java }
-            )
-        val method11 =
-            wrapperClazz.getDeclaredComposableMethod(
-                "overloadedComposableMethod",
-                *Array(11) { String::class.java }
-            )
-        val method12 =
-            wrapperClazz.getDeclaredComposableMethod(
-                "overloadedComposableMethod",
-                *Array(12) { String::class.java }
-            )
-
-        assertNotEquals(method0, method1)
-        assertNotEquals(method0, method10)
-        assertNotEquals(method0, method11)
-        assertNotEquals(method0, method12)
-        assertNotEquals(method1, method10)
-        assertNotEquals(method1, method11)
-        assertNotEquals(method1, method12)
-        assertNotEquals(method10, method11)
-        assertNotEquals(method10, method12)
-        assertNotEquals(method11, method12)
-    }
-
-    @Throws(NoSuchMethodException::class)
-    @Test
-    fun test_getDeclaredComposableMethod_works_with_default_params() {
-        clazz.getDeclaredComposableMethod(
-            "composableFunctionWithDefaults",
-            *Array(5) { String::class.java }
-        )
-
-        wrapperClazz.getDeclaredComposableMethod(
-            "composableMethodWithDefaults",
-            *Array(5) { String::class.java }
-        )
-    }
-
-    @Throws(NoSuchMethodException::class)
-    @Test
-    fun test_realParametersCount_returns_correct_number_of_parameters() {
-        val function0 = clazz.getDeclaredComposableMethod("overloadedComposable")
-        val function1 =
-            clazz.getDeclaredComposableMethod("overloadedComposable", String::class.java)
-        val function10 =
-            clazz.getDeclaredComposableMethod(
-                "overloadedComposable",
-                *Array(10) { String::class.java }
-            )
-        val function11 =
-            clazz.getDeclaredComposableMethod(
-                "overloadedComposable",
-                *Array(11) { String::class.java }
-            )
-        val function12 =
-            clazz.getDeclaredComposableMethod(
-                "overloadedComposable",
-                *Array(12) { String::class.java }
-            )
-
-        val method0 = wrapperClazz.getDeclaredComposableMethod("overloadedComposableMethod")
-        val method1 =
-            wrapperClazz.getDeclaredComposableMethod(
-                "overloadedComposableMethod", String::class.java
-            )
-        val method10 =
-            wrapperClazz.getDeclaredComposableMethod(
-                "overloadedComposableMethod",
-                *Array(10) { String::class.java }
-            )
-        val method11 =
-            wrapperClazz.getDeclaredComposableMethod(
-                "overloadedComposableMethod",
-                *Array(11) { String::class.java }
-            )
-        val method12 =
-            wrapperClazz.getDeclaredComposableMethod(
-                "overloadedComposableMethod",
-                *Array(12) { String::class.java }
-            )
-
-        assertEquals(0, function0.realParametersCount)
-        assertEquals(1, function1.realParametersCount)
-        assertEquals(10, function10.realParametersCount)
-        assertEquals(11, function11.realParametersCount)
-        assertEquals(12, function12.realParametersCount)
-
-        assertEquals(0, method0.realParametersCount)
-        assertEquals(1, method1.realParametersCount)
-        assertEquals(10, method10.realParametersCount)
-        assertEquals(11, method11.realParametersCount)
-        assertEquals(12, method12.realParametersCount)
-
-        assertEquals(0, nonComposable.realParametersCount)
-        assertEquals(1, nonComposableWithComposer.realParametersCount)
-        assertEquals(0, composableMethod.realParametersCount)
-        assertEquals(0, nonComposableMethod.realParametersCount)
-        assertEquals(1, nonComposableMethodWithComposer.realParametersCount)
-    }
-
-    @Suppress("ClassVerificationFailure", "NewApi")
-    @Throws(NoSuchMethodException::class)
-    @Test
-    fun test_realParameters_returns_correct_parameters() {
-        val function0 = clazz.getDeclaredComposableMethod("overloadedComposable")
-        val function1 =
-            clazz.getDeclaredComposableMethod("overloadedComposable", String::class.java)
-        val function10 =
-            clazz.getDeclaredComposableMethod(
-                "overloadedComposable",
-                *Array(10) { String::class.java }
-            )
-        val function11 =
-            clazz.getDeclaredComposableMethod(
-                "overloadedComposable",
-                *Array(11) { String::class.java }
-            )
-        val function12 =
-            clazz.getDeclaredComposableMethod(
-                "overloadedComposable",
-                *Array(12) { String::class.java }
-            )
-
-        val method0 = wrapperClazz.getDeclaredComposableMethod("overloadedComposableMethod")
-        val method1 =
-            wrapperClazz.getDeclaredComposableMethod(
-                "overloadedComposableMethod",
-                String::class.java
-            )
-        val method10 =
-            wrapperClazz.getDeclaredComposableMethod(
-                "overloadedComposableMethod",
-                *Array(10) { String::class.java }
-            )
-        val method11 =
-            wrapperClazz.getDeclaredComposableMethod(
-                "overloadedComposableMethod",
-                *Array(11) { String::class.java }
-            )
-        val method12 =
-            wrapperClazz.getDeclaredComposableMethod(
-                "overloadedComposableMethod",
-                *Array(12) { String::class.java }
-            )
-
-        val diffParameters =
-            clazz.getDeclaredComposableMethod(
-                "differentParametersTypes",
-                String::class.java,
-                Any::class.java,
-                Int::class.java,
-                Float::class.java,
-                Double::class.java,
-                Long::class.java
-            )
-
-        val diffParametersMethod =
-            wrapperClazz.getDeclaredComposableMethod(
-                "differentParametersTypesMethod",
-                String::class.java,
-                Any::class.java,
-                Int::class.java,
-                Float::class.java,
-                Double::class.java,
-                Long::class.java
-            )
-
-        assertEquals(0, function0.realParameters.size)
-        assertEquals(1, function1.realParameters.size)
-        assertEquals(10, function10.realParameters.size)
-        assertEquals(11, function11.realParameters.size)
-        assertEquals(12, function12.realParameters.size)
-        assertEquals(12, function12.realParameters.size)
-
-        assertEquals(0, method0.realParameters.size)
-        assertEquals(1, method1.realParameters.size)
-        assertEquals(10, method10.realParameters.size)
-        assertEquals(11, method11.realParameters.size)
-        assertEquals(12, method12.realParameters.size)
-
-        assertEquals(0, nonComposable.realParameters.size)
-        assertEquals(1, nonComposableWithComposer.realParameters.size)
-        assertEquals(0, composableMethod.realParameters.size)
-        assertEquals(0, nonComposableMethod.realParameters.size)
-        assertEquals(1, nonComposableMethodWithComposer.realParameters.size)
-
-        assertEquals(6, diffParameters.realParameters.size)
-        assertEquals(
-            listOf(String::class.java, Any::class.java, Int::class.java, Float::class.java,
-                Double::class.java, Long::class.java),
-            diffParameters.realParameters.map { it.type })
-
-        assertEquals(6, diffParametersMethod.realParameters.size)
-        assertEquals(
-            listOf(String::class.java, Any::class.java, Int::class.java, Float::class.java,
-                Double::class.java, Long::class.java),
-            diffParametersMethod.realParameters.map { it.type })
-    }
-
-    private class TestFrameClock : MonotonicFrameClock {
-        override suspend fun <R> withFrameNanos(onFrame: (Long) -> R): R = onFrame(0L)
-    }
-
-    private fun <T> executeWithComposer(block: (composer: Composer) -> T): T =
-        runBlocking(TestFrameClock()) {
-            fun compose(
-                recomposer: Recomposer,
-                block: @Composable () -> Unit
-            ): Composition {
-                return Composition(
-                    EmptyApplier(),
-                    recomposer
-                ).apply {
-                    setContent(block)
-                }
-            }
-
-            var res: T? = null
-            withRunningRecomposer { r ->
-                compose(r) {
-                    res = block(currentComposer)
-                }
-            }
-            res!!
-        }
-
-    @Test
-    fun testInvokeComposableFunctions() {
-
-        val composableWithDefaults =
-            clazz.declaredMethods.find { it.name == "composableFunctionWithDefaults" }!!
-        composableWithDefaults.isAccessible = true
-
-        val resABAAA = executeWithComposer {
-            composableWithDefaults.invokeComposable(it, null, "a", "b") as String
-        }
-
-        val resABCAA = executeWithComposer {
-            composableWithDefaults.invokeComposable(it, null, "a", "b", "c") as String
-        }
-
-        val resABCDA = executeWithComposer {
-            composableWithDefaults.invokeComposable(it, null, "a", "b", "c", "d") as String
-        }
-
-        val resABCDE = executeWithComposer {
-            composableWithDefaults.invokeComposable(it, null, "a", "b", "c", "d", "e") as String
-        }
-
-        val resABADA = executeWithComposer {
-            composableWithDefaults.invokeComposable(it, null, "a", "b", null, "d") as String
-        }
-
-        assertEquals("abaaa", resABAAA)
-        assertEquals("abcaa", resABCAA)
-        assertEquals("abcda", resABCDA)
-        assertEquals("abcde", resABCDE)
-        assertEquals("abada", resABADA)
-    }
-
-    @Test
-    fun testInvokeComposableMethods() {
-
-        val composableWithDefaults =
-            wrapperClazz.declaredMethods.find { it.name == "composableMethodWithDefaults" }!!
-        composableWithDefaults.isAccessible = true
-
-        val instance = ComposablesWrapper()
-
-        val resABAAA = executeWithComposer {
-            composableWithDefaults.invokeComposable(it, instance, "a", "b") as String
-        }
-
-        val resABCAA = executeWithComposer {
-            composableWithDefaults.invokeComposable(it, instance, "a", "b", "c") as String
-        }
-
-        val resABCDA = executeWithComposer {
-            composableWithDefaults.invokeComposable(it, instance, "a", "b", "c", "d") as String
-        }
-
-        val resABCDE = executeWithComposer {
-            composableWithDefaults
-                .invokeComposable(it, instance, "a", "b", "c", "d", "e") as String
-        }
-
-        val resABADA = executeWithComposer {
-            composableWithDefaults.invokeComposable(it, instance, "a", "b", null, "d") as String
-        }
-
-        assertEquals("abaaa", resABAAA)
-        assertEquals("abcaa", resABCAA)
-        assertEquals("abcda", resABCDA)
-        assertEquals("abcde", resABCDE)
-        assertEquals("abada", resABADA)
-    }
-}
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/jvmTest/kotlin/androidx/compose/runtime/reflect/ComposableMethodTest.kt b/compose/runtime/runtime/src/jvmTest/kotlin/androidx/compose/runtime/reflect/ComposableMethodTest.kt
new file mode 100644
index 0000000..3c92434
--- /dev/null
+++ b/compose/runtime/runtime/src/jvmTest/kotlin/androidx/compose/runtime/reflect/ComposableMethodTest.kt
@@ -0,0 +1,577 @@
+/*
+ * 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.runtime.reflect
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.Composer
+import androidx.compose.runtime.Composition
+import androidx.compose.runtime.MonotonicFrameClock
+import androidx.compose.runtime.Recomposer
+import androidx.compose.runtime.currentComposer
+import androidx.compose.runtime.mock.EmptyApplier
+import androidx.compose.runtime.withRunningRecomposer
+import kotlin.test.Test
+import kotlin.test.assertEquals
+import kotlin.test.assertNotEquals
+import kotlin.test.assertNotNull
+import kotlin.test.assertNull
+import kotlinx.coroutines.runBlocking
+
+@Composable
+private fun composableFunction() {
+}
+
+private fun nonComposableFunction() {
+}
+
+@Suppress("UNUSED_PARAMETER")
+private fun nonComposableFunctionWithComposerParam(unused: Composer) {
+}
+
+@Composable
+private fun composableFunctionWithDefaults(
+    s1: String,
+    s2: String,
+    s3: String = "a",
+    s4: String = "a",
+    s5: String = "a"
+): String { return s1 + s2 + s3 + s4 + s5 }
+
+@Composable
+private fun overloadedComposable() {
+}
+
+@Suppress("UNUSED_PARAMETER")
+@Composable
+private fun overloadedComposable(s: String) {
+}
+
+@Suppress("UNUSED_PARAMETER")
+@Composable
+private fun overloadedComposable(
+    v1: String,
+    v2: String,
+    v3: String,
+    v4: String,
+    v5: String,
+    v6: String,
+    v7: String,
+    v8: String,
+    v9: String,
+    v10: String
+) { }
+
+@Suppress("UNUSED_PARAMETER")
+@Composable
+private fun overloadedComposable(
+    v1: String,
+    v2: String,
+    v3: String,
+    v4: String,
+    v5: String,
+    v6: String,
+    v7: String,
+    v8: String,
+    v9: String,
+    v10: String,
+    v11: String
+) { }
+
+@Suppress("UNUSED_PARAMETER")
+@Composable
+private fun overloadedComposable(
+    v1: String,
+    v2: String,
+    v3: String,
+    v4: String,
+    v5: String,
+    v6: String,
+    v7: String,
+    v8: String,
+    v9: String,
+    v10: String,
+    v11: String,
+    v12: String
+) { }
+
+@Suppress("UNUSED_PARAMETER")
+@Composable
+private fun differentParametersTypes(
+    v1: String,
+    v2: Any,
+    v3: Int,
+    v4: Float,
+    v5: Double,
+    v6: Long
+) { }
+
+private class ComposablesWrapper {
+    @Composable
+    fun composableMethod() {
+    }
+
+    fun nonComposableMethod() {
+    }
+
+    @Suppress("UNUSED_PARAMETER")
+    fun nonComposableMethodWithComposerParam(unused: Composer) {
+    }
+
+    @Composable
+    fun composableMethodWithDefaults(
+        s1: String,
+        s2: String,
+        s3: String = "a",
+        s4: String = "a",
+        s5: String = "a"
+    ): String { return s1 + s2 + s3 + s4 + s5 }
+
+    @Composable
+    fun overloadedComposableMethod() {
+    }
+
+    @Suppress("UNUSED_PARAMETER")
+    @Composable
+    fun overloadedComposableMethod(s: String) {
+    }
+
+    @Suppress("UNUSED_PARAMETER")
+    @Composable
+    fun overloadedComposableMethod(
+        v1: String,
+        v2: String,
+        v3: String,
+        v4: String,
+        v5: String,
+        v6: String,
+        v7: String,
+        v8: String,
+        v9: String,
+        v10: String
+    ) { }
+
+    @Suppress("UNUSED_PARAMETER")
+    @Composable
+    fun overloadedComposableMethod(
+        v1: String,
+        v2: String,
+        v3: String,
+        v4: String,
+        v5: String,
+        v6: String,
+        v7: String,
+        v8: String,
+        v9: String,
+        v10: String,
+        v11: String
+    ) { }
+
+    @Suppress("UNUSED_PARAMETER")
+    @Composable
+    fun overloadedComposableMethod(
+        v1: String,
+        v2: String,
+        v3: String,
+        v4: String,
+        v5: String,
+        v6: String,
+        v7: String,
+        v8: String,
+        v9: String,
+        v10: String,
+        v11: String,
+        v12: String
+    ) { }
+
+    @Suppress("UNUSED_PARAMETER")
+    @Composable
+    fun differentParametersTypesMethod(
+        v1: String,
+        v2: Any,
+        v3: Int,
+        v4: Float,
+        v5: Double,
+        v6: Long
+    ) { }
+}
+
+class ComposableMethodTest {
+    private val clazz =
+        Class.forName("androidx.compose.runtime.reflect.ComposableMethodTestKt")
+    private val wrapperClazz =
+        Class.forName("androidx.compose.runtime.reflect.ComposablesWrapper")
+
+    private val composable = clazz.declaredMethods.find { it.name == "composableFunction" }!!
+    private val nonComposable = clazz.declaredMethods.find { it.name == "nonComposableFunction" }!!
+    private val nonComposableWithComposer =
+        clazz.declaredMethods.find { it.name == "nonComposableFunctionWithComposerParam" }!!
+    private val composableMethod =
+        wrapperClazz.declaredMethods.find { it.name == "composableMethod" }!!
+    private val nonComposableMethod =
+        wrapperClazz.declaredMethods.find { it.name == "nonComposableMethod" }!!
+    private val nonComposableMethodWithComposer =
+        wrapperClazz.declaredMethods.find { it.name == "nonComposableMethodWithComposerParam" }!!
+
+    @Test
+    fun test_isComposable_correctly_checks_functions() {
+        assertNotNull(composable.asComposableMethod())
+        assertNull(nonComposable.asComposableMethod())
+        assertNull(nonComposableWithComposer.asComposableMethod())
+        assertNotNull(composableMethod.asComposableMethod())
+        assertNull(nonComposableMethod.asComposableMethod())
+        assertNull(nonComposableMethodWithComposer.asComposableMethod())
+    }
+
+    @Throws(NoSuchMethodException::class)
+    @Test
+    fun test_getDeclaredComposableMethod_differentiates_overloaded_functions() {
+        val method0 = clazz.getDeclaredComposableMethod("overloadedComposable")
+        val method1 = clazz.getDeclaredComposableMethod("overloadedComposable", String::class.java)
+        val method10 =
+            clazz.getDeclaredComposableMethod(
+                "overloadedComposable",
+                *Array(10) { String::class.java }
+            )
+        val method11 =
+            clazz.getDeclaredComposableMethod(
+                "overloadedComposable",
+                *Array(11) { String::class.java }
+            )
+        val method12 =
+            clazz.getDeclaredComposableMethod(
+                "overloadedComposable",
+                *Array(12) { String::class.java }
+            )
+
+        assertNotEquals(method0, method1)
+        assertNotEquals(method0, method10)
+        assertNotEquals(method0, method11)
+        assertNotEquals(method0, method12)
+        assertNotEquals(method1, method10)
+        assertNotEquals(method1, method11)
+        assertNotEquals(method1, method12)
+        assertNotEquals(method10, method11)
+        assertNotEquals(method10, method12)
+        assertNotEquals(method11, method12)
+    }
+
+    @Throws(NoSuchMethodException::class)
+    @Test
+    fun test_getDeclaredComposableMethod_differentiates_overloaded_methods() {
+        val method0 = wrapperClazz.getDeclaredComposableMethod("overloadedComposableMethod")
+        val method1 =
+            wrapperClazz.getDeclaredComposableMethod(
+                "overloadedComposableMethod",
+                String::class.java
+            )
+        val method10 =
+            wrapperClazz.getDeclaredComposableMethod(
+                "overloadedComposableMethod",
+                *Array(10) { String::class.java }
+            )
+        val method11 =
+            wrapperClazz.getDeclaredComposableMethod(
+                "overloadedComposableMethod",
+                *Array(11) { String::class.java }
+            )
+        val method12 =
+            wrapperClazz.getDeclaredComposableMethod(
+                "overloadedComposableMethod",
+                *Array(12) { String::class.java }
+            )
+
+        assertNotEquals(method0, method1)
+        assertNotEquals(method0, method10)
+        assertNotEquals(method0, method11)
+        assertNotEquals(method0, method12)
+        assertNotEquals(method1, method10)
+        assertNotEquals(method1, method11)
+        assertNotEquals(method1, method12)
+        assertNotEquals(method10, method11)
+        assertNotEquals(method10, method12)
+        assertNotEquals(method11, method12)
+    }
+
+    @Throws(NoSuchMethodException::class)
+    @Test
+    fun test_getDeclaredComposableMethod_works_with_default_params() {
+        clazz.getDeclaredComposableMethod(
+            "composableFunctionWithDefaults",
+            *Array(5) { String::class.java }
+        )
+
+        wrapperClazz.getDeclaredComposableMethod(
+            "composableMethodWithDefaults",
+            *Array(5) { String::class.java }
+        )
+    }
+
+    @Throws(NoSuchMethodException::class)
+    @Test
+    fun test_realParametersCount_returns_correct_number_of_parameters() {
+        val function0 = clazz.getDeclaredComposableMethod("overloadedComposable")
+        val function1 =
+            clazz.getDeclaredComposableMethod("overloadedComposable", String::class.java)
+        val function10 =
+            clazz.getDeclaredComposableMethod(
+                "overloadedComposable",
+                *Array(10) { String::class.java }
+            )
+        val function11 =
+            clazz.getDeclaredComposableMethod(
+                "overloadedComposable",
+                *Array(11) { String::class.java }
+            )
+        val function12 =
+            clazz.getDeclaredComposableMethod(
+                "overloadedComposable",
+                *Array(12) { String::class.java }
+            )
+
+        val method0 = wrapperClazz.getDeclaredComposableMethod("overloadedComposableMethod")
+        val method1 =
+            wrapperClazz.getDeclaredComposableMethod(
+                "overloadedComposableMethod", String::class.java
+            )
+        val method10 =
+            wrapperClazz.getDeclaredComposableMethod(
+                "overloadedComposableMethod",
+                *Array(10) { String::class.java }
+            )
+        val method11 =
+            wrapperClazz.getDeclaredComposableMethod(
+                "overloadedComposableMethod",
+                *Array(11) { String::class.java }
+            )
+        val method12 =
+            wrapperClazz.getDeclaredComposableMethod(
+                "overloadedComposableMethod",
+                *Array(12) { String::class.java }
+            )
+
+        assertEquals(0, function0.parameterCount)
+        assertEquals(1, function1.parameterCount)
+        assertEquals(10, function10.parameterCount)
+        assertEquals(11, function11.parameterCount)
+        assertEquals(12, function12.parameterCount)
+
+        assertEquals(0, method0.parameterCount)
+        assertEquals(1, method1.parameterCount)
+        assertEquals(10, method10.parameterCount)
+        assertEquals(11, method11.parameterCount)
+        assertEquals(12, method12.parameterCount)
+
+        assertEquals(0, composableMethod.asComposableMethod()!!.parameterCount)
+    }
+
+    @Suppress("ClassVerificationFailure", "NewApi")
+    @Throws(NoSuchMethodException::class)
+    @Test
+    fun test_realParameters_returns_correct_parameters() {
+        val function0 = clazz.getDeclaredComposableMethod("overloadedComposable")
+        val function1 =
+            clazz.getDeclaredComposableMethod("overloadedComposable", String::class.java)
+        val function10 =
+            clazz.getDeclaredComposableMethod(
+                "overloadedComposable",
+                *Array(10) { String::class.java }
+            )
+        val function11 =
+            clazz.getDeclaredComposableMethod(
+                "overloadedComposable",
+                *Array(11) { String::class.java }
+            )
+        val function12 =
+            clazz.getDeclaredComposableMethod(
+                "overloadedComposable",
+                *Array(12) { String::class.java }
+            )
+
+        val method0 = wrapperClazz.getDeclaredComposableMethod("overloadedComposableMethod")
+        val method1 =
+            wrapperClazz.getDeclaredComposableMethod(
+                "overloadedComposableMethod",
+                String::class.java
+            )
+        val method10 =
+            wrapperClazz.getDeclaredComposableMethod(
+                "overloadedComposableMethod",
+                *Array(10) { String::class.java }
+            )
+        val method11 =
+            wrapperClazz.getDeclaredComposableMethod(
+                "overloadedComposableMethod",
+                *Array(11) { String::class.java }
+            )
+        val method12 =
+            wrapperClazz.getDeclaredComposableMethod(
+                "overloadedComposableMethod",
+                *Array(12) { String::class.java }
+            )
+
+        val diffParameters =
+            clazz.getDeclaredComposableMethod(
+                "differentParametersTypes",
+                String::class.java,
+                Any::class.java,
+                Int::class.java,
+                Float::class.java,
+                Double::class.java,
+                Long::class.java
+            )
+
+        val diffParametersMethod =
+            wrapperClazz.getDeclaredComposableMethod(
+                "differentParametersTypesMethod",
+                String::class.java,
+                Any::class.java,
+                Int::class.java,
+                Float::class.java,
+                Double::class.java,
+                Long::class.java
+            )
+
+        assertEquals(0, function0.parameters.size)
+        assertEquals(1, function1.parameters.size)
+        assertEquals(10, function10.parameters.size)
+        assertEquals(11, function11.parameters.size)
+        assertEquals(12, function12.parameters.size)
+        assertEquals(12, function12.parameters.size)
+
+        assertEquals(0, method0.parameters.size)
+        assertEquals(1, method1.parameters.size)
+        assertEquals(10, method10.parameters.size)
+        assertEquals(11, method11.parameters.size)
+        assertEquals(12, method12.parameters.size)
+
+        assertEquals(0, composableMethod.asComposableMethod()!!.parameters.size)
+
+        assertEquals(6, diffParameters.parameters.size)
+        assertEquals(
+            listOf(String::class.java, Any::class.java, Int::class.java, Float::class.java,
+                Double::class.java, Long::class.java),
+            diffParameters.parameters.map { it.type })
+
+        assertEquals(6, diffParametersMethod.parameters.size)
+        assertEquals(
+            listOf(String::class.java, Any::class.java, Int::class.java, Float::class.java,
+                Double::class.java, Long::class.java),
+            diffParametersMethod.parameters.map { it.type })
+    }
+
+    private class TestFrameClock : MonotonicFrameClock {
+        override suspend fun <R> withFrameNanos(onFrame: (Long) -> R): R = onFrame(0L)
+    }
+
+    private fun <T> executeWithComposer(block: (composer: Composer) -> T): T =
+        runBlocking(TestFrameClock()) {
+            fun compose(
+                recomposer: Recomposer,
+                block: @Composable () -> Unit
+            ): Composition {
+                return Composition(
+                    EmptyApplier(),
+                    recomposer
+                ).apply {
+                    setContent(block)
+                }
+            }
+
+            var res: T? = null
+            withRunningRecomposer { r ->
+                compose(r) {
+                    res = block(currentComposer)
+                }
+            }
+            res!!
+        }
+
+    @Test
+    fun testInvokeComposableFunctions() {
+
+        val composableWithDefaults =
+            clazz.declaredMethods
+                .find { it.name == "composableFunctionWithDefaults" }!!
+                .asComposableMethod()!!
+        composableWithDefaults.asMethod().isAccessible = true
+
+        val resABAAA = executeWithComposer {
+            composableWithDefaults.invoke(it, null, "a", "b") as String
+        }
+
+        val resABCAA = executeWithComposer {
+            composableWithDefaults.invoke(it, null, "a", "b", "c") as String
+        }
+
+        val resABCDA = executeWithComposer {
+            composableWithDefaults.invoke(it, null, "a", "b", "c", "d") as String
+        }
+
+        val resABCDE = executeWithComposer {
+            composableWithDefaults.invoke(it, null, "a", "b", "c", "d", "e") as String
+        }
+
+        val resABADA = executeWithComposer {
+            composableWithDefaults.invoke(it, null, "a", "b", null, "d") as String
+        }
+
+        assertEquals("abaaa", resABAAA)
+        assertEquals("abcaa", resABCAA)
+        assertEquals("abcda", resABCDA)
+        assertEquals("abcde", resABCDE)
+        assertEquals("abada", resABADA)
+    }
+
+    @Test
+    fun testInvokeComposableMethods() {
+
+        val composableWithDefaults =
+            wrapperClazz
+                .declaredMethods
+                .find { it.name == "composableMethodWithDefaults" }!!
+                .asComposableMethod()!!
+        composableWithDefaults.asMethod().isAccessible = true
+
+        val instance = ComposablesWrapper()
+
+        val resABAAA = executeWithComposer {
+            composableWithDefaults.invoke(it, instance, "a", "b") as String
+        }
+
+        val resABCAA = executeWithComposer {
+            composableWithDefaults.invoke(it, instance, "a", "b", "c") as String
+        }
+
+        val resABCDA = executeWithComposer {
+            composableWithDefaults.invoke(it, instance, "a", "b", "c", "d") as String
+        }
+
+        val resABCDE = executeWithComposer {
+            composableWithDefaults.invoke(it, instance, "a", "b", "c", "d", "e") as String
+        }
+
+        val resABADA = executeWithComposer {
+            composableWithDefaults.invoke(it, instance, "a", "b", null, "d") as String
+        }
+
+        assertEquals("abaaa", resABAAA)
+        assertEquals("abcaa", resABCAA)
+        assertEquals("abcda", resABCDA)
+        assertEquals("abcde", resABCDE)
+        assertEquals("abada", resABADA)
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui-android-stubs/api/1.3.0-beta01.txt b/compose/ui/ui-android-stubs/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..8e22228
--- /dev/null
+++ b/compose/ui/ui-android-stubs/api/1.3.0-beta01.txt
@@ -0,0 +1,78 @@
+// Signature format: 4.0
+package android.view {
+
+  public final class DisplayListCanvas extends android.graphics.Canvas {
+    ctor public DisplayListCanvas();
+    method public void drawRenderNode(android.view.RenderNode);
+  }
+
+  public class RenderNode {
+    method public static android.view.RenderNode create(String?, android.view.View?);
+    method public void destroy();
+    method public void destroyDisplayListData();
+    method public void discardDisplayList();
+    method public void end(android.view.DisplayListCanvas);
+    method public float getAlpha();
+    method public int getAmbientShadowColor();
+    method public float getCameraDistance();
+    method public boolean getClipToOutline();
+    method public float getElevation();
+    method public void getInverseMatrix(android.graphics.Matrix);
+    method public void getMatrix(android.graphics.Matrix);
+    method public float getPivotX();
+    method public float getPivotY();
+    method public float getRotation();
+    method public float getRotationX();
+    method public float getRotationY();
+    method public float getScaleX();
+    method public float getScaleY();
+    method public int getSpotShadowColor();
+    method public float getTranslationX();
+    method public float getTranslationY();
+    method public float getTranslationZ();
+    method public boolean hasIdentityMatrix();
+    method public boolean hasOverlappingRendering();
+    method public boolean hasShadow();
+    method public boolean isAttached();
+    method public boolean isPivotExplicitlySet();
+    method public boolean isValid();
+    method public boolean offsetLeftAndRight(int);
+    method public boolean offsetTopAndBottom(int);
+    method public void output();
+    method public boolean setAlpha(float);
+    method public boolean setAmbientShadowColor(int);
+    method public boolean setAnimationMatrix(android.graphics.Matrix);
+    method public boolean setBottom(int);
+    method public boolean setCameraDistance(float);
+    method public boolean setClipBounds(android.graphics.Rect?);
+    method public boolean setClipToBounds(boolean);
+    method public boolean setClipToOutline(boolean);
+    method public boolean setElevation(float);
+    method public boolean setHasOverlappingRendering(boolean);
+    method public boolean setLayerPaint(android.graphics.Paint?);
+    method public boolean setLayerType(int);
+    method public boolean setLeft(int);
+    method public boolean setLeftTopRightBottom(int, int, int, int);
+    method public boolean setOutline(android.graphics.Outline?);
+    method public boolean setPivotX(float);
+    method public boolean setPivotY(float);
+    method public boolean setProjectBackwards(boolean);
+    method public boolean setProjectionReceiver(boolean);
+    method public boolean setRevealClip(boolean, float, float, float);
+    method public boolean setRight(int);
+    method public boolean setRotation(float);
+    method public boolean setRotationX(float);
+    method public boolean setRotationY(float);
+    method public boolean setScaleX(float);
+    method public boolean setScaleY(float);
+    method public boolean setSpotShadowColor(int);
+    method public boolean setStaticMatrix(android.graphics.Matrix);
+    method public boolean setTop(int);
+    method public boolean setTranslationX(float);
+    method public boolean setTranslationY(float);
+    method public boolean setTranslationZ(float);
+    method public android.view.DisplayListCanvas start(int, int);
+  }
+
+}
+
diff --git a/compose/ui/ui-android-stubs/api/public_plus_experimental_1.3.0-beta01.txt b/compose/ui/ui-android-stubs/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..8e22228
--- /dev/null
+++ b/compose/ui/ui-android-stubs/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,78 @@
+// Signature format: 4.0
+package android.view {
+
+  public final class DisplayListCanvas extends android.graphics.Canvas {
+    ctor public DisplayListCanvas();
+    method public void drawRenderNode(android.view.RenderNode);
+  }
+
+  public class RenderNode {
+    method public static android.view.RenderNode create(String?, android.view.View?);
+    method public void destroy();
+    method public void destroyDisplayListData();
+    method public void discardDisplayList();
+    method public void end(android.view.DisplayListCanvas);
+    method public float getAlpha();
+    method public int getAmbientShadowColor();
+    method public float getCameraDistance();
+    method public boolean getClipToOutline();
+    method public float getElevation();
+    method public void getInverseMatrix(android.graphics.Matrix);
+    method public void getMatrix(android.graphics.Matrix);
+    method public float getPivotX();
+    method public float getPivotY();
+    method public float getRotation();
+    method public float getRotationX();
+    method public float getRotationY();
+    method public float getScaleX();
+    method public float getScaleY();
+    method public int getSpotShadowColor();
+    method public float getTranslationX();
+    method public float getTranslationY();
+    method public float getTranslationZ();
+    method public boolean hasIdentityMatrix();
+    method public boolean hasOverlappingRendering();
+    method public boolean hasShadow();
+    method public boolean isAttached();
+    method public boolean isPivotExplicitlySet();
+    method public boolean isValid();
+    method public boolean offsetLeftAndRight(int);
+    method public boolean offsetTopAndBottom(int);
+    method public void output();
+    method public boolean setAlpha(float);
+    method public boolean setAmbientShadowColor(int);
+    method public boolean setAnimationMatrix(android.graphics.Matrix);
+    method public boolean setBottom(int);
+    method public boolean setCameraDistance(float);
+    method public boolean setClipBounds(android.graphics.Rect?);
+    method public boolean setClipToBounds(boolean);
+    method public boolean setClipToOutline(boolean);
+    method public boolean setElevation(float);
+    method public boolean setHasOverlappingRendering(boolean);
+    method public boolean setLayerPaint(android.graphics.Paint?);
+    method public boolean setLayerType(int);
+    method public boolean setLeft(int);
+    method public boolean setLeftTopRightBottom(int, int, int, int);
+    method public boolean setOutline(android.graphics.Outline?);
+    method public boolean setPivotX(float);
+    method public boolean setPivotY(float);
+    method public boolean setProjectBackwards(boolean);
+    method public boolean setProjectionReceiver(boolean);
+    method public boolean setRevealClip(boolean, float, float, float);
+    method public boolean setRight(int);
+    method public boolean setRotation(float);
+    method public boolean setRotationX(float);
+    method public boolean setRotationY(float);
+    method public boolean setScaleX(float);
+    method public boolean setScaleY(float);
+    method public boolean setSpotShadowColor(int);
+    method public boolean setStaticMatrix(android.graphics.Matrix);
+    method public boolean setTop(int);
+    method public boolean setTranslationX(float);
+    method public boolean setTranslationY(float);
+    method public boolean setTranslationZ(float);
+    method public android.view.DisplayListCanvas start(int, int);
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/compose/ui/ui-android-stubs/api/res-1.3.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/ui/ui-android-stubs/api/res-1.3.0-beta01.txt
diff --git a/compose/ui/ui-android-stubs/api/restricted_1.3.0-beta01.txt b/compose/ui/ui-android-stubs/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..8e22228
--- /dev/null
+++ b/compose/ui/ui-android-stubs/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,78 @@
+// Signature format: 4.0
+package android.view {
+
+  public final class DisplayListCanvas extends android.graphics.Canvas {
+    ctor public DisplayListCanvas();
+    method public void drawRenderNode(android.view.RenderNode);
+  }
+
+  public class RenderNode {
+    method public static android.view.RenderNode create(String?, android.view.View?);
+    method public void destroy();
+    method public void destroyDisplayListData();
+    method public void discardDisplayList();
+    method public void end(android.view.DisplayListCanvas);
+    method public float getAlpha();
+    method public int getAmbientShadowColor();
+    method public float getCameraDistance();
+    method public boolean getClipToOutline();
+    method public float getElevation();
+    method public void getInverseMatrix(android.graphics.Matrix);
+    method public void getMatrix(android.graphics.Matrix);
+    method public float getPivotX();
+    method public float getPivotY();
+    method public float getRotation();
+    method public float getRotationX();
+    method public float getRotationY();
+    method public float getScaleX();
+    method public float getScaleY();
+    method public int getSpotShadowColor();
+    method public float getTranslationX();
+    method public float getTranslationY();
+    method public float getTranslationZ();
+    method public boolean hasIdentityMatrix();
+    method public boolean hasOverlappingRendering();
+    method public boolean hasShadow();
+    method public boolean isAttached();
+    method public boolean isPivotExplicitlySet();
+    method public boolean isValid();
+    method public boolean offsetLeftAndRight(int);
+    method public boolean offsetTopAndBottom(int);
+    method public void output();
+    method public boolean setAlpha(float);
+    method public boolean setAmbientShadowColor(int);
+    method public boolean setAnimationMatrix(android.graphics.Matrix);
+    method public boolean setBottom(int);
+    method public boolean setCameraDistance(float);
+    method public boolean setClipBounds(android.graphics.Rect?);
+    method public boolean setClipToBounds(boolean);
+    method public boolean setClipToOutline(boolean);
+    method public boolean setElevation(float);
+    method public boolean setHasOverlappingRendering(boolean);
+    method public boolean setLayerPaint(android.graphics.Paint?);
+    method public boolean setLayerType(int);
+    method public boolean setLeft(int);
+    method public boolean setLeftTopRightBottom(int, int, int, int);
+    method public boolean setOutline(android.graphics.Outline?);
+    method public boolean setPivotX(float);
+    method public boolean setPivotY(float);
+    method public boolean setProjectBackwards(boolean);
+    method public boolean setProjectionReceiver(boolean);
+    method public boolean setRevealClip(boolean, float, float, float);
+    method public boolean setRight(int);
+    method public boolean setRotation(float);
+    method public boolean setRotationX(float);
+    method public boolean setRotationY(float);
+    method public boolean setScaleX(float);
+    method public boolean setScaleY(float);
+    method public boolean setSpotShadowColor(int);
+    method public boolean setStaticMatrix(android.graphics.Matrix);
+    method public boolean setTop(int);
+    method public boolean setTranslationX(float);
+    method public boolean setTranslationY(float);
+    method public boolean setTranslationZ(float);
+    method public android.view.DisplayListCanvas start(int, int);
+  }
+
+}
+
diff --git a/compose/ui/ui-geometry/api/1.3.0-beta01.txt b/compose/ui/ui-geometry/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..583e373
--- /dev/null
+++ b/compose/ui/ui-geometry/api/1.3.0-beta01.txt
@@ -0,0 +1,275 @@
+// 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 public final float x;
+    property 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 GeometryUtilsKt {
+  }
+
+  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 public final float x;
+    property 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 public final float height;
+    property public final boolean isEmpty;
+    property public final boolean isFinite;
+    property public final boolean isInfinite;
+    property public final float left;
+    property public final float maxDimension;
+    property public final float minDimension;
+    property public final float right;
+    property public final long size;
+    property public final float top;
+    property public final long topCenter;
+    property public final long topLeft;
+    property public final long topRight;
+    property public final float width;
+    field public static final androidx.compose.ui.geometry.Rect.Companion Companion;
+  }
+
+  public static final class Rect.Companion {
+    method public androidx.compose.ui.geometry.Rect getZero();
+    property public final androidx.compose.ui.geometry.Rect Zero;
+  }
+
+  public final class RectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect(long offset, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect(long center, float radius);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect lerp(androidx.compose.ui.geometry.Rect start, androidx.compose.ui.geometry.Rect stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class RoundRect {
+    ctor public RoundRect(float left, float top, float right, float bottom, optional long topLeftCornerRadius, optional long topRightCornerRadius, optional long bottomRightCornerRadius, optional long bottomLeftCornerRadius);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public long component5-kKHJgLs();
+    method public long component6-kKHJgLs();
+    method public long component7-kKHJgLs();
+    method public long component8-kKHJgLs();
+    method public 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 public final float height;
+    property public final float maxDimension;
+    property public final float minDimension;
+    property 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_1.3.0-beta01.txt b/compose/ui/ui-geometry/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..583e373
--- /dev/null
+++ b/compose/ui/ui-geometry/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,275 @@
+// 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 public final float x;
+    property 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 GeometryUtilsKt {
+  }
+
+  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 public final float x;
+    property 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 public final float height;
+    property public final boolean isEmpty;
+    property public final boolean isFinite;
+    property public final boolean isInfinite;
+    property public final float left;
+    property public final float maxDimension;
+    property public final float minDimension;
+    property public final float right;
+    property public final long size;
+    property public final float top;
+    property public final long topCenter;
+    property public final long topLeft;
+    property public final long topRight;
+    property public final float width;
+    field public static final androidx.compose.ui.geometry.Rect.Companion Companion;
+  }
+
+  public static final class Rect.Companion {
+    method public androidx.compose.ui.geometry.Rect getZero();
+    property public final androidx.compose.ui.geometry.Rect Zero;
+  }
+
+  public final class RectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect(long offset, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect(long center, float radius);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect lerp(androidx.compose.ui.geometry.Rect start, androidx.compose.ui.geometry.Rect stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class RoundRect {
+    ctor public RoundRect(float left, float top, float right, float bottom, optional long topLeftCornerRadius, optional long topRightCornerRadius, optional long bottomRightCornerRadius, optional long bottomLeftCornerRadius);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public long component5-kKHJgLs();
+    method public long component6-kKHJgLs();
+    method public long component7-kKHJgLs();
+    method public long component8-kKHJgLs();
+    method public 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 public final float height;
+    property public final float maxDimension;
+    property public final float minDimension;
+    property 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/health/health-connect-client/api/res-current.txt b/compose/ui/ui-geometry/api/res-1.3.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/ui/ui-geometry/api/res-1.3.0-beta01.txt
diff --git a/compose/ui/ui-geometry/api/restricted_1.3.0-beta01.txt b/compose/ui/ui-geometry/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..583e373
--- /dev/null
+++ b/compose/ui/ui-geometry/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,275 @@
+// 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 public final float x;
+    property 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 GeometryUtilsKt {
+  }
+
+  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 public final float x;
+    property 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 public final float height;
+    property public final boolean isEmpty;
+    property public final boolean isFinite;
+    property public final boolean isInfinite;
+    property public final float left;
+    property public final float maxDimension;
+    property public final float minDimension;
+    property public final float right;
+    property public final long size;
+    property public final float top;
+    property public final long topCenter;
+    property public final long topLeft;
+    property public final long topRight;
+    property public final float width;
+    field public static final androidx.compose.ui.geometry.Rect.Companion Companion;
+  }
+
+  public static final class Rect.Companion {
+    method public androidx.compose.ui.geometry.Rect getZero();
+    property public final androidx.compose.ui.geometry.Rect Zero;
+  }
+
+  public final class RectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect(long offset, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect(long center, float radius);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect lerp(androidx.compose.ui.geometry.Rect start, androidx.compose.ui.geometry.Rect stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class RoundRect {
+    ctor public RoundRect(float left, float top, float right, float bottom, optional long topLeftCornerRadius, optional long topRightCornerRadius, optional long bottomRightCornerRadius, optional long bottomLeftCornerRadius);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public long component5-kKHJgLs();
+    method public long component6-kKHJgLs();
+    method public long component7-kKHJgLs();
+    method public long component8-kKHJgLs();
+    method public 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 public final float height;
+    property public final float maxDimension;
+    property public final float minDimension;
+    property 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-graphics/api/1.3.0-beta01.txt b/compose/ui/ui-graphics/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..4459087
--- /dev/null
+++ b/compose/ui/ui-graphics/api/1.3.0-beta01.txt
@@ -0,0 +1,1628 @@
+// Signature format: 4.0
+package androidx.compose.ui.graphics {
+
+  public final class AndroidBlendMode_androidKt {
+    method public static boolean isSupported(int);
+  }
+
+  public final class AndroidCanvas_androidKt {
+    method public static androidx.compose.ui.graphics.Canvas Canvas(android.graphics.Canvas c);
+    method public static android.graphics.Canvas getNativeCanvas(androidx.compose.ui.graphics.Canvas);
+  }
+
+  public final class AndroidColorFilter_androidKt {
+    method public static android.graphics.ColorFilter asAndroidColorFilter(androidx.compose.ui.graphics.ColorFilter);
+    method public static androidx.compose.ui.graphics.ColorFilter asComposeColorFilter(android.graphics.ColorFilter);
+  }
+
+  public final class AndroidImageBitmap_androidKt {
+    method public static android.graphics.Bitmap asAndroidBitmap(androidx.compose.ui.graphics.ImageBitmap);
+    method public static androidx.compose.ui.graphics.ImageBitmap asImageBitmap(android.graphics.Bitmap);
+  }
+
+  public final class AndroidMatrixConversions_androidKt {
+    method public static void setFrom(float[], android.graphics.Matrix matrix);
+    method public static void setFrom(android.graphics.Matrix, float[] matrix);
+  }
+
+  public final class AndroidPaint implements androidx.compose.ui.graphics.Paint {
+    ctor public AndroidPaint();
+    method public android.graphics.Paint asFrameworkPaint();
+    method public float getAlpha();
+    method public int getBlendMode();
+    method public long getColor();
+    method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
+    method public int getFilterQuality();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public android.graphics.Shader? getShader();
+    method public int getStrokeCap();
+    method public int getStrokeJoin();
+    method public float getStrokeMiterLimit();
+    method public float getStrokeWidth();
+    method public int getStyle();
+    method public boolean isAntiAlias();
+    method public void setAlpha(float);
+    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();
+  }
+
+  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 boolean getSegment(float startDistance, float stopDistance, androidx.compose.ui.graphics.Path destination, boolean startWithMoveTo);
+    method public void setPath(androidx.compose.ui.graphics.Path? path, boolean forceClosed);
+    property public float length;
+  }
+
+  public final class AndroidPathMeasure_androidKt {
+    method public static androidx.compose.ui.graphics.PathMeasure PathMeasure();
+  }
+
+  public final class AndroidPath_androidKt {
+    method public static androidx.compose.ui.graphics.Path Path();
+    method public static inline android.graphics.Path asAndroidPath(androidx.compose.ui.graphics.Path);
+    method public static androidx.compose.ui.graphics.Path asComposePath(android.graphics.Path);
+  }
+
+  public final class AndroidRenderEffect_androidKt {
+    method public static androidx.compose.ui.graphics.RenderEffect asComposeRenderEffect(android.graphics.RenderEffect);
+  }
+
+  public final class AndroidShader_androidKt {
+  }
+
+  public final class AndroidTileMode_androidKt {
+    method public static boolean isSupported(int);
+    method public static android.graphics.Shader.TileMode toAndroidTileMode(int);
+    method public static int toComposeTileMode(android.graphics.Shader.TileMode);
+  }
+
+  public final class AndroidVertexMode_androidKt {
+    method public static android.graphics.Canvas.VertexMode toAndroidVertexMode(int);
+  }
+
+  @androidx.compose.runtime.Immutable @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 public final float alpha;
+    property public final float blue;
+    property public final androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace;
+    property public final float green;
+    property 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 {
+  }
+
+  @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;
+  }
+
+  public final class Float16Kt {
+  }
+
+  @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 boolean getSegment(float startDistance, float stopDistance, androidx.compose.ui.graphics.Path destination, optional boolean startWithMoveTo);
+    method public void setPath(androidx.compose.ui.graphics.Path? path, boolean forceClosed);
+    property public abstract float length;
+  }
+
+  @androidx.compose.runtime.Immutable @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 public static android.graphics.Rect toAndroidRect(androidx.compose.ui.geometry.Rect);
+    method public static android.graphics.RectF toAndroidRectF(androidx.compose.ui.geometry.Rect);
+    method public static androidx.compose.ui.geometry.Rect toComposeRect(android.graphics.Rect);
+  }
+
+  public final class RectangleShapeKt {
+    method public static androidx.compose.ui.graphics.Shape getRectangleShape();
+    property public static final androidx.compose.ui.graphics.Shape RectangleShape;
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class RenderEffect {
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) public final android.graphics.RenderEffect asAndroidRenderEffect();
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) protected abstract android.graphics.RenderEffect createRenderEffect();
+    method public boolean isSupported();
+  }
+
+  public final class RenderEffectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.graphics.BlurEffect BlurEffect(float radiusX, float radiusY, optional int edgeTreatment);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.graphics.OffsetEffect OffsetEffect(float offsetX, float offsetY);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract class ShaderBrush extends androidx.compose.ui.graphics.Brush {
+    ctor public ShaderBrush();
+    method public final void applyTo(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public abstract android.graphics.Shader createShader(long size);
+  }
+
+  public final class ShaderKt {
+    method public static android.graphics.Shader ImageShader(androidx.compose.ui.graphics.ImageBitmap image, optional int tileModeX, optional int tileModeY);
+    method public static android.graphics.Shader LinearGradientShader(long from, long to, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
+    method public static android.graphics.Shader RadialGradientShader(long center, float radius, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
+    method public static android.graphics.Shader SweepGradientShader(long center, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops);
+  }
+
+  @androidx.compose.runtime.Immutable public final class Shadow {
+    ctor public Shadow(optional @androidx.compose.runtime.Stable long color, optional @androidx.compose.runtime.Stable long offset, optional @androidx.compose.runtime.Stable float blurRadius);
+    method public androidx.compose.ui.graphics.Shadow copy(optional long color, optional long offset, optional float blurRadius);
+    method public float getBlurRadius();
+    method public long getColor();
+    method public long getOffset();
+    property public final float blurRadius;
+    property public final long color;
+    property public final long offset;
+    field public static final androidx.compose.ui.graphics.Shadow.Companion Companion;
+  }
+
+  public static final class Shadow.Companion {
+    method public androidx.compose.ui.graphics.Shadow getNone();
+    property public final androidx.compose.ui.graphics.Shadow None;
+  }
+
+  public final class ShadowKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.graphics.Shadow lerp(androidx.compose.ui.graphics.Shadow start, androidx.compose.ui.graphics.Shadow stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public interface Shape {
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+  }
+
+  @androidx.compose.runtime.Immutable public final class SolidColor extends androidx.compose.ui.graphics.Brush {
+    ctor public SolidColor(long value);
+    method public void applyTo(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public long getValue();
+    property public final long value;
+  }
+
+  @androidx.compose.runtime.Immutable @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 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;
+  }
+
+  public final class CanvasDrawScopeKt {
+  }
+
+  @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.internal {
+
+  public final class JvmDefaultWithCompatibility_jvmKt {
+  }
+
+}
+
+package androidx.compose.ui.graphics.painter {
+
+  public final class BitmapPainter extends androidx.compose.ui.graphics.painter.Painter {
+    ctor public BitmapPainter(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize);
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public long intrinsicSize;
+  }
+
+  public final class BitmapPainterKt {
+    method public static androidx.compose.ui.graphics.painter.BitmapPainter BitmapPainter(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional int filterQuality);
+  }
+
+  public final class BrushPainter extends androidx.compose.ui.graphics.painter.Painter {
+    ctor public BrushPainter(androidx.compose.ui.graphics.Brush brush);
+    method public androidx.compose.ui.graphics.Brush getBrush();
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public final androidx.compose.ui.graphics.Brush brush;
+    property public long intrinsicSize;
+  }
+
+  public final class ColorPainter extends androidx.compose.ui.graphics.painter.Painter {
+    ctor public ColorPainter(long color);
+    method public long getColor();
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public final long color;
+    property public long intrinsicSize;
+  }
+
+  public abstract class Painter {
+    ctor public Painter();
+    method protected boolean applyAlpha(float alpha);
+    method protected boolean applyColorFilter(androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method protected boolean applyLayoutDirection(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public final void draw(androidx.compose.ui.graphics.drawscope.DrawScope, long size, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method public abstract long getIntrinsicSize();
+    method protected abstract void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public abstract long intrinsicSize;
+  }
+
+}
+
+package androidx.compose.ui.graphics.vector {
+
+  public final class PathBuilder {
+    ctor public PathBuilder();
+    method public androidx.compose.ui.graphics.vector.PathBuilder arcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float x1, float y1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder arcToRelative(float a, float b, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float dx1, float dy1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder close();
+    method public androidx.compose.ui.graphics.vector.PathBuilder curveTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public androidx.compose.ui.graphics.vector.PathBuilder curveToRelative(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getNodes();
+    method public androidx.compose.ui.graphics.vector.PathBuilder horizontalLineTo(float x);
+    method public androidx.compose.ui.graphics.vector.PathBuilder horizontalLineToRelative(float dx);
+    method public androidx.compose.ui.graphics.vector.PathBuilder lineTo(float x, float y);
+    method public androidx.compose.ui.graphics.vector.PathBuilder lineToRelative(float dx, float dy);
+    method public androidx.compose.ui.graphics.vector.PathBuilder moveTo(float x, float y);
+    method public androidx.compose.ui.graphics.vector.PathBuilder moveToRelative(float dx, float dy);
+    method public androidx.compose.ui.graphics.vector.PathBuilder quadTo(float x1, float y1, float x2, float y2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder quadToRelative(float dx1, float dy1, float dx2, float dy2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveCurveTo(float x1, float y1, float x2, float y2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveCurveToRelative(float dx1, float dy1, float dx2, float dy2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveQuadTo(float x1, float y1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveQuadToRelative(float dx1, float dy1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder verticalLineTo(float y);
+    method public androidx.compose.ui.graphics.vector.PathBuilder verticalLineToRelative(float dy);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class PathNode {
+    method public final boolean isCurve();
+    method public final boolean isQuad();
+    property public final boolean isCurve;
+    property public final boolean isQuad;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.ArcTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.ArcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartX, float arcStartY);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public boolean component4();
+    method public boolean component5();
+    method public float component6();
+    method public float component7();
+    method public androidx.compose.ui.graphics.vector.PathNode.ArcTo copy(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartX, float arcStartY);
+    method public float getArcStartX();
+    method public float getArcStartY();
+    method public float getHorizontalEllipseRadius();
+    method public float getTheta();
+    method public float getVerticalEllipseRadius();
+    method public boolean isMoreThanHalf();
+    method public boolean isPositiveArc();
+    property public final float arcStartX;
+    property public final float arcStartY;
+    property public final float horizontalEllipseRadius;
+    property public final boolean isMoreThanHalf;
+    property public final boolean isPositiveArc;
+    property public final float theta;
+    property public final float verticalEllipseRadius;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.Close extends androidx.compose.ui.graphics.vector.PathNode {
+    field public static final androidx.compose.ui.graphics.vector.PathNode.Close INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.CurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.CurveTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public float component5();
+    method public float component6();
+    method public androidx.compose.ui.graphics.vector.PathNode.CurveTo copy(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public float getX1();
+    method public float getX2();
+    method public float getX3();
+    method public float getY1();
+    method public float getY2();
+    method public float getY3();
+    property public final float x1;
+    property public final float x2;
+    property public final float x3;
+    property public final float y1;
+    property public final float y2;
+    property public final float y3;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.HorizontalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.HorizontalTo(float x);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.HorizontalTo copy(float x);
+    method public float getX();
+    property public final float x;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.LineTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.LineTo(float x, float y);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.LineTo copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.MoveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.MoveTo(float x, float y);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.MoveTo copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.QuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.QuadTo(float x1, float y1, float x2, float y2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.QuadTo copy(float x1, float y1, float x2, float y2);
+    method public float getX1();
+    method public float getX2();
+    method public float getY1();
+    method public float getY2();
+    property public final float x1;
+    property public final float x2;
+    property public final float y1;
+    property public final float y2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.ReflectiveCurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.ReflectiveCurveTo(float x1, float y1, float x2, float y2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.ReflectiveCurveTo copy(float x1, float y1, float x2, float y2);
+    method public float getX1();
+    method public float getX2();
+    method public float getY1();
+    method public float getY2();
+    property public final float x1;
+    property public final float x2;
+    property public final float y1;
+    property public final float y2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.ReflectiveQuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.ReflectiveQuadTo(float x, float y);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.ReflectiveQuadTo copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeArcTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeArcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartDx, float arcStartDy);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public boolean component4();
+    method public boolean component5();
+    method public float component6();
+    method public float component7();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeArcTo copy(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartDx, float arcStartDy);
+    method public float getArcStartDx();
+    method public float getArcStartDy();
+    method public float getHorizontalEllipseRadius();
+    method public float getTheta();
+    method public float getVerticalEllipseRadius();
+    method public boolean isMoreThanHalf();
+    method public boolean isPositiveArc();
+    property public final float arcStartDx;
+    property public final float arcStartDy;
+    property public final float horizontalEllipseRadius;
+    property public final boolean isMoreThanHalf;
+    property public final boolean isPositiveArc;
+    property public final float theta;
+    property public final float verticalEllipseRadius;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeCurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeCurveTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public float component5();
+    method public float component6();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeCurveTo copy(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public float getDx1();
+    method public float getDx2();
+    method public float getDx3();
+    method public float getDy1();
+    method public float getDy2();
+    method public float getDy3();
+    property public final float dx1;
+    property public final float dx2;
+    property public final float dx3;
+    property public final float dy1;
+    property public final float dy2;
+    property public final float dy3;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeHorizontalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeHorizontalTo(float dx);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeHorizontalTo copy(float dx);
+    method public float getDx();
+    property public final float dx;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeLineTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeLineTo(float dx, float dy);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeLineTo copy(float dx, float dy);
+    method public float getDx();
+    method public float getDy();
+    property public final float dx;
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeMoveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeMoveTo(float dx, float dy);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeMoveTo copy(float dx, float dy);
+    method public float getDx();
+    method public float getDy();
+    property public final float dx;
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeQuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeQuadTo(float dx1, float dy1, float dx2, float dy2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeQuadTo copy(float dx1, float dy1, float dx2, float dy2);
+    method public float getDx1();
+    method public float getDx2();
+    method public float getDy1();
+    method public float getDy2();
+    property public final float dx1;
+    property public final float dx2;
+    property public final float dy1;
+    property public final float dy2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeReflectiveCurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeReflectiveCurveTo(float dx1, float dy1, float dx2, float dy2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeReflectiveCurveTo copy(float dx1, float dy1, float dx2, float dy2);
+    method public float getDx1();
+    method public float getDx2();
+    method public float getDy1();
+    method public float getDy2();
+    property public final float dx1;
+    property public final float dx2;
+    property public final float dy1;
+    property public final float dy2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeReflectiveQuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeReflectiveQuadTo(float dx, float dy);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeReflectiveQuadTo copy(float dx, float dy);
+    method public float getDx();
+    method public float getDy();
+    property public final float dx;
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeVerticalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeVerticalTo(float dy);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeVerticalTo copy(float dy);
+    method public float getDy();
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.VerticalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.VerticalTo(float y);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.VerticalTo copy(float y);
+    method public float getY();
+    property public final float y;
+  }
+
+  public final class PathNodeKt {
+  }
+
+  public final class PathParser {
+    ctor public PathParser();
+    method public androidx.compose.ui.graphics.vector.PathParser addPathNodes(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> nodes);
+    method public void clear();
+    method public androidx.compose.ui.graphics.vector.PathParser parsePathString(String pathData);
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> toNodes();
+    method public androidx.compose.ui.graphics.Path toPath(optional androidx.compose.ui.graphics.Path target);
+  }
+
+}
+
diff --git a/compose/ui/ui-graphics/api/public_plus_experimental_1.3.0-beta01.txt b/compose/ui/ui-graphics/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..b4c58f3
--- /dev/null
+++ b/compose/ui/ui-graphics/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,1631 @@
+// Signature format: 4.0
+package androidx.compose.ui.graphics {
+
+  public final class AndroidBlendMode_androidKt {
+    method public static boolean isSupported(int);
+  }
+
+  public final class AndroidCanvas_androidKt {
+    method public static androidx.compose.ui.graphics.Canvas Canvas(android.graphics.Canvas c);
+    method public static android.graphics.Canvas getNativeCanvas(androidx.compose.ui.graphics.Canvas);
+  }
+
+  public final class AndroidColorFilter_androidKt {
+    method public static android.graphics.ColorFilter asAndroidColorFilter(androidx.compose.ui.graphics.ColorFilter);
+    method public static androidx.compose.ui.graphics.ColorFilter asComposeColorFilter(android.graphics.ColorFilter);
+  }
+
+  public final class AndroidImageBitmap_androidKt {
+    method public static android.graphics.Bitmap asAndroidBitmap(androidx.compose.ui.graphics.ImageBitmap);
+    method public static androidx.compose.ui.graphics.ImageBitmap asImageBitmap(android.graphics.Bitmap);
+  }
+
+  public final class AndroidMatrixConversions_androidKt {
+    method public static void setFrom(float[], android.graphics.Matrix matrix);
+    method public static void setFrom(android.graphics.Matrix, float[] matrix);
+  }
+
+  public final class AndroidPaint implements androidx.compose.ui.graphics.Paint {
+    ctor public AndroidPaint();
+    method public android.graphics.Paint asFrameworkPaint();
+    method public float getAlpha();
+    method public int getBlendMode();
+    method public long getColor();
+    method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
+    method public int getFilterQuality();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public android.graphics.Shader? getShader();
+    method public int getStrokeCap();
+    method public int getStrokeJoin();
+    method public float getStrokeMiterLimit();
+    method public float getStrokeWidth();
+    method public int getStyle();
+    method public boolean isAntiAlias();
+    method public void setAlpha(float);
+    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();
+  }
+
+  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 boolean getSegment(float startDistance, float stopDistance, androidx.compose.ui.graphics.Path destination, boolean startWithMoveTo);
+    method public void setPath(androidx.compose.ui.graphics.Path? path, boolean forceClosed);
+    property public float length;
+  }
+
+  public final class AndroidPathMeasure_androidKt {
+    method public static androidx.compose.ui.graphics.PathMeasure PathMeasure();
+  }
+
+  public final class AndroidPath_androidKt {
+    method public static androidx.compose.ui.graphics.Path Path();
+    method public static inline android.graphics.Path asAndroidPath(androidx.compose.ui.graphics.Path);
+    method public static androidx.compose.ui.graphics.Path asComposePath(android.graphics.Path);
+  }
+
+  public final class AndroidRenderEffect_androidKt {
+    method public static androidx.compose.ui.graphics.RenderEffect asComposeRenderEffect(android.graphics.RenderEffect);
+  }
+
+  public final class AndroidShader_androidKt {
+  }
+
+  public final class AndroidTileMode_androidKt {
+    method public static boolean isSupported(int);
+    method public static android.graphics.Shader.TileMode toAndroidTileMode(int);
+    method public static int toComposeTileMode(android.graphics.Shader.TileMode);
+  }
+
+  public final class AndroidVertexMode_androidKt {
+    method public static android.graphics.Canvas.VertexMode toAndroidVertexMode(int);
+  }
+
+  @androidx.compose.runtime.Immutable @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 public final float alpha;
+    property public final float blue;
+    property public final androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace;
+    property public final float green;
+    property 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 {
+  }
+
+  @kotlin.RequiresOptIn(message="This API is experimental and is likely to change in the future.") 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;
+  }
+
+  public final class Float16Kt {
+  }
+
+  @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 boolean getSegment(float startDistance, float stopDistance, androidx.compose.ui.graphics.Path destination, optional boolean startWithMoveTo);
+    method public void setPath(androidx.compose.ui.graphics.Path? path, boolean forceClosed);
+    property public abstract float length;
+  }
+
+  @androidx.compose.runtime.Immutable @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 public static android.graphics.Rect toAndroidRect(androidx.compose.ui.geometry.Rect);
+    method public static android.graphics.RectF toAndroidRectF(androidx.compose.ui.geometry.Rect);
+    method public static androidx.compose.ui.geometry.Rect toComposeRect(android.graphics.Rect);
+  }
+
+  public final class RectangleShapeKt {
+    method public static androidx.compose.ui.graphics.Shape getRectangleShape();
+    property public static final androidx.compose.ui.graphics.Shape RectangleShape;
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class RenderEffect {
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) public final android.graphics.RenderEffect asAndroidRenderEffect();
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) protected abstract android.graphics.RenderEffect createRenderEffect();
+    method public boolean isSupported();
+  }
+
+  public final class RenderEffectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.graphics.BlurEffect BlurEffect(float radiusX, float radiusY, optional int edgeTreatment);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.graphics.OffsetEffect OffsetEffect(float offsetX, float offsetY);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract class ShaderBrush extends androidx.compose.ui.graphics.Brush {
+    ctor public ShaderBrush();
+    method public final void applyTo(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public abstract android.graphics.Shader createShader(long size);
+  }
+
+  public final class ShaderKt {
+    method public static android.graphics.Shader ImageShader(androidx.compose.ui.graphics.ImageBitmap image, optional int tileModeX, optional int tileModeY);
+    method public static android.graphics.Shader LinearGradientShader(long from, long to, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
+    method public static android.graphics.Shader RadialGradientShader(long center, float radius, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
+    method public static android.graphics.Shader SweepGradientShader(long center, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops);
+  }
+
+  @androidx.compose.runtime.Immutable public final class Shadow {
+    ctor public Shadow(optional @androidx.compose.runtime.Stable long color, optional @androidx.compose.runtime.Stable long offset, optional @androidx.compose.runtime.Stable float blurRadius);
+    method public androidx.compose.ui.graphics.Shadow copy(optional long color, optional long offset, optional float blurRadius);
+    method public float getBlurRadius();
+    method public long getColor();
+    method public long getOffset();
+    property public final float blurRadius;
+    property public final long color;
+    property public final long offset;
+    field public static final androidx.compose.ui.graphics.Shadow.Companion Companion;
+  }
+
+  public static final class Shadow.Companion {
+    method public androidx.compose.ui.graphics.Shadow getNone();
+    property public final androidx.compose.ui.graphics.Shadow None;
+  }
+
+  public final class ShadowKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.graphics.Shadow lerp(androidx.compose.ui.graphics.Shadow start, androidx.compose.ui.graphics.Shadow stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public interface Shape {
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+  }
+
+  @androidx.compose.runtime.Immutable public final class SolidColor extends androidx.compose.ui.graphics.Brush {
+    ctor public SolidColor(long value);
+    method public void applyTo(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public long getValue();
+    property public final long value;
+  }
+
+  @androidx.compose.runtime.Immutable @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 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;
+  }
+
+  public final class CanvasDrawScopeKt {
+  }
+
+  @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.internal {
+
+  public final class JvmDefaultWithCompatibility_jvmKt {
+  }
+
+}
+
+package androidx.compose.ui.graphics.painter {
+
+  public final class BitmapPainter extends androidx.compose.ui.graphics.painter.Painter {
+    ctor public BitmapPainter(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize);
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public long intrinsicSize;
+  }
+
+  public final class BitmapPainterKt {
+    method public static androidx.compose.ui.graphics.painter.BitmapPainter BitmapPainter(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional int filterQuality);
+  }
+
+  public final class BrushPainter extends androidx.compose.ui.graphics.painter.Painter {
+    ctor public BrushPainter(androidx.compose.ui.graphics.Brush brush);
+    method public androidx.compose.ui.graphics.Brush getBrush();
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public final androidx.compose.ui.graphics.Brush brush;
+    property public long intrinsicSize;
+  }
+
+  public final class ColorPainter extends androidx.compose.ui.graphics.painter.Painter {
+    ctor public ColorPainter(long color);
+    method public long getColor();
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public final long color;
+    property public long intrinsicSize;
+  }
+
+  public abstract class Painter {
+    ctor public Painter();
+    method protected boolean applyAlpha(float alpha);
+    method protected boolean applyColorFilter(androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method protected boolean applyLayoutDirection(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public final void draw(androidx.compose.ui.graphics.drawscope.DrawScope, long size, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method public abstract long getIntrinsicSize();
+    method protected abstract void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public abstract long intrinsicSize;
+  }
+
+}
+
+package androidx.compose.ui.graphics.vector {
+
+  public final class PathBuilder {
+    ctor public PathBuilder();
+    method public androidx.compose.ui.graphics.vector.PathBuilder arcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float x1, float y1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder arcToRelative(float a, float b, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float dx1, float dy1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder close();
+    method public androidx.compose.ui.graphics.vector.PathBuilder curveTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public androidx.compose.ui.graphics.vector.PathBuilder curveToRelative(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getNodes();
+    method public androidx.compose.ui.graphics.vector.PathBuilder horizontalLineTo(float x);
+    method public androidx.compose.ui.graphics.vector.PathBuilder horizontalLineToRelative(float dx);
+    method public androidx.compose.ui.graphics.vector.PathBuilder lineTo(float x, float y);
+    method public androidx.compose.ui.graphics.vector.PathBuilder lineToRelative(float dx, float dy);
+    method public androidx.compose.ui.graphics.vector.PathBuilder moveTo(float x, float y);
+    method public androidx.compose.ui.graphics.vector.PathBuilder moveToRelative(float dx, float dy);
+    method public androidx.compose.ui.graphics.vector.PathBuilder quadTo(float x1, float y1, float x2, float y2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder quadToRelative(float dx1, float dy1, float dx2, float dy2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveCurveTo(float x1, float y1, float x2, float y2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveCurveToRelative(float dx1, float dy1, float dx2, float dy2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveQuadTo(float x1, float y1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveQuadToRelative(float dx1, float dy1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder verticalLineTo(float y);
+    method public androidx.compose.ui.graphics.vector.PathBuilder verticalLineToRelative(float dy);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class PathNode {
+    method public final boolean isCurve();
+    method public final boolean isQuad();
+    property public final boolean isCurve;
+    property public final boolean isQuad;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.ArcTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.ArcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartX, float arcStartY);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public boolean component4();
+    method public boolean component5();
+    method public float component6();
+    method public float component7();
+    method public androidx.compose.ui.graphics.vector.PathNode.ArcTo copy(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartX, float arcStartY);
+    method public float getArcStartX();
+    method public float getArcStartY();
+    method public float getHorizontalEllipseRadius();
+    method public float getTheta();
+    method public float getVerticalEllipseRadius();
+    method public boolean isMoreThanHalf();
+    method public boolean isPositiveArc();
+    property public final float arcStartX;
+    property public final float arcStartY;
+    property public final float horizontalEllipseRadius;
+    property public final boolean isMoreThanHalf;
+    property public final boolean isPositiveArc;
+    property public final float theta;
+    property public final float verticalEllipseRadius;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.Close extends androidx.compose.ui.graphics.vector.PathNode {
+    field public static final androidx.compose.ui.graphics.vector.PathNode.Close INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.CurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.CurveTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public float component5();
+    method public float component6();
+    method public androidx.compose.ui.graphics.vector.PathNode.CurveTo copy(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public float getX1();
+    method public float getX2();
+    method public float getX3();
+    method public float getY1();
+    method public float getY2();
+    method public float getY3();
+    property public final float x1;
+    property public final float x2;
+    property public final float x3;
+    property public final float y1;
+    property public final float y2;
+    property public final float y3;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.HorizontalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.HorizontalTo(float x);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.HorizontalTo copy(float x);
+    method public float getX();
+    property public final float x;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.LineTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.LineTo(float x, float y);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.LineTo copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.MoveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.MoveTo(float x, float y);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.MoveTo copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.QuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.QuadTo(float x1, float y1, float x2, float y2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.QuadTo copy(float x1, float y1, float x2, float y2);
+    method public float getX1();
+    method public float getX2();
+    method public float getY1();
+    method public float getY2();
+    property public final float x1;
+    property public final float x2;
+    property public final float y1;
+    property public final float y2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.ReflectiveCurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.ReflectiveCurveTo(float x1, float y1, float x2, float y2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.ReflectiveCurveTo copy(float x1, float y1, float x2, float y2);
+    method public float getX1();
+    method public float getX2();
+    method public float getY1();
+    method public float getY2();
+    property public final float x1;
+    property public final float x2;
+    property public final float y1;
+    property public final float y2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.ReflectiveQuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.ReflectiveQuadTo(float x, float y);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.ReflectiveQuadTo copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeArcTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeArcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartDx, float arcStartDy);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public boolean component4();
+    method public boolean component5();
+    method public float component6();
+    method public float component7();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeArcTo copy(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartDx, float arcStartDy);
+    method public float getArcStartDx();
+    method public float getArcStartDy();
+    method public float getHorizontalEllipseRadius();
+    method public float getTheta();
+    method public float getVerticalEllipseRadius();
+    method public boolean isMoreThanHalf();
+    method public boolean isPositiveArc();
+    property public final float arcStartDx;
+    property public final float arcStartDy;
+    property public final float horizontalEllipseRadius;
+    property public final boolean isMoreThanHalf;
+    property public final boolean isPositiveArc;
+    property public final float theta;
+    property public final float verticalEllipseRadius;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeCurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeCurveTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public float component5();
+    method public float component6();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeCurveTo copy(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public float getDx1();
+    method public float getDx2();
+    method public float getDx3();
+    method public float getDy1();
+    method public float getDy2();
+    method public float getDy3();
+    property public final float dx1;
+    property public final float dx2;
+    property public final float dx3;
+    property public final float dy1;
+    property public final float dy2;
+    property public final float dy3;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeHorizontalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeHorizontalTo(float dx);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeHorizontalTo copy(float dx);
+    method public float getDx();
+    property public final float dx;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeLineTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeLineTo(float dx, float dy);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeLineTo copy(float dx, float dy);
+    method public float getDx();
+    method public float getDy();
+    property public final float dx;
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeMoveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeMoveTo(float dx, float dy);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeMoveTo copy(float dx, float dy);
+    method public float getDx();
+    method public float getDy();
+    property public final float dx;
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeQuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeQuadTo(float dx1, float dy1, float dx2, float dy2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeQuadTo copy(float dx1, float dy1, float dx2, float dy2);
+    method public float getDx1();
+    method public float getDx2();
+    method public float getDy1();
+    method public float getDy2();
+    property public final float dx1;
+    property public final float dx2;
+    property public final float dy1;
+    property public final float dy2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeReflectiveCurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeReflectiveCurveTo(float dx1, float dy1, float dx2, float dy2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeReflectiveCurveTo copy(float dx1, float dy1, float dx2, float dy2);
+    method public float getDx1();
+    method public float getDx2();
+    method public float getDy1();
+    method public float getDy2();
+    property public final float dx1;
+    property public final float dx2;
+    property public final float dy1;
+    property public final float dy2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeReflectiveQuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeReflectiveQuadTo(float dx, float dy);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeReflectiveQuadTo copy(float dx, float dy);
+    method public float getDx();
+    method public float getDy();
+    property public final float dx;
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeVerticalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeVerticalTo(float dy);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeVerticalTo copy(float dy);
+    method public float getDy();
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.VerticalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.VerticalTo(float y);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.VerticalTo copy(float y);
+    method public float getY();
+    property public final float y;
+  }
+
+  public final class PathNodeKt {
+  }
+
+  public final class PathParser {
+    ctor public PathParser();
+    method public androidx.compose.ui.graphics.vector.PathParser addPathNodes(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> nodes);
+    method public void clear();
+    method public androidx.compose.ui.graphics.vector.PathParser parsePathString(String pathData);
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> toNodes();
+    method public androidx.compose.ui.graphics.Path toPath(optional androidx.compose.ui.graphics.Path target);
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/compose/ui/ui-graphics/api/res-1.3.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/ui/ui-graphics/api/res-1.3.0-beta01.txt
diff --git a/compose/ui/ui-graphics/api/restricted_1.3.0-beta01.txt b/compose/ui/ui-graphics/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..3fa0dcec
--- /dev/null
+++ b/compose/ui/ui-graphics/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,1684 @@
+// Signature format: 4.0
+package androidx.compose.ui.graphics {
+
+  public final class AndroidBlendMode_androidKt {
+    method public static boolean isSupported(int);
+  }
+
+  @kotlin.PublishedApi internal final class AndroidCanvas implements androidx.compose.ui.graphics.Canvas {
+    ctor public AndroidCanvas();
+    method public void clipPath(androidx.compose.ui.graphics.Path path, int clipOp);
+    method public void clipRect(float left, float top, float right, float bottom, int clipOp);
+    method public void concat(float[] matrix);
+    method public void disableZ();
+    method public void drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
+    method public void drawCircle(long center, float radius, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, long topLeftOffset, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImageRect(androidx.compose.ui.graphics.ImageBitmap image, long srcOffset, long srcSize, long dstOffset, long dstSize, androidx.compose.ui.graphics.Paint paint);
+    method public void drawLine(long p1, long p2, androidx.compose.ui.graphics.Paint paint);
+    method public void drawOval(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Paint paint);
+    method public void drawPoints(int pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRawPoints(int pointMode, float[] points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRect(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY, androidx.compose.ui.graphics.Paint paint);
+    method public void drawVertices(androidx.compose.ui.graphics.Vertices vertices, int blendMode, androidx.compose.ui.graphics.Paint paint);
+    method public void enableZ();
+    method public void restore();
+    method public void rotate(float degrees);
+    method public void save();
+    method public void saveLayer(androidx.compose.ui.geometry.Rect bounds, androidx.compose.ui.graphics.Paint paint);
+    method public void scale(float sx, float sy);
+    method public void skew(float sx, float sy);
+    method public android.graphics.Region.Op toRegionOp(int);
+    method public void translate(float dx, float dy);
+    field @kotlin.PublishedApi internal android.graphics.Canvas internalCanvas;
+  }
+
+  public final class AndroidCanvas_androidKt {
+    method public static androidx.compose.ui.graphics.Canvas Canvas(android.graphics.Canvas c);
+    method public static android.graphics.Canvas getNativeCanvas(androidx.compose.ui.graphics.Canvas);
+  }
+
+  public final class AndroidColorFilter_androidKt {
+    method public static android.graphics.ColorFilter asAndroidColorFilter(androidx.compose.ui.graphics.ColorFilter);
+    method public static androidx.compose.ui.graphics.ColorFilter asComposeColorFilter(android.graphics.ColorFilter);
+  }
+
+  public final class AndroidImageBitmap_androidKt {
+    method public static android.graphics.Bitmap asAndroidBitmap(androidx.compose.ui.graphics.ImageBitmap);
+    method public static androidx.compose.ui.graphics.ImageBitmap asImageBitmap(android.graphics.Bitmap);
+  }
+
+  public final class AndroidMatrixConversions_androidKt {
+    method public static void setFrom(float[], android.graphics.Matrix matrix);
+    method public static void setFrom(android.graphics.Matrix, float[] matrix);
+  }
+
+  public final class AndroidPaint implements androidx.compose.ui.graphics.Paint {
+    ctor public AndroidPaint();
+    method public android.graphics.Paint asFrameworkPaint();
+    method public float getAlpha();
+    method public int getBlendMode();
+    method public long getColor();
+    method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
+    method public int getFilterQuality();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public android.graphics.Shader? getShader();
+    method public int getStrokeCap();
+    method public int getStrokeJoin();
+    method public float getStrokeMiterLimit();
+    method public float getStrokeWidth();
+    method public int getStyle();
+    method public boolean isAntiAlias();
+    method public void setAlpha(float);
+    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();
+  }
+
+  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 boolean getSegment(float startDistance, float stopDistance, androidx.compose.ui.graphics.Path destination, boolean startWithMoveTo);
+    method public void setPath(androidx.compose.ui.graphics.Path? path, boolean forceClosed);
+    property public float length;
+  }
+
+  public final class AndroidPathMeasure_androidKt {
+    method public static androidx.compose.ui.graphics.PathMeasure PathMeasure();
+  }
+
+  public final class AndroidPath_androidKt {
+    method public static androidx.compose.ui.graphics.Path Path();
+    method public static inline android.graphics.Path asAndroidPath(androidx.compose.ui.graphics.Path);
+    method public static androidx.compose.ui.graphics.Path asComposePath(android.graphics.Path);
+  }
+
+  public final class AndroidRenderEffect_androidKt {
+    method public static androidx.compose.ui.graphics.RenderEffect asComposeRenderEffect(android.graphics.RenderEffect);
+  }
+
+  public final class AndroidShader_androidKt {
+  }
+
+  public final class AndroidTileMode_androidKt {
+    method public static boolean isSupported(int);
+    method public static android.graphics.Shader.TileMode toAndroidTileMode(int);
+    method public static int toComposeTileMode(android.graphics.Shader.TileMode);
+  }
+
+  public final class AndroidVertexMode_androidKt {
+    method public static android.graphics.Canvas.VertexMode toAndroidVertexMode(int);
+  }
+
+  @androidx.compose.runtime.Immutable @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 public final float alpha;
+    property public final float blue;
+    property public final androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace;
+    property public final float green;
+    property 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;
+  }
+
+  public final class Float16Kt {
+  }
+
+  @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 boolean getSegment(float startDistance, float stopDistance, androidx.compose.ui.graphics.Path destination, optional boolean startWithMoveTo);
+    method public void setPath(androidx.compose.ui.graphics.Path? path, boolean forceClosed);
+    property public abstract float length;
+  }
+
+  @androidx.compose.runtime.Immutable @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 public static android.graphics.Rect toAndroidRect(androidx.compose.ui.geometry.Rect);
+    method public static android.graphics.RectF toAndroidRectF(androidx.compose.ui.geometry.Rect);
+    method public static androidx.compose.ui.geometry.Rect toComposeRect(android.graphics.Rect);
+  }
+
+  public final class RectangleShapeKt {
+    method public static androidx.compose.ui.graphics.Shape getRectangleShape();
+    property public static final androidx.compose.ui.graphics.Shape RectangleShape;
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class RenderEffect {
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) public final android.graphics.RenderEffect asAndroidRenderEffect();
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) protected abstract android.graphics.RenderEffect createRenderEffect();
+    method public boolean isSupported();
+  }
+
+  public final class RenderEffectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.graphics.BlurEffect BlurEffect(float radiusX, float radiusY, optional int edgeTreatment);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.graphics.OffsetEffect OffsetEffect(float offsetX, float offsetY);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract class ShaderBrush extends androidx.compose.ui.graphics.Brush {
+    ctor public ShaderBrush();
+    method public final void applyTo(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public abstract android.graphics.Shader createShader(long size);
+  }
+
+  public final class ShaderKt {
+    method public static android.graphics.Shader ImageShader(androidx.compose.ui.graphics.ImageBitmap image, optional int tileModeX, optional int tileModeY);
+    method public static android.graphics.Shader LinearGradientShader(long from, long to, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
+    method public static android.graphics.Shader RadialGradientShader(long center, float radius, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
+    method public static android.graphics.Shader SweepGradientShader(long center, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops);
+  }
+
+  @androidx.compose.runtime.Immutable public final class Shadow {
+    ctor public Shadow(optional @androidx.compose.runtime.Stable long color, optional @androidx.compose.runtime.Stable long offset, optional @androidx.compose.runtime.Stable float blurRadius);
+    method public androidx.compose.ui.graphics.Shadow copy(optional long color, optional long offset, optional float blurRadius);
+    method public float getBlurRadius();
+    method public long getColor();
+    method public long getOffset();
+    property public final float blurRadius;
+    property public final long color;
+    property public final long offset;
+    field public static final androidx.compose.ui.graphics.Shadow.Companion Companion;
+  }
+
+  public static final class Shadow.Companion {
+    method public androidx.compose.ui.graphics.Shadow getNone();
+    property public final androidx.compose.ui.graphics.Shadow None;
+  }
+
+  public final class ShadowKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.graphics.Shadow lerp(androidx.compose.ui.graphics.Shadow start, androidx.compose.ui.graphics.Shadow stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public interface Shape {
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+  }
+
+  @androidx.compose.runtime.Immutable public final class SolidColor extends androidx.compose.ui.graphics.Brush {
+    ctor public SolidColor(long value);
+    method public void applyTo(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public long getValue();
+    property public final long value;
+  }
+
+  @androidx.compose.runtime.Immutable @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 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;
+  }
+
+  public final class CanvasDrawScopeKt {
+  }
+
+  @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.internal {
+
+  public final class JvmDefaultWithCompatibility_jvmKt {
+  }
+
+}
+
+package androidx.compose.ui.graphics.painter {
+
+  public final class BitmapPainter extends androidx.compose.ui.graphics.painter.Painter {
+    ctor public BitmapPainter(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize);
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public long intrinsicSize;
+  }
+
+  public final class BitmapPainterKt {
+    method public static androidx.compose.ui.graphics.painter.BitmapPainter BitmapPainter(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional int filterQuality);
+  }
+
+  public final class BrushPainter extends androidx.compose.ui.graphics.painter.Painter {
+    ctor public BrushPainter(androidx.compose.ui.graphics.Brush brush);
+    method public androidx.compose.ui.graphics.Brush getBrush();
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public final androidx.compose.ui.graphics.Brush brush;
+    property public long intrinsicSize;
+  }
+
+  public final class ColorPainter extends androidx.compose.ui.graphics.painter.Painter {
+    ctor public ColorPainter(long color);
+    method public long getColor();
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public final long color;
+    property public long intrinsicSize;
+  }
+
+  public abstract class Painter {
+    ctor public Painter();
+    method protected boolean applyAlpha(float alpha);
+    method protected boolean applyColorFilter(androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method protected boolean applyLayoutDirection(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public final void draw(androidx.compose.ui.graphics.drawscope.DrawScope, long size, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method public abstract long getIntrinsicSize();
+    method protected abstract void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public abstract long intrinsicSize;
+  }
+
+}
+
+package androidx.compose.ui.graphics.vector {
+
+  public final class PathBuilder {
+    ctor public PathBuilder();
+    method public androidx.compose.ui.graphics.vector.PathBuilder arcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float x1, float y1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder arcToRelative(float a, float b, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float dx1, float dy1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder close();
+    method public androidx.compose.ui.graphics.vector.PathBuilder curveTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public androidx.compose.ui.graphics.vector.PathBuilder curveToRelative(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getNodes();
+    method public androidx.compose.ui.graphics.vector.PathBuilder horizontalLineTo(float x);
+    method public androidx.compose.ui.graphics.vector.PathBuilder horizontalLineToRelative(float dx);
+    method public androidx.compose.ui.graphics.vector.PathBuilder lineTo(float x, float y);
+    method public androidx.compose.ui.graphics.vector.PathBuilder lineToRelative(float dx, float dy);
+    method public androidx.compose.ui.graphics.vector.PathBuilder moveTo(float x, float y);
+    method public androidx.compose.ui.graphics.vector.PathBuilder moveToRelative(float dx, float dy);
+    method public androidx.compose.ui.graphics.vector.PathBuilder quadTo(float x1, float y1, float x2, float y2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder quadToRelative(float dx1, float dy1, float dx2, float dy2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveCurveTo(float x1, float y1, float x2, float y2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveCurveToRelative(float dx1, float dy1, float dx2, float dy2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveQuadTo(float x1, float y1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveQuadToRelative(float dx1, float dy1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder verticalLineTo(float y);
+    method public androidx.compose.ui.graphics.vector.PathBuilder verticalLineToRelative(float dy);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class PathNode {
+    method public final boolean isCurve();
+    method public final boolean isQuad();
+    property public final boolean isCurve;
+    property public final boolean isQuad;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.ArcTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.ArcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartX, float arcStartY);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public boolean component4();
+    method public boolean component5();
+    method public float component6();
+    method public float component7();
+    method public androidx.compose.ui.graphics.vector.PathNode.ArcTo copy(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartX, float arcStartY);
+    method public float getArcStartX();
+    method public float getArcStartY();
+    method public float getHorizontalEllipseRadius();
+    method public float getTheta();
+    method public float getVerticalEllipseRadius();
+    method public boolean isMoreThanHalf();
+    method public boolean isPositiveArc();
+    property public final float arcStartX;
+    property public final float arcStartY;
+    property public final float horizontalEllipseRadius;
+    property public final boolean isMoreThanHalf;
+    property public final boolean isPositiveArc;
+    property public final float theta;
+    property public final float verticalEllipseRadius;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.Close extends androidx.compose.ui.graphics.vector.PathNode {
+    field public static final androidx.compose.ui.graphics.vector.PathNode.Close INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.CurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.CurveTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public float component5();
+    method public float component6();
+    method public androidx.compose.ui.graphics.vector.PathNode.CurveTo copy(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public float getX1();
+    method public float getX2();
+    method public float getX3();
+    method public float getY1();
+    method public float getY2();
+    method public float getY3();
+    property public final float x1;
+    property public final float x2;
+    property public final float x3;
+    property public final float y1;
+    property public final float y2;
+    property public final float y3;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.HorizontalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.HorizontalTo(float x);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.HorizontalTo copy(float x);
+    method public float getX();
+    property public final float x;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.LineTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.LineTo(float x, float y);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.LineTo copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.MoveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.MoveTo(float x, float y);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.MoveTo copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.QuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.QuadTo(float x1, float y1, float x2, float y2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.QuadTo copy(float x1, float y1, float x2, float y2);
+    method public float getX1();
+    method public float getX2();
+    method public float getY1();
+    method public float getY2();
+    property public final float x1;
+    property public final float x2;
+    property public final float y1;
+    property public final float y2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.ReflectiveCurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.ReflectiveCurveTo(float x1, float y1, float x2, float y2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.ReflectiveCurveTo copy(float x1, float y1, float x2, float y2);
+    method public float getX1();
+    method public float getX2();
+    method public float getY1();
+    method public float getY2();
+    property public final float x1;
+    property public final float x2;
+    property public final float y1;
+    property public final float y2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.ReflectiveQuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.ReflectiveQuadTo(float x, float y);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.ReflectiveQuadTo copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeArcTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeArcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartDx, float arcStartDy);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public boolean component4();
+    method public boolean component5();
+    method public float component6();
+    method public float component7();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeArcTo copy(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartDx, float arcStartDy);
+    method public float getArcStartDx();
+    method public float getArcStartDy();
+    method public float getHorizontalEllipseRadius();
+    method public float getTheta();
+    method public float getVerticalEllipseRadius();
+    method public boolean isMoreThanHalf();
+    method public boolean isPositiveArc();
+    property public final float arcStartDx;
+    property public final float arcStartDy;
+    property public final float horizontalEllipseRadius;
+    property public final boolean isMoreThanHalf;
+    property public final boolean isPositiveArc;
+    property public final float theta;
+    property public final float verticalEllipseRadius;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeCurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeCurveTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public float component5();
+    method public float component6();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeCurveTo copy(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public float getDx1();
+    method public float getDx2();
+    method public float getDx3();
+    method public float getDy1();
+    method public float getDy2();
+    method public float getDy3();
+    property public final float dx1;
+    property public final float dx2;
+    property public final float dx3;
+    property public final float dy1;
+    property public final float dy2;
+    property public final float dy3;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeHorizontalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeHorizontalTo(float dx);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeHorizontalTo copy(float dx);
+    method public float getDx();
+    property public final float dx;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeLineTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeLineTo(float dx, float dy);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeLineTo copy(float dx, float dy);
+    method public float getDx();
+    method public float getDy();
+    property public final float dx;
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeMoveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeMoveTo(float dx, float dy);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeMoveTo copy(float dx, float dy);
+    method public float getDx();
+    method public float getDy();
+    property public final float dx;
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeQuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeQuadTo(float dx1, float dy1, float dx2, float dy2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeQuadTo copy(float dx1, float dy1, float dx2, float dy2);
+    method public float getDx1();
+    method public float getDx2();
+    method public float getDy1();
+    method public float getDy2();
+    property public final float dx1;
+    property public final float dx2;
+    property public final float dy1;
+    property public final float dy2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeReflectiveCurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeReflectiveCurveTo(float dx1, float dy1, float dx2, float dy2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeReflectiveCurveTo copy(float dx1, float dy1, float dx2, float dy2);
+    method public float getDx1();
+    method public float getDx2();
+    method public float getDy1();
+    method public float getDy2();
+    property public final float dx1;
+    property public final float dx2;
+    property public final float dy1;
+    property public final float dy2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeReflectiveQuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeReflectiveQuadTo(float dx, float dy);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeReflectiveQuadTo copy(float dx, float dy);
+    method public float getDx();
+    method public float getDy();
+    property public final float dx;
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeVerticalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeVerticalTo(float dy);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeVerticalTo copy(float dy);
+    method public float getDy();
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.VerticalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.VerticalTo(float y);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.VerticalTo copy(float y);
+    method public float getY();
+    property public final float y;
+  }
+
+  public final class PathNodeKt {
+  }
+
+  public final class PathParser {
+    ctor public PathParser();
+    method public androidx.compose.ui.graphics.vector.PathParser addPathNodes(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> nodes);
+    method public void clear();
+    method public androidx.compose.ui.graphics.vector.PathParser parsePathString(String pathData);
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> toNodes();
+    method public androidx.compose.ui.graphics.Path toPath(optional androidx.compose.ui.graphics.Path target);
+  }
+
+}
+
diff --git a/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/MultipleAwaitPointerEventScopesDetector.kt b/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/MultipleAwaitPointerEventScopesDetector.kt
new file mode 100644
index 0000000..03959ae
--- /dev/null
+++ b/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/MultipleAwaitPointerEventScopesDetector.kt
@@ -0,0 +1,125 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("UnstableApiUsage")
+
+package androidx.compose.ui.lint
+
+import androidx.compose.lint.Names
+import androidx.compose.lint.inheritsFrom
+import androidx.compose.lint.isInPackageName
+import com.android.tools.lint.detector.api.Category
+import com.android.tools.lint.detector.api.Context
+import com.android.tools.lint.detector.api.Detector
+import com.android.tools.lint.detector.api.Implementation
+import com.android.tools.lint.detector.api.Issue
+import com.android.tools.lint.detector.api.JavaContext
+import com.android.tools.lint.detector.api.Scope
+import com.android.tools.lint.detector.api.Severity
+import com.android.tools.lint.detector.api.SourceCodeScanner
+import com.intellij.psi.PsiMethod
+import java.util.EnumSet
+import org.jetbrains.uast.UCallExpression
+import org.jetbrains.uast.UElement
+import org.jetbrains.uast.UExpression
+import org.jetbrains.uast.getContainingDeclaration
+import org.jetbrains.uast.tryResolve
+import org.jetbrains.uast.visitor.AbstractUastVisitor
+import org.jetbrains.uast.withContainingElements
+
+class MultipleAwaitPointerEventScopesDetector : Detector(), SourceCodeScanner {
+
+    override fun getApplicableMethodNames(): List<String> =
+        listOf(Names.Ui.Pointer.AwaitPointerEventScope.shortName)
+
+    // Our approach is to go up the file tree and find all awaitPointerEventScopes under
+    // a given parent. We might report the same node more than once, so we keep track of reported
+    // nodes to avoid duplicated reporting.
+    private val reportedNodes = mutableSetOf<UElement>()
+
+    override fun afterCheckFile(context: Context) {
+        reportedNodes.clear()
+    }
+
+    override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) {
+        // Not defined in UI Pointer Input
+        if (!method.isInPackageName(Names.Ui.Pointer.PackageName)) return
+        val containingDeclaration = node.getContainingDeclaration()
+
+        // The element we will look inside
+        val boundaryElement = node.withContainingElements.first {
+            // Reached the containing function / lambda
+            // or Found a modifier expression - don't look outside the scope of this modifier
+            it == containingDeclaration || (it is UExpression) && it.getExpressionType()
+                ?.inheritsFrom(Names.Ui.Modifier) == true
+        }
+
+        val awaitPointerEventCalls = searchAwaitPointerScopeCalls(boundaryElement)
+
+        // loop block contains the correct amount of awaitPointerEventScope calls (1 or none)
+        if (awaitPointerEventCalls <= 1) return
+
+        // If loop contains more than one awaitPointerEventScope we should report if we haven't done
+        // so before.
+        if (!reportedNodes.contains(node)) {
+            context.report(
+                MultipleAwaitPointerEventScopes,
+                node,
+                context.getNameLocation(node),
+                ErrorMessage
+            )
+            reportedNodes.add(node)
+        }
+    }
+
+    private fun searchAwaitPointerScopeCalls(parent: UElement): Int {
+        var awaitPointerEventCallsCount = 0
+        parent.accept(object : AbstractUastVisitor() {
+            override fun visitCallExpression(node: UCallExpression): Boolean {
+                val method = node.tryResolve() as? PsiMethod ?: return false
+                if (!method.isInPackageName(Names.Ui.Pointer.PackageName)) return false
+
+                if (method.name == Names.Ui.Pointer.AwaitPointerEventScope.shortName) {
+                    awaitPointerEventCallsCount++
+                }
+                return false
+            }
+        })
+
+        return awaitPointerEventCallsCount
+    }
+
+    companion object {
+        const val IssueId: String = "MultipleAwaitPointerEventScopes"
+        const val ErrorMessage =
+            "Suspicious use of multiple awaitPointerEventScope blocks. Using " +
+                "multiple awaitPointerEventScope blocks may cause some input events to be dropped."
+        val MultipleAwaitPointerEventScopes = Issue.create(
+            IssueId,
+            ErrorMessage,
+            "Pointer Input events are queued inside awaitPointerEventScope. Multiple " +
+                "calls to awaitPointerEventScope may exit the scope. During this time " +
+                "there is no guarantee that the events will be queued and some " +
+                "events may be dropped. It is recommended to use a single top-level block and " +
+                "perform the pointer events processing within such block.",
+            Category.CORRECTNESS, 3, Severity.WARNING,
+            Implementation(
+                MultipleAwaitPointerEventScopesDetector::class.java,
+                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+            )
+        )
+    }
+}
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 d475dec..3c33786 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
@@ -36,7 +36,8 @@
         ModifierDeclarationDetector.ModifierFactoryReturnType,
         ModifierDeclarationDetector.ModifierFactoryUnreferencedReceiver,
         ModifierParameterDetector.ModifierParameter,
-        ReturnFromAwaitPointerEventScopeDetector.ExitAwaitPointerEventScope
+        ReturnFromAwaitPointerEventScopeDetector.ExitAwaitPointerEventScope,
+        MultipleAwaitPointerEventScopesDetector.MultipleAwaitPointerEventScopes
     )
     override val vendor = Vendor(
         vendorName = "Jetpack Compose",
diff --git a/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/MultipleAwaitPointerEventScopesDetectorTest.kt b/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/MultipleAwaitPointerEventScopesDetectorTest.kt
new file mode 100644
index 0000000..f677e2f
--- /dev/null
+++ b/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/MultipleAwaitPointerEventScopesDetectorTest.kt
@@ -0,0 +1,678 @@
+/*
+ * 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.lint
+
+import androidx.compose.lint.test.Stubs
+import androidx.compose.lint.test.compiledStub
+import com.android.tools.lint.checks.infrastructure.LintDetectorTest
+import com.android.tools.lint.checks.infrastructure.TestFile
+import com.android.tools.lint.detector.api.Detector
+import com.android.tools.lint.detector.api.Issue
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+/**
+ * Detector for checking if we have multiple awaitPointerEventScope calls within the same block,
+ * which is generally discouraged if we want to guarantee not losing touch events.
+ *
+ * For each awaitPointerEventScope we'll move to the closest boundary block (method call) and
+ * search for the repeated calls inside that block.
+ */
+@RunWith(JUnit4::class)
+class MultipleAwaitPointerEventScopesDetectorTest : LintDetectorTest() {
+    override fun getDetector(): Detector = MultipleAwaitPointerEventScopesDetector()
+
+    override fun getIssues(): MutableList<Issue> =
+        mutableListOf(MultipleAwaitPointerEventScopesDetector.MultipleAwaitPointerEventScopes)
+
+    private val ForEachGestureStub: TestFile = compiledStub(
+        filename = "ForEachGesture.kt",
+        filepath = "androidx/compose/foundation/gestures",
+        checksum = 0xf41a4b04,
+        """
+            package androidx.compose.foundation.gestures
+            import androidx.compose.ui.input.pointer.PointerInputScope
+
+            suspend fun PointerInputScope.forEachGesture(block: suspend PointerInputScope.() -> Unit) {
+                block()
+            }
+            """,
+        """
+                META-INF/main.kotlin_module:
+                H4sIAAAAAAAAAH2NSwrCMBCGR0SErCToVrC4UsghtFakG0EvEJqxBmomJBOo
+                tzfS7gQXw//6YABgCgCTfPNRQaDYamcCWdOrhl6eIqoHJWc0W3KqxcgpYJSr
+                Muj2PKQSGRumULNcVBROunmOS26Wd+1/OLEXxb83nX5TYjk7UJ/ho9j8wMkq
+                63xi5ck6xiDXtxQ9OmNdex2qy3evbJdtzQXs4AM20YY08QAAAA==
+                """,
+        """
+                androidx/compose/foundation/gestures/ForEachGestureKt.class:
+                H4sIAAAAAAAAALVVz08bRxT+Zm1ss0BiNpACaRwS3IYfIWtoadM6Qo2ISVZ1
+                DIohVcWhGq8XZ7C9Y+3OWuSGcqjUf6OHnqOe0h4qRG/9o6q+sQ0BTIIUqZY8
+                870337z55s2b2X/+/fMvAF/iW4YV7lcDKar7tiubLRl69q6M/CpXQvp2zQtV
+                FHihvS6DAndfPuna36skGEN6j7e53eB+zd6o7HkueWMMV3bPcBl+mS32rREJ
+                W/itSNktKXzlBfZmt3e0s+zKlpcv1qVqCN/eazft3ch3tSAS0kPLJ+OuDGSk
+                hE8q16RPIOpoz88Vz8vLMzb+v2h5uPhRURcv2cLDE8K2L1R+Nb/Qv6XVy/LQ
+                F+SivCBblEHN3vNUJeCCtsZ9Xyre3WYpajR4peERbeZDNKk0k1iZD2crCZMh
+                Ify2rFN1PJjt19PvuUD0MIYxMoQhXGGY688BJTsgicINbecE6sJNM1yveWpt
+                4/nG9pZTKvxU3i5vFkqPC48ZxmYvXMjCNROjGGMYOpXLJK4zpJxSeetRaa3A
+                MHIm0cOYwOQgPsEUhc2qlyLMnr8YKx9VNQwDlYZ06wzTl10R0pvVkRuetk9N
+                eN+dYRg9pjzzFKdXgJPPaLZj9Fww3SQZWF0Dg/z7QqMcoeoSQ3h4kDEPD0wj
+                bZjGhNGBE11opHvG4cHUKuEpI8fmjZyxfDcdm5pJMStukWWZVqqDWG7ASljx
+                CZZL5OJHvyaMVPLp0c/f/f2WHR5oM506em3ETSM1qZdeZqQN1rHw09vPHDsL
+                +8qjCpD+8ejWq04qR88+bPfriiG+Jqt0OiNlxd36M97a0sXPcLVI+SpFzYoX
+                9DxWUbq88YIHQts952BZ1HzePeAbzyNKbtNz/LYIBQ0/endf6M6dH93kAW96
+                dNpnaGZZRoHrrQsdfbI350VfPCzBQBz6RzQMIEHWElkuYtDHNL4wf+8PXI3h
+                x7cY/w3xNz/8jhtvaCCGZWoTYJtJmvIFYZNCac8YkvSRAKa7AfApbnYWGEcG
+                t2gZjaZxm9gruiKI/VU3ElLUf03/azEyBjua3rUGHnTaHL6hfp28d0jvzA5i
+                DrIOPqMWnzu4i1kHc5jfAQuxgHs7GAwxEGIxxM0QmRD3Q9zumHaIxH8TzBqW
+                1AYAAA==
+                """
+
+    )
+
+    private val stubs = arrayOf(
+        Stubs.Composable,
+        Stubs.Modifier,
+        UiStubs.Density,
+        UiStubs.PointerInputScope,
+        UiStubs.PointerEvent,
+        UiStubs.Alignment,
+        ForEachGestureStub
+    )
+
+    @Test
+    fun awaitPointerEventScope_standalone_shouldNotWarn() {
+        expectClean(
+            """
+                package test
+                import androidx.compose.runtime.Composable
+                import androidx.compose.ui.Modifier
+                import androidx.compose.ui.input.pointer.pointerInput
+
+                @Composable
+                fun TestComposable() {
+                    Modifier.pointerInput(Unit) {
+                        awaitPointerEventScope {
+
+                        }
+                    }
+                }
+            """
+        )
+    }
+
+    @Test
+    fun awaitPointerEventScopeOtherMethodName_shouldNotWarn() {
+        expectClean(
+            """
+                package test
+
+                import androidx.compose.foundation.gestures.forEachGesture
+                import androidx.compose.runtime.Composable
+                import androidx.compose.ui.Modifier
+                import androidx.compose.ui.input.pointer.AwaitPointerEventScope
+                import androidx.compose.ui.input.pointer.pointerInput
+
+                @Composable
+                fun TestComposable() {
+                    fun awaitPointerEventScope(block: AwaitPointerEventScope.() -> Unit) {}
+                    Modifier.pointerInput(Unit) {
+                        forEachGesture {
+                            awaitPointerEventScope {
+
+                            }
+                        }
+                    }
+                }
+            """
+        )
+    }
+
+    @Test
+    fun awaitPointerEventScope_insideForEachGesture_shouldNotWarn() {
+        expectClean(
+            """
+                package test
+                import androidx.compose.foundation.gestures.forEachGesture
+                import androidx.compose.runtime.Composable
+                import androidx.compose.ui.Modifier
+                import androidx.compose.ui.input.pointer.pointerInput
+
+                @Composable
+                fun TestComposable() {
+                    Modifier.pointerInput(Unit) {
+                        forEachGesture {
+                            awaitPointerEventScope {
+
+                            }
+                        }
+                    }
+                }
+            """
+        )
+    }
+
+    @Test
+    fun singleAwaitPointerEventScopeFromMethod_shouldNotWarn() {
+        expectClean(
+            """
+                package test
+
+                import androidx.compose.ui.input.pointer.PointerInputScope
+
+                suspend fun PointerInputScope.TestComposable() {
+                    awaitPointerEventScope {
+
+                    }
+                }
+            """
+        )
+    }
+
+    @Test
+    fun awaitPointerEventScope_withConditionalCalls_shouldWarn() {
+        lint().files(
+            kotlin(
+                """
+                package test
+
+                import androidx.compose.runtime.Composable
+                import androidx.compose.ui.Modifier
+                import androidx.compose.ui.input.pointer.pointerInput
+
+                @Composable
+                fun TestComposable(condition: Boolean) {
+                    Modifier.pointerInput(Unit) {
+                        if (condition) {
+                            awaitPointerEventScope {
+
+                            }
+                        } else {
+                            awaitPointerEventScope {
+
+                            }
+                        }
+                    }
+                }
+                 """
+            ),
+            *stubs,
+        )
+            .run()
+            .expect(
+                """
+src/test/test.kt:12: $WarningMessage
+                            awaitPointerEventScope {
+                            ~~~~~~~~~~~~~~~~~~~~~~
+src/test/test.kt:16: $WarningMessage
+                            awaitPointerEventScope {
+                            ~~~~~~~~~~~~~~~~~~~~~~
+0 errors, 2 warnings
+            """.trimIndent()
+            )
+    }
+
+    @Test
+    fun awaitPointerEventScope_fromExtensionMethodAndConditionalCalls_shouldWarn() {
+        lint().files(
+            kotlin(
+                """
+                package test
+
+                import androidx.compose.ui.input.pointer.PointerInputScope
+
+                private suspend fun PointerInputScope.doSomethingInInputScope(
+                    condition: Boolean
+                ) {
+                    if (condition) {
+                        awaitPointerEventScope {
+
+                        }
+                    } else {
+                        awaitPointerEventScope {
+
+                        }
+                    }
+                }
+                 """
+            ),
+            *stubs,
+        )
+            .run()
+            .expect(
+                """
+src/test/test.kt:10: $WarningMessage
+                        awaitPointerEventScope {
+                        ~~~~~~~~~~~~~~~~~~~~~~
+src/test/test.kt:14: $WarningMessage
+                        awaitPointerEventScope {
+                        ~~~~~~~~~~~~~~~~~~~~~~
+0 errors, 2 warnings
+            """.trimIndent()
+            )
+    }
+
+    @Test
+    fun multipleAwaitPointerEventScope_shouldWarn() {
+        lint().files(
+            kotlin(
+                """
+                package test
+                import androidx.compose.foundation.gestures.forEachGesture
+                import androidx.compose.runtime.Composable
+                import androidx.compose.ui.Modifier
+                import androidx.compose.ui.input.pointer.pointerInput
+
+                @Composable
+                fun TestComposable() {
+                    Modifier.pointerInput(Unit) {
+                        forEachGesture {
+                            awaitPointerEventScope {
+
+                            }
+
+                            awaitPointerEventScope {
+
+                            }
+                        }
+                    }
+                }
+                 """
+            ),
+            *stubs,
+        )
+            .run()
+            .expect(
+                """
+src/test/test.kt:12: $WarningMessage
+                            awaitPointerEventScope {
+                            ~~~~~~~~~~~~~~~~~~~~~~
+src/test/test.kt:16: $WarningMessage
+                            awaitPointerEventScope {
+                            ~~~~~~~~~~~~~~~~~~~~~~
+0 errors, 2 warnings
+            """.trimIndent()
+            )
+    }
+
+    @Test
+    fun multipleAwaitPointerEventScope_withLambdaBlocks_shouldWarn() {
+        lint().files(
+            kotlin(
+                """
+                package test
+                import androidx.compose.foundation.gestures.forEachGesture
+                import androidx.compose.runtime.Composable
+                import androidx.compose.ui.Modifier
+                import androidx.compose.ui.input.pointer.pointerInput
+
+                @Composable
+                fun TestComposable() {
+                    Modifier.pointerInput(Unit) {
+                        forEachGesture {
+                            run { awaitPointerEventScope {
+
+                            }}
+
+                            run { awaitPointerEventScope {
+
+                            }}
+                        }
+                    }
+                }
+                 """
+            ),
+            *stubs,
+        )
+            .run()
+            .expect(
+                """
+src/test/test.kt:12: $WarningMessage
+                            run { awaitPointerEventScope {
+                                  ~~~~~~~~~~~~~~~~~~~~~~
+src/test/test.kt:16: $WarningMessage
+                            run { awaitPointerEventScope {
+                                  ~~~~~~~~~~~~~~~~~~~~~~
+0 errors, 2 warnings
+            """.trimIndent()
+            )
+    }
+
+    @Test
+    fun multipleAwaitPointerEventScope_insideExtensionMethod_shouldWarn() {
+        lint().files(
+            kotlin(
+                """
+                package test
+
+                import androidx.compose.ui.input.pointer.PointerInputScope
+
+                private suspend fun PointerInputScope.doSomethingInInputScope() {
+
+                    awaitPointerEventScope {
+
+                    }
+
+                    awaitPointerEventScope {
+
+                    }
+                }
+                 """
+            ),
+            *stubs,
+        )
+            .run()
+            .expect(
+                """
+src/test/test.kt:8: $WarningMessage
+                    awaitPointerEventScope {
+                    ~~~~~~~~~~~~~~~~~~~~~~
+src/test/test.kt:12: $WarningMessage
+                    awaitPointerEventScope {
+                    ~~~~~~~~~~~~~~~~~~~~~~
+0 errors, 2 warnings
+            """
+                    .trimIndent()
+            )
+    }
+
+    @Test
+    fun awaitPointerEventScope_multipleConditionalAndCalls_shouldWarn() {
+        lint().files(
+            kotlin(
+                """
+                package test
+                import androidx.compose.runtime.Composable
+                import androidx.compose.ui.Modifier
+                import androidx.compose.ui.input.pointer.pointerInput
+
+                @Composable
+                fun TestComposable(condition: Boolean) {
+                    Modifier.pointerInput(Unit) {
+                        awaitPointerEventScope {
+
+                        }
+
+                        if (condition) {
+                            awaitPointerEventScope {
+
+                            }
+                        } else {
+                            awaitPointerEventScope {
+
+                            }
+                        }
+                    }
+                }
+                 """
+            ),
+            *stubs,
+        )
+            .run()
+            .expect(
+                """
+src/test/test.kt:10: $WarningMessage
+                        awaitPointerEventScope {
+                        ~~~~~~~~~~~~~~~~~~~~~~
+src/test/test.kt:15: $WarningMessage
+                            awaitPointerEventScope {
+                            ~~~~~~~~~~~~~~~~~~~~~~
+src/test/test.kt:19: $WarningMessage
+                            awaitPointerEventScope {
+                            ~~~~~~~~~~~~~~~~~~~~~~
+0 errors, 3 warnings
+            """.trimIndent()
+            )
+    }
+
+    @Test
+    fun awaitPointerEventScope_multipleConditionalAndCallsInsideCondition_shouldWarn() {
+        lint().files(
+            kotlin(
+                """
+                package test
+
+                import androidx.compose.runtime.Composable
+                import androidx.compose.ui.Modifier
+                import androidx.compose.ui.input.pointer.pointerInput
+
+                @Composable
+                fun TestComposable(condition: Boolean) {
+
+                    Modifier.pointerInput(Unit) {
+                        if (condition) {
+                            awaitPointerEventScope {
+
+                            }
+
+                            awaitPointerEventScope {
+
+                            }
+                        } else {
+                            awaitPointerEventScope {
+
+                            }
+                        }
+                    }
+                }
+                 """
+            ),
+            *stubs,
+        )
+            .run()
+            .expect(
+                """
+src/test/test.kt:13: $WarningMessage
+                            awaitPointerEventScope {
+                            ~~~~~~~~~~~~~~~~~~~~~~
+src/test/test.kt:17: $WarningMessage
+                            awaitPointerEventScope {
+                            ~~~~~~~~~~~~~~~~~~~~~~
+src/test/test.kt:21: $WarningMessage
+                            awaitPointerEventScope {
+                            ~~~~~~~~~~~~~~~~~~~~~~
+0 errors, 3 warnings
+            """.trimIndent()
+            )
+    }
+
+    @Test
+    fun awaitPointerEventScope_repetitionWithinCustomModifier_shouldWarn() {
+        lint().files(
+            kotlin(
+                """
+                package test
+
+                import androidx.compose.runtime.Composable
+                import androidx.compose.ui.Modifier
+                import androidx.compose.ui.input.pointer.PointerInputScope
+                import androidx.compose.ui.input.pointer.pointerInput
+
+                fun Modifier.myCustomPointerInput(block: suspend PointerInputScope.() -> Unit) =
+                    pointerInput(Unit, block)
+
+                @Composable
+                fun TestComposable() {
+                    Modifier
+                        .myCustomPointerInput {
+                            awaitPointerEventScope {
+
+                            }
+                            awaitPointerEventScope {
+
+                            }
+                        }
+                }
+                 """
+            ),
+            *stubs,
+        )
+            .run()
+            .expect(
+                """
+src/test/test.kt:16: $WarningMessage
+                            awaitPointerEventScope {
+                            ~~~~~~~~~~~~~~~~~~~~~~
+src/test/test.kt:19: $WarningMessage
+                            awaitPointerEventScope {
+                            ~~~~~~~~~~~~~~~~~~~~~~
+0 errors, 2 warnings
+            """.trimIndent()
+            )
+    }
+
+    @Test
+    fun awaitPointerEventScope_nestedBlocks_shouldWarn() {
+        lint().files(
+            kotlin(
+                """
+                package test
+
+                import androidx.compose.runtime.Composable
+                import androidx.compose.ui.Modifier
+                import androidx.compose.ui.input.pointer.PointerInputScope
+                import androidx.compose.ui.input.pointer.pointerInput
+
+                fun Modifier.myCustomPointerInput(block: suspend PointerInputScope.() -> Unit) =
+                    pointerInput(Unit, block)
+
+                var condition = false
+
+                enum class Options { A, B, C }
+
+                val options = Options.A
+
+                @Composable
+                fun TestComposable() {
+                    Modifier
+                        .pointerInput(Unit) {
+                            awaitPointerEventScope {
+
+                            }
+
+                            if (condition) {
+                                try {
+                                    when (options) {
+                                        Options.A -> {
+                                            // do something
+                                        }
+                                        Options.B -> {
+                                            awaitPointerEventScope {
+
+                                            }
+                                        }
+                                        Options.C -> {
+                                            // do something
+                                        }
+                                    }
+                                } catch (e: Exception) {
+                                    // do something
+                                }
+                            }
+                        }
+                }
+                 """
+            ),
+            *stubs,
+        )
+            .run()
+            .expect(
+                """
+src/test/Options.kt:22: $WarningMessage
+                            awaitPointerEventScope {
+                            ~~~~~~~~~~~~~~~~~~~~~~
+src/test/Options.kt:33: $WarningMessage
+                                            awaitPointerEventScope {
+                                            ~~~~~~~~~~~~~~~~~~~~~~
+0 errors, 2 warnings
+            """.trimIndent()
+            )
+    }
+
+    @Test
+    fun awaitPointerEventScope_repetitionAcrossCustomModifiers_shouldNotWarn() {
+        expectClean(
+            """
+                package test
+
+                import androidx.compose.runtime.Composable
+                import androidx.compose.ui.Modifier
+                import androidx.compose.ui.input.pointer.PointerInputScope
+                import androidx.compose.ui.input.pointer.pointerInput
+
+                fun Modifier.myCustomPointerInput(block: suspend PointerInputScope.() -> Unit) =
+                    pointerInput(Unit, block)
+
+                @Composable
+                fun TestComposable() {
+                    Modifier
+                        .myCustomPointerInput {
+                            awaitPointerEventScope {
+
+                            }
+                        }
+                        .myCustomPointerInput {
+                            awaitPointerEventScope {
+
+                            }
+                        }
+                }
+                 """
+        )
+    }
+
+    @Test
+    fun awaitPointerEventScope_repetitionAcrossPointerInputModifiers_shouldNotWarn() {
+        expectClean(
+            """
+                package test
+
+                import androidx.compose.runtime.Composable
+                import androidx.compose.ui.Modifier
+                import androidx.compose.ui.input.pointer.PointerInputScope
+                import androidx.compose.ui.input.pointer.pointerInput
+
+                @Composable
+                fun TestComposable() {
+                    Modifier
+                        .pointerInput(Unit) {
+                            awaitPointerEventScope {
+
+                            }
+                        }
+                        .pointerInput(Unit) {
+                            awaitPointerEventScope {
+
+                            }
+                        }
+                }
+                 """
+        )
+    }
+
+    private fun expectClean(source: String) {
+        lint()
+            .files(kotlin(source), *stubs)
+            .run()
+            .expectClean()
+    }
+
+    private val WarningMessage
+        get() = "Warning: ${MultipleAwaitPointerEventScopesDetector.ErrorMessage} " +
+            "[${MultipleAwaitPointerEventScopesDetector.IssueId}]"
+}
\ No newline at end of file
diff --git a/compose/ui/ui-test-junit4/api/1.3.0-beta01.txt b/compose/ui/ui-test-junit4/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..d69e7e0
--- /dev/null
+++ b/compose/ui/ui-test-junit4/api/1.3.0-beta01.txt
@@ -0,0 +1,94 @@
+// 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 {
+    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();
+  }
+
+  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();
+    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 EspressoLink_androidKt {
+  }
+
+  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_1.3.0-beta01.txt b/compose/ui/ui-test-junit4/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..97512e2
--- /dev/null
+++ b/compose/ui/ui-test-junit4/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,135 @@
+// 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();
+    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(kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.ComposeUiTest,? extends kotlin.Unit> block);
+  }
+
+  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(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, 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(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.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);
+    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();
+  }
+
+  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();
+    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 EspressoLink_androidKt {
+  }
+
+  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/health/health-connect-client/api/res-current.txt b/compose/ui/ui-test-junit4/api/res-1.3.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/ui/ui-test-junit4/api/res-1.3.0-beta01.txt
diff --git a/compose/ui/ui-test-junit4/api/restricted_1.3.0-beta01.txt b/compose/ui/ui-test-junit4/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..d69e7e0
--- /dev/null
+++ b/compose/ui/ui-test-junit4/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,94 @@
+// 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 {
+    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();
+  }
+
+  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();
+    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 EspressoLink_androidKt {
+  }
+
+  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-manifest/api/1.3.0-beta01.txt b/compose/ui/ui-test-manifest/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-test-manifest/api/1.3.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/ui/ui-test-manifest/api/public_plus_experimental_1.3.0-beta01.txt b/compose/ui/ui-test-manifest/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-test-manifest/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/health/health-connect-client/api/res-current.txt b/compose/ui/ui-test-manifest/api/res-1.3.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/ui/ui-test-manifest/api/res-1.3.0-beta01.txt
diff --git a/compose/ui/ui-test-manifest/api/restricted_1.3.0-beta01.txt b/compose/ui/ui-test-manifest/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-test-manifest/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/ui/ui-test/api/1.3.0-beta01.txt b/compose/ui/ui-test/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..bd6bf9d
--- /dev/null
+++ b/compose/ui/ui-test/api/1.3.0-beta01.txt
@@ -0,0 +1,402 @@
+// Signature format: 4.0
+package androidx.compose.ui.test {
+
+  public final class ActionsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performClick(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method @Deprecated public static androidx.compose.ui.test.SemanticsNodeInteraction performGesture(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.GestureScope,kotlin.Unit> block);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performMultiModalInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.MultiModalInjectionScope,kotlin.Unit> block);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollTo(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToIndex(androidx.compose.ui.test.SemanticsNodeInteraction, int index);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToKey(androidx.compose.ui.test.SemanticsNodeInteraction, Object key);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToNode(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static <T extends kotlin.Function<? extends java.lang.Boolean>> androidx.compose.ui.test.SemanticsNodeInteraction performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<T>> key, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> invocation);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> key);
+    method @Deprecated public static <T extends kotlin.Function<? extends java.lang.Boolean>> void performSemanticsActionUnit(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<T>> key, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> invocation);
+    method @Deprecated public static void performSemanticsActionUnit(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<? extends java.lang.Boolean>>> key);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performTouchInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.TouchInjectionScope,kotlin.Unit> block);
+  }
+
+  public final class Actions_androidKt {
+  }
+
+  public final class AndroidAssertions_androidKt {
+  }
+
+  public final class AndroidImageHelpers_androidKt {
+    method @RequiresApi(android.os.Build.VERSION_CODES.O) public static androidx.compose.ui.graphics.ImageBitmap captureToImage(androidx.compose.ui.test.SemanticsNodeInteraction);
+  }
+
+  public final class AndroidInputDispatcher_androidKt {
+  }
+
+  public final class AndroidOutput_androidKt {
+  }
+
+  public final class AssertionsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assert(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher, optional kotlin.jvm.functions.Function0<java.lang.String>? messagePrefixOnError);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAll(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAny(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, java.lang.String... values);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertCountEquals(androidx.compose.ui.test.SemanticsNodeInteractionCollection, int expectedSize);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasNoClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsDisplayed(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsEnabled(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsFocused(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotDisplayed(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotEnabled(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotFocused(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotSelected(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsOff(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsOn(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsSelectable(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsSelected(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsToggleable(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertRangeInfoEquals(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.ProgressBarRangeInfo value);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String![] values, optional boolean includeEditableText);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertValueEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value);
+  }
+
+  public final class BoundsAssertionsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHeightIsAtLeast(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHeightIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedHeight);
+    method public static void assertIsEqualTo(float, float expected, String subject, optional float tolerance);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertLeftPositionInRootIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertPositionInRootIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTopPositionInRootIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTouchHeightIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTouchWidthIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedWidth);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsAtLeast(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinWidth);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedWidth);
+    method public static float getAlignmentLinePosition(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public static androidx.compose.ui.unit.DpRect getBoundsInRoot(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.unit.DpRect getUnclippedBoundsInRoot(androidx.compose.ui.test.SemanticsNodeInteraction);
+  }
+
+  public final class ComposeTimeoutException extends java.lang.Throwable {
+    ctor public ComposeTimeoutException(String? message);
+  }
+
+  public final class ErrorMessagesKt {
+  }
+
+  public final class 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);
+    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 KeyInjectionScopeKt {
+  }
+
+  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 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);
+  }
+
+  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 SemanticsSelectorKt {
+  }
+
+  public final class TestContext {
+  }
+
+  public final class TestMonotonicFrameClock_jvmKt {
+  }
+
+  public final class TestOwnerKt {
+  }
+
+  public final class TextActionsKt {
+    method public static void performImeAction(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static void performTextClearance(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static void performTextInput(androidx.compose.ui.test.SemanticsNodeInteraction, String text);
+    method public static void performTextReplacement(androidx.compose.ui.test.SemanticsNodeInteraction, String text);
+  }
+
+  @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);
+  }
+
+  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.3.0-beta01.txt b/compose/ui/ui-test/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..f3aa23b
--- /dev/null
+++ b/compose/ui/ui-test/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,525 @@
+// 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 Actions_androidKt {
+  }
+
+  public final class AndroidAssertions_androidKt {
+  }
+
+  public final class AndroidImageHelpers_androidKt {
+    method @RequiresApi(android.os.Build.VERSION_CODES.O) public static androidx.compose.ui.graphics.ImageBitmap captureToImage(androidx.compose.ui.test.SemanticsNodeInteraction);
+  }
+
+  public final class AndroidInputDispatcher_androidKt {
+  }
+
+  public final class AndroidOutput_androidKt {
+  }
+
+  public final class AssertionsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assert(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher, optional kotlin.jvm.functions.Function0<java.lang.String>? messagePrefixOnError);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAll(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAny(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, java.lang.String... values);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertCountEquals(androidx.compose.ui.test.SemanticsNodeInteractionCollection, int expectedSize);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasNoClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsDisplayed(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsEnabled(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsFocused(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotDisplayed(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotEnabled(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotFocused(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotSelected(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsOff(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsOn(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsSelectable(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsSelected(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsToggleable(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertRangeInfoEquals(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.ProgressBarRangeInfo value);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String![] values, optional boolean includeEditableText);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertValueEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value);
+  }
+
+  public final class BoundsAssertionsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHeightIsAtLeast(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHeightIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedHeight);
+    method public static void assertIsEqualTo(float, float expected, String subject, optional float tolerance);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertLeftPositionInRootIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertPositionInRootIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTopPositionInRootIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTouchHeightIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTouchWidthIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedWidth);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsAtLeast(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinWidth);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedWidth);
+    method public static float getAlignmentLinePosition(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public static androidx.compose.ui.unit.DpRect getBoundsInRoot(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.unit.DpRect getUnclippedBoundsInRoot(androidx.compose.ui.test.SemanticsNodeInteraction);
+  }
+
+  public final class ComposeTimeoutException extends java.lang.Throwable {
+    ctor public ComposeTimeoutException(String? message);
+  }
+
+  public final class ErrorMessagesKt {
+  }
+
+  public final class Expect_jvmKt {
+  }
+
+  @kotlin.RequiresOptIn(message="This testing API is experimental and is likely to be changed or removed entirely") public @interface ExperimentalTestApi {
+  }
+
+  public final class FiltersKt {
+    method public static androidx.compose.ui.test.SemanticsMatcher hasAnyAncestor(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasAnyChild(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasAnyDescendant(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasAnySibling(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasClickAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescription(String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescriptionExactly(java.lang.String... values);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasImeAction(int actionType);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasNoClickAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasNoScrollAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasParent(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasProgressBarRangeInfo(androidx.compose.ui.semantics.ProgressBarRangeInfo rangeInfo);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasScrollAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToIndexAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToKeyAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToNodeAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasSetTextAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasStateDescription(String value);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasTestTag(String testTag);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasText(String text, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasTextExactly(String![] textValues, optional boolean includeEditableText);
+    method public static androidx.compose.ui.test.SemanticsMatcher isDialog();
+    method public static androidx.compose.ui.test.SemanticsMatcher isEnabled();
+    method public static androidx.compose.ui.test.SemanticsMatcher isFocusable();
+    method public static androidx.compose.ui.test.SemanticsMatcher isFocused();
+    method public static androidx.compose.ui.test.SemanticsMatcher isHeading();
+    method public static androidx.compose.ui.test.SemanticsMatcher isNotEnabled();
+    method public static androidx.compose.ui.test.SemanticsMatcher isNotFocusable();
+    method public static androidx.compose.ui.test.SemanticsMatcher isNotFocused();
+    method public static androidx.compose.ui.test.SemanticsMatcher isNotSelected();
+    method public static androidx.compose.ui.test.SemanticsMatcher isOff();
+    method public static androidx.compose.ui.test.SemanticsMatcher isOn();
+    method public static androidx.compose.ui.test.SemanticsMatcher isPopup();
+    method public static androidx.compose.ui.test.SemanticsMatcher isRoot();
+    method public static androidx.compose.ui.test.SemanticsMatcher isSelectable();
+    method public static androidx.compose.ui.test.SemanticsMatcher isSelected();
+    method public static androidx.compose.ui.test.SemanticsMatcher isToggleable();
+  }
+
+  public final class FindersKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onAllNodesWithContentDescription(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String label, optional boolean substring, optional boolean ignoreCase, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onAllNodesWithTag(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String testTag, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onAllNodesWithText(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String text, optional boolean substring, optional boolean ignoreCase, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onNodeWithContentDescription(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String label, optional boolean substring, optional boolean ignoreCase, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onNodeWithTag(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String testTag, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onNodeWithText(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String text, optional boolean substring, optional boolean ignoreCase, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onRoot(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, optional boolean useUnmergedTree);
+  }
+
+  @Deprecated public final class GestureScope {
+    ctor @Deprecated public GestureScope(androidx.compose.ui.semantics.SemanticsNode node, androidx.compose.ui.test.TestContext testContext);
+    method @Deprecated public long getVisibleSize();
+    property public final long visibleSize;
+  }
+
+  public final class GestureScopeKt {
+    method @Deprecated @androidx.compose.ui.test.ExperimentalTestApi public static void advanceEventTime(androidx.compose.ui.test.GestureScope, long durationMillis);
+    method @Deprecated public static void cancel(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void click(androidx.compose.ui.test.GestureScope, optional long position);
+    method @Deprecated public static void doubleClick(androidx.compose.ui.test.GestureScope, optional long position, optional long delayMillis);
+    method @Deprecated public static void down(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method @Deprecated public static void down(androidx.compose.ui.test.GestureScope, long position);
+    method @Deprecated public static inline float getBottom(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getBottomCenter(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getBottomLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getBottomRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getCenter(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getCenterLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getCenterRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getCenterX(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getCenterY(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline int getHeight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getTop(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getTopCenter(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getTopLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getTopRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline int getWidth(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void longClick(androidx.compose.ui.test.GestureScope, optional long position, optional long durationMillis);
+    method @Deprecated public static void move(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void moveBy(androidx.compose.ui.test.GestureScope, int pointerId, long delta);
+    method @Deprecated public static void moveBy(androidx.compose.ui.test.GestureScope, long delta);
+    method @Deprecated public static void movePointerBy(androidx.compose.ui.test.GestureScope, int pointerId, long delta);
+    method @Deprecated public static void movePointerTo(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method @Deprecated public static void moveTo(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method @Deprecated public static void moveTo(androidx.compose.ui.test.GestureScope, long position);
+    method @Deprecated public static long percentOffset(androidx.compose.ui.test.GestureScope, optional float x, optional float y);
+    method @Deprecated public static void pinch(androidx.compose.ui.test.GestureScope, long start0, long end0, long start1, long end1, optional long durationMillis);
+    method @Deprecated public static void swipe(androidx.compose.ui.test.GestureScope, long start, long end, optional long durationMillis);
+    method @Deprecated public static void swipeDown(androidx.compose.ui.test.GestureScope);
+    method @Deprecated @androidx.compose.ui.test.ExperimentalTestApi public static void swipeDown(androidx.compose.ui.test.GestureScope, optional float startY, optional float endY, optional long durationMillis);
+    method @Deprecated public static void swipeLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated @androidx.compose.ui.test.ExperimentalTestApi public static void swipeLeft(androidx.compose.ui.test.GestureScope, optional float startX, optional float endX, optional long durationMillis);
+    method @Deprecated public static void swipeRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated @androidx.compose.ui.test.ExperimentalTestApi public static void swipeRight(androidx.compose.ui.test.GestureScope, optional float startX, optional float endX, optional long durationMillis);
+    method @Deprecated public static void swipeUp(androidx.compose.ui.test.GestureScope);
+    method @Deprecated @androidx.compose.ui.test.ExperimentalTestApi public static void swipeUp(androidx.compose.ui.test.GestureScope, optional float startY, optional float endY, optional long durationMillis);
+    method @Deprecated public static void swipeWithVelocity(androidx.compose.ui.test.GestureScope, long start, long end, float endVelocity, optional long durationMillis);
+    method @Deprecated public static void up(androidx.compose.ui.test.GestureScope, optional int pointerId);
+  }
+
+  @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.") 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 SemanticsSelectorKt {
+  }
+
+  public final class TestContext {
+  }
+
+  @kotlinx.coroutines.ExperimentalCoroutinesApi public final class TestMonotonicFrameClock implements androidx.compose.runtime.MonotonicFrameClock {
+    ctor public TestMonotonicFrameClock(kotlinx.coroutines.CoroutineScope coroutineScope, kotlinx.coroutines.test.TestCoroutineScheduler delayController, optional long frameDelayNanos);
+    method public long getFrameDelayNanos();
+    method public boolean getHasAwaiters();
+    method public suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R>);
+    property public final long frameDelayNanos;
+    property public final boolean hasAwaiters;
+  }
+
+  public final class TestMonotonicFrameClock_jvmKt {
+    method @kotlinx.coroutines.ExperimentalCoroutinesApi public static androidx.compose.ui.test.TestMonotonicFrameClock TestMonotonicFrameClock(kotlinx.coroutines.CoroutineScope coroutineScope, optional long frameDelayNanos);
+    method @kotlinx.coroutines.ExperimentalCoroutinesApi public static long getFrameDelayMillis(androidx.compose.ui.test.TestMonotonicFrameClock);
+  }
+
+  @androidx.compose.ui.test.InternalTestApi public interface TestOwner {
+    method public androidx.compose.ui.test.MainTestClock getMainClock();
+    method public java.util.Set<androidx.compose.ui.node.RootForTest> getRoots(boolean atLeastOneRootExpected);
+    method public <T> T! runOnUiThread(kotlin.jvm.functions.Function0<? extends T> action);
+    method public void sendImeAction(androidx.compose.ui.semantics.SemanticsNode node, int actionSpecified);
+    method public void sendTextInputCommand(androidx.compose.ui.semantics.SemanticsNode node, java.util.List<? extends androidx.compose.ui.text.input.EditCommand> command);
+    property public abstract androidx.compose.ui.test.MainTestClock mainClock;
+  }
+
+  public final class TestOwnerKt {
+    method @androidx.compose.ui.test.InternalTestApi public static androidx.compose.ui.test.TestContext createTestContext(androidx.compose.ui.test.TestOwner owner);
+  }
+
+  public final class TextActionsKt {
+    method public static void performImeAction(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static void performTextClearance(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static void performTextInput(androidx.compose.ui.test.SemanticsNodeInteraction, String text);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void performTextInputSelection(androidx.compose.ui.test.SemanticsNodeInteraction, long selection);
+    method public static void performTextReplacement(androidx.compose.ui.test.SemanticsNodeInteraction, String text);
+  }
+
+  @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);
+  }
+
+  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/health/health-connect-client/api/res-current.txt b/compose/ui/ui-test/api/res-1.3.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/ui/ui-test/api/res-1.3.0-beta01.txt
diff --git a/compose/ui/ui-test/api/restricted_1.3.0-beta01.txt b/compose/ui/ui-test/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..1cb6dfa
--- /dev/null
+++ b/compose/ui/ui-test/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,403 @@
+// Signature format: 4.0
+package androidx.compose.ui.test {
+
+  public final class ActionsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performClick(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method @Deprecated public static androidx.compose.ui.test.SemanticsNodeInteraction performGesture(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.GestureScope,kotlin.Unit> block);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performMultiModalInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.MultiModalInjectionScope,kotlin.Unit> block);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollTo(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToIndex(androidx.compose.ui.test.SemanticsNodeInteraction, int index);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToKey(androidx.compose.ui.test.SemanticsNodeInteraction, Object key);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToNode(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static <T extends kotlin.Function<? extends java.lang.Boolean>> androidx.compose.ui.test.SemanticsNodeInteraction performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<T>> key, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> invocation);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> key);
+    method @Deprecated public static <T extends kotlin.Function<? extends java.lang.Boolean>> void performSemanticsActionUnit(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<T>> key, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> invocation);
+    method @Deprecated public static void performSemanticsActionUnit(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<? extends java.lang.Boolean>>> key);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performTouchInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.TouchInjectionScope,kotlin.Unit> block);
+  }
+
+  public final class Actions_androidKt {
+  }
+
+  public final class AndroidAssertions_androidKt {
+  }
+
+  public final class AndroidImageHelpers_androidKt {
+    method @RequiresApi(android.os.Build.VERSION_CODES.O) public static androidx.compose.ui.graphics.ImageBitmap captureToImage(androidx.compose.ui.test.SemanticsNodeInteraction);
+  }
+
+  public final class AndroidInputDispatcher_androidKt {
+  }
+
+  public final class AndroidOutput_androidKt {
+  }
+
+  public final class AssertionsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assert(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher, optional kotlin.jvm.functions.Function0<java.lang.String>? messagePrefixOnError);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAll(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAny(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, java.lang.String... values);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertCountEquals(androidx.compose.ui.test.SemanticsNodeInteractionCollection, int expectedSize);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasNoClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsDisplayed(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsEnabled(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsFocused(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotDisplayed(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotEnabled(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotFocused(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotSelected(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsOff(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsOn(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsSelectable(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsSelected(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsToggleable(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertRangeInfoEquals(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.ProgressBarRangeInfo value);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String![] values, optional boolean includeEditableText);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertValueEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value);
+  }
+
+  public final class BoundsAssertionsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHeightIsAtLeast(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHeightIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedHeight);
+    method public static void assertIsEqualTo(float, float expected, String subject, optional float tolerance);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertLeftPositionInRootIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertPositionInRootIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTopPositionInRootIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTouchHeightIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTouchWidthIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedWidth);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsAtLeast(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinWidth);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedWidth);
+    method public static float getAlignmentLinePosition(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public static androidx.compose.ui.unit.DpRect getBoundsInRoot(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.unit.DpRect getUnclippedBoundsInRoot(androidx.compose.ui.test.SemanticsNodeInteraction);
+  }
+
+  public final class ComposeTimeoutException extends java.lang.Throwable {
+    ctor public ComposeTimeoutException(String? message);
+  }
+
+  public final class ErrorMessagesKt {
+  }
+
+  public final class 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);
+    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 KeyInjectionScopeKt {
+  }
+
+  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 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);
+  }
+
+  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 SemanticsSelectorKt {
+  }
+
+  public final class TestContext {
+  }
+
+  public final class TestMonotonicFrameClock_jvmKt {
+  }
+
+  public final class TestOwnerKt {
+  }
+
+  public final class TextActionsKt {
+    method public static void performImeAction(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static void performTextClearance(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static void performTextInput(androidx.compose.ui.test.SemanticsNodeInteraction, String text);
+    method public static void performTextReplacement(androidx.compose.ui.test.SemanticsNodeInteraction, String text);
+  }
+
+  @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);
+  }
+
+  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/src/androidAndroidTest/kotlin/androidx/compose/ui/test/LayoutCoordinatesHelperTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/LayoutCoordinatesHelperTest.kt
index de12ba2..b51b5f1 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/LayoutCoordinatesHelperTest.kt
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/LayoutCoordinatesHelperTest.kt
@@ -16,6 +16,12 @@
 
 package androidx.compose.ui.test
 
+import androidx.compose.animation.core.Animatable
+import androidx.compose.animation.core.AnimationVector2D
+import androidx.compose.animation.core.Spring
+import androidx.compose.animation.core.VectorConverter
+import androidx.compose.animation.core.spring
+import androidx.compose.foundation.background
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
@@ -24,20 +30,31 @@
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.layout.width
 import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Alignment
+import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.composed
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.Matrix
+import androidx.compose.ui.layout.AlignmentLine
 import androidx.compose.ui.layout.LayoutCoordinates
 import androidx.compose.ui.layout.LayoutModifier
 import androidx.compose.ui.layout.Measurable
 import androidx.compose.ui.layout.MeasureResult
 import androidx.compose.ui.layout.MeasureScope
 import androidx.compose.ui.layout.OnPlacedModifier
+import androidx.compose.ui.layout.layout
 import androidx.compose.ui.layout.onGloballyPositioned
 import androidx.compose.ui.layout.onPlaced
+import androidx.compose.ui.layout.positionInParent
 import androidx.compose.ui.layout.positionInRoot
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.testTag
@@ -46,13 +63,16 @@
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.round
+import androidx.compose.ui.unit.toOffset
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
 import com.google.common.truth.Truth.assertThat
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.TimeUnit
+import kotlinx.coroutines.launch
 import org.junit.Assert.assertEquals
 import org.junit.Assert.assertTrue
 import org.junit.Ignore
@@ -202,6 +222,119 @@
     }
 
     @Test
+    @Ignore("b/242125166")
+    fun onPlacedUpToDateWhenModifierChainChanges() {
+        var alignment by mutableStateOf(Alignment.TopStart)
+        val targetOffset = mutableStateOf(Offset.Zero)
+        rule.setContent {
+            CompositionLocalProvider(LocalDensity.provides(Density(1f))) {
+                Box(
+                    Modifier
+                        .size(200.dp)
+                ) {
+                    Box(
+                        modifier = Modifier
+                            .animatePlacement(targetOffset) { alignment }
+                            .align(alignment)
+                            .size(20.dp)
+                            .background(Color.Red)
+                    )
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            assertEquals(
+                calculateExpectedIntOffset(alignment),
+                targetOffset.value
+            )
+            alignment = Alignment.Center
+        }
+        rule.runOnIdle {
+            assertEquals(
+                calculateExpectedIntOffset(alignment),
+                targetOffset.value
+            )
+            alignment = Alignment.BottomEnd
+        }
+        rule.runOnIdle {
+            assertEquals(
+                calculateExpectedIntOffset(alignment),
+                targetOffset.value
+            )
+            alignment = Alignment.TopCenter
+        }
+        rule.runOnIdle {
+            assertEquals(
+                calculateExpectedIntOffset(alignment),
+                targetOffset.value
+            )
+            alignment = Alignment.TopEnd
+        }
+        rule.runOnIdle {
+            assertEquals(
+                calculateExpectedIntOffset(alignment),
+                targetOffset.value
+            )
+        }
+    }
+
+    @OptIn(ExperimentalComposeUiApi::class)
+    private fun Modifier.animatePlacement(
+        targetOffset: MutableState<Offset>,
+        alignment: () -> Alignment
+    ): Modifier = composed {
+        val scope = rememberCoroutineScope()
+        var animatable by remember {
+            mutableStateOf<Animatable<Offset, AnimationVector2D>?>(
+                null
+            )
+        }
+        this
+            .layout { measurable, constraints ->
+                val placeable = measurable.measure(constraints)
+                layout(placeable.width, placeable.height) {
+                    placeable.place(
+                        0, 0
+                    )
+                }
+            }
+            .onPlaced { coordinates ->
+                targetOffset.value = coordinates.positionInParent()
+                assertEquals(calculateExpectedIntOffset(alignment()), targetOffset.value)
+                // Animate to the new target offset when alignment changes.
+                val anim =
+                    animatable ?: Animatable(
+                        targetOffset.value,
+                        Offset.VectorConverter
+                    ).also { animatable = it }
+                if (anim.targetValue != targetOffset.value) {
+                    scope.launch {
+                        anim.animateTo(
+                            targetOffset.value,
+                            spring(stiffness = Spring.StiffnessMediumLow)
+                        )
+                    }
+                }
+            }
+            .layout { measurable, constraints ->
+                val placeable = measurable.measure(constraints)
+                layout(placeable.width, placeable.height) {
+                    placeable.place(
+                        animatable?.let {
+                            (it.value - targetOffset.value).round()
+                        } ?: IntOffset.Zero
+                    )
+                }
+            }
+    }
+
+    private fun calculateExpectedIntOffset(alignment: Alignment) =
+        alignment.align(
+            IntSize(20, 20), IntSize(200, 200), LayoutDirection.Ltr
+        ).toOffset()
+
+    @Test
     fun onPlacedModifierWithLayoutModifier() {
         lateinit var coords: LayoutCoordinates
 
@@ -243,6 +376,55 @@
         }
     }
 
+    @Test(expected = UnsupportedOperationException::class)
+    fun defaultTransformFromThrows() {
+        val layoutCoordinates = object : LayoutCoordinates {
+            override val size: IntSize
+                get() = TODO("Not yet implemented")
+            override val providedAlignmentLines: Set<AlignmentLine>
+                get() = TODO("Not yet implemented")
+            override val parentLayoutCoordinates: LayoutCoordinates?
+                get() = TODO("Not yet implemented")
+            override val parentCoordinates: LayoutCoordinates?
+                get() = TODO("Not yet implemented")
+            override val isAttached: Boolean
+                get() = TODO("Not yet implemented")
+
+            override fun windowToLocal(relativeToWindow: Offset): Offset {
+                TODO("Not yet implemented")
+            }
+
+            override fun localToWindow(relativeToLocal: Offset): Offset {
+                TODO("Not yet implemented")
+            }
+
+            override fun localToRoot(relativeToLocal: Offset): Offset {
+                TODO("Not yet implemented")
+            }
+
+            override fun localPositionOf(
+                sourceCoordinates: LayoutCoordinates,
+                relativeToSource: Offset
+            ): Offset {
+                TODO("Not yet implemented")
+            }
+
+            override fun localBoundingBoxOf(
+                sourceCoordinates: LayoutCoordinates,
+                clipBounds: Boolean
+            ): Rect {
+                TODO("Not yet implemented")
+            }
+
+            override fun get(alignmentLine: AlignmentLine): Int {
+                TODO("Not yet implemented")
+            }
+        }
+        val matrix = Matrix()
+        // This should throw UnsupoportedOperationException
+        layoutCoordinates.transformFrom(layoutCoordinates, matrix)
+    }
+
     private fun LayoutCoordinates.placementInParent() =
         parentCoordinates!!.localPositionOf(this, Offset.Zero).round()
 }
diff --git a/compose/ui/ui-text-google-fonts/api/1.3.0-beta01.txt b/compose/ui/ui-text-google-fonts/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..30ba845
--- /dev/null
+++ b/compose/ui/ui-text-google-fonts/api/1.3.0-beta01.txt
@@ -0,0 +1,11 @@
+// Signature format: 4.0
+package androidx.compose.ui.text.googlefonts {
+
+  public final class FontProviderHelperKt {
+  }
+
+  public final class GoogleFontKt {
+  }
+
+}
+
diff --git a/compose/ui/ui-text-google-fonts/api/public_plus_experimental_1.3.0-beta01.txt b/compose/ui/ui-text-google-fonts/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..57a59de
--- /dev/null
+++ b/compose/ui/ui-text-google-fonts/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,32 @@
+// Signature format: 4.0
+package androidx.compose.ui.text.googlefonts {
+
+  public final class FontProviderHelperKt {
+  }
+
+  @androidx.compose.ui.text.ExperimentalTextApi 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;
+  }
+
+  @androidx.compose.ui.text.ExperimentalTextApi 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);
+    field public static final androidx.compose.ui.text.googlefonts.GoogleFont.Provider.Companion Companion;
+  }
+
+  @androidx.compose.ui.text.ExperimentalTextApi public static final class GoogleFont.Provider.Companion {
+    method public android.net.Uri getAllFontsListUri();
+    property public final android.net.Uri AllFontsListUri;
+  }
+
+  public final class GoogleFontKt {
+    method @androidx.compose.ui.text.ExperimentalTextApi 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 @androidx.compose.ui.text.ExperimentalTextApi public static boolean isAvailableOnDevice(androidx.compose.ui.text.googlefonts.GoogleFont.Provider, android.content.Context context);
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/compose/ui/ui-text-google-fonts/api/res-1.3.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/ui/ui-text-google-fonts/api/res-1.3.0-beta01.txt
diff --git a/compose/ui/ui-text-google-fonts/api/restricted_1.3.0-beta01.txt b/compose/ui/ui-text-google-fonts/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..30ba845
--- /dev/null
+++ b/compose/ui/ui-text-google-fonts/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,11 @@
+// Signature format: 4.0
+package androidx.compose.ui.text.googlefonts {
+
+  public final class FontProviderHelperKt {
+  }
+
+  public final class GoogleFontKt {
+  }
+
+}
+
diff --git a/compose/ui/ui-text/api/1.3.0-beta01.txt b/compose/ui/ui-text/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..057beaf
--- /dev/null
+++ b/compose/ui/ui-text/api/1.3.0-beta01.txt
@@ -0,0 +1,1438 @@
+// 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);
+  }
+
+  @androidx.compose.runtime.Immutable public final class AnnotatedString implements java.lang.CharSequence {
+    ctor public AnnotatedString(String text, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> spanStyles, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.ParagraphStyle>> paragraphStyles);
+    method public operator char get(int index);
+    method public int getLength();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.ParagraphStyle>> getParagraphStyles();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> getSpanStyles();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<java.lang.String>> getStringAnnotations(String tag, int start, int end);
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<java.lang.String>> getStringAnnotations(int start, int end);
+    method public String getText();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.TtsAnnotation>> getTtsAnnotations(int start, int end);
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.AnnotatedString plus(androidx.compose.ui.text.AnnotatedString other);
+    method public androidx.compose.ui.text.AnnotatedString subSequence(int startIndex, int endIndex);
+    method public androidx.compose.ui.text.AnnotatedString subSequence(long range);
+    property public int length;
+    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.ParagraphStyle>> paragraphStyles;
+    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> spanStyles;
+    property public final String text;
+  }
+
+  public static final class AnnotatedString.Builder {
+    ctor public AnnotatedString.Builder(optional int capacity);
+    ctor public AnnotatedString.Builder(String text);
+    ctor public AnnotatedString.Builder(androidx.compose.ui.text.AnnotatedString text);
+    method public void addStringAnnotation(String tag, String annotation, int start, int end);
+    method public void addStyle(androidx.compose.ui.text.SpanStyle style, int start, int end);
+    method public void addStyle(androidx.compose.ui.text.ParagraphStyle style, int start, int end);
+    method public void append(String text);
+    method public void append(char char);
+    method public void append(androidx.compose.ui.text.AnnotatedString text);
+    method public int getLength();
+    method public void pop();
+    method public void pop(int index);
+    method public int pushStringAnnotation(String tag, String annotation);
+    method public int pushStyle(androidx.compose.ui.text.SpanStyle style);
+    method public int pushStyle(androidx.compose.ui.text.ParagraphStyle style);
+    method public int pushTtsAnnotation(androidx.compose.ui.text.TtsAnnotation ttsAnnotation);
+    method public androidx.compose.ui.text.AnnotatedString toAnnotatedString();
+    property public final int length;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class AnnotatedString.Range<T> {
+    ctor public AnnotatedString.Range(T? item, int start, int end, String tag);
+    ctor public AnnotatedString.Range(T? item, int start, int end);
+    method public T! component1();
+    method public int component2();
+    method public int component3();
+    method public String component4();
+    method public androidx.compose.ui.text.AnnotatedString.Range<T> copy(T! item, int start, int end, String tag);
+    method public int getEnd();
+    method public T! getItem();
+    method public int getStart();
+    method public String getTag();
+    property public final int end;
+    property public final T! item;
+    property public final int start;
+    property public final String tag;
+  }
+
+  public final class AnnotatedStringKt {
+    method public static androidx.compose.ui.text.AnnotatedString AnnotatedString(String text, androidx.compose.ui.text.SpanStyle spanStyle, optional androidx.compose.ui.text.ParagraphStyle? paragraphStyle);
+    method public static androidx.compose.ui.text.AnnotatedString AnnotatedString(String text, androidx.compose.ui.text.ParagraphStyle paragraphStyle);
+    method public static inline androidx.compose.ui.text.AnnotatedString buildAnnotatedString(kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,kotlin.Unit> builder);
+    method public static androidx.compose.ui.text.AnnotatedString capitalize(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static androidx.compose.ui.text.AnnotatedString decapitalize(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static androidx.compose.ui.text.AnnotatedString toLowerCase(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static androidx.compose.ui.text.AnnotatedString toUpperCase(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static inline <R> R withStyle(androidx.compose.ui.text.AnnotatedString.Builder, androidx.compose.ui.text.SpanStyle style, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,? extends R> block);
+    method public static inline <R> R withStyle(androidx.compose.ui.text.AnnotatedString.Builder, androidx.compose.ui.text.ParagraphStyle style, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,? extends R> block);
+  }
+
+  public final class JvmAnnotatedString_jvmKt {
+  }
+
+  public final class JvmCharHelpers_androidKt {
+  }
+
+  public final class MultiParagraph {
+    ctor public MultiParagraph(androidx.compose.ui.text.MultiParagraphIntrinsics intrinsics, 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 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);
+    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);
+    ctor public ParagraphStyle(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method public androidx.compose.ui.text.ParagraphStyle copy(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method public 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 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 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);
+    method @Deprecated public boolean getIncludeFontPadding();
+    method public androidx.compose.ui.text.PlatformParagraphStyle merge(androidx.compose.ui.text.PlatformParagraphStyle? other);
+    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);
+    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;
+  }
+
+  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);
+    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 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);
+    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 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);
+    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);
+    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);
+    method public androidx.compose.ui.text.TextStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method public 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 long getLetterSpacing();
+    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 long letterSpacing;
+    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.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 {
+    ctor 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();
+    property public final int loadingStrategy;
+    property public final androidx.compose.ui.text.font.AndroidFont.TypefaceLoader typefaceLoader;
+  }
+
+  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 {
+  }
+
+  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);
+    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);
+  }
+
+  public final class DeviceFontFamilyNameFontKt {
+  }
+
+  public abstract sealed class FileBasedFontFamily extends androidx.compose.ui.text.font.FontFamily {
+  }
+
+  @androidx.compose.runtime.Immutable public interface Font {
+    method public int getStyle();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property public abstract int style;
+    property public abstract androidx.compose.ui.text.font.FontWeight weight;
+    field public static final androidx.compose.ui.text.font.Font.Companion Companion;
+  }
+
+  public static final class Font.Companion {
+  }
+
+  @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 FontFamilyResolverKt {
+  }
+
+  public final class FontFamilyResolver_androidKt {
+    method public static androidx.compose.ui.text.font.FontFamily.Resolver createFontFamilyResolver(android.content.Context context);
+  }
+
+  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;
+  }
+
+  public final class FontListFontFamilyTypefaceAdapterKt {
+  }
+
+  @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 FontSynthesis_androidKt {
+  }
+
+  @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 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();
+    method public int getStyle();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property public final int resId;
+    property public int style;
+    property public androidx.compose.ui.text.font.FontWeight weight;
+  }
+
+  public abstract sealed class SystemFontFamily extends androidx.compose.ui.text.font.FontFamily {
+  }
+
+  public interface Typeface {
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    property public abstract androidx.compose.ui.text.font.FontFamily? fontFamily;
+  }
+
+}
+
+package androidx.compose.ui.text.input {
+
+  public final class BackspaceCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public BackspaceCommand();
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  public final class CommitTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public CommitTextCommand(androidx.compose.ui.text.AnnotatedString annotatedString, int newCursorPosition);
+    ctor public CommitTextCommand(String text, int newCursorPosition);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public androidx.compose.ui.text.AnnotatedString getAnnotatedString();
+    method public int getNewCursorPosition();
+    method public String getText();
+    property public final androidx.compose.ui.text.AnnotatedString annotatedString;
+    property public final int newCursorPosition;
+    property public final String text;
+  }
+
+  public final class DeleteAllCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public DeleteAllCommand();
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  public final class DeleteSurroundingTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public DeleteSurroundingTextCommand(int lengthBeforeCursor, int lengthAfterCursor);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getLengthAfterCursor();
+    method public int getLengthBeforeCursor();
+    property public final int lengthAfterCursor;
+    property public final int lengthBeforeCursor;
+  }
+
+  public final class DeleteSurroundingTextInCodePointsCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public DeleteSurroundingTextInCodePointsCommand(int lengthBeforeCursor, int lengthAfterCursor);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getLengthAfterCursor();
+    method public int getLengthBeforeCursor();
+    property public final int lengthAfterCursor;
+    property public final int lengthBeforeCursor;
+  }
+
+  public interface EditCommand {
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  public final class EditCommandKt {
+  }
+
+  public final class EditProcessor {
+    ctor public EditProcessor();
+    method public androidx.compose.ui.text.input.TextFieldValue apply(java.util.List<? extends androidx.compose.ui.text.input.EditCommand> editCommands);
+    method public void reset(androidx.compose.ui.text.input.TextFieldValue value, androidx.compose.ui.text.input.TextInputSession? textInputSession);
+    method public androidx.compose.ui.text.input.TextFieldValue toTextFieldValue();
+  }
+
+  public final class EditingBuffer {
+    ctor public EditingBuffer(androidx.compose.ui.text.AnnotatedString text, long selection);
+  }
+
+  public final class EditingBufferKt {
+  }
+
+  public final class FinishComposingTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public FinishComposingTextCommand();
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  public final class GapBufferKt {
+  }
+
+  public final class GapBuffer_jvmKt {
+  }
+
+  @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 @Deprecated 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 @Deprecated 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.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();
+    method public String getRegion();
+    method public String getScript();
+    method public String toLanguageTag();
+    property public final String language;
+    property public final String region;
+    property public final String script;
+    field public static final androidx.compose.ui.text.intl.Locale.Companion Companion;
+  }
+
+  public static final class Locale.Companion {
+    method public androidx.compose.ui.text.intl.Locale getCurrent();
+    property public final androidx.compose.ui.text.intl.Locale current;
+  }
+
+  @androidx.compose.runtime.Immutable public final class LocaleList implements java.util.Collection<androidx.compose.ui.text.intl.Locale> kotlin.jvm.internal.markers.KMappedMarker {
+    ctor public LocaleList(java.util.List<androidx.compose.ui.text.intl.Locale> localeList);
+    ctor public LocaleList(String languageTags);
+    ctor public LocaleList(androidx.compose.ui.text.intl.Locale... locales);
+    method public operator boolean contains(androidx.compose.ui.text.intl.Locale element);
+    method public boolean containsAll(java.util.Collection<E!> elements);
+    method public operator androidx.compose.ui.text.intl.Locale get(int i);
+    method public java.util.List<androidx.compose.ui.text.intl.Locale> getLocaleList();
+    method public int getSize();
+    method public boolean isEmpty();
+    method public java.util.Iterator<androidx.compose.ui.text.intl.Locale> iterator();
+    property public final java.util.List<androidx.compose.ui.text.intl.Locale> localeList;
+    property public int size;
+    field public static final androidx.compose.ui.text.intl.LocaleList.Companion Companion;
+  }
+
+  public static final class LocaleList.Companion {
+    method public androidx.compose.ui.text.intl.LocaleList getCurrent();
+    property public final androidx.compose.ui.text.intl.LocaleList current;
+  }
+
+  public final class PlatformLocaleKt {
+  }
+
+}
+
+package androidx.compose.ui.text.platform {
+
+  public final class AndroidAccessibilitySpannableString_androidKt {
+  }
+
+  public final class 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 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 {
+
+  @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);
+  }
+
+  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;
+  }
+
+  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);
+    method public float getScaleX();
+    method public float getSkewX();
+    property public final float scaleX;
+    property public final float skewX;
+    field public static final androidx.compose.ui.text.style.TextGeometricTransform.Companion Companion;
+  }
+
+  public static final class TextGeometricTransform.Companion {
+  }
+
+  public final class TextGeometricTransformKt {
+    method public static androidx.compose.ui.text.style.TextGeometricTransform lerp(androidx.compose.ui.text.style.TextGeometricTransform start, androidx.compose.ui.text.style.TextGeometricTransform stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextIndent {
+    ctor public TextIndent(optional long firstLine, optional long restLine);
+    method public androidx.compose.ui.text.style.TextIndent copy(optional long firstLine, optional long restLine);
+    method public long getFirstLine();
+    method public long getRestLine();
+    property public final long firstLine;
+    property public final long restLine;
+    field public static final androidx.compose.ui.text.style.TextIndent.Companion Companion;
+  }
+
+  public static final class TextIndent.Companion {
+    method public androidx.compose.ui.text.style.TextIndent getNone();
+    property public final androidx.compose.ui.text.style.TextIndent None;
+  }
+
+  public final class TextIndentKt {
+    method public static androidx.compose.ui.text.style.TextIndent lerp(androidx.compose.ui.text.style.TextIndent start, androidx.compose.ui.text.style.TextIndent stop, float fraction);
+  }
+
+  @kotlin.jvm.JvmInline public final value class TextOverflow {
+    field public static final androidx.compose.ui.text.style.TextOverflow.Companion Companion;
+  }
+
+  public static final class TextOverflow.Companion {
+    method public int getClip();
+    method public int getEllipsis();
+    method public int getVisible();
+    property public final int Clip;
+    property public final int Ellipsis;
+    property public final int Visible;
+  }
+
+}
+
diff --git a/compose/ui/ui-text/api/current.ignore b/compose/ui/ui-text/api/current.ignore
index 8fe6362..85b4b37 100644
--- a/compose/ui/ui-text/api/current.ignore
+++ b/compose/ui/ui-text/api/current.ignore
@@ -71,3 +71,21 @@
     Attempted to remove default value from parameter shadow in androidx.compose.ui.text.Paragraph.paint
 DefaultValueChange: androidx.compose.ui.text.Paragraph#paint(androidx.compose.ui.graphics.Canvas, long, androidx.compose.ui.graphics.Shadow, androidx.compose.ui.text.style.TextDecoration) parameter #3:
     Attempted to remove default value from parameter textDecoration in androidx.compose.ui.text.Paragraph.paint
+
+
+RemovedMethod: androidx.compose.ui.text.ParagraphStyle#equals(Object):
+    Removed method androidx.compose.ui.text.ParagraphStyle.equals(Object)
+RemovedMethod: androidx.compose.ui.text.Placeholder#equals(Object):
+    Removed method androidx.compose.ui.text.Placeholder.equals(Object)
+RemovedMethod: androidx.compose.ui.text.SpanStyle#equals(Object):
+    Removed method androidx.compose.ui.text.SpanStyle.equals(Object)
+RemovedMethod: androidx.compose.ui.text.TextLayoutInput#equals(Object):
+    Removed method androidx.compose.ui.text.TextLayoutInput.equals(Object)
+RemovedMethod: androidx.compose.ui.text.TextLayoutResult#equals(Object):
+    Removed method androidx.compose.ui.text.TextLayoutResult.equals(Object)
+RemovedMethod: androidx.compose.ui.text.style.TextDecoration#equals(Object):
+    Removed method androidx.compose.ui.text.style.TextDecoration.equals(Object)
+RemovedMethod: androidx.compose.ui.text.style.TextGeometricTransform#equals(Object):
+    Removed method androidx.compose.ui.text.style.TextGeometricTransform.equals(Object)
+RemovedMethod: androidx.compose.ui.text.style.TextIndent#equals(Object):
+    Removed method androidx.compose.ui.text.style.TextIndent.equals(Object)
diff --git a/compose/ui/ui-text/api/current.txt b/compose/ui/ui-text/api/current.txt
index 060bf6e..057beaf 100644
--- a/compose/ui/ui-text/api/current.txt
+++ b/compose/ui/ui-text/api/current.txt
@@ -226,7 +226,6 @@
     ctor public ParagraphStyle(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
     method public androidx.compose.ui.text.ParagraphStyle copy(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
     method public 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 operator boolean equals(Object? other);
     method public long getLineHeight();
     method public androidx.compose.ui.text.style.LineHeightStyle? getLineHeightStyle();
     method public androidx.compose.ui.text.PlatformParagraphStyle? getPlatformStyle();
@@ -250,7 +249,6 @@
   @androidx.compose.runtime.Immutable public final class Placeholder {
     ctor public Placeholder(long width, long height, int placeholderVerticalAlign);
     method public androidx.compose.ui.text.Placeholder copy(optional long width, optional long height, optional int placeholderVerticalAlign);
-    method public operator boolean equals(Object? other);
     method public long getHeight();
     method public int getPlaceholderVerticalAlign();
     method public long getWidth();
@@ -321,7 +319,6 @@
     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 operator boolean equals(Object? other);
     method public long getBackground();
     method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift();
     method public long getColor();
@@ -378,7 +375,6 @@
     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 operator boolean equals(Object? other);
     method public long getConstraints();
     method public androidx.compose.ui.unit.Density getDensity();
     method public androidx.compose.ui.text.font.FontFamily.Resolver getFontFamilyResolver();
@@ -406,7 +402,6 @@
   public final class TextLayoutResult {
     ctor public TextLayoutResult(androidx.compose.ui.text.TextLayoutInput layoutInput, androidx.compose.ui.text.MultiParagraph multiParagraph, long size);
     method public androidx.compose.ui.text.TextLayoutResult copy(optional androidx.compose.ui.text.TextLayoutInput layoutInput, optional long size);
-    method public operator boolean equals(Object? other);
     method public androidx.compose.ui.text.style.ResolvedTextDirection getBidiRunDirection(int offset);
     method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
     method public androidx.compose.ui.geometry.Rect getCursorRect(int offset);
@@ -597,6 +592,9 @@
 
 package androidx.compose.ui.text.android.style {
 
+  public final class IndentationFixSpanKt {
+  }
+
   public final class LineHeightStyleSpanKt {
   }
 
@@ -642,9 +640,6 @@
   public final class AndroidFontUtils_androidKt {
   }
 
-  public final class AndroidLoadableFontsKt {
-  }
-
   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);
@@ -903,7 +898,6 @@
 
   public interface EditCommand {
     method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
-    method public default String toStringForLog();
   }
 
   public final class EditCommandKt {
@@ -1355,7 +1349,6 @@
 
   @androidx.compose.runtime.Immutable public final class TextDecoration {
     method public operator boolean contains(androidx.compose.ui.text.style.TextDecoration other);
-    method public operator boolean equals(Object? other);
     method public int getMask();
     method public operator androidx.compose.ui.text.style.TextDecoration plus(androidx.compose.ui.text.style.TextDecoration decoration);
     property public final int mask;
@@ -1395,7 +1388,6 @@
   @androidx.compose.runtime.Immutable public final class TextGeometricTransform {
     ctor public TextGeometricTransform(optional float scaleX, optional float skewX);
     method public androidx.compose.ui.text.style.TextGeometricTransform copy(optional float scaleX, optional float skewX);
-    method public operator boolean equals(Object? other);
     method public float getScaleX();
     method public float getSkewX();
     property public final float scaleX;
@@ -1413,7 +1405,6 @@
   @androidx.compose.runtime.Immutable public final class TextIndent {
     ctor public TextIndent(optional long firstLine, optional long restLine);
     method public androidx.compose.ui.text.style.TextIndent copy(optional long firstLine, optional long restLine);
-    method public operator boolean equals(Object? other);
     method public long getFirstLine();
     method public long getRestLine();
     property public final long firstLine;
diff --git a/compose/ui/ui-text/api/public_plus_experimental_1.3.0-beta01.txt b/compose/ui/ui-text/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..cde0c73
--- /dev/null
+++ b/compose/ui/ui-text/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,1535 @@
+// 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);
+  }
+
+  @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 @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.AnnotatedString plus(androidx.compose.ui.text.AnnotatedString other);
+    method public androidx.compose.ui.text.AnnotatedString subSequence(int startIndex, int endIndex);
+    method public androidx.compose.ui.text.AnnotatedString subSequence(long range);
+    property public int length;
+    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.ParagraphStyle>> paragraphStyles;
+    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> spanStyles;
+    property public final String text;
+  }
+
+  public static final class AnnotatedString.Builder {
+    ctor public AnnotatedString.Builder(optional int capacity);
+    ctor public AnnotatedString.Builder(String text);
+    ctor public AnnotatedString.Builder(androidx.compose.ui.text.AnnotatedString text);
+    method public void addStringAnnotation(String tag, String annotation, int start, int end);
+    method public void addStyle(androidx.compose.ui.text.SpanStyle style, int start, int end);
+    method public void addStyle(androidx.compose.ui.text.ParagraphStyle style, int start, int end);
+    method @androidx.compose.ui.text.ExperimentalTextApi public void addTtsAnnotation(androidx.compose.ui.text.TtsAnnotation ttsAnnotation, int start, int end);
+    method @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 void append(char char);
+    method public void append(androidx.compose.ui.text.AnnotatedString text);
+    method public int getLength();
+    method public void pop();
+    method public void pop(int index);
+    method public int pushStringAnnotation(String tag, String annotation);
+    method public int pushStyle(androidx.compose.ui.text.SpanStyle style);
+    method public int pushStyle(androidx.compose.ui.text.ParagraphStyle style);
+    method public int pushTtsAnnotation(androidx.compose.ui.text.TtsAnnotation ttsAnnotation);
+    method @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.RequiresOptIn(message="This API is experimental and is likely to change in the future.") public @interface ExperimentalTextApi {
+  }
+
+  @kotlin.RequiresOptIn(level=kotlin.RequiresOptIn.Level.ERROR, message="This is internal API that may change frequently and without warning.") @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);
+    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, androidx.compose.ui.graphics.Brush brush, optional float alpha, 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 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);
+    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, androidx.compose.ui.graphics.Brush brush, float alpha, 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);
+    ctor public ParagraphStyle(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method public androidx.compose.ui.text.ParagraphStyle copy(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method public 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 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 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);
+    method @Deprecated public boolean getIncludeFontPadding();
+    method public androidx.compose.ui.text.PlatformParagraphStyle merge(androidx.compose.ui.text.PlatformParagraphStyle? other);
+    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);
+    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;
+  }
+
+  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);
+    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);
+    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(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);
+    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 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 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 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);
+    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 size, optional androidx.compose.ui.unit.LayoutDirection layoutDirection, optional androidx.compose.ui.unit.Density density, optional androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver, optional boolean skipCache);
+  }
+
+  public final class TextMeasurerKt {
+  }
+
+  public final class TextPainter {
+    method public void paint(androidx.compose.ui.graphics.Canvas canvas, androidx.compose.ui.text.TextLayoutResult textLayoutResult);
+    field public static final androidx.compose.ui.text.TextPainter INSTANCE;
+  }
+
+  public final class TextPainterKt {
+    method @androidx.compose.ui.text.ExperimentalTextApi public static void drawText(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.text.TextMeasurer textMeasurer, androidx.compose.ui.text.AnnotatedString text, optional long topLeft, optional androidx.compose.ui.text.TextStyle style, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional long size);
+    method @androidx.compose.ui.text.ExperimentalTextApi public static void drawText(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.text.TextMeasurer textMeasurer, String text, optional long topLeft, optional androidx.compose.ui.text.TextStyle style, optional int overflow, optional boolean softWrap, optional int maxLines, optional long size);
+    method @androidx.compose.ui.text.ExperimentalTextApi public static void drawText(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.text.TextLayoutResult textLayoutResult, optional long color, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? textDecoration);
+    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);
+  }
+
+  @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);
+    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);
+    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.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);
+    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);
+    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.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 public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public long getFontSize();
+    method public androidx.compose.ui.text.font.FontStyle? getFontStyle();
+    method public androidx.compose.ui.text.font.FontSynthesis? getFontSynthesis();
+    method public androidx.compose.ui.text.font.FontWeight? getFontWeight();
+    method public long getLetterSpacing();
+    method public long getLineHeight();
+    method public androidx.compose.ui.text.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 @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 public final androidx.compose.ui.text.font.FontFamily? fontFamily;
+    property public final String? fontFeatureSettings;
+    property public final long fontSize;
+    property public final androidx.compose.ui.text.font.FontStyle? fontStyle;
+    property public final androidx.compose.ui.text.font.FontSynthesis? fontSynthesis;
+    property public final androidx.compose.ui.text.font.FontWeight? fontWeight;
+    property public final long letterSpacing;
+    property public final long lineHeight;
+    property public final androidx.compose.ui.text.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 {
+  }
+
+  @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.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY}) public @interface InternalPlatformTextApi {
+  }
+
+  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 {
+    ctor @androidx.compose.ui.text.ExperimentalTextApi public AndroidFont(int loadingStrategy, androidx.compose.ui.text.font.AndroidFont.TypefaceLoader typefaceLoader, androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
+    ctor 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 @androidx.compose.ui.text.ExperimentalTextApi 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 @androidx.compose.ui.text.ExperimentalTextApi 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 @Deprecated @androidx.compose.runtime.Stable @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.font.Font Font(android.content.res.AssetManager assetManager, String path, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
+    method @androidx.compose.runtime.Stable @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.font.Font Font(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 @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.font.Font Font(java.io.File file, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
+    method @RequiresApi(26) @androidx.compose.runtime.Stable @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.font.Font Font(android.os.ParcelFileDescriptor fileDescriptor, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, 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);
+    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);
+  }
+
+  @androidx.compose.ui.text.ExperimentalTextApi @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 @androidx.compose.ui.text.ExperimentalTextApi 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 @androidx.compose.ui.text.ExperimentalTextApi public int getLoadingStrategy();
+    method public int getStyle();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property @androidx.compose.ui.text.ExperimentalTextApi public abstract 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 @androidx.compose.ui.text.ExperimentalTextApi public static final long MaximumAsyncTimeout = 15000L; // 0x3a98L
+  }
+
+  public static final class Font.Companion {
+  }
+
+  @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 FontFamilyResolverKt {
+  }
+
+  public final class FontFamilyResolver_androidKt {
+    method public static androidx.compose.ui.text.font.FontFamily.Resolver createFontFamilyResolver(android.content.Context context);
+    method @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.font.FontFamily.Resolver createFontFamilyResolver(android.content.Context context, kotlin.coroutines.CoroutineContext coroutineContext);
+  }
+
+  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;
+  }
+
+  public final class FontListFontFamilyTypefaceAdapterKt {
+  }
+
+  @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 FontSynthesis_androidKt {
+  }
+
+  @androidx.compose.ui.text.ExperimentalTextApi 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 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);
+    method @androidx.compose.ui.text.ExperimentalTextApi public int getLoadingStrategy();
+    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 EditCommandKt {
+  }
+
+  public final class EditProcessor {
+    ctor public EditProcessor();
+    method public androidx.compose.ui.text.input.TextFieldValue apply(java.util.List<? extends androidx.compose.ui.text.input.EditCommand> editCommands);
+    method public void reset(androidx.compose.ui.text.input.TextFieldValue value, androidx.compose.ui.text.input.TextInputSession? textInputSession);
+    method public androidx.compose.ui.text.input.TextFieldValue toTextFieldValue();
+  }
+
+  public final class EditingBuffer {
+    ctor public EditingBuffer(androidx.compose.ui.text.AnnotatedString text, long selection);
+  }
+
+  public final class EditingBufferKt {
+  }
+
+  public final class FinishComposingTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public FinishComposingTextCommand();
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  public final class GapBufferKt {
+  }
+
+  public final class GapBuffer_jvmKt {
+  }
+
+  @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 @Deprecated 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 @Deprecated 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.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();
+    method public String getRegion();
+    method public String getScript();
+    method public String toLanguageTag();
+    property public final String language;
+    property public final String region;
+    property public final String script;
+    field public static final androidx.compose.ui.text.intl.Locale.Companion Companion;
+  }
+
+  public static final class Locale.Companion {
+    method public androidx.compose.ui.text.intl.Locale getCurrent();
+    property public final androidx.compose.ui.text.intl.Locale current;
+  }
+
+  @androidx.compose.runtime.Immutable public final class LocaleList implements java.util.Collection<androidx.compose.ui.text.intl.Locale> kotlin.jvm.internal.markers.KMappedMarker {
+    ctor public LocaleList(java.util.List<androidx.compose.ui.text.intl.Locale> localeList);
+    ctor public LocaleList(String languageTags);
+    ctor public LocaleList(androidx.compose.ui.text.intl.Locale... locales);
+    method public operator boolean contains(androidx.compose.ui.text.intl.Locale element);
+    method public boolean containsAll(java.util.Collection<E!> elements);
+    method public operator androidx.compose.ui.text.intl.Locale get(int i);
+    method public java.util.List<androidx.compose.ui.text.intl.Locale> getLocaleList();
+    method public int getSize();
+    method public boolean isEmpty();
+    method public java.util.Iterator<androidx.compose.ui.text.intl.Locale> iterator();
+    property public final java.util.List<androidx.compose.ui.text.intl.Locale> localeList;
+    property public int size;
+    field public static final androidx.compose.ui.text.intl.LocaleList.Companion Companion;
+  }
+
+  public static final class LocaleList.Companion {
+    method public androidx.compose.ui.text.intl.LocaleList getCurrent();
+    property public final androidx.compose.ui.text.intl.LocaleList current;
+  }
+
+  public final class PlatformLocaleKt {
+  }
+
+}
+
+package androidx.compose.ui.text.platform {
+
+  public final class AndroidAccessibilitySpannableString_androidKt {
+  }
+
+  public final class 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 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 {
+    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);
+  }
+
+  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;
+  }
+
+  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);
+    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/public_plus_experimental_current.txt b/compose/ui/ui-text/api/public_plus_experimental_current.txt
index 23c639f..cde0c73 100644
--- a/compose/ui/ui-text/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-text/api/public_plus_experimental_current.txt
@@ -241,7 +241,6 @@
     ctor public ParagraphStyle(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
     method public androidx.compose.ui.text.ParagraphStyle copy(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
     method public 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 operator boolean equals(Object? other);
     method public long getLineHeight();
     method public androidx.compose.ui.text.style.LineHeightStyle? getLineHeightStyle();
     method public androidx.compose.ui.text.PlatformParagraphStyle? getPlatformStyle();
@@ -265,7 +264,6 @@
   @androidx.compose.runtime.Immutable public final class Placeholder {
     ctor public Placeholder(long width, long height, int placeholderVerticalAlign);
     method public androidx.compose.ui.text.Placeholder copy(optional long width, optional long height, optional int placeholderVerticalAlign);
-    method public operator boolean equals(Object? other);
     method public long getHeight();
     method public int getPlaceholderVerticalAlign();
     method public long getWidth();
@@ -338,7 +336,6 @@
     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(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);
-    method public operator boolean equals(Object? other);
     method @androidx.compose.ui.text.ExperimentalTextApi public float getAlpha();
     method public long getBackground();
     method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift();
@@ -399,7 +396,6 @@
     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 operator boolean equals(Object? other);
     method public long getConstraints();
     method public androidx.compose.ui.unit.Density getDensity();
     method public androidx.compose.ui.text.font.FontFamily.Resolver getFontFamilyResolver();
@@ -427,7 +423,6 @@
   public final class TextLayoutResult {
     ctor public TextLayoutResult(androidx.compose.ui.text.TextLayoutInput layoutInput, androidx.compose.ui.text.MultiParagraph multiParagraph, long size);
     method public androidx.compose.ui.text.TextLayoutResult copy(optional androidx.compose.ui.text.TextLayoutInput layoutInput, optional long size);
-    method public operator boolean equals(Object? other);
     method public androidx.compose.ui.text.style.ResolvedTextDirection getBidiRunDirection(int offset);
     method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
     method public androidx.compose.ui.geometry.Rect getCursorRect(int offset);
@@ -642,6 +637,9 @@
 
 package androidx.compose.ui.text.android.style {
 
+  public final class IndentationFixSpanKt {
+  }
+
   public final class LineHeightStyleSpanKt {
   }
 
@@ -679,6 +677,10 @@
   }
 
   public final class AndroidFontKt {
+    method @Deprecated @androidx.compose.runtime.Stable @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.font.Font Font(android.content.res.AssetManager assetManager, String path, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
+    method @androidx.compose.runtime.Stable @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.font.Font Font(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 @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.font.Font Font(java.io.File file, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
+    method @RequiresApi(26) @androidx.compose.runtime.Stable @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.font.Font Font(android.os.ParcelFileDescriptor fileDescriptor, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
   }
 
   public final class AndroidFontLoader_androidKt {
@@ -690,13 +692,6 @@
   public final class AndroidFontUtils_androidKt {
   }
 
-  public final class AndroidLoadableFontsKt {
-    method @Deprecated @androidx.compose.runtime.Stable @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.font.Font Font(android.content.res.AssetManager assetManager, String path, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
-    method @androidx.compose.runtime.Stable @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.font.Font Font(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 @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.font.Font Font(java.io.File file, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
-    method @RequiresApi(26) @androidx.compose.runtime.Stable @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.font.Font Font(android.os.ParcelFileDescriptor fileDescriptor, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, 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);
@@ -851,7 +846,7 @@
     field public static final androidx.compose.ui.text.font.FontVariation INSTANCE;
   }
 
-  @androidx.compose.runtime.Immutable public static interface FontVariation.Setting {
+  @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);
@@ -998,7 +993,6 @@
 
   public interface EditCommand {
     method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
-    method public default String toStringForLog();
   }
 
   public final class EditCommandKt {
@@ -1452,7 +1446,6 @@
 
   @androidx.compose.runtime.Immutable public final class TextDecoration {
     method public operator boolean contains(androidx.compose.ui.text.style.TextDecoration other);
-    method public operator boolean equals(Object? other);
     method public int getMask();
     method public operator androidx.compose.ui.text.style.TextDecoration plus(androidx.compose.ui.text.style.TextDecoration decoration);
     property public final int mask;
@@ -1492,7 +1485,6 @@
   @androidx.compose.runtime.Immutable public final class TextGeometricTransform {
     ctor public TextGeometricTransform(optional float scaleX, optional float skewX);
     method public androidx.compose.ui.text.style.TextGeometricTransform copy(optional float scaleX, optional float skewX);
-    method public operator boolean equals(Object? other);
     method public float getScaleX();
     method public float getSkewX();
     property public final float scaleX;
@@ -1510,7 +1502,6 @@
   @androidx.compose.runtime.Immutable public final class TextIndent {
     ctor public TextIndent(optional long firstLine, optional long restLine);
     method public androidx.compose.ui.text.style.TextIndent copy(optional long firstLine, optional long restLine);
-    method public operator boolean equals(Object? other);
     method public long getFirstLine();
     method public long getRestLine();
     property public final long firstLine;
diff --git a/health/health-connect-client/api/res-current.txt b/compose/ui/ui-text/api/res-1.3.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/ui/ui-text/api/res-1.3.0-beta01.txt
diff --git a/compose/ui/ui-text/api/restricted_1.3.0-beta01.txt b/compose/ui/ui-text/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..057beaf
--- /dev/null
+++ b/compose/ui/ui-text/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,1438 @@
+// 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);
+  }
+
+  @androidx.compose.runtime.Immutable public final class AnnotatedString implements java.lang.CharSequence {
+    ctor public AnnotatedString(String text, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> spanStyles, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.ParagraphStyle>> paragraphStyles);
+    method public operator char get(int index);
+    method public int getLength();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.ParagraphStyle>> getParagraphStyles();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> getSpanStyles();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<java.lang.String>> getStringAnnotations(String tag, int start, int end);
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<java.lang.String>> getStringAnnotations(int start, int end);
+    method public String getText();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.TtsAnnotation>> getTtsAnnotations(int start, int end);
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.AnnotatedString plus(androidx.compose.ui.text.AnnotatedString other);
+    method public androidx.compose.ui.text.AnnotatedString subSequence(int startIndex, int endIndex);
+    method public androidx.compose.ui.text.AnnotatedString subSequence(long range);
+    property public int length;
+    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.ParagraphStyle>> paragraphStyles;
+    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> spanStyles;
+    property public final String text;
+  }
+
+  public static final class AnnotatedString.Builder {
+    ctor public AnnotatedString.Builder(optional int capacity);
+    ctor public AnnotatedString.Builder(String text);
+    ctor public AnnotatedString.Builder(androidx.compose.ui.text.AnnotatedString text);
+    method public void addStringAnnotation(String tag, String annotation, int start, int end);
+    method public void addStyle(androidx.compose.ui.text.SpanStyle style, int start, int end);
+    method public void addStyle(androidx.compose.ui.text.ParagraphStyle style, int start, int end);
+    method public void append(String text);
+    method public void append(char char);
+    method public void append(androidx.compose.ui.text.AnnotatedString text);
+    method public int getLength();
+    method public void pop();
+    method public void pop(int index);
+    method public int pushStringAnnotation(String tag, String annotation);
+    method public int pushStyle(androidx.compose.ui.text.SpanStyle style);
+    method public int pushStyle(androidx.compose.ui.text.ParagraphStyle style);
+    method public int pushTtsAnnotation(androidx.compose.ui.text.TtsAnnotation ttsAnnotation);
+    method public androidx.compose.ui.text.AnnotatedString toAnnotatedString();
+    property public final int length;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class AnnotatedString.Range<T> {
+    ctor public AnnotatedString.Range(T? item, int start, int end, String tag);
+    ctor public AnnotatedString.Range(T? item, int start, int end);
+    method public T! component1();
+    method public int component2();
+    method public int component3();
+    method public String component4();
+    method public androidx.compose.ui.text.AnnotatedString.Range<T> copy(T! item, int start, int end, String tag);
+    method public int getEnd();
+    method public T! getItem();
+    method public int getStart();
+    method public String getTag();
+    property public final int end;
+    property public final T! item;
+    property public final int start;
+    property public final String tag;
+  }
+
+  public final class AnnotatedStringKt {
+    method public static androidx.compose.ui.text.AnnotatedString AnnotatedString(String text, androidx.compose.ui.text.SpanStyle spanStyle, optional androidx.compose.ui.text.ParagraphStyle? paragraphStyle);
+    method public static androidx.compose.ui.text.AnnotatedString AnnotatedString(String text, androidx.compose.ui.text.ParagraphStyle paragraphStyle);
+    method public static inline androidx.compose.ui.text.AnnotatedString buildAnnotatedString(kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,kotlin.Unit> builder);
+    method public static androidx.compose.ui.text.AnnotatedString capitalize(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static androidx.compose.ui.text.AnnotatedString decapitalize(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static androidx.compose.ui.text.AnnotatedString toLowerCase(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static androidx.compose.ui.text.AnnotatedString toUpperCase(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static inline <R> R withStyle(androidx.compose.ui.text.AnnotatedString.Builder, androidx.compose.ui.text.SpanStyle style, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,? extends R> block);
+    method public static inline <R> R withStyle(androidx.compose.ui.text.AnnotatedString.Builder, androidx.compose.ui.text.ParagraphStyle style, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,? extends R> block);
+  }
+
+  public final class JvmAnnotatedString_jvmKt {
+  }
+
+  public final class JvmCharHelpers_androidKt {
+  }
+
+  public final class MultiParagraph {
+    ctor public MultiParagraph(androidx.compose.ui.text.MultiParagraphIntrinsics intrinsics, 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 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);
+    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);
+    ctor public ParagraphStyle(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method public androidx.compose.ui.text.ParagraphStyle copy(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method public 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 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 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);
+    method @Deprecated public boolean getIncludeFontPadding();
+    method public androidx.compose.ui.text.PlatformParagraphStyle merge(androidx.compose.ui.text.PlatformParagraphStyle? other);
+    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);
+    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;
+  }
+
+  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);
+    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 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);
+    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 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);
+    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);
+    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);
+    method public androidx.compose.ui.text.TextStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method public 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 long getLetterSpacing();
+    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 long letterSpacing;
+    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.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 {
+    ctor 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();
+    property public final int loadingStrategy;
+    property public final androidx.compose.ui.text.font.AndroidFont.TypefaceLoader typefaceLoader;
+  }
+
+  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 {
+  }
+
+  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);
+    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);
+  }
+
+  public final class DeviceFontFamilyNameFontKt {
+  }
+
+  public abstract sealed class FileBasedFontFamily extends androidx.compose.ui.text.font.FontFamily {
+  }
+
+  @androidx.compose.runtime.Immutable public interface Font {
+    method public int getStyle();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property public abstract int style;
+    property public abstract androidx.compose.ui.text.font.FontWeight weight;
+    field public static final androidx.compose.ui.text.font.Font.Companion Companion;
+  }
+
+  public static final class Font.Companion {
+  }
+
+  @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 FontFamilyResolverKt {
+  }
+
+  public final class FontFamilyResolver_androidKt {
+    method public static androidx.compose.ui.text.font.FontFamily.Resolver createFontFamilyResolver(android.content.Context context);
+  }
+
+  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;
+  }
+
+  public final class FontListFontFamilyTypefaceAdapterKt {
+  }
+
+  @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 FontSynthesis_androidKt {
+  }
+
+  @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 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();
+    method public int getStyle();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property public final int resId;
+    property public int style;
+    property public androidx.compose.ui.text.font.FontWeight weight;
+  }
+
+  public abstract sealed class SystemFontFamily extends androidx.compose.ui.text.font.FontFamily {
+  }
+
+  public interface Typeface {
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    property public abstract androidx.compose.ui.text.font.FontFamily? fontFamily;
+  }
+
+}
+
+package androidx.compose.ui.text.input {
+
+  public final class BackspaceCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public BackspaceCommand();
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  public final class CommitTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public CommitTextCommand(androidx.compose.ui.text.AnnotatedString annotatedString, int newCursorPosition);
+    ctor public CommitTextCommand(String text, int newCursorPosition);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public androidx.compose.ui.text.AnnotatedString getAnnotatedString();
+    method public int getNewCursorPosition();
+    method public String getText();
+    property public final androidx.compose.ui.text.AnnotatedString annotatedString;
+    property public final int newCursorPosition;
+    property public final String text;
+  }
+
+  public final class DeleteAllCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public DeleteAllCommand();
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  public final class DeleteSurroundingTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public DeleteSurroundingTextCommand(int lengthBeforeCursor, int lengthAfterCursor);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getLengthAfterCursor();
+    method public int getLengthBeforeCursor();
+    property public final int lengthAfterCursor;
+    property public final int lengthBeforeCursor;
+  }
+
+  public final class DeleteSurroundingTextInCodePointsCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public DeleteSurroundingTextInCodePointsCommand(int lengthBeforeCursor, int lengthAfterCursor);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getLengthAfterCursor();
+    method public int getLengthBeforeCursor();
+    property public final int lengthAfterCursor;
+    property public final int lengthBeforeCursor;
+  }
+
+  public interface EditCommand {
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  public final class EditCommandKt {
+  }
+
+  public final class EditProcessor {
+    ctor public EditProcessor();
+    method public androidx.compose.ui.text.input.TextFieldValue apply(java.util.List<? extends androidx.compose.ui.text.input.EditCommand> editCommands);
+    method public void reset(androidx.compose.ui.text.input.TextFieldValue value, androidx.compose.ui.text.input.TextInputSession? textInputSession);
+    method public androidx.compose.ui.text.input.TextFieldValue toTextFieldValue();
+  }
+
+  public final class EditingBuffer {
+    ctor public EditingBuffer(androidx.compose.ui.text.AnnotatedString text, long selection);
+  }
+
+  public final class EditingBufferKt {
+  }
+
+  public final class FinishComposingTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public FinishComposingTextCommand();
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  public final class GapBufferKt {
+  }
+
+  public final class GapBuffer_jvmKt {
+  }
+
+  @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 @Deprecated 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 @Deprecated 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.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();
+    method public String getRegion();
+    method public String getScript();
+    method public String toLanguageTag();
+    property public final String language;
+    property public final String region;
+    property public final String script;
+    field public static final androidx.compose.ui.text.intl.Locale.Companion Companion;
+  }
+
+  public static final class Locale.Companion {
+    method public androidx.compose.ui.text.intl.Locale getCurrent();
+    property public final androidx.compose.ui.text.intl.Locale current;
+  }
+
+  @androidx.compose.runtime.Immutable public final class LocaleList implements java.util.Collection<androidx.compose.ui.text.intl.Locale> kotlin.jvm.internal.markers.KMappedMarker {
+    ctor public LocaleList(java.util.List<androidx.compose.ui.text.intl.Locale> localeList);
+    ctor public LocaleList(String languageTags);
+    ctor public LocaleList(androidx.compose.ui.text.intl.Locale... locales);
+    method public operator boolean contains(androidx.compose.ui.text.intl.Locale element);
+    method public boolean containsAll(java.util.Collection<E!> elements);
+    method public operator androidx.compose.ui.text.intl.Locale get(int i);
+    method public java.util.List<androidx.compose.ui.text.intl.Locale> getLocaleList();
+    method public int getSize();
+    method public boolean isEmpty();
+    method public java.util.Iterator<androidx.compose.ui.text.intl.Locale> iterator();
+    property public final java.util.List<androidx.compose.ui.text.intl.Locale> localeList;
+    property public int size;
+    field public static final androidx.compose.ui.text.intl.LocaleList.Companion Companion;
+  }
+
+  public static final class LocaleList.Companion {
+    method public androidx.compose.ui.text.intl.LocaleList getCurrent();
+    property public final androidx.compose.ui.text.intl.LocaleList current;
+  }
+
+  public final class PlatformLocaleKt {
+  }
+
+}
+
+package androidx.compose.ui.text.platform {
+
+  public final class AndroidAccessibilitySpannableString_androidKt {
+  }
+
+  public final class 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 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 {
+
+  @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);
+  }
+
+  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;
+  }
+
+  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);
+    method public float getScaleX();
+    method public float getSkewX();
+    property public final float scaleX;
+    property public final float skewX;
+    field public static final androidx.compose.ui.text.style.TextGeometricTransform.Companion Companion;
+  }
+
+  public static final class TextGeometricTransform.Companion {
+  }
+
+  public final class TextGeometricTransformKt {
+    method public static androidx.compose.ui.text.style.TextGeometricTransform lerp(androidx.compose.ui.text.style.TextGeometricTransform start, androidx.compose.ui.text.style.TextGeometricTransform stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextIndent {
+    ctor public TextIndent(optional long firstLine, optional long restLine);
+    method public androidx.compose.ui.text.style.TextIndent copy(optional long firstLine, optional long restLine);
+    method public long getFirstLine();
+    method public long getRestLine();
+    property public final long firstLine;
+    property public final long restLine;
+    field public static final androidx.compose.ui.text.style.TextIndent.Companion Companion;
+  }
+
+  public static final class TextIndent.Companion {
+    method public androidx.compose.ui.text.style.TextIndent getNone();
+    property public final androidx.compose.ui.text.style.TextIndent None;
+  }
+
+  public final class TextIndentKt {
+    method public static androidx.compose.ui.text.style.TextIndent lerp(androidx.compose.ui.text.style.TextIndent start, androidx.compose.ui.text.style.TextIndent stop, float fraction);
+  }
+
+  @kotlin.jvm.JvmInline public final value class TextOverflow {
+    field public static final androidx.compose.ui.text.style.TextOverflow.Companion Companion;
+  }
+
+  public static final class TextOverflow.Companion {
+    method public int getClip();
+    method public int getEllipsis();
+    method public int getVisible();
+    property public final int Clip;
+    property public final int Ellipsis;
+    property public final int Visible;
+  }
+
+}
+
diff --git a/compose/ui/ui-text/api/restricted_current.ignore b/compose/ui/ui-text/api/restricted_current.ignore
index 8fe6362..85b4b37 100644
--- a/compose/ui/ui-text/api/restricted_current.ignore
+++ b/compose/ui/ui-text/api/restricted_current.ignore
@@ -71,3 +71,21 @@
     Attempted to remove default value from parameter shadow in androidx.compose.ui.text.Paragraph.paint
 DefaultValueChange: androidx.compose.ui.text.Paragraph#paint(androidx.compose.ui.graphics.Canvas, long, androidx.compose.ui.graphics.Shadow, androidx.compose.ui.text.style.TextDecoration) parameter #3:
     Attempted to remove default value from parameter textDecoration in androidx.compose.ui.text.Paragraph.paint
+
+
+RemovedMethod: androidx.compose.ui.text.ParagraphStyle#equals(Object):
+    Removed method androidx.compose.ui.text.ParagraphStyle.equals(Object)
+RemovedMethod: androidx.compose.ui.text.Placeholder#equals(Object):
+    Removed method androidx.compose.ui.text.Placeholder.equals(Object)
+RemovedMethod: androidx.compose.ui.text.SpanStyle#equals(Object):
+    Removed method androidx.compose.ui.text.SpanStyle.equals(Object)
+RemovedMethod: androidx.compose.ui.text.TextLayoutInput#equals(Object):
+    Removed method androidx.compose.ui.text.TextLayoutInput.equals(Object)
+RemovedMethod: androidx.compose.ui.text.TextLayoutResult#equals(Object):
+    Removed method androidx.compose.ui.text.TextLayoutResult.equals(Object)
+RemovedMethod: androidx.compose.ui.text.style.TextDecoration#equals(Object):
+    Removed method androidx.compose.ui.text.style.TextDecoration.equals(Object)
+RemovedMethod: androidx.compose.ui.text.style.TextGeometricTransform#equals(Object):
+    Removed method androidx.compose.ui.text.style.TextGeometricTransform.equals(Object)
+RemovedMethod: androidx.compose.ui.text.style.TextIndent#equals(Object):
+    Removed method androidx.compose.ui.text.style.TextIndent.equals(Object)
diff --git a/compose/ui/ui-text/api/restricted_current.txt b/compose/ui/ui-text/api/restricted_current.txt
index 060bf6e..057beaf 100644
--- a/compose/ui/ui-text/api/restricted_current.txt
+++ b/compose/ui/ui-text/api/restricted_current.txt
@@ -226,7 +226,6 @@
     ctor public ParagraphStyle(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
     method public androidx.compose.ui.text.ParagraphStyle copy(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
     method public 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 operator boolean equals(Object? other);
     method public long getLineHeight();
     method public androidx.compose.ui.text.style.LineHeightStyle? getLineHeightStyle();
     method public androidx.compose.ui.text.PlatformParagraphStyle? getPlatformStyle();
@@ -250,7 +249,6 @@
   @androidx.compose.runtime.Immutable public final class Placeholder {
     ctor public Placeholder(long width, long height, int placeholderVerticalAlign);
     method public androidx.compose.ui.text.Placeholder copy(optional long width, optional long height, optional int placeholderVerticalAlign);
-    method public operator boolean equals(Object? other);
     method public long getHeight();
     method public int getPlaceholderVerticalAlign();
     method public long getWidth();
@@ -321,7 +319,6 @@
     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 operator boolean equals(Object? other);
     method public long getBackground();
     method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift();
     method public long getColor();
@@ -378,7 +375,6 @@
     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 operator boolean equals(Object? other);
     method public long getConstraints();
     method public androidx.compose.ui.unit.Density getDensity();
     method public androidx.compose.ui.text.font.FontFamily.Resolver getFontFamilyResolver();
@@ -406,7 +402,6 @@
   public final class TextLayoutResult {
     ctor public TextLayoutResult(androidx.compose.ui.text.TextLayoutInput layoutInput, androidx.compose.ui.text.MultiParagraph multiParagraph, long size);
     method public androidx.compose.ui.text.TextLayoutResult copy(optional androidx.compose.ui.text.TextLayoutInput layoutInput, optional long size);
-    method public operator boolean equals(Object? other);
     method public androidx.compose.ui.text.style.ResolvedTextDirection getBidiRunDirection(int offset);
     method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
     method public androidx.compose.ui.geometry.Rect getCursorRect(int offset);
@@ -597,6 +592,9 @@
 
 package androidx.compose.ui.text.android.style {
 
+  public final class IndentationFixSpanKt {
+  }
+
   public final class LineHeightStyleSpanKt {
   }
 
@@ -642,9 +640,6 @@
   public final class AndroidFontUtils_androidKt {
   }
 
-  public final class AndroidLoadableFontsKt {
-  }
-
   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);
@@ -903,7 +898,6 @@
 
   public interface EditCommand {
     method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
-    method public default String toStringForLog();
   }
 
   public final class EditCommandKt {
@@ -1355,7 +1349,6 @@
 
   @androidx.compose.runtime.Immutable public final class TextDecoration {
     method public operator boolean contains(androidx.compose.ui.text.style.TextDecoration other);
-    method public operator boolean equals(Object? other);
     method public int getMask();
     method public operator androidx.compose.ui.text.style.TextDecoration plus(androidx.compose.ui.text.style.TextDecoration decoration);
     property public final int mask;
@@ -1395,7 +1388,6 @@
   @androidx.compose.runtime.Immutable public final class TextGeometricTransform {
     ctor public TextGeometricTransform(optional float scaleX, optional float skewX);
     method public androidx.compose.ui.text.style.TextGeometricTransform copy(optional float scaleX, optional float skewX);
-    method public operator boolean equals(Object? other);
     method public float getScaleX();
     method public float getSkewX();
     property public final float scaleX;
@@ -1413,7 +1405,6 @@
   @androidx.compose.runtime.Immutable public final class TextIndent {
     ctor public TextIndent(optional long firstLine, optional long restLine);
     method public androidx.compose.ui.text.style.TextIndent copy(optional long firstLine, optional long restLine);
-    method public operator boolean equals(Object? other);
     method public long getFirstLine();
     method public long getRestLine();
     property public final long firstLine;
diff --git a/compose/ui/ui-text/lint-baseline.xml b/compose/ui/ui-text/lint-baseline.xml
index 50cfa08..2168b87 100644
--- a/compose/ui/ui-text/lint-baseline.xml
+++ b/compose/ui/ui-text/lint-baseline.xml
@@ -29,465 +29,6 @@
     </issue>
 
     <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="    @OptIn(InternalPlatformTextApi::class, ExperimentalTextApi::class)"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidFontListTypeface.android.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class, ExperimentalTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/text/AndroidParagraph.android.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/text/AndroidParagraph.android.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/text/AndroidParagraph.android.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class, ExperimentalTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphHelper.android.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphIntrinsics.android.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphIntrinsics.android.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphIntrinsics.android.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@InternalPlatformTextApi"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/style/BaselineShiftSpan.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/BoringLayoutFactory.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/BoringLayoutFactory.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@InternalPlatformTextApi"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/style/FontFeatureSpan.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@InternalPlatformTextApi"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/LayoutCompat.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@InternalPlatformTextApi"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/LayoutCompat.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@InternalPlatformTextApi"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/LayoutHelper.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@InternalPlatformTextApi"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/LayoutIntrinsics.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/LayoutIntrinsics.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@InternalPlatformTextApi"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/style/LetterSpacingSpanEm.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@InternalPlatformTextApi"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/style/LetterSpacingSpanPx.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@InternalPlatformTextApi"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/style/LineHeightSpan.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@InternalPlatformTextApi"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/style/LineHeightStyleSpan.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/PlaceholderExtensions.android.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@InternalPlatformTextApi"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/style/PlaceholderSpan.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@InternalPlatformTextApi"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/animation/SegmentBreaker.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@InternalPlatformTextApi"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/animation/SegmentBreaker.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@InternalPlatformTextApi"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/animation/SegmentType.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@InternalPlatformTextApi"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/style/ShadowSpan.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@InternalPlatformTextApi"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/style/SkewXSpan.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class, ExperimentalTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@InternalPlatformTextApi"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/style/TextDecorationSpan.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@InternalPlatformTextApi"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@OptIn(InternalPlatformTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@InternalPlatformTextApi"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/style/TypefaceSpan.kt"/>
-    </issue>
-
-    <issue
-        id="NullAnnotationGroup"
-        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
-        errorLine1="@InternalPlatformTextApi"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/selection/WordBoundary.kt"/>
-    </issue>
-
-    <issue
         id="ListIterator"
         message="Creating an unnecessary Iterator to iterate through a List"
         errorLine1="        paragraphStyles.sortedBy { it.start }.fastForEach { paragraphStyle ->"
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationIndentationFixTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationIndentationFixTest.kt
new file mode 100644
index 0000000..8ea12f4
--- /dev/null
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationIndentationFixTest.kt
@@ -0,0 +1,264 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.ui.text
+
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.text.font.toFontFamily
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.text.style.TextIndent
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.TextUnit
+import androidx.compose.ui.unit.em
+import androidx.compose.ui.unit.sp
+import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class ParagraphIntegrationIndentationFixTest {
+    private val fontFamilyMeasureFont = FontTestData.BASIC_MEASURE_FONT.toFontFamily()
+    private val lastLine = 2
+    private val fontSize = 10
+    private val letterSpacing = 5
+    private val emLetterSpacing = (letterSpacing.toFloat() / fontSize).em
+    private val charWidth = fontSize + letterSpacing
+    private val repeatCount = 20
+    private val ltrChar = "a"
+    private val rtlChar = "\u05D0"
+    private val lineStartOffsets = arrayOf(0, 3, 6)
+
+    @Test
+    fun getLineLeftAndGetLineRight_Ltr() {
+        val paragraph = paragraph(ltrChar.repeat(repeatCount))
+        for (line in 0 until paragraph.lineCount) {
+            assertThat(paragraph.getLineRight(line)).isEqualTo(paragraph.width)
+            assertThat(paragraph.getLineLeft(line)).isEqualTo(0f)
+        }
+    }
+
+    @Test
+    fun getLineLeftAndGetLineRight_Rtl() {
+        val paragraph = paragraph(rtlChar.repeat(repeatCount))
+        for (line in 0 until paragraph.lineCount) {
+            assertThat(paragraph.getLineLeft(line)).isEqualTo(0)
+            assertThat(paragraph.getLineRight(line)).isEqualTo(paragraph.width)
+        }
+    }
+
+    @Test
+    fun getLineLeftAndGetLineRight_Ltr_TextIndent() {
+        val paragraph = paragraph(
+            text = ltrChar.repeat(repeatCount),
+            textIndent = TextIndent(firstLine = charWidth.sp, restLine = charWidth.sp)
+        )
+        for (line in 0 until paragraph.lineCount) {
+            assertThat(paragraph.getLineRight(line)).isEqualTo(paragraph.width)
+            val expectedLeft = if (line == paragraph.lineCount - 1) -charWidth else 0f
+            assertThat(paragraph.getLineLeft(line)).isEqualTo(expectedLeft)
+        }
+    }
+
+    @Test
+    fun getHorizontalPosition_Ltr() {
+        val paragraph = paragraph(ltrChar.repeat(repeatCount))
+        lineStartOffsets.forEach { offset ->
+            assertThat(
+                paragraph.getHorizontalPosition(offset, usePrimaryDirection = true)
+            ).isEqualTo(0f)
+
+            assertThat(
+                paragraph.getHorizontalPosition(offset, usePrimaryDirection = false)
+            ).isEqualTo(0f)
+        }
+    }
+
+    @Test
+    fun getHorizontalPosition_Rtl() {
+        val paragraph = paragraph(rtlChar.repeat(repeatCount))
+        lineStartOffsets.forEach { offset ->
+            assertThat(
+                paragraph.getHorizontalPosition(offset, usePrimaryDirection = true)
+            ).isEqualTo(paragraph.width)
+
+            assertThat(
+                paragraph.getHorizontalPosition(offset, usePrimaryDirection = false)
+            ).isEqualTo(paragraph.width)
+        }
+    }
+
+    @Test
+    fun getOffsetForPosition_Ltr() {
+        val paragraph = paragraph(ltrChar.repeat(repeatCount))
+        for (line in 0 until paragraph.lineCount) {
+            assertThat(
+                paragraph.getOffsetForPosition(Offset(1f, line * fontSize + 1f))
+            ).isEqualTo(lineStartOffsets[line])
+        }
+    }
+
+    @Test
+    fun getOffsetForPosition_Rtl() {
+        val paragraph = paragraph(rtlChar.repeat(repeatCount))
+        for (line in 0 until paragraph.lineCount) {
+            assertThat(
+                paragraph.getOffsetForPosition(Offset(paragraph.width - 1f, line * fontSize + 1f))
+            ).isEqualTo(lineStartOffsets[line])
+        }
+    }
+
+    // letterSpacing in SP is handled by spans, therefore the results are a little off when
+    // letterSpacing is in SP. This is actually a bug, but adding tests for visibility
+    @Test
+    fun getLineLeftAndGetLineRight_Ltr_sp_letterspacing() {
+        val paragraph = paragraph(ltrChar.repeat(repeatCount), letterSpacing = letterSpacing.sp)
+        for (line in 0 until paragraph.lineCount) {
+            assertThat(paragraph.getLineRight(line)).isEqualTo(paragraph.width)
+
+            val expectedLeft = if (line == paragraph.lineCount - 1) {
+                // ellipsize does not include letter spacing
+                letterSpacing
+            } else {
+                0f
+            }
+            assertThat(paragraph.getLineLeft(line)).isEqualTo(expectedLeft)
+        }
+    }
+
+    @Test
+    fun getLineLeftAndGetLineRight_Rtl_sp_letterspacing() {
+        val paragraph = paragraph(rtlChar.repeat(repeatCount), letterSpacing = letterSpacing.sp)
+        for (line in 0 until paragraph.lineCount) {
+            assertThat(paragraph.getLineLeft(line)).isEqualTo(0)
+
+            val expectedRight = if (line == paragraph.lineCount - 1) {
+                // ellipsize does not include letter spacing
+                paragraph.width - letterSpacing
+            } else {
+                paragraph.width
+            }
+            assertThat(paragraph.getLineRight(line)).isEqualTo(expectedRight)
+        }
+    }
+
+    @Test
+    fun getLineLeftAndGetLineRight_Ltr_TextIndent_sp_letterspacing() {
+        val paragraph = paragraph(
+            text = ltrChar.repeat(repeatCount),
+            textIndent = TextIndent(firstLine = charWidth.sp, restLine = charWidth.sp),
+            letterSpacing = letterSpacing.sp
+        )
+        for (line in 0 until paragraph.lineCount) {
+            assertThat(paragraph.getLineRight(line)).isEqualTo(paragraph.width)
+
+            val expectedLeft = if (line == paragraph.lineCount - 1) {
+                -fontSize
+            } else {
+                0f
+            }
+            assertThat(paragraph.getLineLeft(line)).isEqualTo(expectedLeft)
+        }
+    }
+
+    @Test
+    fun getHorizontalPosition_Ltr_sp_letterspacing() {
+        val paragraph = paragraph(ltrChar.repeat(repeatCount), letterSpacing = letterSpacing.sp)
+        lineStartOffsets.forEach { offset ->
+            val expectedPosition = if (offset == paragraph.getLineStart(paragraph.lineCount - 1)) {
+                letterSpacing
+            } else {
+                0f
+            }
+            assertThat(
+                paragraph.getHorizontalPosition(offset, usePrimaryDirection = true)
+            ).isEqualTo(expectedPosition)
+
+            assertThat(
+                paragraph.getHorizontalPosition(offset, usePrimaryDirection = false)
+            ).isEqualTo(expectedPosition)
+        }
+    }
+
+    @Test
+    fun getHorizontalPosition_Rtl_sp_letterspacing() {
+        val paragraph = paragraph(rtlChar.repeat(repeatCount), letterSpacing = letterSpacing.sp)
+        lineStartOffsets.forEach { offset ->
+            val expectedPosition = if (offset == paragraph.getLineStart(paragraph.lineCount - 1)) {
+                paragraph.width - letterSpacing
+            } else {
+                paragraph.width
+            }
+            assertThat(
+                paragraph.getHorizontalPosition(offset, usePrimaryDirection = true)
+            ).isEqualTo(expectedPosition)
+
+            assertThat(
+                paragraph.getHorizontalPosition(offset, usePrimaryDirection = false)
+            ).isEqualTo(expectedPosition)
+        }
+    }
+
+    @Test
+    fun getOffsetForPosition_Ltr_sp_letterspacing() {
+        val paragraph = paragraph(ltrChar.repeat(repeatCount), letterSpacing = letterSpacing.sp)
+        for (line in 0 until paragraph.lineCount) {
+            assertThat(
+                paragraph.getOffsetForPosition(Offset(1f, line * fontSize + 1f))
+            ).isEqualTo(lineStartOffsets[line])
+        }
+    }
+
+    @Test
+    fun getOffsetForPosition_Rtl_sp_letterspacing() {
+        val paragraph = paragraph(rtlChar.repeat(repeatCount), letterSpacing = letterSpacing.sp)
+        for (line in 0 until paragraph.lineCount) {
+            assertThat(
+                paragraph.getOffsetForPosition(Offset(paragraph.width - 1f, line * fontSize + 1f))
+            ).isEqualTo(lineStartOffsets[line])
+        }
+    }
+
+    private fun paragraph(
+        text: String = "",
+        textIndent: TextIndent = TextIndent.None,
+        letterSpacing: TextUnit = emLetterSpacing
+    ): Paragraph {
+        val width = charWidth * 3
+
+        return Paragraph(
+            text = text,
+            style = TextStyle(
+                fontFamily = fontFamilyMeasureFont,
+                fontSize = fontSize.sp,
+                textAlign = TextAlign.End,
+                letterSpacing = letterSpacing,
+                textIndent = textIndent
+            ),
+            maxLines = lastLine + 1,
+            ellipsis = true,
+            constraints = Constraints(maxWidth = width),
+            density = Density(density = 1f),
+            fontFamilyResolver = UncachedFontFamilyResolver(
+                InstrumentationRegistry.getInstrumentation().context
+            )
+        )
+    }
+}
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/AndroidParagraph.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/AndroidParagraph.android.kt
index 3a5dee6..26e7850 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/AndroidParagraph.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/AndroidParagraph.android.kt
@@ -17,6 +17,8 @@
 package androidx.compose.ui.text
 
 import java.util.Locale as JavaLocale
+import android.text.Spannable
+import android.text.SpannableString
 import android.text.Spanned
 import android.text.TextUtils
 import androidx.annotation.VisibleForTesting
@@ -42,10 +44,12 @@
 import androidx.compose.ui.text.android.LayoutCompat.JUSTIFICATION_MODE_INTER_WORD
 import androidx.compose.ui.text.android.TextLayout
 import androidx.compose.ui.text.android.selection.WordBoundary
+import androidx.compose.ui.text.android.style.IndentationFixSpan
 import androidx.compose.ui.text.android.style.PlaceholderSpan
 import androidx.compose.ui.text.font.FontFamily
 import androidx.compose.ui.text.platform.AndroidParagraphIntrinsics
 import androidx.compose.ui.text.platform.AndroidTextPaint
+import androidx.compose.ui.text.platform.extensions.setSpan
 import androidx.compose.ui.text.platform.isIncludeFontPaddingEnabled
 import androidx.compose.ui.text.platform.style.ShaderBrushSpan
 import androidx.compose.ui.text.style.ResolvedTextDirection
@@ -53,7 +57,8 @@
 import androidx.compose.ui.text.style.TextDecoration
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Density
-import kotlin.math.min
+import androidx.compose.ui.unit.TextUnit
+import androidx.compose.ui.unit.sp
 
 /**
  * Android specific implementation for [Paragraph]
@@ -69,7 +74,6 @@
     val ellipsis: Boolean,
     val constraints: Constraints
 ) : Paragraph {
-
     constructor(
         text: String,
         style: TextStyle,
@@ -96,6 +100,8 @@
 
     private val layout: TextLayout
 
+    @VisibleForTesting
+    internal val charSequence: CharSequence
     init {
         require(constraints.minHeight == 0 && constraints.minWidth == 0) {
             "Setting Constraints.minWidth and Constraints.minHeight is not supported, " +
@@ -105,6 +111,15 @@
 
         val style = paragraphIntrinsics.style
 
+        charSequence = if (shouldAttachIndentationFixSpan(style, ellipsis)) {
+            // When letter spacing, align and ellipsize applied to text, the ellipsized line is
+            // indented wrong. This function adds the IndentationFixSpan in order to fix the issue
+            // with best effort. b/228463206
+            paragraphIntrinsics.charSequence.attachIndentationFixSpan()
+        } else {
+            paragraphIntrinsics.charSequence
+        }
+
         val alignment = toLayoutAlign(style.textAlign)
 
         val justificationMode = when (style.textAlign) {
@@ -188,7 +203,7 @@
         get() = layout.lineCount
 
     override val placeholderRects: List<Rect?> =
-        with(paragraphIntrinsics.charSequence) {
+        with(charSequence) {
             if (this !is Spanned) return@with listOf()
             getSpans(0, length, PlaceholderSpan::class.java).map { span ->
                 val start = getSpanStart(span)
@@ -242,10 +257,6 @@
         }
 
     @VisibleForTesting
-    internal val charSequence: CharSequence
-        get() = paragraphIntrinsics.charSequence
-
-    @VisibleForTesting
     internal val textPaint: AndroidTextPaint
         get() = paragraphIntrinsics.textPaint
 
@@ -459,7 +470,7 @@
         maxLines: Int
     ) =
         TextLayout(
-            charSequence = paragraphIntrinsics.charSequence,
+            charSequence = charSequence,
             width = width,
             textPaint = textPaint,
             ellipsize = ellipsize,
@@ -493,4 +504,17 @@
         if (getLineBottom(lineIndex) > maxHeight) return lineIndex
     }
     return lineCount
+}
+
+private fun shouldAttachIndentationFixSpan(textStyle: TextStyle, ellipsis: Boolean) =
+    with(textStyle) {
+        ellipsis && (letterSpacing != 0.sp && letterSpacing != TextUnit.Unspecified) &&
+            (textAlign != null && textAlign != TextAlign.Start && textAlign != TextAlign.Justify)
+    }
+
+@OptIn(InternalPlatformTextApi::class)
+private fun CharSequence.attachIndentationFixSpan(): CharSequence {
+    val spannable = if (this is Spannable) this else SpannableString(this)
+    spannable.setSpan(IndentationFixSpan(), spannable.length - 1, spannable.length - 1)
+    return spannable
 }
\ No newline at end of file
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidFont.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidFont.kt
index 4582e7b..524441d 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidFont.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidFont.kt
@@ -17,8 +17,110 @@
 package androidx.compose.ui.text.font
 
 import android.content.Context
+import android.content.res.AssetManager
 import android.graphics.Typeface
+import android.os.ParcelFileDescriptor
+import androidx.annotation.RequiresApi
+import androidx.compose.runtime.Stable
 import androidx.compose.ui.text.ExperimentalTextApi
+import java.io.File
+
+/**
+ * Create a Font declaration from a file in the assets directory. The content of the [File] is
+ * read during construction.
+ *
+ * @param assetManager Android AssetManager
+ * @param path full path starting from the assets directory (i.e. dir/myfont.ttf for
+ * assets/dir/myfont.ttf).
+ * @param weight The weight of the font. The system uses this to match a font to a font request
+ * that is given in a [androidx.compose.ui.text.SpanStyle].
+ * @param style The style of the font, normal or italic. The system uses this to match a font to a
+ * font request that is given in a [androidx.compose.ui.text.SpanStyle].
+ */
+@ExperimentalTextApi
+@Stable
+@Deprecated("This experimental Font is replaced by Font(path, assetManager, ...)",
+    replaceWith = ReplaceWith("Font(path, assetManager, weight, style)"),
+    level = DeprecationLevel.WARNING
+)
+fun Font(
+    assetManager: AssetManager,
+    path: String,
+    weight: FontWeight = FontWeight.Normal,
+    style: FontStyle = FontStyle.Normal
+): Font = AndroidAssetFont(
+    assetManager,
+    path,
+    weight,
+    style,
+    FontVariation.Settings(weight, style)
+)
+
+/**
+ * Create a Font declaration from a file in the assets directory. The content of the [File] is
+ * read during construction.
+ *
+ * @param path full path starting from the assets directory (i.e. dir/myfont.ttf for
+ * assets/dir/myfont.ttf).
+ * @param assetManager Android AssetManager
+ * @param weight The weight of the font. The system uses this to match a font to a font request
+ * that is given in a [androidx.compose.ui.text.SpanStyle].
+ * @param style The style of the font, normal or italic. The system uses this to match a font to a
+ * font request that is given in a [androidx.compose.ui.text.SpanStyle].
+ * @param variationSettings on API 26 and above these settings are applied to a variable font when
+ * the font is loaded
+ */
+@ExperimentalTextApi
+@Stable
+fun Font(
+    path: String,
+    assetManager: AssetManager,
+    weight: FontWeight = FontWeight.Normal,
+    style: FontStyle = FontStyle.Normal,
+    variationSettings: FontVariation.Settings = FontVariation.Settings(weight, style)
+): Font = AndroidAssetFont(assetManager, path, weight, style, variationSettings)
+
+/**
+ * Create a Font declaration from a file. The content of the [File] is read during construction.
+ *
+ * @param file the font file.
+ * @param weight The weight of the font. The system uses this to match a font to a font request
+ * that is given in a [androidx.compose.ui.text.SpanStyle].
+ * @param style The style of the font, normal or italic. The system uses this to match a font to a
+ * font request that is given in a [androidx.compose.ui.text.SpanStyle].
+ * @param variationSettings on API 26 and above these settings are applied to a variable font when
+ * the font is loaded
+ */
+@ExperimentalTextApi
+@Stable
+@Suppress("StreamFiles")
+fun Font(
+    file: File,
+    weight: FontWeight = FontWeight.Normal,
+    style: FontStyle = FontStyle.Normal,
+    variationSettings: FontVariation.Settings = FontVariation.Settings(weight, style)
+): Font = AndroidFileFont(file, weight, style, variationSettings)
+
+/**
+ * Create a Font declaration from a [ParcelFileDescriptor]. The content of the
+ * [ParcelFileDescriptor] is read during construction.
+ *
+ * @param fileDescriptor the file descriptor for the font file.
+ * @param weight The weight of the font. The system uses this to match a font to a font request
+ * that is given in a [androidx.compose.ui.text.SpanStyle].
+ * @param style The style of the font, normal or italic. The system uses this to match a font to a
+ * font request that is given in a [androidx.compose.ui.text.SpanStyle].
+ * @param variationSettings these settings are applied to a variable font when the font is loaded
+ */
+@RequiresApi(26)
+@ExperimentalTextApi
+@Stable
+fun Font(
+    fileDescriptor: ParcelFileDescriptor,
+    weight: FontWeight = FontWeight.Normal,
+    style: FontStyle = FontStyle.Normal,
+    variationSettings: FontVariation.Settings = FontVariation.Settings(weight, style)
+): Font = AndroidFileDescriptorFont(fileDescriptor, weight, style, variationSettings)
 
 /**
  * Font for use on Android.
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidLoadableFonts.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidLoadableFonts.kt
deleted file mode 100644
index 07406a8..0000000
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidLoadableFonts.kt
+++ /dev/null
@@ -1,332 +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.text.font
-
-import android.content.Context
-import android.content.res.AssetManager
-import android.graphics.Typeface
-import android.graphics.fonts.FontVariationAxis
-import android.os.Build
-import android.os.ParcelFileDescriptor
-import androidx.annotation.DoNotInline
-import androidx.annotation.RequiresApi
-import androidx.compose.runtime.Stable
-import androidx.compose.ui.text.ExperimentalTextApi
-import androidx.compose.ui.unit.Density
-import androidx.compose.ui.util.fastMap
-import java.io.File
-
-/**
- * Create a Font declaration from a file in the assets directory. The content of the [File] is
- * read during construction.
- *
- * @param assetManager Android AssetManager
- * @param path full path starting from the assets directory (i.e. dir/myfont.ttf for
- * assets/dir/myfont.ttf).
- * @param weight The weight of the font. The system uses this to match a font to a font request
- * that is given in a [androidx.compose.ui.text.SpanStyle].
- * @param style The style of the font, normal or italic. The system uses this to match a font to a
- * font request that is given in a [androidx.compose.ui.text.SpanStyle].
- */
-@ExperimentalTextApi
-@Stable
-@Deprecated("This experimental Font is replaced by Font(path, assetManager, ...)",
-    replaceWith = ReplaceWith("Font(path, assetManager, weight, style)"),
-    level = DeprecationLevel.WARNING
-)
-fun Font(
-    assetManager: AssetManager,
-    path: String,
-    weight: FontWeight = FontWeight.Normal,
-    style: FontStyle = FontStyle.Normal
-): Font = AndroidAssetFont(
-    assetManager,
-    path,
-    weight,
-    style,
-    FontVariation.Settings(weight, style)
-)
-
-/**
- * Create a Font declaration from a file in the assets directory. The content of the [File] is
- * read during construction.
- *
- * @param path full path starting from the assets directory (i.e. dir/myfont.ttf for
- * assets/dir/myfont.ttf).
- * @param assetManager Android AssetManager
- * @param weight The weight of the font. The system uses this to match a font to a font request
- * that is given in a [androidx.compose.ui.text.SpanStyle].
- * @param style The style of the font, normal or italic. The system uses this to match a font to a
- * font request that is given in a [androidx.compose.ui.text.SpanStyle].
- * @param variationSettings on API 26 and above these settings are applied to a variable font when
- * the font is loaded
- */
-@ExperimentalTextApi
-@Stable
-fun Font(
-    path: String,
-    assetManager: AssetManager,
-    weight: FontWeight = FontWeight.Normal,
-    style: FontStyle = FontStyle.Normal,
-    variationSettings: FontVariation.Settings = FontVariation.Settings(weight, style)
-): Font = AndroidAssetFont(assetManager, path, weight, style, variationSettings)
-
-/**
- * Create a Font declaration from a file. The content of the [File] is read during construction.
- *
- * @param file the font file.
- * @param weight The weight of the font. The system uses this to match a font to a font request
- * that is given in a [androidx.compose.ui.text.SpanStyle].
- * @param style The style of the font, normal or italic. The system uses this to match a font to a
- * font request that is given in a [androidx.compose.ui.text.SpanStyle].
- * @param variationSettings on API 26 and above these settings are applied to a variable font when
- * the font is loaded
- */
-@ExperimentalTextApi
-@Stable
-@Suppress("StreamFiles")
-fun Font(
-    file: File,
-    weight: FontWeight = FontWeight.Normal,
-    style: FontStyle = FontStyle.Normal,
-    variationSettings: FontVariation.Settings = FontVariation.Settings(weight, style)
-): Font = AndroidFileFont(file, weight, style, variationSettings)
-
-/**
- * Create a Font declaration from a [ParcelFileDescriptor]. The content of the
- * [ParcelFileDescriptor] is read during construction.
- *
- * @param fileDescriptor the file descriptor for the font file.
- * @param weight The weight of the font. The system uses this to match a font to a font request
- * that is given in a [androidx.compose.ui.text.SpanStyle].
- * @param style The style of the font, normal or italic. The system uses this to match a font to a
- * font request that is given in a [androidx.compose.ui.text.SpanStyle].
- * @param variationSettings these settings are applied to a variable font when the font is loaded
- */
-@RequiresApi(26)
-@ExperimentalTextApi
-@Stable
-fun Font(
-    fileDescriptor: ParcelFileDescriptor,
-    weight: FontWeight = FontWeight.Normal,
-    style: FontStyle = FontStyle.Normal,
-    variationSettings: FontVariation.Settings = FontVariation.Settings(weight, style)
-): Font = AndroidFileDescriptorFont(fileDescriptor, weight, style, variationSettings)
-
-@OptIn(ExperimentalTextApi::class)
-internal sealed class AndroidPreloadedFont @OptIn(ExperimentalTextApi::class) constructor(
-    final override val weight: FontWeight,
-    final override val style: FontStyle,
-    variationSettings: FontVariation.Settings
-) : AndroidFont(
-    FontLoadingStrategy.Blocking,
-    AndroidPreloadedFontTypefaceLoader,
-    variationSettings
-) {
-    abstract val cacheKey: String?
-    internal abstract fun doLoad(context: Context?): Typeface?
-
-    private var didInitWithContext: Boolean = false
-    // subclasses MUST initialize this by calling doLoad(null) - after overriding doLoad as final
-    internal var typeface: Typeface? = null
-
-    internal fun loadCached(context: Context): Typeface? {
-        if (!didInitWithContext && typeface == null) {
-            typeface = doLoad(context)
-        }
-        didInitWithContext = true
-        return typeface
-    }
-}
-
-private object AndroidPreloadedFontTypefaceLoader : AndroidFont.TypefaceLoader {
-    override fun loadBlocking(context: Context, font: AndroidFont): Typeface? =
-        (font as? AndroidPreloadedFont)?.loadCached(context)
-
-    override suspend fun awaitLoad(context: Context, font: AndroidFont): Nothing {
-        throw UnsupportedOperationException("All preloaded fonts are blocking.")
-    }
-}
-
-@OptIn(ExperimentalTextApi::class) /* FontVariation.Settings */
-private class AndroidAssetFont constructor(
-    val assetManager: AssetManager,
-    val path: String,
-    weight: FontWeight = FontWeight.Normal,
-    style: FontStyle = FontStyle.Normal,
-    variationSettings: FontVariation.Settings
-) : AndroidPreloadedFont(weight, style, variationSettings) {
-
-    override fun doLoad(context: Context?): Typeface? {
-        return if (Build.VERSION.SDK_INT >= 26) {
-            TypefaceBuilderCompat.createFromAssets(assetManager, path, context, variationSettings)
-        } else {
-            Typeface.createFromAsset(assetManager, path)
-        }
-    }
-
-    init {
-        typeface = doLoad(null)
-    }
-
-    override val cacheKey: String = "asset:$path"
-
-    override fun toString(): String {
-        return "Font(assetManager, path=$path, weight=$weight, style=$style)"
-    }
-
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (other !is AndroidAssetFont) return false
-
-        if (path != other.path) return false
-        if (variationSettings != other.variationSettings) return false
-
-        return true
-    }
-
-    override fun hashCode(): Int {
-        var result = path.hashCode()
-        result = 31 * result + variationSettings.hashCode()
-        return result
-    }
-}
-
-@OptIn(ExperimentalTextApi::class)
-private class AndroidFileFont constructor(
-    val file: File,
-    weight: FontWeight = FontWeight.Normal,
-    style: FontStyle = FontStyle.Normal,
-    variationSettings: FontVariation.Settings
-) : AndroidPreloadedFont(weight, style, variationSettings) {
-
-    override fun doLoad(context: Context?): Typeface? {
-        return if (Build.VERSION.SDK_INT >= 26) {
-            TypefaceBuilderCompat.createFromFile(file, context, variationSettings)
-        } else {
-            Typeface.createFromFile(file)
-        }
-    }
-
-    init {
-        typeface = doLoad(null)
-    }
-
-    override val cacheKey: String? = null
-    override fun toString(): String {
-        return "Font(file=$file, weight=$weight, style=$style)"
-    }
-}
-
-@RequiresApi(26)
-@OptIn(ExperimentalTextApi::class)
-private class AndroidFileDescriptorFont constructor(
-    val fileDescriptor: ParcelFileDescriptor,
-    weight: FontWeight = FontWeight.Normal,
-    style: FontStyle = FontStyle.Normal,
-    variationSettings: FontVariation.Settings
-) : AndroidPreloadedFont(weight, style, variationSettings) {
-
-    override fun doLoad(context: Context?): Typeface? {
-        return if (Build.VERSION.SDK_INT >= 26) {
-            TypefaceBuilderCompat.createFromFileDescriptor(
-                fileDescriptor,
-                context,
-                variationSettings
-            )
-        } else {
-            throw IllegalArgumentException("Cannot create font from file descriptor for SDK < 26")
-        }
-    }
-
-    init {
-        typeface = doLoad(null)
-    }
-
-    override val cacheKey: String? = null
-    override fun toString(): String {
-        return "Font(fileDescriptor=$fileDescriptor, weight=$weight, style=$style)"
-    }
-}
-
-@RequiresApi(api = 26)
-private object TypefaceBuilderCompat {
-    @ExperimentalTextApi
-    @DoNotInline
-    fun createFromAssets(
-        assetManager: AssetManager,
-        path: String,
-        context: Context?,
-        variationSettings: FontVariation.Settings
-    ): Typeface? {
-        if (context == null) {
-            return null
-        }
-        return Typeface.Builder(assetManager, path)
-            .setFontVariationSettings(variationSettings.toVariationSettings(context))
-            .build()
-    }
-
-    @ExperimentalTextApi
-    @DoNotInline
-    fun createFromFile(
-        file: File,
-        context: Context?,
-        variationSettings: FontVariation.Settings
-    ): Typeface? {
-        if (context == null) {
-            return null
-        }
-        return Typeface.Builder(file)
-            .setFontVariationSettings(variationSettings.toVariationSettings(context))
-            .build()
-    }
-
-    @ExperimentalTextApi
-    @DoNotInline
-    fun createFromFileDescriptor(
-        fileDescriptor: ParcelFileDescriptor,
-        context: Context?,
-        variationSettings: FontVariation.Settings,
-    ): Typeface? {
-        if (context == null) {
-            return null
-        }
-        return Typeface.Builder(fileDescriptor.fileDescriptor)
-            .setFontVariationSettings(variationSettings.toVariationSettings(context))
-            .build()
-    }
-
-    @RequiresApi(Build.VERSION_CODES.O)
-    @ExperimentalTextApi
-    private fun FontVariation.Settings.toVariationSettings(
-        context: Context?
-    ): Array<FontVariationAxis> {
-        val density = if (context != null) {
-            Density(context)
-        } else if (!needsDensity) {
-            // we don't need density, so make a fake one and be on with it
-            Density(1f, 1f)
-        } else {
-            // cannot reach
-            throw IllegalStateException("Required density, but not provided")
-        }
-        return settings.fastMap { setting ->
-            FontVariationAxis(setting.axisName, setting.toVariationValue(density))
-        }.toTypedArray()
-    }
-}
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidPreloadedFont.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidPreloadedFont.kt
new file mode 100644
index 0000000..5f0cad7
--- /dev/null
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidPreloadedFont.kt
@@ -0,0 +1,234 @@
+/*
+ * 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.text.font
+
+import android.content.Context
+import android.content.res.AssetManager
+import android.graphics.Typeface
+import android.graphics.fonts.FontVariationAxis
+import android.os.Build
+import android.os.ParcelFileDescriptor
+import androidx.annotation.DoNotInline
+import androidx.annotation.RequiresApi
+import androidx.compose.ui.text.ExperimentalTextApi
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.util.fastMap
+import java.io.File
+
+@OptIn(ExperimentalTextApi::class)
+internal sealed class AndroidPreloadedFont @OptIn(ExperimentalTextApi::class) constructor(
+    final override val weight: FontWeight,
+    final override val style: FontStyle,
+    variationSettings: FontVariation.Settings
+) : AndroidFont(
+    FontLoadingStrategy.Blocking,
+    AndroidPreloadedFontTypefaceLoader,
+    variationSettings
+) {
+    abstract val cacheKey: String?
+    internal abstract fun doLoad(context: Context?): Typeface?
+
+    private var didInitWithContext: Boolean = false
+    // subclasses MUST initialize this by calling doLoad(null) - after overriding doLoad as final
+    internal var typeface: Typeface? = null
+
+    internal fun loadCached(context: Context): Typeface? {
+        if (!didInitWithContext && typeface == null) {
+            typeface = doLoad(context)
+        }
+        didInitWithContext = true
+        return typeface
+    }
+}
+
+private object AndroidPreloadedFontTypefaceLoader : AndroidFont.TypefaceLoader {
+    override fun loadBlocking(context: Context, font: AndroidFont): Typeface? =
+        (font as? AndroidPreloadedFont)?.loadCached(context)
+
+    override suspend fun awaitLoad(context: Context, font: AndroidFont): Nothing {
+        throw UnsupportedOperationException("All preloaded fonts are blocking.")
+    }
+}
+
+@OptIn(ExperimentalTextApi::class) /* FontVariation.Settings */
+internal class AndroidAssetFont constructor(
+    val assetManager: AssetManager,
+    val path: String,
+    weight: FontWeight = FontWeight.Normal,
+    style: FontStyle = FontStyle.Normal,
+    variationSettings: FontVariation.Settings
+) : AndroidPreloadedFont(weight, style, variationSettings) {
+
+    override fun doLoad(context: Context?): Typeface? {
+        return if (Build.VERSION.SDK_INT >= 26) {
+            TypefaceBuilderCompat.createFromAssets(assetManager, path, context, variationSettings)
+        } else {
+            Typeface.createFromAsset(assetManager, path)
+        }
+    }
+
+    init {
+        typeface = doLoad(null)
+    }
+
+    override val cacheKey: String = "asset:$path"
+
+    override fun toString(): String {
+        return "Font(assetManager, path=$path, weight=$weight, style=$style)"
+    }
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other !is AndroidAssetFont) return false
+
+        if (path != other.path) return false
+        if (variationSettings != other.variationSettings) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = path.hashCode()
+        result = 31 * result + variationSettings.hashCode()
+        return result
+    }
+}
+
+@OptIn(ExperimentalTextApi::class)
+internal class AndroidFileFont constructor(
+    val file: File,
+    weight: FontWeight = FontWeight.Normal,
+    style: FontStyle = FontStyle.Normal,
+    variationSettings: FontVariation.Settings
+) : AndroidPreloadedFont(weight, style, variationSettings) {
+
+    override fun doLoad(context: Context?): Typeface? {
+        return if (Build.VERSION.SDK_INT >= 26) {
+            TypefaceBuilderCompat.createFromFile(file, context, variationSettings)
+        } else {
+            Typeface.createFromFile(file)
+        }
+    }
+
+    init {
+        typeface = doLoad(null)
+    }
+
+    override val cacheKey: String? = null
+    override fun toString(): String {
+        return "Font(file=$file, weight=$weight, style=$style)"
+    }
+}
+
+@RequiresApi(26)
+@OptIn(ExperimentalTextApi::class)
+internal class AndroidFileDescriptorFont constructor(
+    val fileDescriptor: ParcelFileDescriptor,
+    weight: FontWeight = FontWeight.Normal,
+    style: FontStyle = FontStyle.Normal,
+    variationSettings: FontVariation.Settings
+) : AndroidPreloadedFont(weight, style, variationSettings) {
+
+    override fun doLoad(context: Context?): Typeface? {
+        return if (Build.VERSION.SDK_INT >= 26) {
+            TypefaceBuilderCompat.createFromFileDescriptor(
+                fileDescriptor,
+                context,
+                variationSettings
+            )
+        } else {
+            throw IllegalArgumentException("Cannot create font from file descriptor for SDK < 26")
+        }
+    }
+
+    init {
+        typeface = doLoad(null)
+    }
+
+    override val cacheKey: String? = null
+    override fun toString(): String {
+        return "Font(fileDescriptor=$fileDescriptor, weight=$weight, style=$style)"
+    }
+}
+
+@RequiresApi(api = 26)
+private object TypefaceBuilderCompat {
+    @ExperimentalTextApi
+    @DoNotInline
+    fun createFromAssets(
+        assetManager: AssetManager,
+        path: String,
+        context: Context?,
+        variationSettings: FontVariation.Settings
+    ): Typeface? {
+        if (context == null) {
+            return null
+        }
+        return Typeface.Builder(assetManager, path)
+            .setFontVariationSettings(variationSettings.toVariationSettings(context))
+            .build()
+    }
+
+    @ExperimentalTextApi
+    @DoNotInline
+    fun createFromFile(
+        file: File,
+        context: Context?,
+        variationSettings: FontVariation.Settings
+    ): Typeface? {
+        if (context == null) {
+            return null
+        }
+        return Typeface.Builder(file)
+            .setFontVariationSettings(variationSettings.toVariationSettings(context))
+            .build()
+    }
+
+    @ExperimentalTextApi
+    @DoNotInline
+    fun createFromFileDescriptor(
+        fileDescriptor: ParcelFileDescriptor,
+        context: Context?,
+        variationSettings: FontVariation.Settings,
+    ): Typeface? {
+        if (context == null) {
+            return null
+        }
+        return Typeface.Builder(fileDescriptor.fileDescriptor)
+            .setFontVariationSettings(variationSettings.toVariationSettings(context))
+            .build()
+    }
+
+    @RequiresApi(Build.VERSION_CODES.O)
+    @ExperimentalTextApi
+    private fun FontVariation.Settings.toVariationSettings(
+        context: Context?
+    ): Array<FontVariationAxis> {
+        val density = if (context != null) {
+            Density(context)
+        } else if (!needsDensity) {
+            // we don't need density, so make a fake one and be on with it
+            Density(1f, 1f)
+        } else {
+            // cannot reach
+            throw IllegalStateException("Required density, but not provided")
+        }
+        return settings.fastMap { setting ->
+            FontVariationAxis(setting.axisName, setting.toVariationValue(density))
+        }.toTypedArray()
+    }
+}
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/ParagraphStyle.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/ParagraphStyle.kt
index 3440d6c..4cba34a 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/ParagraphStyle.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/ParagraphStyle.kt
@@ -179,7 +179,7 @@
         )
     }
 
-    override operator fun equals(other: Any?): Boolean {
+    override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is ParagraphStyle) return false
 
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Placeholder.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Placeholder.kt
index a65fc3f..7e7f2eb 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Placeholder.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Placeholder.kt
@@ -56,7 +56,7 @@
         )
     }
 
-    override operator fun equals(other: Any?): Boolean {
+    override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is Placeholder) return false
         if (width != other.width) return false
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/SpanStyle.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/SpanStyle.kt
index 758cdfa..9bee135 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/SpanStyle.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/SpanStyle.kt
@@ -483,7 +483,7 @@
         )
     }
 
-    override operator fun equals(other: Any?): Boolean {
+    override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is SpanStyle) return false
         return hasSameLayoutAffectingAttributes(other) &&
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextLayoutResult.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextLayoutResult.kt
index 2fb35be..5f32551 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextLayoutResult.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextLayoutResult.kt
@@ -209,7 +209,7 @@
         )
     }
 
-    override operator fun equals(other: Any?): Boolean {
+    override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is TextLayoutInput) return false
 
@@ -548,7 +548,7 @@
         )
     }
 
-    override operator fun equals(other: Any?): Boolean {
+    override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is TextLayoutResult) return false
 
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextMeasurer.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextMeasurer.kt
index e540b13..1ee046a 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextMeasurer.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextMeasurer.kt
@@ -69,11 +69,12 @@
  * @param fallbackLayoutDirection layout direction of the measurement environment.
  * @param fallbackDensity density of the measurement environment. Density controls the scaling
  * factor for fonts.
- * @param cacheSize Capacity of internal cache inside TextMeasurer. Value of this parameter highly
- * depends on the consumer use case. Provide a cache size that is in line with how many distinct
- * text layouts are going to be calculated by this measurer repeatedly. If you are animating font
- * attributes, or any other layout affecting input, cache can be skipped because most measure calls
- * would miss the cache.
+ * @param cacheSize Capacity of internal cache inside TextMeasurer. Size unit is the number of
+ * unique text layout inputs that are measured. Value of this parameter highly depends on the
+ * consumer use case. Provide a cache size that is in line with how many distinct text layouts are
+ * going to be calculated by this measurer repeatedly. If you are animating font attributes, or any
+ * other layout affecting input, cache can be skipped because most repeated measure calls would miss
+ * the cache.
  */
 @ExperimentalTextApi
 @Immutable
@@ -264,7 +265,8 @@
  * Keeps an LRU layout cache of TextLayoutInput, TextLayoutResult pairs. Any non-layout affecting
  * change in TextLayoutInput (color, brush, shadow, TextDecoration) is ignored by this cache.
  *
- * @param capacity Maximum initial size of LRU cache.
+ * @param capacity Maximum size of LRU cache. Size unit is the number of [CacheTextLayoutInput]
+ * and [TextLayoutResult] pairs.
  *
  * @throws IllegalArgumentException if capacity is not a positive integer.
  */
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontVariation.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontVariation.kt
index c7b09ca..12ad815 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontVariation.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontVariation.kt
@@ -80,7 +80,7 @@
      * Represents a single point in a variation, such as 0.7 or 100
      */
     @Immutable
-    interface Setting {
+    sealed interface Setting {
         /**
          * Convert a value to a final value for use as a font variation setting.
          *
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/EditCommand.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/EditCommand.kt
index af3cd71..eeb8ba6 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/EditCommand.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/EditCommand.kt
@@ -31,13 +31,6 @@
      * Apply the command on the editing buffer.
      */
     fun applyTo(buffer: EditingBuffer)
-
-    /**
-     * Generate a description of the command that is suitable for logging – this should not include
-     * any user-entered text, which may be sensitive.
-     */
-    // Do not return toString() by default, since that might contain sensitive text.
-    fun toStringForLog(): String = this::class.simpleName ?: "{anonymous EditCommand}"
 }
 
 /**
@@ -109,9 +102,6 @@
     override fun toString(): String {
         return "CommitTextCommand(text='$text', newCursorPosition=$newCursorPosition)"
     }
-
-    override fun toStringForLog(): String =
-        "CommitTextCommand(text.length=${text.length}, newCursorPosition=$newCursorPosition)"
 }
 
 /**
@@ -165,8 +155,6 @@
     override fun toString(): String {
         return "SetComposingRegionCommand(start=$start, end=$end)"
     }
-
-    override fun toStringForLog(): String = toString()
 }
 
 /**
@@ -247,9 +235,6 @@
     override fun toString(): String {
         return "SetComposingTextCommand(text='$text', newCursorPosition=$newCursorPosition)"
     }
-
-    override fun toStringForLog(): String =
-        "SetComposingTextCommand(text.length=${text.length}, newCursorPosition=$newCursorPosition)"
 }
 
 /**
@@ -309,8 +294,6 @@
         return "DeleteSurroundingTextCommand(lengthBeforeCursor=$lengthBeforeCursor, " +
             "lengthAfterCursor=$lengthAfterCursor)"
     }
-
-    override fun toStringForLog(): String = toString()
 }
 
 /**
@@ -392,8 +375,6 @@
         return "DeleteSurroundingTextInCodePointsCommand(lengthBeforeCursor=$lengthBeforeCursor, " +
             "lengthAfterCursor=$lengthAfterCursor)"
     }
-
-    override fun toStringForLog(): String = toString()
 }
 
 /**
@@ -440,8 +421,6 @@
     override fun toString(): String {
         return "SetSelectionCommand(start=$start, end=$end)"
     }
-
-    override fun toStringForLog(): String = toString()
 }
 
 /**
@@ -463,8 +442,6 @@
     override fun toString(): String {
         return "FinishComposingTextCommand()"
     }
-
-    override fun toStringForLog(): String = toString()
 }
 
 /**
@@ -505,8 +482,6 @@
     override fun toString(): String {
         return "BackspaceCommand()"
     }
-
-    override fun toStringForLog(): String = toString()
 }
 
 /**
@@ -561,8 +536,6 @@
     override fun toString(): String {
         return "MoveCursorCommand(amount=$amount)"
     }
-
-    override fun toStringForLog(): String = toString()
 }
 
 /**
@@ -580,8 +553,6 @@
     override fun toString(): String {
         return "DeleteAllCommand()"
     }
-
-    override fun toStringForLog(): String = toString()
 }
 
 /**
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/EditProcessor.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/EditProcessor.kt
index e2548bc..a4f89c5 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/EditProcessor.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/EditProcessor.kt
@@ -148,4 +148,26 @@
             prefix + it.toStringForLog()
         }
     }
+
+    /**
+     * Generate a description of the command that is suitable for logging – this should not include
+     * any user-entered text, which may be sensitive.
+     */
+    private fun EditCommand.toStringForLog(): String = when (this) {
+        is CommitTextCommand ->
+            "CommitTextCommand(text.length=${text.length}, newCursorPosition=$newCursorPosition)"
+        is SetComposingTextCommand ->
+            "SetComposingTextCommand(text.length=${text.length}, " +
+                "newCursorPosition=$newCursorPosition)"
+        is SetComposingRegionCommand -> toString()
+        is DeleteSurroundingTextCommand -> toString()
+        is DeleteSurroundingTextInCodePointsCommand -> toString()
+        is SetSelectionCommand -> toString()
+        is FinishComposingTextCommand -> toString()
+        is BackspaceCommand -> toString()
+        is MoveCursorCommand -> toString()
+        is DeleteAllCommand -> toString()
+        // Do not return toString() by default, since that might contain sensitive text.
+        else -> "Unknown EditCommand: " + (this::class.simpleName ?: "{anonymous EditCommand}")
+    }
 }
\ No newline at end of file
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/TextInputService.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/TextInputService.kt
index b41257c..cfb4a53 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/TextInputService.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/TextInputService.kt
@@ -88,7 +88,7 @@
      * system service may silently ignore this request.
      */
     @Deprecated(
-        message = "Use SoftwareKeyboardController.showSoftwareKeyboard or " +
+        message = "Use SoftwareKeyboardController.show or " +
             "TextInputSession.showSoftwareKeyboard instead.",
         replaceWith = ReplaceWith("textInputSession.showSoftwareKeyboard()")
     )
@@ -103,7 +103,7 @@
      * Hide onscreen keyboard.
      */
     @Deprecated(
-        message = "Use SoftwareKeyboardController.hideSoftwareKeyboard or " +
+        message = "Use SoftwareKeyboardController.hide or " +
             "TextInputSession.hideSoftwareKeyboard instead.",
         replaceWith = ReplaceWith("textInputSession.hideSoftwareKeyboard()")
     )
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/LineHeightStyle.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/LineHeightStyle.kt
index bb6949a..afa4713 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/LineHeightStyle.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/LineHeightStyle.kt
@@ -192,7 +192,7 @@
      * Defines how to align the line in the space provided by the line height.
      *
      * @param topRatio the ratio of ascent to ascent+descent in percentage. Valid values are
-     * integers between 0f (inclusive) to 1f (inclusive).
+     * between 0f (inclusive) and 1f (inclusive).
      */
     @kotlin.jvm.JvmInline
     value class Alignment @ExperimentalTextApi constructor(internal val topRatio: Float) {
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextDecoration.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextDecoration.kt
index fe595ce..3244f63 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextDecoration.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextDecoration.kt
@@ -97,7 +97,7 @@
         return "TextDecoration[${values.fastJoinToString(separator = ", ")}]"
     }
 
-    override operator fun equals(other: Any?): Boolean {
+    override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is TextDecoration) return false
         if (mask != other.mask) return false
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextGeometricTransform.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextGeometricTransform.kt
index ea867fe..0763615 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextGeometricTransform.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextGeometricTransform.kt
@@ -46,7 +46,7 @@
         return TextGeometricTransform(scaleX, skewX)
     }
 
-    override operator fun equals(other: Any?): Boolean {
+    override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is TextGeometricTransform) return false
         if (scaleX != other.scaleX) return false
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextIndent.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextIndent.kt
index aad447e..ae93195 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextIndent.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextIndent.kt
@@ -48,7 +48,7 @@
         return TextIndent(firstLine, restLine)
     }
 
-    override operator fun equals(other: Any?): Boolean {
+    override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is TextIndent) return false
         if (firstLine != other.firstLine) return false
diff --git a/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/input/EditProcessorTest.kt b/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/input/EditProcessorTest.kt
index 5de51b4..61f0a3b 100644
--- a/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/input/EditProcessorTest.kt
+++ b/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/input/EditProcessorTest.kt
@@ -302,12 +302,10 @@
 
     @Test
     fun throwsDescriptiveMessage_whenCommandFailsInBatch() {
-        fun invalidCommand(index: Int) = object : EditCommand {
+        class InvalidCommand : EditCommand {
             override fun applyTo(buffer: EditingBuffer) {
                 throw RuntimeException("Better luck next time")
             }
-
-            override fun toStringForLog(): String = "InvalidCommand(index=$index)"
         }
 
         val processor = EditProcessor().apply {
@@ -317,7 +315,7 @@
         }
         val batch = listOf(
             CommitTextCommand("ab", 0),
-            invalidCommand(42),
+            InvalidCommand(),
             SetSelectionCommand(0, 2),
         )
 
@@ -329,7 +327,7 @@
             "Error while applying EditCommand batch to buffer " +
                 "(length=11, composition=null, selection=TextRange(5, 5)):\n" +
                 "   CommitTextCommand(text.length=2, newCursorPosition=0)\n" +
-                " > InvalidCommand(index=42)\n" +
+                " > Unknown EditCommand: InvalidCommand\n" +
                 "   SetSelectionCommand(start=0, end=2)"
         )
         assertThat(error).hasCauseThat().hasMessageThat().isEqualTo("Better luck next time")
diff --git a/compose/ui/ui-tooling-data/api/1.3.0-beta01.txt b/compose/ui/ui-tooling-data/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..ab1e1a2
--- /dev/null
+++ b/compose/ui/ui-tooling-data/api/1.3.0-beta01.txt
@@ -0,0 +1,8 @@
+// Signature format: 4.0
+package androidx.compose.ui.tooling.data {
+
+  public final class SlotTreeKt {
+  }
+
+}
+
diff --git a/compose/ui/ui-tooling-data/api/public_plus_experimental_1.3.0-beta01.txt b/compose/ui/ui-tooling-data/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..092a10a
--- /dev/null
+++ b/compose/ui/ui-tooling-data/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,123 @@
+// 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);
+    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();
+    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 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();
+    property public abstract androidx.compose.ui.unit.IntRect bounds;
+    property public abstract int depth;
+    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.") public @interface UiToolingDataApi {
+  }
+
+}
+
diff --git a/compose/ui/ui-tooling-data/api/public_plus_experimental_current.txt b/compose/ui/ui-tooling-data/api/public_plus_experimental_current.txt
index 7ff92d0..092a10a 100644
--- a/compose/ui/ui-tooling-data/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-tooling-data/api/public_plus_experimental_current.txt
@@ -78,6 +78,7 @@
 
   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);
   }
diff --git a/health/health-connect-client/api/res-current.txt b/compose/ui/ui-tooling-data/api/res-1.3.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/ui/ui-tooling-data/api/res-1.3.0-beta01.txt
diff --git a/compose/ui/ui-tooling-data/api/restricted_1.3.0-beta01.txt b/compose/ui/ui-tooling-data/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..ab1e1a2
--- /dev/null
+++ b/compose/ui/ui-tooling-data/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,8 @@
+// Signature format: 4.0
+package androidx.compose.ui.tooling.data {
+
+  public final class SlotTreeKt {
+  }
+
+}
+
diff --git a/compose/ui/ui-tooling-data/src/androidAndroidTest/kotlin/androidx/compose/ui/tooling/data/BoundsTest.kt b/compose/ui/ui-tooling-data/src/androidAndroidTest/kotlin/androidx/compose/ui/tooling/data/BoundsTest.kt
index eb44e3a..a8d4eee 100644
--- a/compose/ui/ui-tooling-data/src/androidAndroidTest/kotlin/androidx/compose/ui/tooling/data/BoundsTest.kt
+++ b/compose/ui/ui-tooling-data/src/androidAndroidTest/kotlin/androidx/compose/ui/tooling/data/BoundsTest.kt
@@ -93,6 +93,7 @@
     @Test
     fun testBoundsWithoutParsingParameters() {
         val lefts = mutableMapOf<String, Dp>()
+        val anchors = mutableMapOf<String, Any?>()
         val slotTableRecord = CompositionDataRecord.create()
         show {
             Inspectable(slotTableRecord) {
@@ -105,10 +106,11 @@
         }
 
         activityTestRule.runOnUiThread {
-            slotTableRecord.store.first().mapTree<Any>({ _, context, _ ->
+            slotTableRecord.store.first().mapTree<Any>({ group, context, _ ->
                 if (context.location?.sourceFile == "BoundsTest.kt") {
                     with(Density(activityTestRule.activity)) {
                         lefts[context.name!!] = context.bounds.left.toDp()
+                        anchors[context.name!!] = group.identity
                     }
                 }
             })
@@ -116,6 +118,11 @@
             assertThat(lefts["Box"]?.value).isWithin(1f).of(0f)
             assertThat(lefts["Column"]?.value).isWithin(1f).of(10f)
             assertThat(lefts["Text"]?.value).isWithin(0.5f).of(15f)
+
+            val textAnchor = anchors["Text"]
+            val textGroup = slotTableRecord.store.first().find(textAnchor!!)!!
+            val textParams = textGroup.findParameters()
+            assertThat(textParams.find { it.name == "text" }?.value).isEqualTo("Hello")
         }
     }
 
diff --git a/compose/ui/ui-tooling-data/src/jvmMain/kotlin/androidx/compose/ui/tooling/data/SlotTree.kt b/compose/ui/ui-tooling-data/src/jvmMain/kotlin/androidx/compose/ui/tooling/data/SlotTree.kt
index 17e2f7c..bd62589 100644
--- a/compose/ui/ui-tooling-data/src/jvmMain/kotlin/androidx/compose/ui/tooling/data/SlotTree.kt
+++ b/compose/ui/ui-tooling-data/src/jvmMain/kotlin/androidx/compose/ui/tooling/data/SlotTree.kt
@@ -712,6 +712,20 @@
 }
 
 /**
+ * Return the parameters found for this [CompositionGroup].
+ */
+@UiToolingDataApi
+fun CompositionGroup.findParameters(cache: ContextCache? = null): List<ParameterInformation> {
+    val information = sourceInfo ?: return emptyList()
+    val context = if (cache == null) sourceInformationContextOf(information) else
+        cache.contexts.getOrPut(information) { sourceInformationContextOf(information) }
+            as? SourceInformationContext
+    val data = mutableListOf<Any?>()
+    data.addAll(this.data)
+    return extractParameterInfo(data, context)
+}
+
+/**
  * Return a group tree for for the slot table that represents the entire content of the slot
  * table.
  */
diff --git a/compose/ui/ui-tooling-preview/api/1.3.0-beta01.txt b/compose/ui/ui-tooling-preview/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..0b5989f
--- /dev/null
+++ b/compose/ui/ui-tooling-preview/api/1.3.0-beta01.txt
@@ -0,0 +1,103 @@
+// 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 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 widthDp() default -1;
+    property public abstract int apiLevel;
+    property public abstract long backgroundColor;
+    property public abstract String device;
+    property public abstract float fontScale;
+    property public abstract String group;
+    property public abstract int heightDp;
+    property public abstract String locale;
+    property public abstract String name;
+    property public abstract boolean showBackground;
+    property public abstract boolean showSystemUi;
+    property public abstract int uiMode;
+    property public abstract int widthDp;
+  }
+
+  @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;
+  }
+
+}
+
+package androidx.compose.ui.tooling.preview.datasource {
+
+  public class CollectionPreviewParameterProvider<T> implements androidx.compose.ui.tooling.preview.PreviewParameterProvider<T> {
+    ctor public CollectionPreviewParameterProvider(java.util.Collection<? extends T> collection);
+    method public kotlin.sequences.Sequence<T> getValues();
+    property public kotlin.sequences.Sequence<T> values;
+  }
+
+  public final class LoremIpsum implements androidx.compose.ui.tooling.preview.PreviewParameterProvider<java.lang.String> {
+    ctor public LoremIpsum(int words);
+    ctor public LoremIpsum();
+    method public kotlin.sequences.Sequence<java.lang.String> getValues();
+    property public kotlin.sequences.Sequence<java.lang.String> values;
+  }
+
+  public final class LoremIpsumKt {
+  }
+
+}
+
diff --git a/compose/ui/ui-tooling-preview/api/public_plus_experimental_1.3.0-beta01.txt b/compose/ui/ui-tooling-preview/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..0b5989f
--- /dev/null
+++ b/compose/ui/ui-tooling-preview/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,103 @@
+// 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 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 widthDp() default -1;
+    property public abstract int apiLevel;
+    property public abstract long backgroundColor;
+    property public abstract String device;
+    property public abstract float fontScale;
+    property public abstract String group;
+    property public abstract int heightDp;
+    property public abstract String locale;
+    property public abstract String name;
+    property public abstract boolean showBackground;
+    property public abstract boolean showSystemUi;
+    property public abstract int uiMode;
+    property public abstract int widthDp;
+  }
+
+  @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;
+  }
+
+}
+
+package androidx.compose.ui.tooling.preview.datasource {
+
+  public class CollectionPreviewParameterProvider<T> implements androidx.compose.ui.tooling.preview.PreviewParameterProvider<T> {
+    ctor public CollectionPreviewParameterProvider(java.util.Collection<? extends T> collection);
+    method public kotlin.sequences.Sequence<T> getValues();
+    property public kotlin.sequences.Sequence<T> values;
+  }
+
+  public final class LoremIpsum implements androidx.compose.ui.tooling.preview.PreviewParameterProvider<java.lang.String> {
+    ctor public LoremIpsum(int words);
+    ctor public LoremIpsum();
+    method public kotlin.sequences.Sequence<java.lang.String> getValues();
+    property public kotlin.sequences.Sequence<java.lang.String> values;
+  }
+
+  public final class LoremIpsumKt {
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/compose/ui/ui-tooling-preview/api/res-1.3.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/ui/ui-tooling-preview/api/res-1.3.0-beta01.txt
diff --git a/compose/ui/ui-tooling-preview/api/restricted_1.3.0-beta01.txt b/compose/ui/ui-tooling-preview/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..0b5989f
--- /dev/null
+++ b/compose/ui/ui-tooling-preview/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,103 @@
+// 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 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 widthDp() default -1;
+    property public abstract int apiLevel;
+    property public abstract long backgroundColor;
+    property public abstract String device;
+    property public abstract float fontScale;
+    property public abstract String group;
+    property public abstract int heightDp;
+    property public abstract String locale;
+    property public abstract String name;
+    property public abstract boolean showBackground;
+    property public abstract boolean showSystemUi;
+    property public abstract int uiMode;
+    property public abstract int widthDp;
+  }
+
+  @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;
+  }
+
+}
+
+package androidx.compose.ui.tooling.preview.datasource {
+
+  public class CollectionPreviewParameterProvider<T> implements androidx.compose.ui.tooling.preview.PreviewParameterProvider<T> {
+    ctor public CollectionPreviewParameterProvider(java.util.Collection<? extends T> collection);
+    method public kotlin.sequences.Sequence<T> getValues();
+    property public kotlin.sequences.Sequence<T> values;
+  }
+
+  public final class LoremIpsum implements androidx.compose.ui.tooling.preview.PreviewParameterProvider<java.lang.String> {
+    ctor public LoremIpsum(int words);
+    ctor public LoremIpsum();
+    method public kotlin.sequences.Sequence<java.lang.String> getValues();
+    property public kotlin.sequences.Sequence<java.lang.String> values;
+  }
+
+  public final class LoremIpsumKt {
+  }
+
+}
+
diff --git a/compose/ui/ui-tooling/api/1.3.0-beta01.txt b/compose/ui/ui-tooling/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..2f0241d
--- /dev/null
+++ b/compose/ui/ui-tooling/api/1.3.0-beta01.txt
@@ -0,0 +1,22 @@
+// Signature format: 4.0
+package androidx.compose.ui.tooling {
+
+  public final class ComposeViewAdapterKt {
+  }
+
+  public final class InspectableKt {
+    method @Deprecated @androidx.compose.runtime.Composable public static void InInspectionModeOnly(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class PreviewUtilsKt {
+  }
+
+}
+
+package androidx.compose.ui.tooling.animation {
+
+  public final class ComposeAnimationParserKt {
+  }
+
+}
+
diff --git a/compose/ui/ui-tooling/api/public_plus_experimental_1.3.0-beta01.txt b/compose/ui/ui-tooling/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..6428016
--- /dev/null
+++ b/compose/ui/ui-tooling/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,27 @@
+// 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 ComposeViewAdapterKt {
+  }
+
+  public final class InspectableKt {
+    method @Deprecated @androidx.compose.runtime.Composable public static void InInspectionModeOnly(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class PreviewUtilsKt {
+  }
+
+}
+
+package androidx.compose.ui.tooling.animation {
+
+  public final class ComposeAnimationParserKt {
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/compose/ui/ui-tooling/api/res-1.3.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/ui/ui-tooling/api/res-1.3.0-beta01.txt
diff --git a/compose/ui/ui-tooling/api/restricted_1.3.0-beta01.txt b/compose/ui/ui-tooling/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..2f0241d
--- /dev/null
+++ b/compose/ui/ui-tooling/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,22 @@
+// Signature format: 4.0
+package androidx.compose.ui.tooling {
+
+  public final class ComposeViewAdapterKt {
+  }
+
+  public final class InspectableKt {
+    method @Deprecated @androidx.compose.runtime.Composable public static void InInspectionModeOnly(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class PreviewUtilsKt {
+  }
+
+}
+
+package androidx.compose.ui.tooling.animation {
+
+  public final class ComposeAnimationParserKt {
+  }
+
+}
+
diff --git a/compose/ui/ui-tooling/build.gradle b/compose/ui/ui-tooling/build.gradle
index f8b91da..59a1dfa 100644
--- a/compose/ui/ui-tooling/build.gradle
+++ b/compose/ui/ui-tooling/build.gradle
@@ -32,7 +32,7 @@
         implementation(libs.kotlinStdlib)
 
         api("androidx.annotation:annotation:1.1.0")
-        implementation("androidx.compose.animation:animation:1.1.1")
+        implementation(project(":compose:animation:animation"))
 
         api("androidx.compose.runtime:runtime:1.1.1")
         api(project(":compose:ui:ui"))
diff --git a/compose/ui/ui-tooling/src/androidAndroidTest/kotlin/androidx/compose/ui/tooling/ComposeViewAdapterTest.kt b/compose/ui/ui-tooling/src/androidAndroidTest/kotlin/androidx/compose/ui/tooling/ComposeViewAdapterTest.kt
index 89882d6..44e1a97 100644
--- a/compose/ui/ui-tooling/src/androidAndroidTest/kotlin/androidx/compose/ui/tooling/ComposeViewAdapterTest.kt
+++ b/compose/ui/ui-tooling/src/androidAndroidTest/kotlin/androidx/compose/ui/tooling/ComposeViewAdapterTest.kt
@@ -21,6 +21,7 @@
 import android.os.Bundle
 import androidx.compose.animation.core.InternalAnimationApi
 import androidx.compose.ui.tooling.animation.PreviewAnimationClock
+import androidx.compose.ui.tooling.animation.UnsupportedComposeAnimation
 import androidx.compose.ui.tooling.data.UiToolingDataApi
 import androidx.compose.ui.tooling.test.R
 import androidx.test.filters.LargeTest
@@ -155,7 +156,7 @@
 
     @Test
     fun animatedContentIsSubscribed() {
-        checkUnsupportedIsSubscribed("AnimatedContentPreview", listOf("AnimatedContent"))
+        checkAnimationsAreSubscribed("AnimatedContentPreview", listOf("AnimatedContent"))
     }
 
     @Test
@@ -170,38 +171,62 @@
 
     @Test
     fun animateXAsStateIsSubscribed() {
-        checkUnsupportedIsSubscribed(
+        checkAnimationsAreSubscribed(
             "AnimateAsStatePreview",
-            listOf("animateValueAsState", "animateValueAsState")
+            listOf("DpAnimation", "IntAnimation")
         )
     }
 
     @Test
     fun animateContentSizeIsSubscribed() {
-        checkUnsupportedIsSubscribed("AnimateContentSizePreview", listOf("animateContentSize"))
+        checkAnimationsAreSubscribed("AnimateContentSizePreview", listOf("animateContentSize"))
     }
 
     @Test
     fun crossFadeIsSubscribed() {
-        checkTransitionIsSubscribed("CrossFadePreview", "String")
+        checkTransitionIsSubscribed("CrossFadePreview", "Crossfade")
     }
 
     @Test
     fun targetBasedAnimationIsSubscribed() {
-        checkUnsupportedIsSubscribed("TargetBasedAnimationPreview", listOf("TargetBasedAnimation"))
+        checkAnimationsAreSubscribed("TargetBasedAnimationPreview", listOf("TargetBasedAnimation"))
     }
 
     @Test
     fun decayAnimationIsSubscribed() {
-        checkUnsupportedIsSubscribed("DecayAnimationPreview", listOf("DecayAnimation"))
+        checkAnimationsAreSubscribed("DecayAnimationPreview", listOf("DecayAnimation"))
     }
 
     @Test
     fun infiniteTransitionIsSubscribed() {
-        checkUnsupportedIsSubscribed("InfiniteTransitionPreview", listOf("InfiniteTransition"))
+        checkAnimationsAreSubscribed("InfiniteTransitionPreview", listOf("InfiniteTransition"))
     }
 
-    private fun checkUnsupportedIsSubscribed(preview: String, labels: List<String>) {
+    @Test
+    fun unsupportedAreNotSubscribedWhenEnumIsNotAvailable() {
+        UnsupportedComposeAnimation.testOverrideAvailability(false)
+        checkAnimationsAreSubscribed(
+            "AllAnimations",
+            emptyList(),
+            listOf("checkBoxAnim", "Crossfade")
+        )
+        UnsupportedComposeAnimation.testOverrideAvailability(true)
+    }
+
+    @Test
+    fun animationsAreOrdered() {
+        checkAnimationsAreSubscribed(
+            "AnimationOrder",
+            emptyList(),
+            listOf("transitionOne", "transitionTwo", "transitionThree")
+        )
+    }
+
+    private fun checkAnimationsAreSubscribed(
+        preview: String,
+        unsupported: List<String>,
+        transitions: List<String> = emptyList()
+    ) {
         val clock = PreviewAnimationClock()
 
         activityTestRule.runOnUiThread {
@@ -212,9 +237,11 @@
             composeViewAdapter.clock = clock
             assertFalse(composeViewAdapter.hasAnimations())
             assertTrue(clock.trackedTransitions.isEmpty())
+            assertTrue(clock.trackedUnsupported.isEmpty())
+            assertTrue(clock.trackedAnimatedVisibility.isEmpty())
         }
 
-        waitFor("Composable to have animations", 1, TimeUnit.SECONDS) {
+        waitFor("Composable to have animations", 5, TimeUnit.SECONDS) {
             // Handle the case where onLayout was called too soon. Calling requestLayout will
             // make sure onLayout will be called again.
             composeViewAdapter.requestLayout()
@@ -222,8 +249,8 @@
         }
 
         activityTestRule.runOnUiThread {
-            assertEquals(labels, clock.trackedUnsupported.map { it.label }.sortedBy { it })
-            assertEquals(0, clock.trackedTransitions.size)
+            assertEquals(unsupported, clock.trackedUnsupported.map { it.label })
+            assertEquals(transitions, clock.trackedTransitions.map { it.label })
             assertEquals(0, clock.trackedAnimatedVisibility.size)
         }
     }
diff --git a/compose/ui/ui-tooling/src/androidAndroidTest/kotlin/androidx/compose/ui/tooling/TestAnimationPreview.kt b/compose/ui/ui-tooling/src/androidAndroidTest/kotlin/androidx/compose/ui/tooling/TestAnimationPreview.kt
index 408d822..cb77adb 100644
--- a/compose/ui/ui-tooling/src/androidAndroidTest/kotlin/androidx/compose/ui/tooling/TestAnimationPreview.kt
+++ b/compose/ui/ui-tooling/src/androidAndroidTest/kotlin/androidx/compose/ui/tooling/TestAnimationPreview.kt
@@ -89,6 +89,37 @@
     }
 }
 
+@Preview(name = "All unsupported and transition animations")
+@Composable
+fun AllAnimations() {
+    AnimatedContentPreview()
+    CheckBox()
+    AnimateAsStatePreview()
+    CrossFadePreview()
+    AnimateContentSizePreview()
+    TargetBasedAnimationPreview()
+    DecayAnimationPreview()
+    InfiniteTransitionPreview()
+}
+
+@Preview(name = "Animations are ordered")
+@Composable
+fun AnimationOrder() {
+    val selected by remember { mutableStateOf(false) }
+    updateTransition(
+        if (selected) CheckBoxState.Selected else CheckBoxState.Unselected,
+        label = "transitionOne"
+    )
+    updateTransition(
+        if (selected) CheckBoxState.Selected else CheckBoxState.Unselected,
+        label = "transitionTwo"
+    )
+    updateTransition(
+        if (selected) CheckBoxState.Selected else CheckBoxState.Unselected,
+        label = "transitionThree"
+    )
+}
+
 @OptIn(ExperimentalAnimationApi::class)
 @Preview(name = "AnimatedContent")
 @Composable
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/ComposeViewAdapter.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/ComposeViewAdapter.kt
index fe71638..e17c784 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/ComposeViewAdapter.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/ComposeViewAdapter.kt
@@ -73,6 +73,7 @@
 import androidx.compose.animation.core.DecayAnimation
 import androidx.compose.animation.core.InfiniteTransition
 import androidx.compose.animation.core.TargetBasedAnimation
+import androidx.compose.ui.tooling.animation.UnsupportedComposeAnimation
 import kotlin.reflect.KClass
 import kotlin.reflect.safeCast
 
@@ -290,7 +291,9 @@
         open fun parse(treeWithLocation: Collection<Group>) {}
         fun hasAnimations() = animations.isNotEmpty()
         fun track() {
-            animations.forEach { trackAnimation(it) }
+            // Animations are found in reversed order in the tree,
+            // reverse it back so they are tracked in the order they appear in the code.
+            animations.reversed().forEach { trackAnimation(it) }
         }
     }
 
@@ -435,10 +438,14 @@
         val animatedVisibilitySearch = AnimatedVisibilitySearch {
             clock.trackAnimatedVisibility(it as Transition<Any>, ::requestLayout)
         }
-
-        val search = listOf(
+        // All supported animations.
+        val supportedSearch = setOf(
             transitionSearch,
             animatedVisibilitySearch,
+        )
+
+        // All unsupported animations, if API is available.
+        val extraSearch = if (UnsupportedComposeAnimation.apiAvailable) setOf(
             animatedContentSearch,
             AnimateXAsStateSearch { clock.trackAnimateXAsState(it as Animatable<*, *>) },
             AnimateContentSizeSearch { clock.trackAnimateContentSize(it) },
@@ -451,14 +458,21 @@
             RememberSearch(InfiniteTransition::class) {
                 clock.trackInfiniteTransition(it as InfiniteTransition)
             }
-        )
+        ) else emptyList()
+
+        // Animations to track in PreviewAnimationClock.
+        val setToTrack = supportedSearch + extraSearch
+
+        // Animations to search. animatedContentSearch is included even if it's not going to be
+        // tracked as it should be excluded from transitionSearch.
+        val setToSearch = setToTrack + setOf(animatedContentSearch)
 
         // Check all the slot tables, since some animations might not be present in the same
         // table as the one containing the `@Composable` being previewed, e.g. when they're
         // defined using sub-composition.
         slotTrees.forEach { tree ->
             val treeWithLocation = tree.findAll { it.location != null }
-            search.forEach { it.parse(treeWithLocation) }
+            setToSearch.forEach { it.parse(treeWithLocation) }
 
             // Remove all AnimatedVisibility parent transitions from the transitions list,
             // otherwise we'd duplicate them in the Android Studio Animation Preview because we
@@ -470,11 +484,11 @@
             transitionSearch.animations.removeAll(animatedContentSearch.animations)
         }
 
-        hasAnimations = search.any { it.hasAnimations() }
+        hasAnimations = setToTrack.any { it.hasAnimations() }
 
         // Make the `PreviewAnimationClock` track all the transitions found.
         if (::clock.isInitialized) {
-            search.forEach { it.track() }
+            setToTrack.forEach { it.track() }
         }
     }
 
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/ComposeAnimationParser.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/ComposeAnimationParser.kt
index abc83a1..f5cc293 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/ComposeAnimationParser.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/ComposeAnimationParser.kt
@@ -20,6 +20,7 @@
 import androidx.compose.animation.core.Transition
 import androidx.compose.animation.tooling.ComposeAnimation
 import androidx.compose.animation.tooling.ComposeAnimationType
+import org.jetbrains.annotations.TestOnly
 
 // TODO(b/160126628): support other animation types, e.g. single animated value
 /**
@@ -73,12 +74,32 @@
 /**
  * [ComposeAnimation] of type [ComposeAnimationType.UNSUPPORTED].
  */
-internal class UnsupportedComposeAnimation(
+internal class UnsupportedComposeAnimation private constructor(
     override val label: String?
 ) : ComposeAnimation {
     override val type = ComposeAnimationType.UNSUPPORTED
     override val animationObject: Any = 0
     override val states = emptySet<Int>()
+
+    companion object {
+        /**
+         * [ComposeAnimationType] from ANIMATABLE to UNSUPPORTED are not available in previous
+         * versions of the library. To avoid creating non-existing enum,
+         * [UnsupportedComposeAnimation] should only be instantiated if [ComposeAnimationType] API
+         * for UNSUPPORTED enum is available.
+         */
+        var apiAvailable = enumValues<ComposeAnimationType>().any { it.name == "UNSUPPORTED" }
+            private set
+
+        fun create(label: String?) =
+            if (apiAvailable) UnsupportedComposeAnimation(label) else null
+
+        /** This method is for testing only. */
+        @TestOnly
+        fun testOverrideAvailability(override: Boolean) {
+            apiAvailable = override
+        }
+    }
 }
 
 /**
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/PreviewAnimationClock.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/PreviewAnimationClock.kt
index 4329d4f..bb8ed1b 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/PreviewAnimationClock.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/PreviewAnimationClock.kt
@@ -62,7 +62,7 @@
      * and in [getAnimatedProperties], where we get the animation values.
      */
     @VisibleForTesting
-    internal val trackedTransitions = hashSetOf<TransitionComposeAnimation>()
+    internal val trackedTransitions = linkedSetOf<TransitionComposeAnimation>()
 
     /**
      * Set of tracked [AnimatedVisibilityComposeAnimation]s, each one having a [Transition] object
@@ -72,11 +72,11 @@
      * child transition used in [getAnimatedProperties], where we get the animation values.
      */
     @VisibleForTesting
-    internal val trackedAnimatedVisibility = hashSetOf<AnimatedVisibilityComposeAnimation>()
+    internal val trackedAnimatedVisibility = linkedSetOf<AnimatedVisibilityComposeAnimation>()
 
     /** Set of detected but not supported animations. */
     @VisibleForTesting
-    internal val trackedUnsupported = hashSetOf<UnsupportedComposeAnimation>()
+    internal val trackedUnsupported = linkedSetOf<UnsupportedComposeAnimation>()
 
     /**
      * Maps [Transition]s to their corresponding cached [TransitionState], which we use to seek
@@ -115,10 +115,11 @@
      * Each animation can only be subscribed once.
      */
     private inner class UnsupportedComposeAnimationSubscriber<T> {
-        private val animations = mutableSetOf<T>()
+        private val animations = linkedSetOf<T>()
         private val lock = Any()
 
         fun trackAnimation(animation: T, label: String) {
+            if (!UnsupportedComposeAnimation.apiAvailable) return
             synchronized(lock) {
                 if (animations.contains(animation)) {
                     if (DEBUG) {
@@ -133,9 +134,10 @@
                 Log.d(TAG, "Animation $animation is now tracked")
             }
 
-            val composeAnimation = UnsupportedComposeAnimation(label)
-            trackedUnsupported.add(composeAnimation)
-            notifySubscribe(composeAnimation)
+            UnsupportedComposeAnimation.create(label)?.let {
+                trackedUnsupported.add(it)
+                notifySubscribe(it)
+            }
         }
 
         fun clear() {
@@ -199,8 +201,7 @@
     }
 
     fun trackAnimateXAsState(animatable: Animatable<*, *>) {
-        // TODO(b/240919893) Use label from animatable.
-        animateXAsStateSubscriber.trackAnimation(animatable, "animateValueAsState")
+        animateXAsStateSubscriber.trackAnimation(animatable, animatable.label)
     }
 
     fun trackAnimateContentSize(sizeAnimationModifier: Any) {
diff --git a/compose/ui/ui-unit/api/1.3.0-beta01.txt b/compose/ui/ui-unit/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..22c19dd
--- /dev/null
+++ b/compose/ui/ui-unit/api/1.3.0-beta01.txt
@@ -0,0 +1,418 @@
+// 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 public final boolean hasFixedHeight;
+    property public final boolean hasFixedWidth;
+    property 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 public final float x;
+    property 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 public final float height;
+    property 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 public final int x;
+    property 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 public final int height;
+    property public final boolean isEmpty;
+    property public final int left;
+    property public final int maxDimension;
+    property public final int minDimension;
+    property public final int right;
+    property public final long size;
+    property public final int top;
+    property public final long topCenter;
+    property public final long topLeft;
+    property public final long topRight;
+    property public final int width;
+    field public static final androidx.compose.ui.unit.IntRect.Companion Companion;
+  }
+
+  public static final class IntRect.Companion {
+    method public androidx.compose.ui.unit.IntRect getZero();
+    property public final androidx.compose.ui.unit.IntRect Zero;
+  }
+
+  public final class IntRectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect(long offset, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect(long center, int radius);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect lerp(androidx.compose.ui.unit.IntRect start, androidx.compose.ui.unit.IntRect stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable @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 public final int height;
+    property 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 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 public final float x;
+    property 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);
+  }
+
+}
+
+package androidx.compose.ui.unit.internal {
+
+  public final class JvmDefaultWithCompatibility_jvmKt {
+  }
+
+}
+
diff --git a/compose/ui/ui-unit/api/public_plus_experimental_1.3.0-beta01.txt b/compose/ui/ui-unit/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..35ad3e1
--- /dev/null
+++ b/compose/ui/ui-unit/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,422 @@
+// 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 public final boolean hasFixedHeight;
+    property public final boolean hasFixedWidth;
+    property 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 public final float x;
+    property 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 public final float height;
+    property 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.") 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 public final int x;
+    property 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 public final int height;
+    property public final boolean isEmpty;
+    property public final int left;
+    property public final int maxDimension;
+    property public final int minDimension;
+    property public final int right;
+    property public final long size;
+    property public final int top;
+    property public final long topCenter;
+    property public final long topLeft;
+    property public final long topRight;
+    property public final int width;
+    field public static final androidx.compose.ui.unit.IntRect.Companion Companion;
+  }
+
+  public static final class IntRect.Companion {
+    method public androidx.compose.ui.unit.IntRect getZero();
+    property public final androidx.compose.ui.unit.IntRect Zero;
+  }
+
+  public final class IntRectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect(long offset, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect(long center, int radius);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect lerp(androidx.compose.ui.unit.IntRect start, androidx.compose.ui.unit.IntRect stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable @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 public final int height;
+    property 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 @androidx.compose.ui.unit.ExperimentalUnitApi public static long TextUnit(float value, long type);
+    method public static long getEm(float);
+    method public static long getEm(double);
+    method public static long getEm(int);
+    method public static long getSp(float);
+    method public static long getSp(double);
+    method public static long getSp(int);
+    method public static inline boolean isSpecified(long);
+    method public static boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.TextUnit> block);
+    method @androidx.compose.runtime.Stable public static inline operator long times(float, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long times(double, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long times(int, long other);
+  }
+
+  @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 public final float x;
+    property 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);
+  }
+
+}
+
+package androidx.compose.ui.unit.internal {
+
+  public final class JvmDefaultWithCompatibility_jvmKt {
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/compose/ui/ui-unit/api/res-1.3.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/ui/ui-unit/api/res-1.3.0-beta01.txt
diff --git a/compose/ui/ui-unit/api/restricted_1.3.0-beta01.txt b/compose/ui/ui-unit/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..3b5fb53
--- /dev/null
+++ b/compose/ui/ui-unit/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,422 @@
+// 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 public final boolean hasFixedHeight;
+    property public final boolean hasFixedWidth;
+    property 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 public final float x;
+    property 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 public final float height;
+    property 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 public final int x;
+    property 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 public final int height;
+    property public final boolean isEmpty;
+    property public final int left;
+    property public final int maxDimension;
+    property public final int minDimension;
+    property public final int right;
+    property public final long size;
+    property public final int top;
+    property public final long topCenter;
+    property public final long topLeft;
+    property public final long topRight;
+    property public final int width;
+    field public static final androidx.compose.ui.unit.IntRect.Companion Companion;
+  }
+
+  public static final class IntRect.Companion {
+    method public androidx.compose.ui.unit.IntRect getZero();
+    property public final androidx.compose.ui.unit.IntRect Zero;
+  }
+
+  public final class IntRectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect(long offset, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect(long center, int radius);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect lerp(androidx.compose.ui.unit.IntRect start, androidx.compose.ui.unit.IntRect stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable @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 public final int height;
+    property 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 @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 public final float x;
+    property 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);
+  }
+
+}
+
+package androidx.compose.ui.unit.internal {
+
+  public final class JvmDefaultWithCompatibility_jvmKt {
+  }
+
+}
+
diff --git a/compose/ui/ui-util/api/1.3.0-beta01.txt b/compose/ui/ui-util/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..b71072e
--- /dev/null
+++ b/compose/ui/ui-util/api/1.3.0-beta01.txt
@@ -0,0 +1,36 @@
+// Signature format: 4.0
+package androidx.compose.ui.util {
+
+  public final class AndroidTrace_androidKt {
+    method public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+  public final class InlineClassHelperKt {
+    method public static inline long packFloats(float val1, float val2);
+    method public static inline long packInts(int val1, int val2);
+    method public static inline float unpackFloat1(long value);
+    method public static inline float unpackFloat2(long value);
+    method public static inline int unpackInt1(long value);
+    method public static inline int unpackInt2(long value);
+  }
+
+  public final class ListUtilsKt {
+    method public static inline <T> boolean fastAll(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public static inline <T> boolean fastAny(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public static inline <T> T? fastFirstOrNull(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public static inline <T> void fastForEach(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> action);
+    method public static inline <T> void fastForEachIndexed(java.util.List<? extends T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+    method public static inline <T, R> java.util.List<R> fastMap(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+    method public static inline <T, R, C extends java.util.Collection<? super R>> C fastMapTo(java.util.List<? extends T>, C destination, kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+    method public static inline <T, R extends java.lang.Comparable<? super R>> T? fastMaxBy(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,? extends R> selector);
+    method public static inline <T> int fastSumBy(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,java.lang.Integer> selector);
+  }
+
+  public final class MathHelpersKt {
+    method public static float lerp(float start, float stop, float fraction);
+    method public static int lerp(int start, int stop, float fraction);
+    method public static long lerp(long start, long stop, float fraction);
+  }
+
+}
+
diff --git a/compose/ui/ui-util/api/public_plus_experimental_1.3.0-beta01.txt b/compose/ui/ui-util/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..b71072e
--- /dev/null
+++ b/compose/ui/ui-util/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,36 @@
+// Signature format: 4.0
+package androidx.compose.ui.util {
+
+  public final class AndroidTrace_androidKt {
+    method public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+  public final class InlineClassHelperKt {
+    method public static inline long packFloats(float val1, float val2);
+    method public static inline long packInts(int val1, int val2);
+    method public static inline float unpackFloat1(long value);
+    method public static inline float unpackFloat2(long value);
+    method public static inline int unpackInt1(long value);
+    method public static inline int unpackInt2(long value);
+  }
+
+  public final class ListUtilsKt {
+    method public static inline <T> boolean fastAll(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public static inline <T> boolean fastAny(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public static inline <T> T? fastFirstOrNull(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public static inline <T> void fastForEach(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> action);
+    method public static inline <T> void fastForEachIndexed(java.util.List<? extends T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+    method public static inline <T, R> java.util.List<R> fastMap(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+    method public static inline <T, R, C extends java.util.Collection<? super R>> C fastMapTo(java.util.List<? extends T>, C destination, kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+    method public static inline <T, R extends java.lang.Comparable<? super R>> T? fastMaxBy(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,? extends R> selector);
+    method public static inline <T> int fastSumBy(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,java.lang.Integer> selector);
+  }
+
+  public final class MathHelpersKt {
+    method public static float lerp(float start, float stop, float fraction);
+    method public static int lerp(int start, int stop, float fraction);
+    method public static long lerp(long start, long stop, float fraction);
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/compose/ui/ui-util/api/res-1.3.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/ui/ui-util/api/res-1.3.0-beta01.txt
diff --git a/compose/ui/ui-util/api/restricted_1.3.0-beta01.txt b/compose/ui/ui-util/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..b71072e
--- /dev/null
+++ b/compose/ui/ui-util/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,36 @@
+// Signature format: 4.0
+package androidx.compose.ui.util {
+
+  public final class AndroidTrace_androidKt {
+    method public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+  public final class InlineClassHelperKt {
+    method public static inline long packFloats(float val1, float val2);
+    method public static inline long packInts(int val1, int val2);
+    method public static inline float unpackFloat1(long value);
+    method public static inline float unpackFloat2(long value);
+    method public static inline int unpackInt1(long value);
+    method public static inline int unpackInt2(long value);
+  }
+
+  public final class ListUtilsKt {
+    method public static inline <T> boolean fastAll(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public static inline <T> boolean fastAny(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public static inline <T> T? fastFirstOrNull(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public static inline <T> void fastForEach(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> action);
+    method public static inline <T> void fastForEachIndexed(java.util.List<? extends T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+    method public static inline <T, R> java.util.List<R> fastMap(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+    method public static inline <T, R, C extends java.util.Collection<? super R>> C fastMapTo(java.util.List<? extends T>, C destination, kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+    method public static inline <T, R extends java.lang.Comparable<? super R>> T? fastMaxBy(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,? extends R> selector);
+    method public static inline <T> int fastSumBy(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,java.lang.Integer> selector);
+  }
+
+  public final class MathHelpersKt {
+    method public static float lerp(float start, float stop, float fraction);
+    method public static int lerp(int start, int stop, float fraction);
+    method public static long lerp(long start, long stop, float fraction);
+  }
+
+}
+
diff --git a/compose/ui/ui-viewbinding/api/1.3.0-beta01.txt b/compose/ui/ui-viewbinding/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..07ba909
--- /dev/null
+++ b/compose/ui/ui-viewbinding/api/1.3.0-beta01.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.compose.ui.viewinterop {
+
+  public final class AndroidViewBindingKt {
+    method @androidx.compose.runtime.Composable public static <T extends androidx.viewbinding.ViewBinding> void AndroidViewBinding(kotlin.jvm.functions.Function3<? super android.view.LayoutInflater,? super android.view.ViewGroup,? super java.lang.Boolean,? extends T> factory, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update);
+  }
+
+}
+
diff --git a/compose/ui/ui-viewbinding/api/public_plus_experimental_1.3.0-beta01.txt b/compose/ui/ui-viewbinding/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..07ba909
--- /dev/null
+++ b/compose/ui/ui-viewbinding/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.compose.ui.viewinterop {
+
+  public final class AndroidViewBindingKt {
+    method @androidx.compose.runtime.Composable public static <T extends androidx.viewbinding.ViewBinding> void AndroidViewBinding(kotlin.jvm.functions.Function3<? super android.view.LayoutInflater,? super android.view.ViewGroup,? super java.lang.Boolean,? extends T> factory, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update);
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/compose/ui/ui-viewbinding/api/res-1.3.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/ui/ui-viewbinding/api/res-1.3.0-beta01.txt
diff --git a/compose/ui/ui-viewbinding/api/restricted_1.3.0-beta01.txt b/compose/ui/ui-viewbinding/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..07ba909
--- /dev/null
+++ b/compose/ui/ui-viewbinding/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.compose.ui.viewinterop {
+
+  public final class AndroidViewBindingKt {
+    method @androidx.compose.runtime.Composable public static <T extends androidx.viewbinding.ViewBinding> void AndroidViewBinding(kotlin.jvm.functions.Function3<? super android.view.LayoutInflater,? super android.view.ViewGroup,? super java.lang.Boolean,? extends T> factory, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update);
+  }
+
+}
+
diff --git a/compose/ui/ui/api/1.3.0-beta01.txt b/compose/ui/ui/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..3a48b6b
--- /dev/null
+++ b/compose/ui/ui/api/1.3.0-beta01.txt
@@ -0,0 +1,3136 @@
+// 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;
+  }
+
+  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;
+  }
+
+  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> {
+  }
+
+  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 {
+  }
+
+  public final class ZIndexModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier zIndex(androidx.compose.ui.Modifier, float zIndex);
+  }
+
+}
+
+package androidx.compose.ui.autofill {
+
+  public final class AndroidAutofillType_androidKt {
+  }
+
+  public final class AndroidAutofill_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.draw {
+
+  public final class AlphaKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier alpha(androidx.compose.ui.Modifier, float alpha);
+  }
+
+  public final class BlurKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier blur(androidx.compose.ui.Modifier, float radiusX, float radiusY, optional androidx.compose.ui.graphics.Shape edgeTreatment);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier blur(androidx.compose.ui.Modifier, float radius, optional androidx.compose.ui.graphics.Shape edgeTreatment);
+  }
+
+  @androidx.compose.runtime.Immutable @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 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);
+  }
+
+  @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 getIn();
+    method public int getLeft();
+    method public int getNext();
+    method public int getOut();
+    method public int getPrevious();
+    method public int getRight();
+    method public int getUp();
+    property public final int Down;
+    property public final int In;
+    property public final int Left;
+    property public final int Next;
+    property public final int Out;
+    property public final int Previous;
+    property public final int Right;
+    property public final int Up;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusEventModifier extends androidx.compose.ui.Modifier.Element {
+    method public void onFocusEvent(androidx.compose.ui.focus.FocusState focusState);
+  }
+
+  public final class FocusEventModifierKt {
+    method public static androidx.compose.ui.Modifier onFocusEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusState,kotlin.Unit> onFocusEvent);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusManager {
+    method public void clearFocus(optional boolean force);
+    method public boolean moveFocus(int focusDirection);
+  }
+
+  public final class FocusManagerKt {
+  }
+
+  public final class FocusModifierKt {
+    method @Deprecated public static androidx.compose.ui.Modifier focusModifier(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier focusTarget(androidx.compose.ui.Modifier);
+  }
+
+  @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);
+  }
+
+  public final class FocusRequester {
+    ctor public FocusRequester();
+    method public boolean captureFocus();
+    method public boolean freeFocus();
+    method public void requestFocus();
+    field public static final androidx.compose.ui.focus.FocusRequester.Companion Companion;
+  }
+
+  public static final class FocusRequester.Companion {
+    method public androidx.compose.ui.focus.FocusRequester getDefault();
+    property public final androidx.compose.ui.focus.FocusRequester Default;
+  }
+
+  public final class FocusRequesterKt {
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusRequesterModifier extends androidx.compose.ui.Modifier.Element {
+    method public androidx.compose.ui.focus.FocusRequester getFocusRequester();
+    property public abstract androidx.compose.ui.focus.FocusRequester focusRequester;
+  }
+
+  public final class FocusRequesterModifierKt {
+    method public static androidx.compose.ui.Modifier focusRequester(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester);
+  }
+
+  public interface FocusState {
+    method public boolean getHasFocus();
+    method public boolean isCaptured();
+    method public boolean isFocused();
+    property public abstract boolean hasFocus;
+    property public abstract boolean isCaptured;
+    property public abstract boolean isFocused;
+  }
+
+  public final class FocusTransactionsKt {
+  }
+
+  public final class FocusTraversalKt {
+  }
+
+  public final class OneDimensionalFocusSearchKt {
+  }
+
+  public final class TwoDimensionalFocusSearchKt {
+  }
+
+}
+
+package androidx.compose.ui.graphics {
+
+  public final class GraphicsLayerModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional androidx.compose.ui.graphics.RenderEffect? renderEffect, optional long ambientShadowColor, optional long spotShadowColor);
+    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 @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 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 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 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 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 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.graphics.vector.compat {
+
+  public final class XmlVectorParser_androidKt {
+  }
+
+}
+
+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);
+  }
+
+  public final class NestedScrollModifierLocalKt {
+  }
+
+  @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 {
+  }
+
+  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 final class PointerInputEventProcessorKt {
+  }
+
+  public abstract class PointerInputFilter {
+    ctor public PointerInputFilter();
+    method public boolean getInterceptOutOfBoundsChildEvents();
+    method public final long getSize();
+    method public abstract void onCancel();
+    method public abstract void onPointerEvent(androidx.compose.ui.input.pointer.PointerEvent pointerEvent, androidx.compose.ui.input.pointer.PointerEventPass pass, long bounds);
+    property public boolean interceptOutOfBoundsChildEvents;
+    property public final long size;
+  }
+
+  @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 PointerInputTestUtilKt {
+  }
+
+  public final class PointerInteropFilter_androidKt {
+  }
+
+  public final class PointerInteropUtils_androidKt {
+  }
+
+  @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 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 {
+  }
+
+}
+
+package androidx.compose.ui.internal {
+
+  public final class JvmDefaultWithCompatibility_jvmKt {
+  }
+
+}
+
+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;
+  }
+
+  public final class ContentScaleKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class FixedScale implements androidx.compose.ui.layout.ContentScale {
+    ctor public FixedScale(float value);
+    method public float component1();
+    method public long computeScaleFactor(long srcSize, long dstSize);
+    method public androidx.compose.ui.layout.FixedScale copy(float value);
+    method public float getValue();
+    property public final float value;
+  }
+
+  @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 final class IntrinsicMeasurableKt {
+  }
+
+  public interface IntrinsicMeasureScope extends androidx.compose.ui.unit.Density {
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
+  }
+
+  @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 @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 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);
+  }
+
+  @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 final class MeasureScopeKt {
+  }
+
+  public interface Measured {
+    method public operator int get(androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public int getMeasuredHeight();
+    method public int getMeasuredWidth();
+    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;
+  }
+
+  @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);
+  }
+
+  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 final class PlaceableKt {
+  }
+
+  public final class RelocationModifierKt {
+  }
+
+  public final class RelocationRequesterModifierKt {
+  }
+
+  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 public final float scaleX;
+    property 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 {
+  }
+
+  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();
+    property public abstract androidx.compose.ui.modifier.ProvidableModifierLocal<T> key;
+    property public abstract T! value;
+  }
+
+  public final class ModifierLocalProviderKt {
+  }
+
+  public interface ModifierLocalReadScope {
+    method public <T> T! getCurrent(androidx.compose.ui.modifier.ModifierLocal<T>);
+  }
+
+  @androidx.compose.runtime.Stable public final class ProvidableModifierLocal<T> extends androidx.compose.ui.modifier.ModifierLocal<T> {
+    ctor public ProvidableModifierLocal(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+  }
+
+}
+
+package androidx.compose.ui.node {
+
+  public final class 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 ModifierNodeElementKt {
+  }
+
+  public final class MyersDiffKt {
+  }
+
+  public final class NodeChainKt {
+  }
+
+  public final class NodeCoordinatorKt {
+  }
+
+  public final class NodeKindKt {
+  }
+
+  public final class PointerInputModifierNodeKt {
+  }
+
+  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;
+  }
+
+  public final class SemanticsModifierNodeKt {
+  }
+
+  public final class ViewInterop_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.platform {
+
+  public abstract class AbstractComposeView extends android.view.ViewGroup {
+    ctor public AbstractComposeView(android.content.Context context, optional android.util.AttributeSet? attrs, optional int defStyleAttr);
+    ctor public AbstractComposeView(android.content.Context context, optional android.util.AttributeSet? attrs);
+    ctor public AbstractComposeView(android.content.Context context);
+    method @androidx.compose.runtime.Composable @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 AndroidClipboardManager_androidKt {
+  }
+
+  public final class AndroidComposeViewAccessibilityDelegateCompat_androidKt {
+  }
+
+  public final class AndroidComposeView_androidKt {
+  }
+
+  public final class AndroidCompositionLocals_androidKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> getLocalConfiguration();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> getLocalContext();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> getLocalLifecycleOwner();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> getLocalSavedStateRegistryOwner();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> getLocalView();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> LocalConfiguration;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> LocalContext;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> LocalLifecycleOwner;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> LocalSavedStateRegistryOwner;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> LocalView;
+  }
+
+  public final class AndroidUiDispatcher extends kotlinx.coroutines.CoroutineDispatcher {
+    method public void dispatch(kotlin.coroutines.CoroutineContext context, Runnable block);
+    method public android.view.Choreographer getChoreographer();
+    method public androidx.compose.runtime.MonotonicFrameClock getFrameClock();
+    property public final android.view.Choreographer choreographer;
+    property public final androidx.compose.runtime.MonotonicFrameClock frameClock;
+    field public static final androidx.compose.ui.platform.AndroidUiDispatcher.Companion Companion;
+  }
+
+  public static final class AndroidUiDispatcher.Companion {
+    method public kotlin.coroutines.CoroutineContext getCurrentThread();
+    method public kotlin.coroutines.CoroutineContext getMain();
+    property public final kotlin.coroutines.CoroutineContext CurrentThread;
+    property public final kotlin.coroutines.CoroutineContext Main;
+  }
+
+  public final class AndroidUiDispatcher_androidKt {
+  }
+
+  public final class AndroidUiFrameClock implements androidx.compose.runtime.MonotonicFrameClock {
+    ctor public AndroidUiFrameClock(android.view.Choreographer choreographer);
+    method public android.view.Choreographer getChoreographer();
+    method public suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R>);
+    property public final android.view.Choreographer choreographer;
+  }
+
+  public final class AndroidUriHandler implements androidx.compose.ui.platform.UriHandler {
+    ctor public AndroidUriHandler(android.content.Context context);
+    method public void openUri(String uri);
+  }
+
+  public final class AndroidViewConfiguration implements androidx.compose.ui.platform.ViewConfiguration {
+    ctor public AndroidViewConfiguration(android.view.ViewConfiguration viewConfiguration);
+    method public long getDoubleTapMinTimeMillis();
+    method public long getDoubleTapTimeoutMillis();
+    method public long getLongPressTimeoutMillis();
+    method public float getTouchSlop();
+    property public long doubleTapMinTimeMillis;
+    property public long doubleTapTimeoutMillis;
+    property public long longPressTimeoutMillis;
+    property public float touchSlop;
+  }
+
+  public interface ClipboardManager {
+    method public androidx.compose.ui.text.AnnotatedString? getText();
+    method public void setText(androidx.compose.ui.text.AnnotatedString annotatedString);
+  }
+
+  public final class ComposeView extends androidx.compose.ui.platform.AbstractComposeView {
+    ctor public ComposeView(android.content.Context context, optional android.util.AttributeSet? attrs, optional int defStyleAttr);
+    ctor public ComposeView(android.content.Context context, optional android.util.AttributeSet? attrs);
+    ctor public ComposeView(android.content.Context context);
+    method @androidx.compose.runtime.Composable public void Content();
+    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    property protected boolean shouldCreateCompositionOnAttachedToWindow;
+  }
+
+  public final class CompositionLocalsKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.AccessibilityManager> getLocalAccessibilityManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager> getLocalClipboardManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> getLocalDensity();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> getLocalFocusManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.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;
+  }
+
+  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>);
+    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 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();
+    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 InvertMatrixKt {
+  }
+
+  public final class JvmActuals_jvmKt {
+  }
+
+  public final class NestedScrollInteropConnectionKt {
+  }
+
+  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);
+  }
+
+  @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;
+  }
+
+  public final class ViewCompositionStrategy_androidKt {
+  }
+
+  @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 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 {
+
+  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 Resources_androidKt {
+  }
+
+  public final class StringResources_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String![] stringArrayResource(@ArrayRes int id);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String stringResource(@StringRes int id);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String stringResource(@StringRes int id, java.lang.Object... formatArgs);
+  }
+
+  public final class VectorResources_androidKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.ImageVector vectorResource(androidx.compose.ui.graphics.vector.ImageVector.Companion, @DrawableRes int id);
+    method @kotlin.jvm.Throws(exceptionClasses=XmlPullParserException::class) public static androidx.compose.ui.graphics.vector.ImageVector vectorResource(androidx.compose.ui.graphics.vector.ImageVector.Companion, optional android.content.res.Resources.Theme? theme, android.content.res.Resources res, int resId) throws org.xmlpull.v1.XmlPullParserException;
+  }
+
+}
+
+package androidx.compose.ui.semantics {
+
+  public final class AccessibilityAction<T extends kotlin.Function<? extends java.lang.Boolean>> {
+    ctor public AccessibilityAction(String? label, T? action);
+    method public T? getAction();
+    method public String? getLabel();
+    property public final T? action;
+    property public final String? label;
+  }
+
+  public final class CollectionInfo {
+    ctor public CollectionInfo(int rowCount, int columnCount);
+    method public int getColumnCount();
+    method public int getRowCount();
+    property public final int columnCount;
+    property public final int rowCount;
+  }
+
+  public final class CollectionItemInfo {
+    ctor public CollectionItemInfo(int rowIndex, int rowSpan, int columnIndex, int columnSpan);
+    method public int getColumnIndex();
+    method public int getColumnSpan();
+    method public int getRowIndex();
+    method public int getRowSpan();
+    property public final int columnIndex;
+    property public final int columnSpan;
+    property public final int rowIndex;
+    property public final int rowSpan;
+  }
+
+  public final class CustomAccessibilityAction {
+    ctor public CustomAccessibilityAction(String label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
+    method public kotlin.jvm.functions.Function0<java.lang.Boolean> getAction();
+    method public String getLabel();
+    property public final kotlin.jvm.functions.Function0<java.lang.Boolean> action;
+    property public final String label;
+  }
+
+  @androidx.compose.runtime.Immutable @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 getImage();
+    method public int getRadioButton();
+    method public int getSwitch();
+    method public int getTab();
+    property public final int Button;
+    property public final int Checkbox;
+    property public final int Image;
+    property public final int RadioButton;
+    property public final int Switch;
+    property public final int Tab;
+  }
+
+  public final class ScrollAxisRange {
+    ctor public ScrollAxisRange(kotlin.jvm.functions.Function0<java.lang.Float> value, kotlin.jvm.functions.Function0<java.lang.Float> maxValue, optional boolean reverseScrolling);
+    method public kotlin.jvm.functions.Function0<java.lang.Float> getMaxValue();
+    method public boolean getReverseScrolling();
+    method public kotlin.jvm.functions.Function0<java.lang.Float> getValue();
+    property public final kotlin.jvm.functions.Function0<java.lang.Float> maxValue;
+    property public final boolean reverseScrolling;
+    property public final kotlin.jvm.functions.Function0<java.lang.Float> value;
+  }
+
+  public final class SemanticsActions {
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCollapse();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCopyText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>> getCustomActions();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCutText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getDismiss();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getExpand();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>>> getGetTextLayoutResult();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnClick();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnLongClick();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getPasteText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.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>>> 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 SemanticsNodeKt {
+  }
+
+  public final class SemanticsOwner {
+    method public androidx.compose.ui.semantics.SemanticsNode getRootSemanticsNode();
+    method public androidx.compose.ui.semantics.SemanticsNode getUnmergedRootSemanticsNode();
+    property public final androidx.compose.ui.semantics.SemanticsNode rootSemanticsNode;
+    property public final androidx.compose.ui.semantics.SemanticsNode unmergedRootSemanticsNode;
+  }
+
+  public final class SemanticsOwnerKt {
+    method public static java.util.List<androidx.compose.ui.semantics.SemanticsNode> getAllSemanticsNodes(androidx.compose.ui.semantics.SemanticsOwner, boolean mergingEnabled);
+  }
+
+  public final class SemanticsProperties {
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> getCollectionInfo();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> getCollectionItemInfo();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> getContentDescription();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getDisabled();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> getEditableText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getError();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getFocused();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getHeading();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getHorizontalScrollAxisRange();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.input.ImeAction> getImeAction();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer>> getIndexForKey();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getInvisibleToUser();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getIsDialog();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getIsPopup();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.LiveRegionMode> getLiveRegion();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getPaneTitle();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getPassword();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ProgressBarRangeInfo> getProgressBarRangeInfo();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.Role> getRole();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getSelectableGroup();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getSelected();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getStateDescription();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getTestTag();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> getText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> getTextSelectionRange();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> getToggleableState();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getVerticalScrollAxisRange();
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> CollectionInfo;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> CollectionItemInfo;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> ContentDescription;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Disabled;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> EditableText;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> Error;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Focused;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Heading;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> HorizontalScrollAxisRange;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.input.ImeAction> ImeAction;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer>> IndexForKey;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> InvisibleToUser;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> IsDialog;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> IsPopup;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.LiveRegionMode> LiveRegion;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> PaneTitle;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Password;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ProgressBarRangeInfo> ProgressBarRangeInfo;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.Role> Role;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> SelectableGroup;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Selected;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> StateDescription;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> TestTag;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> Text;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> TextSelectionRange;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> ToggleableState;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> VerticalScrollAxisRange;
+    field public static final androidx.compose.ui.semantics.SemanticsProperties INSTANCE;
+  }
+
+  public final class SemanticsPropertiesKt {
+    method public static void collapse(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void copyText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void cutText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void dialog(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void disabled(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void dismiss(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void error(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String description);
+    method public static void expand(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static androidx.compose.ui.semantics.CollectionInfo getCollectionInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.CollectionItemInfo getCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> getCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.text.AnnotatedString getEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static boolean getFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.ScrollAxisRange getHorizontalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static int getImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static int getLiveRegion(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getPaneTitle(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.ProgressBarRangeInfo getProgressBarRangeInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static int getRole(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static boolean getSelected(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getStateDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.text.AnnotatedString getText(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void getTextLayoutResult(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>? action);
+    method public static long getTextSelectionRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.state.ToggleableState getToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.ScrollAxisRange getVerticalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void heading(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void indexForKey(androidx.compose.ui.semantics.SemanticsPropertyReceiver, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer> mapping);
+    method public static void onClick(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void onLongClick(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void password(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void pasteText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void popup(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void 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 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 {
+  }
+
+  public final class SemanticsPropertyKey<T> {
+    ctor public SemanticsPropertyKey(String name, optional kotlin.jvm.functions.Function2<? super T,? super T,? extends T> mergePolicy);
+    method public String getName();
+    method public operator T! getValue(androidx.compose.ui.semantics.SemanticsPropertyReceiver thisRef, kotlin.reflect.KProperty<?> property);
+    method public T? merge(T? parentValue, T? childValue);
+    method public operator void setValue(androidx.compose.ui.semantics.SemanticsPropertyReceiver thisRef, kotlin.reflect.KProperty<?> property, T? value);
+    property public final String name;
+  }
+
+  public interface SemanticsPropertyReceiver {
+    method public operator <T> void set(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, T? value);
+  }
+
+  public final class SemanticsSortKt {
+  }
+
+}
+
+package androidx.compose.ui.state {
+
+  public enum ToggleableState {
+    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 {
+  }
+
+}
+
+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();
+    property public static final kotlin.jvm.functions.Function1<android.view.View,kotlin.Unit> NoOpUpdate;
+  }
+
+}
+
+package androidx.compose.ui.window {
+
+  public final class AndroidDialog_androidKt {
+    method @androidx.compose.runtime.Composable public static void Dialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.window.DialogProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class AndroidPopup_androidKt {
+    method @androidx.compose.runtime.Composable public static void Popup(optional androidx.compose.ui.Alignment alignment, optional long offset, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Popup(androidx.compose.ui.window.PopupPositionProvider popupPositionProvider, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @org.jetbrains.annotations.TestOnly public static boolean isPopupLayout(android.view.View view, optional String? testTag);
+  }
+
+  @androidx.compose.runtime.Immutable public final class DialogProperties {
+    ctor public DialogProperties(optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy);
+    method public boolean getDismissOnBackPress();
+    method public boolean getDismissOnClickOutside();
+    method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
+    method public boolean getUsePlatformDefaultWidth();
+    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;
+  }
+
+  public final class SecureFlagPolicy_androidKt {
+  }
+
+}
+
diff --git a/compose/ui/ui/api/current.txt b/compose/ui/ui/api/current.txt
index c23d869d..3a48b6b 100644
--- a/compose/ui/ui/api/current.txt
+++ b/compose/ui/ui/api/current.txt
@@ -21,6 +21,9 @@
     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;
@@ -2172,6 +2175,9 @@
     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();
@@ -2194,16 +2200,49 @@
 
 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 ModifiedLayoutNodeKt {
+  public final class ModifierNodeElementKt {
+  }
+
+  public final class MyersDiffKt {
+  }
+
+  public final class NodeChainKt {
+  }
+
+  public final class NodeCoordinatorKt {
+  }
+
+  public final class NodeKindKt {
+  }
+
+  public final class PointerInputModifierNodeKt {
   }
 
   public final class Ref<T> {
@@ -2223,6 +2262,9 @@
     property public abstract androidx.compose.ui.text.input.TextInputService textInputService;
   }
 
+  public final class SemanticsModifierNodeKt {
+  }
+
   public final class ViewInterop_androidKt {
   }
 
@@ -2608,6 +2650,9 @@
     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![] stringArrayResource(@ArrayRes int id);
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String stringResource(@StringRes int id);
diff --git a/compose/ui/ui/api/public_plus_experimental_1.3.0-beta01.txt b/compose/ui/ui/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..e7df09a
--- /dev/null
+++ b/compose/ui/ui/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,3458 @@
+// 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;
+  }
+
+  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;
+  }
+
+  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.") public @interface ExperimentalComposeUiApi {
+  }
+
+  @kotlin.RequiresOptIn(message="Unstable API for use only between compose-ui modules sharing the same exact version, " + "subject to change without notice in major, minor, or patch releases.") public @interface InternalComposeUiApi {
+  }
+
+  @androidx.compose.runtime.Stable @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 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> {
+  }
+
+  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 {
+  }
+
+  public final class ZIndexModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier zIndex(androidx.compose.ui.Modifier, float zIndex);
+  }
+
+}
+
+package androidx.compose.ui.autofill {
+
+  public final class AndroidAutofillType_androidKt {
+  }
+
+  public final class AndroidAutofill_androidKt {
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public interface Autofill {
+    method public void cancelAutofillForNode(androidx.compose.ui.autofill.AutofillNode autofillNode);
+    method public void requestAutofillForNode(androidx.compose.ui.autofill.AutofillNode autofillNode);
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public final class AutofillNode {
+    ctor public AutofillNode(optional java.util.List<? extends androidx.compose.ui.autofill.AutofillType> autofillTypes, optional androidx.compose.ui.geometry.Rect? boundingBox, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit>? onFill);
+    method public java.util.List<androidx.compose.ui.autofill.AutofillType> getAutofillTypes();
+    method public androidx.compose.ui.geometry.Rect? getBoundingBox();
+    method public int getId();
+    method public kotlin.jvm.functions.Function1<java.lang.String,kotlin.Unit>? getOnFill();
+    method public void setBoundingBox(androidx.compose.ui.geometry.Rect?);
+    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 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);
+  }
+
+  @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 getIn();
+    method public int getLeft();
+    method public int getNext();
+    method public int getOut();
+    method public int getPrevious();
+    method public int getRight();
+    method public int getUp();
+    property public final int Down;
+    property public final int In;
+    property public final int Left;
+    property public final int Next;
+    property public final int Out;
+    property public final int Previous;
+    property public final int Right;
+    property public final int Up;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusEventModifier extends androidx.compose.ui.Modifier.Element {
+    method public void onFocusEvent(androidx.compose.ui.focus.FocusState focusState);
+  }
+
+  public final class FocusEventModifierKt {
+    method public static androidx.compose.ui.Modifier onFocusEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusState,kotlin.Unit> onFocusEvent);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusManager {
+    method public void clearFocus(optional boolean force);
+    method public boolean moveFocus(int focusDirection);
+  }
+
+  public final class FocusManagerKt {
+  }
+
+  public final class FocusModifierKt {
+    method @Deprecated public static androidx.compose.ui.Modifier focusModifier(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier focusTarget(androidx.compose.ui.Modifier);
+  }
+
+  @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);
+  }
+
+  public final class FocusRequester {
+    ctor public FocusRequester();
+    method public boolean captureFocus();
+    method public boolean freeFocus();
+    method public void requestFocus();
+    field public static final androidx.compose.ui.focus.FocusRequester.Companion Companion;
+  }
+
+  public static final class FocusRequester.Companion {
+    method @androidx.compose.ui.ExperimentalComposeUiApi public androidx.compose.ui.focus.FocusRequester.Companion.FocusRequesterFactory createRefs();
+    method public androidx.compose.ui.focus.FocusRequester getDefault();
+    property public final androidx.compose.ui.focus.FocusRequester Default;
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public static final class FocusRequester.Companion.FocusRequesterFactory {
+    method public operator androidx.compose.ui.focus.FocusRequester component1();
+    method public operator androidx.compose.ui.focus.FocusRequester component10();
+    method public operator androidx.compose.ui.focus.FocusRequester component11();
+    method public operator androidx.compose.ui.focus.FocusRequester component12();
+    method public operator androidx.compose.ui.focus.FocusRequester component13();
+    method public operator androidx.compose.ui.focus.FocusRequester component14();
+    method public operator androidx.compose.ui.focus.FocusRequester component15();
+    method public operator androidx.compose.ui.focus.FocusRequester component16();
+    method public operator androidx.compose.ui.focus.FocusRequester component2();
+    method public operator androidx.compose.ui.focus.FocusRequester component3();
+    method public operator androidx.compose.ui.focus.FocusRequester component4();
+    method public operator androidx.compose.ui.focus.FocusRequester component5();
+    method public operator androidx.compose.ui.focus.FocusRequester component6();
+    method public operator androidx.compose.ui.focus.FocusRequester component7();
+    method public operator androidx.compose.ui.focus.FocusRequester component8();
+    method public operator androidx.compose.ui.focus.FocusRequester component9();
+    field public static final androidx.compose.ui.focus.FocusRequester.Companion.FocusRequesterFactory INSTANCE;
+  }
+
+  public final class FocusRequesterKt {
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusRequesterModifier extends androidx.compose.ui.Modifier.Element {
+    method public androidx.compose.ui.focus.FocusRequester getFocusRequester();
+    property public abstract androidx.compose.ui.focus.FocusRequester focusRequester;
+  }
+
+  public final class FocusRequesterModifierKt {
+    method public static androidx.compose.ui.Modifier focusRequester(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester);
+  }
+
+  public interface FocusState {
+    method public boolean getHasFocus();
+    method public boolean isCaptured();
+    method public boolean isFocused();
+    property public abstract boolean hasFocus;
+    property public abstract boolean isCaptured;
+    property public abstract boolean isFocused;
+  }
+
+  public final class FocusTransactionsKt {
+  }
+
+  public final class FocusTraversalKt {
+  }
+
+  public final class OneDimensionalFocusSearchKt {
+  }
+
+  public final class TwoDimensionalFocusSearchKt {
+  }
+
+}
+
+package androidx.compose.ui.graphics {
+
+  public final class GraphicsLayerModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional androidx.compose.ui.graphics.RenderEffect? renderEffect, optional long ambientShadowColor, optional long spotShadowColor);
+    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 @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 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 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 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 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 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.graphics.vector.compat {
+
+  public final class XmlVectorParser_androidKt {
+  }
+
+}
+
+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);
+  }
+
+  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);
+  }
+
+  public final class NestedScrollModifierLocalKt {
+  }
+
+  @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 {
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public final class PointerIconDefaults {
+    method public androidx.compose.ui.input.pointer.PointerIcon getCrosshair();
+    method public androidx.compose.ui.input.pointer.PointerIcon getDefault();
+    method public androidx.compose.ui.input.pointer.PointerIcon getHand();
+    method public androidx.compose.ui.input.pointer.PointerIcon getText();
+    property public final androidx.compose.ui.input.pointer.PointerIcon Crosshair;
+    property public final androidx.compose.ui.input.pointer.PointerIcon Default;
+    property public final androidx.compose.ui.input.pointer.PointerIcon Hand;
+    property public final androidx.compose.ui.input.pointer.PointerIcon Text;
+    field public static final androidx.compose.ui.input.pointer.PointerIconDefaults INSTANCE;
+  }
+
+  public final class PointerIconKt {
+    method @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 final class PointerInputEventProcessorKt {
+  }
+
+  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 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);
+  }
+
+  @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 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 @androidx.compose.ui.ExperimentalComposeUiApi 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 @androidx.compose.ui.ExperimentalComposeUiApi 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 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.internal {
+
+  public final class JvmDefaultWithCompatibility_jvmKt {
+  }
+
+}
+
+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;
+  }
+
+  public final class ContentScaleKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class FixedScale implements androidx.compose.ui.layout.ContentScale {
+    ctor public FixedScale(float value);
+    method public float component1();
+    method public long computeScaleFactor(long srcSize, long dstSize);
+    method public androidx.compose.ui.layout.FixedScale copy(float value);
+    method public float getValue();
+    property public final float value;
+  }
+
+  @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 final class IntrinsicMeasurableKt {
+  }
+
+  public interface IntrinsicMeasureScope extends androidx.compose.ui.unit.Density {
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
+  }
+
+  @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 @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 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);
+  }
+
+  @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 final class MeasureScopeKt {
+  }
+
+  public interface Measured {
+    method public operator int get(androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public int getMeasuredHeight();
+    method public int getMeasuredWidth();
+    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;
+  }
+
+  @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);
+  }
+
+  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;
+  }
+
+  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>);
+  }
+
+  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 public final float scaleX;
+    property 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 {
+
+  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;
+  }
+
+  public final class DelegatableNodeKt {
+  }
+
+  @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);
+    method public final <T extends androidx.compose.ui.Modifier.Node> kotlin.Lazy<T> lazyDelegated(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 {
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public interface GlobalPositionAwareModifierNode extends androidx.compose.ui.node.DelegatableNode {
+    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);
+    property public abstract long targetSize;
+  }
+
+  @kotlin.RequiresOptIn(message="This API is internal to library.") @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 int maxIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int width);
+    method public 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 int minIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int width);
+    method public int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int height);
+  }
+
+  public final class LayoutModifierNodeCoordinatorKt {
+  }
+
+  public final class LayoutModifierNodeKt {
+  }
+
+  public final class LayoutNodeDrawScopeKt {
+  }
+
+  public final class LayoutNodeKt {
+  }
+
+  public final class LayoutNodeLayoutDelegateKt {
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public abstract class ModifierNodeElement<N extends androidx.compose.ui.Modifier.Node> implements androidx.compose.ui.Modifier.Element {
+    ctor public ModifierNodeElement(optional Object? params);
+    method public abstract N create();
+    method public abstract N update(N node);
+  }
+
+  public final class ModifierNodeElementKt {
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static inline <reified T extends androidx.compose.ui.Modifier.Node> androidx.compose.ui.Modifier! modifierElementOf(Object? params, kotlin.jvm.functions.Function0<? extends T> create, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> update);
+    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);
+  }
+
+  public final class MyersDiffKt {
+  }
+
+  public final class NodeChainKt {
+  }
+
+  public final class NodeCoordinatorKt {
+  }
+
+  public final class NodeKindKt {
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public interface ParentDataModifierNode extends androidx.compose.ui.node.DelegatableNode {
+    method public Object? modifyParentData(androidx.compose.ui.unit.Density, Object? parentData);
+  }
+
+  @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 PointerInputModifierNodeKt {
+  }
+
+  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;
+  }
+
+  @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);
+  }
+
+  public final class ViewInterop_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.platform {
+
+  public abstract class AbstractComposeView extends android.view.ViewGroup {
+    ctor public AbstractComposeView(android.content.Context context, optional android.util.AttributeSet? attrs, optional int defStyleAttr);
+    ctor public AbstractComposeView(android.content.Context context, optional android.util.AttributeSet? attrs);
+    ctor public AbstractComposeView(android.content.Context context);
+    method @androidx.compose.runtime.Composable @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 AndroidClipboardManager_androidKt {
+  }
+
+  public final class AndroidComposeViewAccessibilityDelegateCompat_androidKt {
+  }
+
+  public final class AndroidComposeView_androidKt {
+  }
+
+  public final class AndroidCompositionLocals_androidKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> getLocalConfiguration();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> getLocalContext();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> getLocalLifecycleOwner();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> getLocalSavedStateRegistryOwner();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> getLocalView();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> LocalConfiguration;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> LocalContext;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> LocalLifecycleOwner;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> LocalSavedStateRegistryOwner;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> LocalView;
+  }
+
+  public final class AndroidUiDispatcher extends kotlinx.coroutines.CoroutineDispatcher {
+    method public void dispatch(kotlin.coroutines.CoroutineContext context, Runnable block);
+    method public android.view.Choreographer getChoreographer();
+    method public androidx.compose.runtime.MonotonicFrameClock getFrameClock();
+    property public final android.view.Choreographer choreographer;
+    property public final androidx.compose.runtime.MonotonicFrameClock frameClock;
+    field public static final androidx.compose.ui.platform.AndroidUiDispatcher.Companion Companion;
+  }
+
+  public static final class AndroidUiDispatcher.Companion {
+    method public kotlin.coroutines.CoroutineContext getCurrentThread();
+    method public kotlin.coroutines.CoroutineContext getMain();
+    property public final kotlin.coroutines.CoroutineContext CurrentThread;
+    property public final kotlin.coroutines.CoroutineContext Main;
+  }
+
+  public final class AndroidUiDispatcher_androidKt {
+  }
+
+  public final class AndroidUiFrameClock implements androidx.compose.runtime.MonotonicFrameClock {
+    ctor public AndroidUiFrameClock(android.view.Choreographer choreographer);
+    method public android.view.Choreographer getChoreographer();
+    method public suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R>);
+    property public final android.view.Choreographer choreographer;
+  }
+
+  public final class AndroidUriHandler implements androidx.compose.ui.platform.UriHandler {
+    ctor public AndroidUriHandler(android.content.Context context);
+    method public void openUri(String uri);
+  }
+
+  public final class AndroidViewConfiguration implements androidx.compose.ui.platform.ViewConfiguration {
+    ctor public AndroidViewConfiguration(android.view.ViewConfiguration viewConfiguration);
+    method public long getDoubleTapMinTimeMillis();
+    method public long getDoubleTapTimeoutMillis();
+    method public long getLongPressTimeoutMillis();
+    method public float getTouchSlop();
+    property public long doubleTapMinTimeMillis;
+    property public long doubleTapTimeoutMillis;
+    property public long longPressTimeoutMillis;
+    property public float touchSlop;
+  }
+
+  public interface ClipboardManager {
+    method public androidx.compose.ui.text.AnnotatedString? getText();
+    method public void setText(androidx.compose.ui.text.AnnotatedString annotatedString);
+  }
+
+  public final class ComposeView extends androidx.compose.ui.platform.AbstractComposeView {
+    ctor public ComposeView(android.content.Context context, optional android.util.AttributeSet? attrs, optional int defStyleAttr);
+    ctor public ComposeView(android.content.Context context, optional android.util.AttributeSet? attrs);
+    ctor public ComposeView(android.content.Context context);
+    method @androidx.compose.runtime.Composable public void Content();
+    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    property protected boolean shouldCreateCompositionOnAttachedToWindow;
+  }
+
+  public final class CompositionLocalsKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.AccessibilityManager> getLocalAccessibilityManager();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.autofill.Autofill> getLocalAutofill();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.autofill.AutofillTree> getLocalAutofillTree();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager> getLocalClipboardManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> getLocalDensity();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> getLocalFocusManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.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;
+  }
+
+  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>);
+    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 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();
+    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 InvertMatrixKt {
+  }
+
+  public final class JvmActuals_jvmKt {
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public final class LocalSoftwareKeyboardController {
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.platform.SoftwareKeyboardController? getCurrent();
+    method public infix androidx.compose.runtime.ProvidedValue<androidx.compose.ui.platform.SoftwareKeyboardController> provides(androidx.compose.ui.platform.SoftwareKeyboardController softwareKeyboardController);
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.platform.SoftwareKeyboardController? current;
+    field public static final androidx.compose.ui.platform.LocalSoftwareKeyboardController INSTANCE;
+  }
+
+  public final class NestedScrollInteropConnectionKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.input.nestedscroll.NestedScrollConnection rememberNestedScrollInteropConnection();
+  }
+
+  public final class ShapeContainingUtilKt {
+  }
+
+  @androidx.compose.runtime.Stable @androidx.compose.ui.ExperimentalComposeUiApi public interface SoftwareKeyboardController {
+    method public void hide();
+    method @Deprecated public default void hideSoftwareKeyboard();
+    method public void show();
+    method @Deprecated public default void showSoftwareKeyboard();
+  }
+
+  public final class TestTagKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier testTag(androidx.compose.ui.Modifier, String tag);
+  }
+
+  @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;
+  }
+
+  public final class ViewCompositionStrategy_androidKt {
+  }
+
+  @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;
+  }
+
+  public final class WindowInfoKt {
+  }
+
+  @androidx.compose.ui.InternalComposeUiApi public fun interface WindowRecomposerFactory {
+    method public androidx.compose.runtime.Recomposer createRecomposer(android.view.View windowRootView);
+    field public static final androidx.compose.ui.platform.WindowRecomposerFactory.Companion Companion;
+  }
+
+  public static final class WindowRecomposerFactory.Companion {
+    method public androidx.compose.ui.platform.WindowRecomposerFactory getLifecycleAware();
+    property public final androidx.compose.ui.platform.WindowRecomposerFactory LifecycleAware;
+  }
+
+  @androidx.compose.ui.InternalComposeUiApi public final class WindowRecomposerPolicy {
+    method public void setFactory(androidx.compose.ui.platform.WindowRecomposerFactory factory);
+    method public inline <R> R! withFactory(androidx.compose.ui.platform.WindowRecomposerFactory factory, kotlin.jvm.functions.Function0<? extends R> block);
+    field public static final androidx.compose.ui.platform.WindowRecomposerPolicy INSTANCE;
+  }
+
+  public final class WindowRecomposer_androidKt {
+    method @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?);
+  }
+
+  public final class Wrapper_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.platform.accessibility {
+
+  public final class CollectionInfoKt {
+  }
+
+}
+
+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 Resources_androidKt {
+  }
+
+  public final class StringResources_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable @androidx.compose.ui.ExperimentalComposeUiApi public static String pluralStringResource(@PluralsRes int id, int count);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable @androidx.compose.ui.ExperimentalComposeUiApi 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 getImage();
+    method public int getRadioButton();
+    method public int getSwitch();
+    method public int getTab();
+    property public final int Button;
+    property public final int Checkbox;
+    property public final int Image;
+    property public final int RadioButton;
+    property public final int Switch;
+    property public final int Tab;
+  }
+
+  public final class ScrollAxisRange {
+    ctor public ScrollAxisRange(kotlin.jvm.functions.Function0<java.lang.Float> value, kotlin.jvm.functions.Function0<java.lang.Float> maxValue, optional boolean reverseScrolling);
+    method public kotlin.jvm.functions.Function0<java.lang.Float> getMaxValue();
+    method public boolean getReverseScrolling();
+    method public kotlin.jvm.functions.Function0<java.lang.Float> getValue();
+    property public final kotlin.jvm.functions.Function0<java.lang.Float> maxValue;
+    property public final boolean reverseScrolling;
+    property public final kotlin.jvm.functions.Function0<java.lang.Float> value;
+  }
+
+  public final class SemanticsActions {
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCollapse();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCopyText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>> getCustomActions();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCutText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getDismiss();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getExpand();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>>> getGetTextLayoutResult();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnClick();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnLongClick();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getPasteText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.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>>> 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 SemanticsNodeKt {
+  }
+
+  public final class SemanticsOwner {
+    method public androidx.compose.ui.semantics.SemanticsNode getRootSemanticsNode();
+    method public androidx.compose.ui.semantics.SemanticsNode getUnmergedRootSemanticsNode();
+    property public final androidx.compose.ui.semantics.SemanticsNode rootSemanticsNode;
+    property public final androidx.compose.ui.semantics.SemanticsNode unmergedRootSemanticsNode;
+  }
+
+  public final class SemanticsOwnerKt {
+    method public static java.util.List<androidx.compose.ui.semantics.SemanticsNode> getAllSemanticsNodes(androidx.compose.ui.semantics.SemanticsOwner, boolean mergingEnabled);
+  }
+
+  public final class SemanticsProperties {
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> getCollectionInfo();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> getCollectionItemInfo();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> getContentDescription();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getDisabled();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> getEditableText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getError();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getFocused();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getHeading();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getHorizontalScrollAxisRange();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.input.ImeAction> getImeAction();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer>> getIndexForKey();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getInvisibleToUser();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getIsDialog();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getIsPopup();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.LiveRegionMode> getLiveRegion();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getPaneTitle();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getPassword();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ProgressBarRangeInfo> getProgressBarRangeInfo();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.Role> getRole();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getSelectableGroup();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getSelected();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getStateDescription();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getTestTag();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> getText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> getTextSelectionRange();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> getToggleableState();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getVerticalScrollAxisRange();
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> CollectionInfo;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> CollectionItemInfo;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> ContentDescription;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Disabled;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> EditableText;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> Error;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Focused;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Heading;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> HorizontalScrollAxisRange;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.input.ImeAction> ImeAction;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer>> IndexForKey;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> InvisibleToUser;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> IsDialog;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> IsPopup;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.LiveRegionMode> LiveRegion;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> PaneTitle;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Password;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ProgressBarRangeInfo> ProgressBarRangeInfo;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.Role> Role;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> SelectableGroup;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Selected;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> StateDescription;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> TestTag;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> Text;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> TextSelectionRange;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> ToggleableState;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> VerticalScrollAxisRange;
+    field public static final androidx.compose.ui.semantics.SemanticsProperties INSTANCE;
+  }
+
+  @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 void onClick(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void onLongClick(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void password(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void pasteText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void popup(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void 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 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);
+  }
+
+  public final class SemanticsSortKt {
+  }
+
+}
+
+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.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();
+    property public static final kotlin.jvm.functions.Function1<android.view.View,kotlin.Unit> NoOpUpdate;
+  }
+
+}
+
+package androidx.compose.ui.window {
+
+  public final class AndroidDialog_androidKt {
+    method @androidx.compose.runtime.Composable public static void Dialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.window.DialogProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class AndroidPopup_androidKt {
+    method @androidx.compose.runtime.Composable public static void Popup(optional androidx.compose.ui.Alignment alignment, optional long offset, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Popup(androidx.compose.ui.window.PopupPositionProvider popupPositionProvider, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @org.jetbrains.annotations.TestOnly public static boolean isPopupLayout(android.view.View view, optional String? testTag);
+  }
+
+  @androidx.compose.runtime.Immutable public final class DialogProperties {
+    ctor @androidx.compose.ui.ExperimentalComposeUiApi public DialogProperties(optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean usePlatformDefaultWidth, optional boolean decorFitsSystemWindows);
+    ctor public DialogProperties(optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public boolean getDecorFitsSystemWindows();
+    method public boolean getDismissOnBackPress();
+    method public boolean getDismissOnClickOutside();
+    method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
+    method public boolean getUsePlatformDefaultWidth();
+    property @androidx.compose.ui.ExperimentalComposeUiApi 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;
+  }
+
+  public final class SecureFlagPolicy_androidKt {
+  }
+
+}
+
diff --git a/compose/ui/ui/api/public_plus_experimental_current.txt b/compose/ui/ui/api/public_plus_experimental_current.txt
index d9ab742..e7df09a 100644
--- a/compose/ui/ui/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui/api/public_plus_experimental_current.txt
@@ -21,6 +21,9 @@
     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;
@@ -149,6 +152,17 @@
     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 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();
@@ -2343,6 +2357,24 @@
     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();
@@ -2366,19 +2398,112 @@
 
 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;
+  }
+
+  public final class DelegatableNodeKt {
+  }
+
+  @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);
+    method public final <T extends androidx.compose.ui.Modifier.Node> kotlin.Lazy<T> lazyDelegated(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 {
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public interface GlobalPositionAwareModifierNode extends androidx.compose.ui.node.DelegatableNode {
+    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);
+    property public abstract long targetSize;
+  }
+
   @kotlin.RequiresOptIn(message="This API is internal to library.") @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 int maxIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int width);
+    method public 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 int minIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int width);
+    method public int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int height);
+  }
+
+  public final class LayoutModifierNodeCoordinatorKt {
+  }
+
+  public final class LayoutModifierNodeKt {
+  }
+
+  public final class LayoutNodeDrawScopeKt {
+  }
+
   public final class LayoutNodeKt {
   }
 
   public final class LayoutNodeLayoutDelegateKt {
   }
 
-  public final class ModifiedLayoutNodeKt {
+  @androidx.compose.ui.ExperimentalComposeUiApi public abstract class ModifierNodeElement<N extends androidx.compose.ui.Modifier.Node> implements androidx.compose.ui.Modifier.Element {
+    ctor public ModifierNodeElement(optional Object? params);
+    method public abstract N create();
+    method public abstract N update(N node);
+  }
+
+  public final class ModifierNodeElementKt {
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static inline <reified T extends androidx.compose.ui.Modifier.Node> androidx.compose.ui.Modifier! modifierElementOf(Object? params, kotlin.jvm.functions.Function0<? extends T> create, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> update);
+    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);
+  }
+
+  public final class MyersDiffKt {
+  }
+
+  public final class NodeChainKt {
+  }
+
+  public final class NodeCoordinatorKt {
+  }
+
+  public final class NodeKindKt {
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public interface ParentDataModifierNode extends androidx.compose.ui.node.DelegatableNode {
+    method public Object? modifyParentData(androidx.compose.ui.unit.Density, Object? parentData);
+  }
+
+  @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 PointerInputModifierNodeKt {
   }
 
   public final class Ref<T> {
@@ -2398,6 +2523,16 @@
     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);
+  }
+
   public final class ViewInterop_androidKt {
   }
 
@@ -2821,6 +2956,9 @@
     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 @androidx.compose.ui.ExperimentalComposeUiApi public static String pluralStringResource(@PluralsRes int id, int count);
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable @androidx.compose.ui.ExperimentalComposeUiApi public static String pluralStringResource(@PluralsRes int id, int count, java.lang.Object... formatArgs);
@@ -3216,7 +3354,7 @@
 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 androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver, optional androidx.compose.ui.unit.Density density, optional androidx.compose.ui.unit.LayoutDirection layoutDirection, optional int cacheSize);
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.TextMeasurer rememberTextMeasurer(optional int cacheSize);
   }
 
 }
@@ -3263,12 +3401,14 @@
   }
 
   @androidx.compose.runtime.Immutable public final class DialogProperties {
-    ctor @androidx.compose.ui.ExperimentalComposeUiApi public DialogProperties(optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean usePlatformDefaultWidth);
+    ctor @androidx.compose.ui.ExperimentalComposeUiApi 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 @androidx.compose.ui.ExperimentalComposeUiApi public boolean getDecorFitsSystemWindows();
     method public boolean getDismissOnBackPress();
     method public boolean getDismissOnClickOutside();
     method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
     method public boolean getUsePlatformDefaultWidth();
+    property @androidx.compose.ui.ExperimentalComposeUiApi public final boolean decorFitsSystemWindows;
     property public final boolean dismissOnBackPress;
     property public final boolean dismissOnClickOutside;
     property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
diff --git a/health/health-connect-client/api/res-current.txt b/compose/ui/ui/api/res-1.3.0-beta01.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to compose/ui/ui/api/res-1.3.0-beta01.txt
diff --git a/compose/ui/ui/api/restricted_1.3.0-beta01.txt b/compose/ui/ui/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..2bc1512
--- /dev/null
+++ b/compose/ui/ui/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,3172 @@
+// 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;
+  }
+
+  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;
+  }
+
+  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> {
+  }
+
+  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 {
+  }
+
+  public final class ZIndexModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier zIndex(androidx.compose.ui.Modifier, float zIndex);
+  }
+
+}
+
+package androidx.compose.ui.autofill {
+
+  public final class AndroidAutofillType_androidKt {
+  }
+
+  public final class AndroidAutofill_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.draw {
+
+  public final class AlphaKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier alpha(androidx.compose.ui.Modifier, float alpha);
+  }
+
+  public final class BlurKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier blur(androidx.compose.ui.Modifier, float radiusX, float radiusY, optional androidx.compose.ui.graphics.Shape edgeTreatment);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier blur(androidx.compose.ui.Modifier, float radius, optional androidx.compose.ui.graphics.Shape edgeTreatment);
+  }
+
+  @androidx.compose.runtime.Immutable @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 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);
+  }
+
+  @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 getIn();
+    method public int getLeft();
+    method public int getNext();
+    method public int getOut();
+    method public int getPrevious();
+    method public int getRight();
+    method public int getUp();
+    property public final int Down;
+    property public final int In;
+    property public final int Left;
+    property public final int Next;
+    property public final int Out;
+    property public final int Previous;
+    property public final int Right;
+    property public final int Up;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusEventModifier extends androidx.compose.ui.Modifier.Element {
+    method public void onFocusEvent(androidx.compose.ui.focus.FocusState focusState);
+  }
+
+  public final class FocusEventModifierKt {
+    method public static androidx.compose.ui.Modifier onFocusEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusState,kotlin.Unit> onFocusEvent);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusManager {
+    method public void clearFocus(optional boolean force);
+    method public boolean moveFocus(int focusDirection);
+  }
+
+  public final class FocusManagerKt {
+  }
+
+  public final class FocusModifierKt {
+    method @Deprecated public static androidx.compose.ui.Modifier focusModifier(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier focusTarget(androidx.compose.ui.Modifier);
+  }
+
+  @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);
+  }
+
+  public final class FocusRequester {
+    ctor public FocusRequester();
+    method public boolean captureFocus();
+    method public boolean freeFocus();
+    method public void requestFocus();
+    field public static final androidx.compose.ui.focus.FocusRequester.Companion Companion;
+  }
+
+  public static final class FocusRequester.Companion {
+    method public androidx.compose.ui.focus.FocusRequester getDefault();
+    property public final androidx.compose.ui.focus.FocusRequester Default;
+  }
+
+  public final class FocusRequesterKt {
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusRequesterModifier extends androidx.compose.ui.Modifier.Element {
+    method public androidx.compose.ui.focus.FocusRequester getFocusRequester();
+    property public abstract androidx.compose.ui.focus.FocusRequester focusRequester;
+  }
+
+  public final class FocusRequesterModifierKt {
+    method public static androidx.compose.ui.Modifier focusRequester(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester);
+  }
+
+  public interface FocusState {
+    method public boolean getHasFocus();
+    method public boolean isCaptured();
+    method public boolean isFocused();
+    property public abstract boolean hasFocus;
+    property public abstract boolean isCaptured;
+    property public abstract boolean isFocused;
+  }
+
+  public final class FocusTransactionsKt {
+  }
+
+  public final class FocusTraversalKt {
+  }
+
+  public final class OneDimensionalFocusSearchKt {
+  }
+
+  public final class TwoDimensionalFocusSearchKt {
+  }
+
+}
+
+package androidx.compose.ui.graphics {
+
+  public final class GraphicsLayerModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional androidx.compose.ui.graphics.RenderEffect? renderEffect, optional long ambientShadowColor, optional long spotShadowColor);
+    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 @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 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 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 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 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 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.graphics.vector.compat {
+
+  public final class XmlVectorParser_androidKt {
+  }
+
+}
+
+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);
+  }
+
+  public final class NestedScrollModifierLocalKt {
+  }
+
+  @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 {
+  }
+
+  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 final class PointerInputEventProcessorKt {
+  }
+
+  public abstract class PointerInputFilter {
+    ctor public PointerInputFilter();
+    method public boolean getInterceptOutOfBoundsChildEvents();
+    method public final long getSize();
+    method public abstract void onCancel();
+    method public abstract void onPointerEvent(androidx.compose.ui.input.pointer.PointerEvent pointerEvent, androidx.compose.ui.input.pointer.PointerEventPass pass, long bounds);
+    property public boolean interceptOutOfBoundsChildEvents;
+    property public final long size;
+  }
+
+  @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 PointerInputTestUtilKt {
+  }
+
+  public final class PointerInteropFilter_androidKt {
+  }
+
+  public final class PointerInteropUtils_androidKt {
+  }
+
+  @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 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 {
+  }
+
+}
+
+package androidx.compose.ui.internal {
+
+  public final class JvmDefaultWithCompatibility_jvmKt {
+  }
+
+}
+
+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;
+  }
+
+  public final class ContentScaleKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class FixedScale implements androidx.compose.ui.layout.ContentScale {
+    ctor public FixedScale(float value);
+    method public float component1();
+    method public long computeScaleFactor(long srcSize, long dstSize);
+    method public androidx.compose.ui.layout.FixedScale copy(float value);
+    method public float getValue();
+    property public final float value;
+  }
+
+  @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 final class IntrinsicMeasurableKt {
+  }
+
+  public interface IntrinsicMeasureScope extends androidx.compose.ui.unit.Density {
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
+  }
+
+  @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 @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.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 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);
+  }
+
+  @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 final class MeasureScopeKt {
+  }
+
+  public interface Measured {
+    method public operator int get(androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public int getMeasuredHeight();
+    method public int getMeasuredWidth();
+    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;
+  }
+
+  @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);
+  }
+
+  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 final class PlaceableKt {
+  }
+
+  public final class RelocationModifierKt {
+  }
+
+  public final class RelocationRequesterModifierKt {
+  }
+
+  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 public final float scaleX;
+    property 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 {
+  }
+
+  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();
+    property public abstract androidx.compose.ui.modifier.ProvidableModifierLocal<T> key;
+    property public abstract T! value;
+  }
+
+  public final class ModifierLocalProviderKt {
+  }
+
+  public interface ModifierLocalReadScope {
+    method public <T> T! getCurrent(androidx.compose.ui.modifier.ModifierLocal<T>);
+  }
+
+  @androidx.compose.runtime.Stable public final class ProvidableModifierLocal<T> extends androidx.compose.ui.modifier.ModifierLocal<T> {
+    ctor public ProvidableModifierLocal(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+  }
+
+}
+
+package androidx.compose.ui.node {
+
+  public final class BackwardsCompatNodeKt {
+  }
+
+  @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();
+    property public final kotlin.jvm.functions.Function0<androidx.compose.ui.node.ComposeUiNode> Constructor;
+    property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.unit.Density,kotlin.Unit> SetDensity;
+    property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.unit.LayoutDirection,kotlin.Unit> SetLayoutDirection;
+    property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.layout.MeasurePolicy,kotlin.Unit> SetMeasurePolicy;
+    property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.Modifier,kotlin.Unit> SetModifier;
+    property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.platform.ViewConfiguration,kotlin.Unit> SetViewConfiguration;
+  }
+
+  public final class 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 ModifierNodeElementKt {
+  }
+
+  public final class MyersDiffKt {
+  }
+
+  public final class NodeChainKt {
+  }
+
+  public final class NodeCoordinatorKt {
+  }
+
+  public final class NodeKindKt {
+  }
+
+  public final class PointerInputModifierNodeKt {
+  }
+
+  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;
+  }
+
+  public final class SemanticsModifierNodeKt {
+  }
+
+  public final class ViewInterop_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.platform {
+
+  public abstract class AbstractComposeView extends android.view.ViewGroup {
+    ctor public AbstractComposeView(android.content.Context context, optional android.util.AttributeSet? attrs, optional int defStyleAttr);
+    ctor public AbstractComposeView(android.content.Context context, optional android.util.AttributeSet? attrs);
+    ctor public AbstractComposeView(android.content.Context context);
+    method @androidx.compose.runtime.Composable @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 AndroidClipboardManager_androidKt {
+  }
+
+  public final class AndroidComposeViewAccessibilityDelegateCompat_androidKt {
+  }
+
+  public final class AndroidComposeView_androidKt {
+  }
+
+  public final class AndroidCompositionLocals_androidKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> getLocalConfiguration();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> getLocalContext();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> getLocalLifecycleOwner();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> getLocalSavedStateRegistryOwner();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> getLocalView();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> LocalConfiguration;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> LocalContext;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> LocalLifecycleOwner;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> LocalSavedStateRegistryOwner;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> LocalView;
+  }
+
+  public final class AndroidUiDispatcher extends kotlinx.coroutines.CoroutineDispatcher {
+    method public void dispatch(kotlin.coroutines.CoroutineContext context, Runnable block);
+    method public android.view.Choreographer getChoreographer();
+    method public androidx.compose.runtime.MonotonicFrameClock getFrameClock();
+    property public final android.view.Choreographer choreographer;
+    property public final androidx.compose.runtime.MonotonicFrameClock frameClock;
+    field public static final androidx.compose.ui.platform.AndroidUiDispatcher.Companion Companion;
+  }
+
+  public static final class AndroidUiDispatcher.Companion {
+    method public kotlin.coroutines.CoroutineContext getCurrentThread();
+    method public kotlin.coroutines.CoroutineContext getMain();
+    property public final kotlin.coroutines.CoroutineContext CurrentThread;
+    property public final kotlin.coroutines.CoroutineContext Main;
+  }
+
+  public final class AndroidUiDispatcher_androidKt {
+  }
+
+  public final class AndroidUiFrameClock implements androidx.compose.runtime.MonotonicFrameClock {
+    ctor public AndroidUiFrameClock(android.view.Choreographer choreographer);
+    method public android.view.Choreographer getChoreographer();
+    method public suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R>);
+    property public final android.view.Choreographer choreographer;
+  }
+
+  public final class AndroidUriHandler implements androidx.compose.ui.platform.UriHandler {
+    ctor public AndroidUriHandler(android.content.Context context);
+    method public void openUri(String uri);
+  }
+
+  public final class AndroidViewConfiguration implements androidx.compose.ui.platform.ViewConfiguration {
+    ctor public AndroidViewConfiguration(android.view.ViewConfiguration viewConfiguration);
+    method public long getDoubleTapMinTimeMillis();
+    method public long getDoubleTapTimeoutMillis();
+    method public long getLongPressTimeoutMillis();
+    method public float getTouchSlop();
+    property public long doubleTapMinTimeMillis;
+    property public long doubleTapTimeoutMillis;
+    property public long longPressTimeoutMillis;
+    property public float touchSlop;
+  }
+
+  public interface ClipboardManager {
+    method public androidx.compose.ui.text.AnnotatedString? getText();
+    method public void setText(androidx.compose.ui.text.AnnotatedString annotatedString);
+  }
+
+  public final class ComposeView extends androidx.compose.ui.platform.AbstractComposeView {
+    ctor public ComposeView(android.content.Context context, optional android.util.AttributeSet? attrs, optional int defStyleAttr);
+    ctor public ComposeView(android.content.Context context, optional android.util.AttributeSet? attrs);
+    ctor public ComposeView(android.content.Context context);
+    method @androidx.compose.runtime.Composable public void Content();
+    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    property protected boolean shouldCreateCompositionOnAttachedToWindow;
+  }
+
+  public final class CompositionLocalsKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.AccessibilityManager> getLocalAccessibilityManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager> getLocalClipboardManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> getLocalDensity();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> getLocalFocusManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.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;
+  }
+
+  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>);
+    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 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();
+    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 InvertMatrixKt {
+  }
+
+  public final class JvmActuals_jvmKt {
+  }
+
+  public final class NestedScrollInteropConnectionKt {
+  }
+
+  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);
+  }
+
+  @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;
+  }
+
+  public final class ViewCompositionStrategy_androidKt {
+  }
+
+  @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 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 {
+
+  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 Resources_androidKt {
+  }
+
+  public final class StringResources_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String![] stringArrayResource(@ArrayRes int id);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String stringResource(@StringRes int id);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String stringResource(@StringRes int id, java.lang.Object... formatArgs);
+  }
+
+  public final class VectorResources_androidKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.ImageVector vectorResource(androidx.compose.ui.graphics.vector.ImageVector.Companion, @DrawableRes int id);
+    method @kotlin.jvm.Throws(exceptionClasses=XmlPullParserException::class) public static androidx.compose.ui.graphics.vector.ImageVector vectorResource(androidx.compose.ui.graphics.vector.ImageVector.Companion, optional android.content.res.Resources.Theme? theme, android.content.res.Resources res, int resId) throws org.xmlpull.v1.XmlPullParserException;
+  }
+
+}
+
+package androidx.compose.ui.semantics {
+
+  public final class AccessibilityAction<T extends kotlin.Function<? extends java.lang.Boolean>> {
+    ctor public AccessibilityAction(String? label, T? action);
+    method public T? getAction();
+    method public String? getLabel();
+    property public final T? action;
+    property public final String? label;
+  }
+
+  public final class CollectionInfo {
+    ctor public CollectionInfo(int rowCount, int columnCount);
+    method public int getColumnCount();
+    method public int getRowCount();
+    property public final int columnCount;
+    property public final int rowCount;
+  }
+
+  public final class CollectionItemInfo {
+    ctor public CollectionItemInfo(int rowIndex, int rowSpan, int columnIndex, int columnSpan);
+    method public int getColumnIndex();
+    method public int getColumnSpan();
+    method public int getRowIndex();
+    method public int getRowSpan();
+    property public final int columnIndex;
+    property public final int columnSpan;
+    property public final int rowIndex;
+    property public final int rowSpan;
+  }
+
+  public final class CustomAccessibilityAction {
+    ctor public CustomAccessibilityAction(String label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
+    method public kotlin.jvm.functions.Function0<java.lang.Boolean> getAction();
+    method public String getLabel();
+    property public final kotlin.jvm.functions.Function0<java.lang.Boolean> action;
+    property public final String label;
+  }
+
+  @androidx.compose.runtime.Immutable @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 getImage();
+    method public int getRadioButton();
+    method public int getSwitch();
+    method public int getTab();
+    property public final int Button;
+    property public final int Checkbox;
+    property public final int Image;
+    property public final int RadioButton;
+    property public final int Switch;
+    property public final int Tab;
+  }
+
+  public final class ScrollAxisRange {
+    ctor public ScrollAxisRange(kotlin.jvm.functions.Function0<java.lang.Float> value, kotlin.jvm.functions.Function0<java.lang.Float> maxValue, optional boolean reverseScrolling);
+    method public kotlin.jvm.functions.Function0<java.lang.Float> getMaxValue();
+    method public boolean getReverseScrolling();
+    method public kotlin.jvm.functions.Function0<java.lang.Float> getValue();
+    property public final kotlin.jvm.functions.Function0<java.lang.Float> maxValue;
+    property public final boolean reverseScrolling;
+    property public final kotlin.jvm.functions.Function0<java.lang.Float> value;
+  }
+
+  public final class SemanticsActions {
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCollapse();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCopyText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>> getCustomActions();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCutText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getDismiss();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getExpand();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>>> getGetTextLayoutResult();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnClick();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnLongClick();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getPasteText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.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>>> 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 SemanticsNodeKt {
+  }
+
+  public final class SemanticsOwner {
+    method public androidx.compose.ui.semantics.SemanticsNode getRootSemanticsNode();
+    method public androidx.compose.ui.semantics.SemanticsNode getUnmergedRootSemanticsNode();
+    property public final androidx.compose.ui.semantics.SemanticsNode rootSemanticsNode;
+    property public final androidx.compose.ui.semantics.SemanticsNode unmergedRootSemanticsNode;
+  }
+
+  public final class SemanticsOwnerKt {
+    method public static java.util.List<androidx.compose.ui.semantics.SemanticsNode> getAllSemanticsNodes(androidx.compose.ui.semantics.SemanticsOwner, boolean mergingEnabled);
+  }
+
+  public final class SemanticsProperties {
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> getCollectionInfo();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> getCollectionItemInfo();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> getContentDescription();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getDisabled();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> getEditableText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getError();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getFocused();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getHeading();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getHorizontalScrollAxisRange();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.input.ImeAction> getImeAction();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer>> getIndexForKey();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getInvisibleToUser();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getIsDialog();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getIsPopup();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.LiveRegionMode> getLiveRegion();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getPaneTitle();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getPassword();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ProgressBarRangeInfo> getProgressBarRangeInfo();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.Role> getRole();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getSelectableGroup();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getSelected();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getStateDescription();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getTestTag();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> getText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> getTextSelectionRange();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> getToggleableState();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getVerticalScrollAxisRange();
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> CollectionInfo;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> CollectionItemInfo;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> ContentDescription;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Disabled;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> EditableText;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> Error;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Focused;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Heading;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> HorizontalScrollAxisRange;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.input.ImeAction> ImeAction;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer>> IndexForKey;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> InvisibleToUser;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> IsDialog;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> IsPopup;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.LiveRegionMode> LiveRegion;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> PaneTitle;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Password;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ProgressBarRangeInfo> ProgressBarRangeInfo;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.Role> Role;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> SelectableGroup;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Selected;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> StateDescription;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> TestTag;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> Text;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> TextSelectionRange;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> ToggleableState;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> VerticalScrollAxisRange;
+    field public static final androidx.compose.ui.semantics.SemanticsProperties INSTANCE;
+  }
+
+  public final class SemanticsPropertiesKt {
+    method public static void collapse(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void copyText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void cutText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void dialog(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void disabled(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void dismiss(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void error(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String description);
+    method public static void expand(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static androidx.compose.ui.semantics.CollectionInfo getCollectionInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.CollectionItemInfo getCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> getCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.text.AnnotatedString getEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static boolean getFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.ScrollAxisRange getHorizontalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static int getImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static int getLiveRegion(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getPaneTitle(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.ProgressBarRangeInfo getProgressBarRangeInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static int getRole(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static boolean getSelected(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getStateDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.text.AnnotatedString getText(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void getTextLayoutResult(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>? action);
+    method public static long getTextSelectionRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.state.ToggleableState getToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.ScrollAxisRange getVerticalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void heading(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void indexForKey(androidx.compose.ui.semantics.SemanticsPropertyReceiver, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer> mapping);
+    method public static void onClick(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void onLongClick(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void password(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void pasteText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void popup(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void 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 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 {
+  }
+
+  public final class SemanticsPropertyKey<T> {
+    ctor public SemanticsPropertyKey(String name, optional kotlin.jvm.functions.Function2<? super T,? super T,? extends T> mergePolicy);
+    method public String getName();
+    method public operator T! getValue(androidx.compose.ui.semantics.SemanticsPropertyReceiver thisRef, kotlin.reflect.KProperty<?> property);
+    method public T? merge(T? parentValue, T? childValue);
+    method public operator void setValue(androidx.compose.ui.semantics.SemanticsPropertyReceiver thisRef, kotlin.reflect.KProperty<?> property, T? value);
+    property public final String name;
+  }
+
+  public interface SemanticsPropertyReceiver {
+    method public operator <T> void set(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, T? value);
+  }
+
+  public final class SemanticsSortKt {
+  }
+
+}
+
+package androidx.compose.ui.state {
+
+  public enum ToggleableState {
+    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 {
+  }
+
+}
+
+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();
+    property public static final kotlin.jvm.functions.Function1<android.view.View,kotlin.Unit> NoOpUpdate;
+  }
+
+}
+
+package androidx.compose.ui.window {
+
+  public final class AndroidDialog_androidKt {
+    method @androidx.compose.runtime.Composable public static void Dialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.window.DialogProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class AndroidPopup_androidKt {
+    method @androidx.compose.runtime.Composable public static void Popup(optional androidx.compose.ui.Alignment alignment, optional long offset, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Popup(androidx.compose.ui.window.PopupPositionProvider popupPositionProvider, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @org.jetbrains.annotations.TestOnly public static boolean isPopupLayout(android.view.View view, optional String? testTag);
+  }
+
+  @androidx.compose.runtime.Immutable public final class DialogProperties {
+    ctor public DialogProperties(optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy);
+    method public boolean getDismissOnBackPress();
+    method public boolean getDismissOnClickOutside();
+    method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
+    method public boolean getUsePlatformDefaultWidth();
+    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;
+  }
+
+  public final class SecureFlagPolicy_androidKt {
+  }
+
+}
+
diff --git a/compose/ui/ui/api/restricted_current.txt b/compose/ui/ui/api/restricted_current.txt
index ed2ddc6..2bc1512 100644
--- a/compose/ui/ui/api/restricted_current.txt
+++ b/compose/ui/ui/api/restricted_current.txt
@@ -21,6 +21,9 @@
     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;
@@ -2173,6 +2176,9 @@
     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();
@@ -2195,6 +2201,9 @@
 
 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();
@@ -2229,16 +2238,46 @@
     property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.platform.ViewConfiguration,kotlin.Unit> SetViewConfiguration;
   }
 
+  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 ModifiedLayoutNodeKt {
+  public final class ModifierNodeElementKt {
+  }
+
+  public final class MyersDiffKt {
+  }
+
+  public final class NodeChainKt {
+  }
+
+  public final class NodeCoordinatorKt {
+  }
+
+  public final class NodeKindKt {
+  }
+
+  public final class PointerInputModifierNodeKt {
   }
 
   public final class Ref<T> {
@@ -2258,6 +2297,9 @@
     property public abstract androidx.compose.ui.text.input.TextInputService textInputService;
   }
 
+  public final class SemanticsModifierNodeKt {
+  }
+
   public final class ViewInterop_androidKt {
   }
 
@@ -2644,6 +2686,9 @@
     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![] stringArrayResource(@ArrayRes int id);
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String stringResource(@StringRes int id);
diff --git a/compose/ui/ui/build.gradle b/compose/ui/ui/build.gradle
index 13f51f0..ac97b80 100644
--- a/compose/ui/ui/build.gradle
+++ b/compose/ui/ui/build.gradle
@@ -46,7 +46,7 @@
         api(project(":compose:ui:ui-graphics"))
         api(project(":compose:ui:ui-text"))
         api(project(":compose:ui:ui-unit"))
-        api("androidx.annotation:annotation:1.5.0-alpha01")
+        api(project(":annotation:annotation"))
 
         // This has stub APIs for access to legacy Android APIs, so we don't want
         // any dependency on this module.
@@ -98,8 +98,9 @@
         androidTestImplementation(project(":compose:test-utils"))
         androidTestImplementation(project(":internal-testutils-fonts"))
         androidTestImplementation(project(":compose:ui:ui-test-junit4"))
+        androidTestImplementation(project(":internal-testutils-runtime"))
         androidTestImplementation(project(":test:screenshot:screenshot"))
-        androidTestImplementation("androidx.recyclerview:recyclerview:1.1.0")
+        androidTestImplementation("androidx.recyclerview:recyclerview:1.3.0-alpha02")
         androidTestImplementation("androidx.core:core-ktx:1.1.0")
         androidTestImplementation("androidx.activity:activity-compose:1.3.1")
         androidTestImplementation("androidx.appcompat:appcompat:1.3.0")
@@ -215,8 +216,9 @@
                 implementation(project(":compose:test-utils"))
                 implementation(project(":internal-testutils-fonts"))
                 implementation(project(":compose:ui:ui-test-junit4"))
+                implementation(project(":internal-testutils-runtime"))
                 implementation(project(":test:screenshot:screenshot"))
-                implementation("androidx.recyclerview:recyclerview:1.1.0")
+                implementation("androidx.recyclerview:recyclerview:1.3.0-alpha02")
                 implementation("androidx.core:core-ktx:1.1.0")
                 implementation("androidx.activity:activity-compose:1.3.1")
             }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/AndroidManifest.xml b/compose/ui/ui/integration-tests/ui-demos/src/main/AndroidManifest.xml
index d853515..7367348 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/AndroidManifest.xml
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/AndroidManifest.xml
@@ -15,8 +15,8 @@
   -->
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android">
-    <application
-        android:theme="@style/Theme.MaterialComponents.Light">
+
+    <application android:theme="@style/Theme.MaterialComponents.Light">
         <activity
             android:name=".viewinterop.ComposeNothingInAndroidTap"
             android:configChanges="orientation|screenSize"
@@ -54,5 +54,12 @@
             android:name=".viewinterop.ViewComposeViewNestedScrollInteropDemo"
             android:configChanges="orientation|screenSize"
             android:label="Coordinator Layout Activity with Compose > View" />
+
+        <activity
+            android:name=".PainterResourcesDemoActivity"
+            android:configChanges="colorMode|density|fontScale|keyboard|keyboardHidden|
+            layoutDirection|locale|mcc|mnc|navigation|orientation|screenLayout|screenSize|
+            smallestScreenSize|touchscreen|uiMode"
+            android:label="Painter Resources Demo" />
     </application>
 </manifest>
\ No newline at end of file
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/PainterResourcesDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/PainterResourcesDemo.kt
new file mode 100644
index 0000000..306808e
--- /dev/null
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/PainterResourcesDemo.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.compose.ui.demos
+
+import android.os.Bundle
+import android.view.ViewGroup
+import androidx.activity.ComponentActivity
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.layout.Column
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.platform.ComposeView
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.vectorResource
+
+internal class PainterResourcesDemoActivity : ComponentActivity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        val composeView = ComposeView(this)
+        setContentView(
+            composeView,
+            ViewGroup.LayoutParams(
+                ViewGroup.LayoutParams.MATCH_PARENT,
+                ViewGroup.LayoutParams.MATCH_PARENT
+            )
+        )
+
+        composeView.setContent {
+            PainterResourcesDemo()
+        }
+    }
+}
+
+@Composable
+fun PainterResourcesDemo() {
+    // A resource that switches between day and night mode
+    val painter = painterResource(id = R.drawable.ic_painterresource)
+    val vector = ImageVector.Companion.vectorResource(id = R.drawable.ic_painterresource)
+
+    Column {
+        Image(painter, contentDescription = null)
+        Image(vector, contentDescription = null)
+    }
+}
\ No newline at end of file
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 db60235..a78dc22 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
@@ -166,7 +166,11 @@
     "Graphics",
     listOf(
         ComposableDemo("VectorGraphicsDemo") { VectorGraphicsDemo() },
-        ComposableDemo("DeclarativeGraphicsDemo") { DeclarativeGraphicsDemo() }
+        ComposableDemo("DeclarativeGraphicsDemo") { DeclarativeGraphicsDemo() },
+        ActivityDemo(
+            "Painter Resources Demo",
+            PainterResourcesDemoActivity::class
+        )
     )
 )
 
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/res/drawable-night/ic_painterresource.xml b/compose/ui/ui/integration-tests/ui-demos/src/main/res/drawable-night/ic_painterresource.xml
new file mode 100644
index 0000000..81aa518
--- /dev/null
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/res/drawable-night/ic_painterresource.xml
@@ -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.
+  -->
+
+<vector android:height="24dp" android:tint="#000000"
+    android:viewportHeight="24" android:viewportWidth="24"
+    android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="@android:color/white" android:pathData="M9.5,2c-1.82,0 -3.53,0.5 -5,1.35c2.99,1.73 5,4.95 5,8.65s-2.01,6.92 -5,8.65C5.97,21.5 7.68,22 9.5,22c5.52,0 10,-4.48 10,-10S15.02,2 9.5,2z"/>
+</vector>
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/res/drawable/ic_painterresource.xml b/compose/ui/ui/integration-tests/ui-demos/src/main/res/drawable/ic_painterresource.xml
new file mode 100644
index 0000000..123786a
--- /dev/null
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/res/drawable/ic_painterresource.xml
@@ -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.
+  -->
+
+<vector android:height="24dp" android:tint="#000000"
+    android:viewportHeight="24" android:viewportWidth="24"
+    android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="@android:color/white" android:pathData="M6.76,4.84l-1.8,-1.79 -1.41,1.41 1.79,1.79 1.42,-1.41zM4,10.5L1,10.5v2h3v-2zM13,0.55h-2L11,3.5h2L13,0.55zM20.45,4.46l-1.41,-1.41 -1.79,1.79 1.41,1.41 1.79,-1.79zM17.24,18.16l1.79,1.8 1.41,-1.41 -1.8,-1.79 -1.4,1.4zM20,10.5v2h3v-2h-3zM12,5.5c-3.31,0 -6,2.69 -6,6s2.69,6 6,6 6,-2.69 6,-6 -2.69,-6 -6,-6zM11,22.45h2L13,19.5h-2v2.95zM3.55,18.54l1.41,1.41 1.79,-1.8 -1.41,-1.41 -1.79,1.8z"/>
+</vector>
diff --git a/compose/ui/ui/src/androidAndroidTest/AndroidManifest.xml b/compose/ui/ui/src/androidAndroidTest/AndroidManifest.xml
index fb3637b..9825c9c 100644
--- a/compose/ui/ui/src/androidAndroidTest/AndroidManifest.xml
+++ b/compose/ui/ui/src/androidAndroidTest/AndroidManifest.xml
@@ -21,6 +21,10 @@
             android:name="androidx.compose.ui.test.TestActivity"
             android:theme="@android:style/Theme.Material.NoActionBar.Fullscreen" />
         <activity
+            android:name="androidx.compose.ui.window.ActivityWithInsets"
+            android:windowSoftInputMode="adjustResize"
+            android:theme="@android:style/Theme.Material.Light.NoActionBar" />
+        <activity
             android:name="androidx.compose.ui.input.pointer.AndroidPointerInputTestActivity" />
         <activity android:name="androidx.appcompat.app.AppCompatActivity"
             android:theme="@style/Theme.AppCompat"/>
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 d0d6697..b614ce0 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
@@ -2701,7 +2701,7 @@
     }
 
     @Test
-    fun testSemanticsSort_doesNotThrow_whenLayoutNodeWrapperNotAttached() {
+    fun testSemanticsSort_doesNotThrow_whenCoordinatorNotAttached() {
         container.setContent {
             with(LocalDensity.current) {
                 Box(Modifier.size(100.toDp()).testTag("parent")) {
@@ -2714,8 +2714,7 @@
         val child = rule.onNodeWithTag("child").fetchSemanticsNode()
 
         rule.runOnIdle {
-            child.layoutNode.innerLayoutNodeWrapper.detach()
-            child.outerSemanticsEntity.onDetach()
+            child.layoutNode.innerCoordinator.detach()
         }
 
         rule.runOnIdle {
@@ -2725,7 +2724,7 @@
     }
 
     @Test
-    fun testSemanticsSort_doesNotThrow_whenLayoutNodeWrapperNotAttached_compare() {
+    fun testSemanticsSort_doesNotThrow_whenCoordinatorNotAttached_compare() {
         container.setContent {
             with(LocalDensity.current) {
                 Box(Modifier.size(100.toDp()).testTag("parent")) {
@@ -2743,10 +2742,8 @@
         val grandChild1 = rule.onNodeWithTag("grandChild1").fetchSemanticsNode()
         val grandChild2 = rule.onNodeWithTag("grandChild2").fetchSemanticsNode()
         rule.runOnIdle {
-            grandChild1.layoutNode.innerLayoutNodeWrapper.detach()
-            grandChild1.outerSemanticsEntity.onDetach()
-            grandChild2.layoutNode.innerLayoutNodeWrapper.detach()
-            grandChild2.outerSemanticsEntity.onDetach()
+            grandChild1.layoutNode.innerCoordinator.detach()
+            grandChild2.layoutNode.innerCoordinator.detach()
         }
 
         rule.runOnIdle {
@@ -2856,6 +2853,48 @@
     }
 
     @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.P)
+    fun testScreenReaderFocusable_notSet_whenAncestorMergesDescendants() {
+        container.setContent {
+            Column(Modifier.semantics(true) { }) {
+                BasicText("test", Modifier.testTag("child"))
+            }
+        }
+
+        val childNode = rule.onNodeWithTag("child", useUnmergedTree = true).fetchSemanticsNode()
+        val childInfo = provider.createAccessibilityNodeInfo(childNode.id)!!
+        assertEquals(childInfo.isScreenReaderFocusable, false)
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.P)
+    fun testScreenReaderFocusable_set_whenAncestorDoesNotMerge() {
+        container.setContent {
+            Column(Modifier.semantics(false) { }) {
+                BasicText("test", Modifier.testTag("child"))
+            }
+        }
+
+        val childNode = rule.onNodeWithTag("child", useUnmergedTree = true).fetchSemanticsNode()
+        val childInfo = provider.createAccessibilityNodeInfo(childNode.id)!!
+        assertEquals(childInfo.isScreenReaderFocusable, true)
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.P)
+    fun testScreenReaderFocusable_notSet_whenChildNotSpeakable() {
+        container.setContent {
+            Column(Modifier.semantics(false) { }) {
+                Box(Modifier.testTag("child").size(100.dp))
+            }
+        }
+
+        val childNode = rule.onNodeWithTag("child", useUnmergedTree = true).fetchSemanticsNode()
+        val childInfo = provider.createAccessibilityNodeInfo(childNode.id)!!
+        assertEquals(childInfo.isScreenReaderFocusable, false)
+    }
+
+    @Test
     fun testImageRole_notSet_whenAncestorMergesDescendants() {
         container.setContent {
             Column(Modifier.semantics(true) { }) {
@@ -2992,24 +3031,36 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.P)
     fun progressSemantics_mergesSemantics_forTalkback() {
         container.setContent {
-            Box(Modifier.progressSemantics(0.5f).testTag("box"))
+            Box(Modifier.progressSemantics(0.5f).testTag("box")) {
+                 BasicText("test", Modifier.testTag("child"))
+            }
         }
 
-        val node = rule.onNodeWithTag("box").fetchSemanticsNode()
+        val node = rule.onNodeWithTag("box", useUnmergedTree = true).fetchSemanticsNode()
         val info = provider.createAccessibilityNodeInfo(node.id)!!
         assertEquals(info.isScreenReaderFocusable, true)
+
+        val childNode = rule.onNodeWithTag("child", useUnmergedTree = true).fetchSemanticsNode()
+        val childInfo = provider.createAccessibilityNodeInfo(childNode.id)!!
+        assertEquals(childInfo.isScreenReaderFocusable, false)
     }
 
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.P)
     fun indeterminateProgressSemantics_mergesSemantics_forTalkback() {
         container.setContent {
-            Box(Modifier.progressSemantics().testTag("box"))
+            Box(Modifier.progressSemantics().testTag("box")) {
+                 BasicText("test", Modifier.testTag("child"))
+            }
         }
 
-        val node = rule.onNodeWithTag("box").fetchSemanticsNode()
+        val node = rule.onNodeWithTag("box", useUnmergedTree = true).fetchSemanticsNode()
         val info = provider.createAccessibilityNodeInfo(node.id)!!
         assertEquals(info.isScreenReaderFocusable, true)
+
+        val childNode = rule.onNodeWithTag("child", useUnmergedTree = true).fetchSemanticsNode()
+        val childInfo = provider.createAccessibilityNodeInfo(childNode.id)!!
+        assertEquals(childInfo.isScreenReaderFocusable, false)
     }
 
     private fun eventIndex(list: List<AccessibilityEvent>, event: AccessibilityEvent): Int {
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidComposeViewAccessibilityDelegateCompatTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidComposeViewAccessibilityDelegateCompatTest.kt
index c77098c..efdf754 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidComposeViewAccessibilityDelegateCompatTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidComposeViewAccessibilityDelegateCompatTest.kt
@@ -31,8 +31,9 @@
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.graphics.toAndroidRect
-import androidx.compose.ui.node.InnerPlaceable
+import androidx.compose.ui.node.InnerNodeCoordinator
 import androidx.compose.ui.node.LayoutNode
+import androidx.compose.ui.node.SemanticsModifierNode
 import androidx.compose.ui.platform.AndroidComposeView
 import androidx.compose.ui.platform.AndroidComposeViewAccessibilityDelegateCompat
 import androidx.compose.ui.platform.LocalClipboardManager
@@ -43,11 +44,11 @@
 import androidx.compose.ui.semantics.ProgressBarRangeInfo
 import androidx.compose.ui.semantics.Role
 import androidx.compose.ui.semantics.ScrollAxisRange
+import androidx.compose.ui.semantics.SemanticsConfiguration
 import androidx.compose.ui.semantics.SemanticsModifierCore
 import androidx.compose.ui.semantics.SemanticsNode
 import androidx.compose.ui.semantics.SemanticsOwner
 import androidx.compose.ui.semantics.SemanticsPropertyReceiver
-import androidx.compose.ui.semantics.SemanticsEntity
 import androidx.compose.ui.semantics.collapse
 import androidx.compose.ui.semantics.contentDescription
 import androidx.compose.ui.semantics.copyText
@@ -242,6 +243,17 @@
     }
 
     @Test
+    fun testPopulateAccessibilityNodeInfoProperties_screenReaderFocusable_speakable() {
+        val node = createSemanticsNodeWithProperties(1, false) {
+            text = AnnotatedString("Example text")
+        }
+
+        accessibilityDelegate.populateAccessibilityNodeInfoProperties(1, info, node)
+
+        assertTrue(info.isScreenReaderFocusable)
+    }
+
+    @Test
     fun testPopulateAccessibilityNodeInfoProperties_disabled() {
         rule.setContent {
             LocalClipboardManager.current.setText(AnnotatedString("test"))
@@ -1258,15 +1270,25 @@
         )
     }
 
+    @OptIn(ExperimentalComposeUiApi::class)
     private fun createSemanticsNodeWithProperties(
         id: Int,
         mergeDescendants: Boolean,
         properties: (SemanticsPropertyReceiver.() -> Unit)
     ): SemanticsNode {
-        val semanticsModifier = SemanticsModifierCore(mergeDescendants, false, properties)
+        val layoutNode = LayoutNode(semanticsId = id)
+        val nodeCoordinator = InnerNodeCoordinator(layoutNode)
+        val modifierNode = object : SemanticsModifierNode, Modifier.Node() {
+            override val semanticsConfiguration = SemanticsConfiguration().also {
+                it.isMergingSemanticsOfDescendants = mergeDescendants
+                it.properties()
+            }
+        }
+        modifierNode.updateCoordinator(nodeCoordinator)
         return SemanticsNode(
-            SemanticsEntity(InnerPlaceable(LayoutNode(semanticsId = id)), semanticsModifier),
-            true
+            modifierNode,
+            true,
+            layoutNode
         )
     }
 
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt
index 3190e18..4302c8b 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt
@@ -2778,7 +2778,7 @@
         assertSame(firstMeasurable, m)
     }
 
-    // LayoutNodeWrappers remain even when there are multiple for a modifier
+    // NodeCoordinators remain even when there are multiple for a modifier
     @Test
     fun replaceMultiImplementationModifier() {
         var color by mutableStateOf(Color.Red)
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/DrawModifierTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/DrawModifierTest.kt
index b9748d3..ad1c03f 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/DrawModifierTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/DrawModifierTest.kt
@@ -41,6 +41,10 @@
 import androidx.compose.ui.graphics.graphicsLayer
 import androidx.compose.ui.graphics.toArgb
 import androidx.compose.ui.layout.Layout
+import androidx.compose.ui.layout.LayoutModifier
+import androidx.compose.ui.layout.Measurable
+import androidx.compose.ui.layout.MeasureResult
+import androidx.compose.ui.layout.MeasureScope
 import androidx.compose.ui.platform.InspectableValue
 import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
@@ -50,6 +54,7 @@
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.test.performClick
+import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.dp
 import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -218,6 +223,40 @@
         }
     }
 
+    @Test
+    fun combinedModifiers_drawingSizesAreUsingTheSizeDefinedByLayoutModifier() {
+        var drawingSize: Size = Size.Unspecified
+        var drawingCacheSize: Size = Size.Unspecified
+        val modifier = object : LayoutModifier, DrawCacheModifier {
+            override fun onBuildCache(params: BuildDrawCacheParams) {
+                drawingCacheSize = params.size
+            }
+
+            override fun ContentDrawScope.draw() {
+                drawingSize = size
+            }
+
+            override fun MeasureScope.measure(
+                measurable: Measurable,
+                constraints: Constraints
+            ): MeasureResult {
+                val placeable = measurable.measure(Constraints.fixed(10, 10))
+                return layout(20, 20) {
+                    placeable.place(0, 0)
+                }
+            }
+        }
+        rule.setContent {
+            Box(modifier)
+        }
+
+        rule.runOnIdle {
+            val expectedSize = Size(10f, 10f)
+            assertThat(drawingSize).isEqualTo(expectedSize)
+            assertThat(drawingCacheSize).isEqualTo(expectedSize)
+        }
+    }
+
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testCacheInvalidatedAfterSizeChange() {
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/HitPathTrackerTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/HitPathTrackerTest.kt
index 0fe6b5d..182fb02 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/HitPathTrackerTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/HitPathTrackerTest.kt
@@ -19,6 +19,7 @@
 import android.view.MotionEvent.ACTION_HOVER_ENTER
 import android.view.MotionEvent.ACTION_HOVER_EXIT
 import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.autofill.Autofill
 import androidx.compose.ui.autofill.AutofillTree
 import androidx.compose.ui.focus.FocusDirection
@@ -37,12 +38,18 @@
 import androidx.compose.ui.input.key.KeyEvent
 import androidx.compose.ui.layout.AlignmentLine
 import androidx.compose.ui.layout.LayoutCoordinates
+import androidx.compose.ui.layout.LookaheadScope
+import androidx.compose.ui.layout.Placeable
+import androidx.compose.ui.modifier.ModifierLocalManager
 import androidx.compose.ui.node.InternalCoreApi
 import androidx.compose.ui.node.LayoutNode
 import androidx.compose.ui.node.LayoutNodeDrawScope
+import androidx.compose.ui.node.LookaheadDelegate
+import androidx.compose.ui.node.NodeCoordinator
 import androidx.compose.ui.node.OwnedLayer
 import androidx.compose.ui.node.Owner
 import androidx.compose.ui.node.OwnerSnapshotObserver
+import androidx.compose.ui.node.PointerInputModifierNode
 import androidx.compose.ui.node.RootForTest
 import androidx.compose.ui.platform.AccessibilityManager
 import androidx.compose.ui.platform.ClipboardManager
@@ -68,6 +75,7 @@
 
 @MediumTest
 @RunWith(AndroidJUnit4::class)
+@OptIn(ExperimentalComposeUiApi::class)
 class HitPathTrackerTest {
 
     private lateinit var hitPathTracker: HitPathTracker
@@ -77,14 +85,14 @@
 
     @Before
     fun setup() {
-        hitPathTracker = HitPathTracker(layoutNode.outerLayoutNodeWrapper)
+        hitPathTracker = HitPathTracker(layoutNode.outerCoordinator)
     }
 
     @Test
     fun addHitPath_emptyHitResult_resultIsCorrect() {
-        val pif1: PointerInputFilter = PointerInputFilterMock()
-        val pif2: PointerInputFilter = PointerInputFilterMock()
-        val pif3: PointerInputFilter = PointerInputFilterMock()
+        val pif1 = PointerInputNodeMock()
+        val pif2 = PointerInputNodeMock()
+        val pif3 = PointerInputNodeMock()
         val pointerId = PointerId(1)
 
         hitPathTracker.addHitPath(pointerId, listOf(pif1, pif2, pif3))
@@ -111,12 +119,12 @@
 
     @Test
     fun addHitPath_existingNonMatchingTree_resultIsCorrect() {
-        val pif1: PointerInputFilter = PointerInputFilterMock()
-        val pif2: PointerInputFilter = PointerInputFilterMock()
-        val pif3: PointerInputFilter = PointerInputFilterMock()
-        val pif4: PointerInputFilter = PointerInputFilterMock()
-        val pif5: PointerInputFilter = PointerInputFilterMock()
-        val pif6: PointerInputFilter = PointerInputFilterMock()
+        val pif1 = PointerInputNodeMock()
+        val pif2 = PointerInputNodeMock()
+        val pif3 = PointerInputNodeMock()
+        val pif4 = PointerInputNodeMock()
+        val pif5 = PointerInputNodeMock()
+        val pif6 = PointerInputNodeMock()
         val pointerId1 = PointerId(1)
         val pointerId2 = PointerId(2)
 
@@ -160,9 +168,9 @@
 
     @Test
     fun addHitPath_completeMatchingTree_resultIsCorrect() {
-        val pif1: PointerInputFilter = PointerInputFilterMock()
-        val pif2: PointerInputFilter = PointerInputFilterMock()
-        val pif3: PointerInputFilter = PointerInputFilterMock()
+        val pif1 = PointerInputNodeMock()
+        val pif2 = PointerInputNodeMock()
+        val pif3 = PointerInputNodeMock()
         val pointerId1 = PointerId(1)
         val pointerId2 = PointerId(2)
         hitPathTracker.addHitPath(pointerId1, listOf(pif1, pif2, pif3))
@@ -194,11 +202,11 @@
 
     @Test
     fun addHitPath_partiallyMatchingTree_resultIsCorrect() {
-        val pif1: PointerInputFilter = PointerInputFilterMock()
-        val pif2: PointerInputFilter = PointerInputFilterMock()
-        val pif3: PointerInputFilter = PointerInputFilterMock()
-        val pif4: PointerInputFilter = PointerInputFilterMock()
-        val pif5: PointerInputFilter = PointerInputFilterMock()
+        val pif1 = PointerInputNodeMock()
+        val pif2 = PointerInputNodeMock()
+        val pif3 = PointerInputNodeMock()
+        val pif4 = PointerInputNodeMock()
+        val pif5 = PointerInputNodeMock()
         val pointerId1 = PointerId(1)
         val pointerId2 = PointerId(2)
         hitPathTracker.addHitPath(pointerId1, listOf(pif1, pif2, pif3))
@@ -243,7 +251,7 @@
 
     @Test
     fun dispatchChanges_hitResultHasSingleMatch_pointerInputHandlerCalled() {
-        val pif = PointerInputFilterMock()
+        val pif = PointerInputNodeMock()
         hitPathTracker.addHitPath(PointerId(13), listOf(pif))
 
         hitPathTracker.dispatchChanges(internalPointerEventOf(down(13)))
@@ -264,9 +272,9 @@
     @Test
     fun dispatchChanges_hitResultHasMultipleMatches_pointerInputHandlersCalledInCorrectOrder() {
         val log = mutableListOf<LogEntry>()
-        val pif1 = PointerInputFilterMock(log)
-        val pif2 = PointerInputFilterMock(log)
-        val pif3 = PointerInputFilterMock(log)
+        val pif1 = PointerInputNodeMock(log)
+        val pif2 = PointerInputNodeMock(log)
+        val pif3 = PointerInputNodeMock(log)
         hitPathTracker.addHitPath(PointerId(13), listOf(pif1, pif2, pif3))
 
         hitPathTracker.dispatchChanges(internalPointerEventOf(down(13)))
@@ -274,9 +282,9 @@
         val onPointerEventLog =
             log.getOnPointerEventLog().filter { it.pass == PointerEventPass.Initial }
         assertThat(onPointerEventLog).hasSize(3)
-        assertThat(onPointerEventLog[0].pointerInputFilter).isEqualTo(pif1)
-        assertThat(onPointerEventLog[1].pointerInputFilter).isEqualTo(pif2)
-        assertThat(onPointerEventLog[2].pointerInputFilter).isEqualTo(pif3)
+        assertThat(onPointerEventLog[0].pointerInputNode).isEqualTo(pif1)
+        assertThat(onPointerEventLog[1].pointerInputNode).isEqualTo(pif2)
+        assertThat(onPointerEventLog[2].pointerInputNode).isEqualTo(pif3)
         onPointerEventLog.forEach {
             PointerEventSubject
                 .assertThat(it.pointerEvent)
@@ -287,9 +295,9 @@
     @Test
     fun dispatchChanges_hasDownAndUpPath_pointerInputHandlersCalledInCorrectOrder() {
         val log = mutableListOf<LogEntry>()
-        val pif1 = PointerInputFilterMock(log)
-        val pif2 = PointerInputFilterMock(log)
-        val pif3 = PointerInputFilterMock(log)
+        val pif1 = PointerInputNodeMock(log)
+        val pif2 = PointerInputNodeMock(log)
+        val pif3 = PointerInputNodeMock(log)
         hitPathTracker.addHitPath(PointerId(13), listOf(pif1, pif2, pif3))
 
         hitPathTracker.dispatchChanges(internalPointerEventOf(down(13)))
@@ -298,12 +306,12 @@
             .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
 
         assertThat(onPointerEventLog).hasSize(6)
-        assertThat(onPointerEventLog[0].pointerInputFilter).isEqualTo(pif1)
-        assertThat(onPointerEventLog[1].pointerInputFilter).isEqualTo(pif2)
-        assertThat(onPointerEventLog[2].pointerInputFilter).isEqualTo(pif3)
-        assertThat(onPointerEventLog[3].pointerInputFilter).isEqualTo(pif3)
-        assertThat(onPointerEventLog[4].pointerInputFilter).isEqualTo(pif2)
-        assertThat(onPointerEventLog[5].pointerInputFilter).isEqualTo(pif1)
+        assertThat(onPointerEventLog[0].pointerInputNode).isEqualTo(pif1)
+        assertThat(onPointerEventLog[1].pointerInputNode).isEqualTo(pif2)
+        assertThat(onPointerEventLog[2].pointerInputNode).isEqualTo(pif3)
+        assertThat(onPointerEventLog[3].pointerInputNode).isEqualTo(pif3)
+        assertThat(onPointerEventLog[4].pointerInputNode).isEqualTo(pif2)
+        assertThat(onPointerEventLog[5].pointerInputNode).isEqualTo(pif1)
         onPointerEventLog.forEach {
             PointerEventSubject
                 .assertThat(it.pointerEvent)
@@ -314,10 +322,10 @@
     @Test
     fun dispatchChanges_2IndependentBranchesFromRoot_eventsSplitCorrectlyAndCallOrderCorrect() {
         val log = mutableListOf<LogEntry>()
-        val pif1 = PointerInputFilterMock(log)
-        val pif2 = PointerInputFilterMock(log)
-        val pif3 = PointerInputFilterMock(log)
-        val pif4 = PointerInputFilterMock(log)
+        val pif1 = PointerInputNodeMock(log)
+        val pif2 = PointerInputNodeMock(log)
+        val pif3 = PointerInputNodeMock(log)
+        val pif4 = PointerInputNodeMock(log)
         hitPathTracker.addHitPath(PointerId(3), listOf(pif1, pif2))
         hitPathTracker.addHitPath(PointerId(5), listOf(pif3, pif4))
         val event1 = down(3)
@@ -329,11 +337,11 @@
 
         val log1 = log
             .getOnPointerEventLog()
-            .filter { it.pointerInputFilter == pif1 || it.pointerInputFilter == pif2 }
+            .filter { it.pointerInputNode == pif1 || it.pointerInputNode == pif2 }
             .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
         val log2 = log
             .getOnPointerEventLog()
-            .filter { it.pointerInputFilter == pif3 || it.pointerInputFilter == pif4 }
+            .filter { it.pointerInputNode == pif3 || it.pointerInputNode == pif4 }
             .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
 
         assertThat(log1).hasSize(4)
@@ -345,31 +353,31 @@
                 .isStructurallyEqualTo(pointerEventOf(event1))
         }
 
-        assertThat(log1[0].pointerInputFilter).isEqualTo(pif1)
+        assertThat(log1[0].pointerInputNode).isEqualTo(pif1)
         assertThat(log1[0].pass).isEqualTo(PointerEventPass.Initial)
-        assertThat(log1[1].pointerInputFilter).isEqualTo(pif2)
+        assertThat(log1[1].pointerInputNode).isEqualTo(pif2)
         assertThat(log1[1].pass).isEqualTo(PointerEventPass.Initial)
-        assertThat(log1[2].pointerInputFilter).isEqualTo(pif2)
+        assertThat(log1[2].pointerInputNode).isEqualTo(pif2)
         assertThat(log1[2].pass).isEqualTo(PointerEventPass.Main)
-        assertThat(log1[3].pointerInputFilter).isEqualTo(pif1)
+        assertThat(log1[3].pointerInputNode).isEqualTo(pif1)
         assertThat(log1[3].pass).isEqualTo(PointerEventPass.Main)
 
-        assertThat(log2[0].pointerInputFilter).isEqualTo(pif3)
+        assertThat(log2[0].pointerInputNode).isEqualTo(pif3)
         assertThat(log2[0].pass).isEqualTo(PointerEventPass.Initial)
-        assertThat(log2[1].pointerInputFilter).isEqualTo(pif4)
+        assertThat(log2[1].pointerInputNode).isEqualTo(pif4)
         assertThat(log2[1].pass).isEqualTo(PointerEventPass.Initial)
-        assertThat(log2[2].pointerInputFilter).isEqualTo(pif4)
+        assertThat(log2[2].pointerInputNode).isEqualTo(pif4)
         assertThat(log2[2].pass).isEqualTo(PointerEventPass.Main)
-        assertThat(log2[3].pointerInputFilter).isEqualTo(pif3)
+        assertThat(log2[3].pointerInputNode).isEqualTo(pif3)
         assertThat(log2[3].pass).isEqualTo(PointerEventPass.Main)
     }
 
     @Test
     fun dispatchChanges_2BranchesWithSharedParent_eventsSplitCorrectlyAndCallOrderCorrect() {
         val log = mutableListOf<LogEntry>()
-        val parent = PointerInputFilterMock(log)
-        val child1 = PointerInputFilterMock(log)
-        val child2 = PointerInputFilterMock(log)
+        val parent = PointerInputNodeMock(log)
+        val child1 = PointerInputNodeMock(log)
+        val child2 = PointerInputNodeMock(log)
         hitPathTracker.addHitPath(PointerId(3), listOf(parent, child1))
         hitPathTracker.addHitPath(PointerId(5), listOf(parent, child2))
         val event1 = down(3)
@@ -381,61 +389,61 @@
 
         val log1 = log
             .getOnPointerEventLog()
-            .filter { it.pointerInputFilter == parent || it.pointerInputFilter == child1 }
+            .filter { it.pointerInputNode == parent || it.pointerInputNode == child1 }
             .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
         val log2 = log
             .getOnPointerEventLog()
-            .filter { it.pointerInputFilter == parent || it.pointerInputFilter == child2 }
+            .filter { it.pointerInputNode == parent || it.pointerInputNode == child2 }
             .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
 
         assertThat(log1).hasSize(4)
         assertThat(log2).hasSize(4)
 
         // Verifies that the events traverse between parent and child1 in the correct order.
-        assertThat(log1[0].pointerInputFilter).isEqualTo(parent)
+        assertThat(log1[0].pointerInputNode).isEqualTo(parent)
         PointerEventSubject
             .assertThat(log1[0].pointerEvent)
             .isStructurallyEqualTo(pointerEventOf(event1, event2))
         assertThat(log1[0].pass).isEqualTo(PointerEventPass.Initial)
 
-        assertThat(log1[1].pointerInputFilter).isEqualTo(child1)
+        assertThat(log1[1].pointerInputNode).isEqualTo(child1)
         PointerEventSubject
             .assertThat(log1[1].pointerEvent)
             .isStructurallyEqualTo(pointerEventOf(event1))
         assertThat(log1[1].pass).isEqualTo(PointerEventPass.Initial)
 
-        assertThat(log1[2].pointerInputFilter).isEqualTo(child1)
+        assertThat(log1[2].pointerInputNode).isEqualTo(child1)
         PointerEventSubject
             .assertThat(log1[2].pointerEvent)
             .isStructurallyEqualTo(pointerEventOf(event1))
         assertThat(log1[2].pass).isEqualTo(PointerEventPass.Main)
 
-        assertThat(log1[3].pointerInputFilter).isEqualTo(parent)
+        assertThat(log1[3].pointerInputNode).isEqualTo(parent)
         PointerEventSubject
             .assertThat(log1[3].pointerEvent)
             .isStructurallyEqualTo(pointerEventOf(event1, event2))
         assertThat(log1[3].pass).isEqualTo(PointerEventPass.Main)
 
         // Verifies that the events traverse between parent and child2 in the correct order.
-        assertThat(log1[0].pointerInputFilter).isEqualTo(parent)
+        assertThat(log1[0].pointerInputNode).isEqualTo(parent)
         PointerEventSubject
             .assertThat(log1[0].pointerEvent)
             .isStructurallyEqualTo(pointerEventOf(event1, event2))
         assertThat(log1[0].pass).isEqualTo(PointerEventPass.Initial)
 
-        assertThat(log1[1].pointerInputFilter).isEqualTo(child1)
+        assertThat(log1[1].pointerInputNode).isEqualTo(child1)
         PointerEventSubject
             .assertThat(log1[1].pointerEvent)
             .isStructurallyEqualTo(pointerEventOf(event1))
         assertThat(log1[1].pass).isEqualTo(PointerEventPass.Initial)
 
-        assertThat(log1[2].pointerInputFilter).isEqualTo(child1)
+        assertThat(log1[2].pointerInputNode).isEqualTo(child1)
         PointerEventSubject
             .assertThat(log1[2].pointerEvent)
             .isStructurallyEqualTo(pointerEventOf(event1))
         assertThat(log1[2].pass).isEqualTo(PointerEventPass.Main)
 
-        assertThat(log1[3].pointerInputFilter).isEqualTo(parent)
+        assertThat(log1[3].pointerInputNode).isEqualTo(parent)
         PointerEventSubject
             .assertThat(log1[3].pointerEvent)
             .isStructurallyEqualTo(pointerEventOf(event1, event2))
@@ -445,8 +453,8 @@
     @Test
     fun dispatchChanges_2PointersShareCompletePath_eventsDoNotSplitAndCallOrderCorrect() {
         val log = mutableListOf<LogEntry>()
-        val child1 = PointerInputFilterMock(log)
-        val child2 = PointerInputFilterMock(log)
+        val child1 = PointerInputNodeMock(log)
+        val child2 = PointerInputNodeMock(log)
         hitPathTracker.addHitPath(PointerId(3), listOf(child1, child2))
         hitPathTracker.addHitPath(PointerId(5), listOf(child1, child2))
         val event1 = down(3)
@@ -472,13 +480,13 @@
 
         // Verify dispatch order
         assertThat(log1[0].pass).isEqualTo(PointerEventPass.Initial)
-        assertThat(log1[0].pointerInputFilter).isEqualTo(child1)
+        assertThat(log1[0].pointerInputNode).isEqualTo(child1)
         assertThat(log1[1].pass).isEqualTo(PointerEventPass.Initial)
-        assertThat(log1[1].pointerInputFilter).isEqualTo(child2)
+        assertThat(log1[1].pointerInputNode).isEqualTo(child2)
         assertThat(log1[2].pass).isEqualTo(PointerEventPass.Main)
-        assertThat(log1[2].pointerInputFilter).isEqualTo(child2)
+        assertThat(log1[2].pointerInputNode).isEqualTo(child2)
         assertThat(log1[3].pass).isEqualTo(PointerEventPass.Main)
-        assertThat(log1[3].pointerInputFilter).isEqualTo(child1)
+        assertThat(log1[3].pointerInputNode).isEqualTo(child1)
     }
 
     @Test
@@ -494,7 +502,7 @@
 
     @Test
     fun dispatchChanges_hitResultHasSingleMatch_changesAreUpdatedCorrectly() {
-        val pif1 = PointerInputFilterMock(
+        val pif1 = PointerInputNodeMock(
             pointerEventHandler = { pointerEvent, _, _ ->
                 pointerEvent.changes.map {
                     if (it.pressed != it.previousPressed) it.consume()
@@ -517,7 +525,7 @@
     @Test
     fun dispatchChanges_hitResultHasMultipleMatchesAndDownAndUpPaths_changesAreUpdatedCorrectly() {
         val log = mutableListOf<LogEntry>()
-        val pif1 = PointerInputFilterMock(
+        val pif1 = PointerInputNodeMock(
             log = log,
             pointerEventHandler = { pointerEvent, _, _ ->
                 pointerEvent.changes.map {
@@ -527,7 +535,7 @@
             }
         )
 
-        val pif2 = PointerInputFilterMock(
+        val pif2 = PointerInputNodeMock(
             log = log,
             pointerEventHandler = { pointerEvent, _, _ ->
                 pointerEvent.changes.map {
@@ -537,7 +545,7 @@
             }
         )
 
-        val pif3 = PointerInputFilterMock(
+        val pif3 = PointerInputNodeMock(
             log = log,
             pointerEventHandler = { pointerEvent, _, _ ->
                 pointerEvent.changes.map {
@@ -559,13 +567,13 @@
         val log1 = log.getOnPointerEventLog()
             .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
 
-        assertThat(log1[0].pointerInputFilter).isEqualTo(pif1)
+        assertThat(log1[0].pointerInputNode).isEqualTo(pif1)
         PointerEventSubject
             .assertThat(log1[0].pointerEvent)
             .isStructurallyEqualTo(pointerEventOf(expectedChange))
         assertThat(log1[0].pass).isEqualTo(PointerEventPass.Initial)
 
-        assertThat(log1[1].pointerInputFilter).isEqualTo(pif2)
+        assertThat(log1[1].pointerInputNode).isEqualTo(pif2)
         PointerEventSubject
             .assertThat(log1[1].pointerEvent)
             .isStructurallyEqualTo(
@@ -575,7 +583,7 @@
             )
         assertThat(log1[1].pass).isEqualTo(PointerEventPass.Initial)
 
-        assertThat(log1[2].pointerInputFilter).isEqualTo(pif3)
+        assertThat(log1[2].pointerInputNode).isEqualTo(pif3)
         PointerEventSubject
             .assertThat(log1[2].pointerEvent)
             .isStructurallyEqualTo(
@@ -585,7 +593,7 @@
             )
         assertThat(log1[2].pass).isEqualTo(PointerEventPass.Initial)
 
-        assertThat(log1[3].pointerInputFilter).isEqualTo(pif3)
+        assertThat(log1[3].pointerInputNode).isEqualTo(pif3)
         PointerEventSubject
             .assertThat(log1[3].pointerEvent)
             .isStructurallyEqualTo(
@@ -595,7 +603,7 @@
             )
         assertThat(log1[3].pass).isEqualTo(PointerEventPass.Main)
 
-        assertThat(log1[4].pointerInputFilter).isEqualTo(pif2)
+        assertThat(log1[4].pointerInputNode).isEqualTo(pif2)
         PointerEventSubject
             .assertThat(log1[4].pointerEvent)
             .isStructurallyEqualTo(
@@ -605,7 +613,7 @@
             )
         assertThat(log1[4].pass).isEqualTo(PointerEventPass.Main)
 
-        assertThat(log1[5].pointerInputFilter).isEqualTo(pif1)
+        assertThat(log1[5].pointerInputNode).isEqualTo(pif1)
         PointerEventSubject
             .assertThat(log1[5].pointerEvent)
             .isStructurallyEqualTo(
@@ -625,7 +633,7 @@
     @Test
     fun dispatchChanges_2IndependentBranchesFromRoot_changesAreUpdatedCorrectly() {
         val log = mutableListOf<LogEntry>()
-        val pif1 = PointerInputFilterMock(
+        val pif1 = PointerInputNodeMock(
             log = log,
             pointerEventHandler =
                 { pointerEvent, _, _ ->
@@ -635,7 +643,7 @@
                     pointerEvent.changes
                 }
         )
-        val pif2 = PointerInputFilterMock(
+        val pif2 = PointerInputNodeMock(
             log = log,
             pointerEventHandler =
                 { pointerEvent, _, _ ->
@@ -645,7 +653,7 @@
                     pointerEvent.changes
                 }
         )
-        val pif3 = PointerInputFilterMock(
+        val pif3 = PointerInputNodeMock(
             log = log,
             pointerEventHandler =
                 { pointerEvent, _, _ ->
@@ -655,7 +663,7 @@
                     pointerEvent.changes
                 }
         )
-        val pif4 = PointerInputFilterMock(
+        val pif4 = PointerInputNodeMock(
             log = log,
             pointerEventHandler =
                 { pointerEvent, _, _ ->
@@ -680,19 +688,19 @@
 
         val log1 = log.getOnPointerEventLog()
             .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
-            .filter { it.pointerInputFilter == pif1 || it.pointerInputFilter == pif2 }
+            .filter { it.pointerInputNode == pif1 || it.pointerInputNode == pif2 }
 
         val log2 = log.getOnPointerEventLog()
             .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
-            .filter { it.pointerInputFilter == pif3 || it.pointerInputFilter == pif4 }
+            .filter { it.pointerInputNode == pif3 || it.pointerInputNode == pif4 }
 
-        assertThat(log1[0].pointerInputFilter).isEqualTo(pif1)
+        assertThat(log1[0].pointerInputNode).isEqualTo(pif1)
         PointerEventSubject
             .assertThat(log1[0].pointerEvent)
             .isStructurallyEqualTo(pointerEventOf(expectedEvent1))
         assertThat(log1[0].pass).isEqualTo(PointerEventPass.Initial)
 
-        assertThat(log1[1].pointerInputFilter).isEqualTo(pif2)
+        assertThat(log1[1].pointerInputNode).isEqualTo(pif2)
         PointerEventSubject
             .assertThat(log1[1].pointerEvent)
             .isStructurallyEqualTo(
@@ -702,7 +710,7 @@
             )
         assertThat(log1[1].pass).isEqualTo(PointerEventPass.Initial)
 
-        assertThat(log1[2].pointerInputFilter).isEqualTo(pif2)
+        assertThat(log1[2].pointerInputNode).isEqualTo(pif2)
         PointerEventSubject
             .assertThat(log1[2].pointerEvent)
             .isStructurallyEqualTo(
@@ -712,7 +720,7 @@
             )
         assertThat(log1[2].pass).isEqualTo(PointerEventPass.Main)
 
-        assertThat(log1[3].pointerInputFilter).isEqualTo(pif1)
+        assertThat(log1[3].pointerInputNode).isEqualTo(pif1)
         PointerEventSubject
             .assertThat(log1[3].pointerEvent)
             .isStructurallyEqualTo(
@@ -722,13 +730,13 @@
             )
         assertThat(log1[3].pass).isEqualTo(PointerEventPass.Main)
 
-        assertThat(log2[0].pointerInputFilter).isEqualTo(pif3)
+        assertThat(log2[0].pointerInputNode).isEqualTo(pif3)
         PointerEventSubject
             .assertThat(log2[0].pointerEvent)
             .isStructurallyEqualTo(pointerEventOf(expectedEvent2))
         assertThat(log2[0].pass).isEqualTo(PointerEventPass.Initial)
 
-        assertThat(log2[1].pointerInputFilter).isEqualTo(pif4)
+        assertThat(log2[1].pointerInputNode).isEqualTo(pif4)
         PointerEventSubject
             .assertThat(log2[1].pointerEvent)
             .isStructurallyEqualTo(
@@ -738,7 +746,7 @@
             )
         assertThat(log2[1].pass).isEqualTo(PointerEventPass.Initial)
 
-        assertThat(log2[2].pointerInputFilter).isEqualTo(pif4)
+        assertThat(log2[2].pointerInputNode).isEqualTo(pif4)
         PointerEventSubject
             .assertThat(log2[2].pointerEvent)
             .isStructurallyEqualTo(
@@ -748,7 +756,7 @@
             )
         assertThat(log2[2].pass).isEqualTo(PointerEventPass.Main)
 
-        assertThat(log2[3].pointerInputFilter).isEqualTo(pif3)
+        assertThat(log2[3].pointerInputNode).isEqualTo(pif3)
         PointerEventSubject
             .assertThat(log2[3].pointerEvent)
             .isStructurallyEqualTo(
@@ -774,7 +782,7 @@
     @Test
     fun dispatchChanges_2BranchesWithSharedParent_changesAreUpdatedCorrectly() {
         val log = mutableListOf<LogEntry>()
-        val parent = PointerInputFilterMock(
+        val parent = PointerInputNodeMock(
             log = log,
             pointerEventHandler =
                 { pointerEvent, _, _ ->
@@ -785,7 +793,7 @@
                 }
         )
 
-        val child1 = PointerInputFilterMock(
+        val child1 = PointerInputNodeMock(
             log = log,
             pointerEventHandler =
                 { pointerEvent, _, _ ->
@@ -796,7 +804,7 @@
                 }
         )
 
-        val child2 = PointerInputFilterMock(
+        val child2 = PointerInputNodeMock(
             log = log,
             pointerEventHandler =
                 { pointerEvent, _, _ ->
@@ -823,13 +831,13 @@
         val log1 = log.getOnPointerEventLog()
             .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
 
-        assertThat(log1[0].pointerInputFilter).isEqualTo(parent)
+        assertThat(log1[0].pointerInputNode).isEqualTo(parent)
         PointerEventSubject
             .assertThat(log1[0].pointerEvent)
             .isStructurallyEqualTo(pointerEventOf(expectedEvent1, expectedEvent2))
         assertThat(log1[0].pass).isEqualTo(PointerEventPass.Initial)
 
-        assertThat(log1[1].pointerInputFilter).isEqualTo(child1)
+        assertThat(log1[1].pointerInputNode).isEqualTo(child1)
         PointerEventSubject
             .assertThat(log1[1].pointerEvent)
             .isStructurallyEqualTo(
@@ -837,7 +845,7 @@
             )
         assertThat(log1[1].pass).isEqualTo(PointerEventPass.Initial)
 
-        assertThat(log1[2].pointerInputFilter).isEqualTo(child1)
+        assertThat(log1[2].pointerInputNode).isEqualTo(child1)
         PointerEventSubject
             .assertThat(log1[2].pointerEvent)
             .isStructurallyEqualTo(
@@ -845,7 +853,7 @@
             )
         assertThat(log1[2].pass).isEqualTo(PointerEventPass.Main)
 
-        assertThat(log1[3].pointerInputFilter).isEqualTo(child2)
+        assertThat(log1[3].pointerInputNode).isEqualTo(child2)
         PointerEventSubject
             .assertThat(log1[3].pointerEvent)
             .isStructurallyEqualTo(
@@ -853,7 +861,7 @@
             )
         assertThat(log1[3].pass).isEqualTo(PointerEventPass.Initial)
 
-        assertThat(log1[4].pointerInputFilter).isEqualTo(child2)
+        assertThat(log1[4].pointerInputNode).isEqualTo(child2)
         PointerEventSubject
             .assertThat(log1[4].pointerEvent)
             .isStructurallyEqualTo(
@@ -861,7 +869,7 @@
             )
         assertThat(log1[4].pass).isEqualTo(PointerEventPass.Main)
 
-        assertThat(log1[5].pointerInputFilter).isEqualTo(parent)
+        assertThat(log1[5].pointerInputNode).isEqualTo(parent)
         PointerEventSubject
             .assertThat(log1[5].pointerEvent)
             .isStructurallyEqualTo(
@@ -882,7 +890,7 @@
     @Test
     fun dispatchChanges_2PointersShareCompletePath_changesAreUpdatedCorrectly() {
         val log = mutableListOf<LogEntry>()
-        val child1 = PointerInputFilterMock(
+        val child1 = PointerInputNodeMock(
             log = log,
             pointerEventHandler =
                 { pointerEvent, _, _ ->
@@ -892,7 +900,7 @@
                     pointerEvent.changes
                 }
         )
-        val child2 = PointerInputFilterMock(
+        val child2 = PointerInputNodeMock(
             log = log,
             pointerEventHandler =
                 { pointerEvent, _, _ ->
@@ -919,13 +927,13 @@
         val log1 = log.getOnPointerEventLog()
             .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
 
-        assertThat(log1[0].pointerInputFilter).isEqualTo(child1)
+        assertThat(log1[0].pointerInputNode).isEqualTo(child1)
         PointerEventSubject
             .assertThat(log1[0].pointerEvent)
             .isStructurallyEqualTo(pointerEventOf(expectedEvent1, expectedEvent2))
         assertThat(log1[0].pass).isEqualTo(PointerEventPass.Initial)
 
-        assertThat(log1[1].pointerInputFilter).isEqualTo(child2)
+        assertThat(log1[1].pointerInputNode).isEqualTo(child2)
         PointerEventSubject
             .assertThat(log1[1].pointerEvent)
             .isStructurallyEqualTo(
@@ -936,7 +944,7 @@
             )
         assertThat(log1[1].pass).isEqualTo(PointerEventPass.Initial)
 
-        assertThat(log1[2].pointerInputFilter).isEqualTo(child2)
+        assertThat(log1[2].pointerInputNode).isEqualTo(child2)
         PointerEventSubject
             .assertThat(log1[2].pointerEvent)
             .isStructurallyEqualTo(
@@ -947,7 +955,7 @@
             )
         assertThat(log1[2].pass).isEqualTo(PointerEventPass.Main)
 
-        assertThat(log1[3].pointerInputFilter).isEqualTo(child1)
+        assertThat(log1[3].pointerInputNode).isEqualTo(child1)
         PointerEventSubject
             .assertThat(log1[3].pointerEvent)
             .isStructurallyEqualTo(
@@ -988,15 +996,15 @@
 
         val log = mutableListOf<LogEntry>()
 
-        val pif1 = PointerInputFilterMock(log)
-        val pif2 = PointerInputFilterMock(log)
-        val pif3 = PointerInputFilterMock(log)
-        val pif4 = PointerInputFilterMock(log)
-        val pif5 = PointerInputFilterMock(log)
-        val pif6 = PointerInputFilterMock(log)
-        val pif7 = PointerInputFilterMock(log)
-        val pif8 = PointerInputFilterMock(log)
-        val pif9 = PointerInputFilterMock(log)
+        val pif1 = PointerInputNodeMock(log)
+        val pif2 = PointerInputNodeMock(log)
+        val pif3 = PointerInputNodeMock(log)
+        val pif4 = PointerInputNodeMock(log)
+        val pif5 = PointerInputNodeMock(log)
+        val pif6 = PointerInputNodeMock(log)
+        val pif7 = PointerInputNodeMock(log)
+        val pif8 = PointerInputNodeMock(log)
+        val pif9 = PointerInputNodeMock(log)
 
         val pointerId1 = PointerId(1)
         val pointerId2 = PointerId(2)
@@ -1075,17 +1083,17 @@
     @Test
     fun removeDetachedPointerInputFilters_1PathRootDetached_allRemovedAndCorrectCancels() {
         val log = mutableListOf<LogEntry>()
-        val root = PointerInputFilterMock(
+        val root = PointerInputNodeMock(
             log = log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val middle = PointerInputFilterMock(
+        val middle = PointerInputNodeMock(
             log = log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val leaf = PointerInputFilterMock(
+        val leaf = PointerInputNodeMock(
             log = log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
         hitPathTracker.addHitPath(PointerId(0), listOf(root, middle, leaf))
@@ -1095,23 +1103,23 @@
         assertThat(areEqual(hitPathTracker.root, NodeParent())).isTrue()
 
         val log1 = log.getOnCancelLog()
-        assertThat(log1[0].pointerInputFilter).isEqualTo(leaf)
-        assertThat(log1[1].pointerInputFilter).isEqualTo(middle)
-        assertThat(log1[2].pointerInputFilter).isEqualTo(root)
+        assertThat(log1[0].pointerInputNode).isEqualTo(leaf)
+        assertThat(log1[1].pointerInputNode).isEqualTo(middle)
+        assertThat(log1[2].pointerInputNode).isEqualTo(root)
     }
 
     //  compositionRoot -> root, middle -> child
     @Test
     fun removeDetachedPointerInputFilters_1PathMiddleDetached_removesAndCancelsCorrect() {
         val log = mutableListOf<LogEntry>()
-        val root = PointerInputFilterMock(log)
-        val middle = PointerInputFilterMock(
+        val root = PointerInputNodeMock(log)
+        val middle = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val child = PointerInputFilterMock(
+        val child = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
         val pointerId = PointerId(0)
@@ -1132,19 +1140,19 @@
         val log1 = log.getOnCancelLog()
 
         assertThat(log1).hasSize(2)
-        assertThat(log1[0].pointerInputFilter).isEqualTo(child)
-        assertThat(log1[1].pointerInputFilter).isEqualTo(middle)
+        assertThat(log1[0].pointerInputNode).isEqualTo(child)
+        assertThat(log1[1].pointerInputNode).isEqualTo(middle)
     }
 
     //  compositionRoot -> root -> middle, leaf
     @Test
     fun removeDetachedPointerInputFilters_1PathLeafDetached_removesAndCancelsCorrect() {
         val log = mutableListOf<LogEntry>()
-        val root = PointerInputFilterMock(log)
-        val middle = PointerInputFilterMock(log)
-        val leaf = PointerInputFilterMock(
+        val root = PointerInputNodeMock(log)
+        val middle = PointerInputNodeMock(log)
+        val leaf = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
         val pointerId = PointerId(0)
@@ -1170,7 +1178,7 @@
         val log1 = log.getOnCancelLog()
 
         assertThat(log1).hasSize(1)
-        assertThat(log1[0].pointerInputFilter).isEqualTo(leaf)
+        assertThat(log1[0].pointerInputNode).isEqualTo(leaf)
     }
 
     //  compositionRoot -> root1 -> middle1 -> leaf1
@@ -1180,25 +1188,25 @@
     fun removeDetachedPointerInputFilters_3Roots1Detached_removesAndCancelsCorrect() {
         val log = mutableListOf<LogEntry>()
 
-        val root1 = PointerInputFilterMock(log)
-        val middle1 = PointerInputFilterMock(log)
-        val leaf1 = PointerInputFilterMock(log)
+        val root1 = PointerInputNodeMock(log)
+        val middle1 = PointerInputNodeMock(log)
+        val leaf1 = PointerInputNodeMock(log)
 
-        val root2 = PointerInputFilterMock(log)
-        val middle2 = PointerInputFilterMock(log)
-        val leaf2 = PointerInputFilterMock(log)
+        val root2 = PointerInputNodeMock(log)
+        val middle2 = PointerInputNodeMock(log)
+        val leaf2 = PointerInputNodeMock(log)
 
-        val root3 = PointerInputFilterMock(
+        val root3 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val middle3 = PointerInputFilterMock(
+        val middle3 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val leaf3 = PointerInputFilterMock(
+        val leaf3 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
         val pointerId1 = PointerId(3)
@@ -1249,9 +1257,9 @@
         val log1 = log.getOnCancelLog()
 
         assertThat(log1).hasSize(3)
-        assertThat(log1[0].pointerInputFilter).isEqualTo(leaf3)
-        assertThat(log1[1].pointerInputFilter).isEqualTo(middle3)
-        assertThat(log1[2].pointerInputFilter).isEqualTo(root3)
+        assertThat(log1[0].pointerInputNode).isEqualTo(leaf3)
+        assertThat(log1[1].pointerInputNode).isEqualTo(middle3)
+        assertThat(log1[2].pointerInputNode).isEqualTo(root3)
     }
 
     //  compositionRoot -> root1, middle1 -> leaf1
@@ -1261,23 +1269,23 @@
     fun removeDetachedPointerInputFilters_3Roots1MiddleDetached_removesAndCancelsCorrect() {
         val log = mutableListOf<LogEntry>()
 
-        val root1 = PointerInputFilterMock(log)
-        val middle1 = PointerInputFilterMock(
+        val root1 = PointerInputNodeMock(log)
+        val middle1 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val leaf1 = PointerInputFilterMock(
+        val leaf1 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
-        val root2 = PointerInputFilterMock()
-        val middle2 = PointerInputFilterMock()
-        val leaf2 = PointerInputFilterMock()
+        val root2 = PointerInputNodeMock()
+        val middle2 = PointerInputNodeMock()
+        val leaf2 = PointerInputNodeMock()
 
-        val root3 = PointerInputFilterMock()
-        val middle3 = PointerInputFilterMock()
-        val leaf3 = PointerInputFilterMock()
+        val root3 = PointerInputNodeMock()
+        val middle3 = PointerInputNodeMock()
+        val leaf3 = PointerInputNodeMock()
 
         val pointerId1 = PointerId(3)
         val pointerId2 = PointerId(5)
@@ -1332,8 +1340,8 @@
         val log1 = log.getOnCancelLog()
 
         assertThat(log1).hasSize(2)
-        assertThat(log1[0].pointerInputFilter).isEqualTo(leaf1)
-        assertThat(log1[1].pointerInputFilter).isEqualTo(middle1)
+        assertThat(log1[0].pointerInputNode).isEqualTo(leaf1)
+        assertThat(log1[1].pointerInputNode).isEqualTo(middle1)
     }
 
     //  compositionRoot -> root1 -> middle1 -> leaf1
@@ -1343,20 +1351,20 @@
     fun removeDetachedPointerInputFilters_3Roots1LeafDetached_removesAndCancelsCorrect() {
         val log = mutableListOf<LogEntry>()
 
-        val root1 = PointerInputFilterMock(log)
-        val middle1 = PointerInputFilterMock(log)
-        val leaf1 = PointerInputFilterMock(log)
+        val root1 = PointerInputNodeMock(log)
+        val middle1 = PointerInputNodeMock(log)
+        val leaf1 = PointerInputNodeMock(log)
 
-        val root2 = PointerInputFilterMock(log)
-        val middle2 = PointerInputFilterMock(log)
-        val leaf2 = PointerInputFilterMock(
+        val root2 = PointerInputNodeMock(log)
+        val middle2 = PointerInputNodeMock(log)
+        val leaf2 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
-        val root3 = PointerInputFilterMock(log)
-        val middle3 = PointerInputFilterMock(log)
-        val leaf3 = PointerInputFilterMock(log)
+        val root3 = PointerInputNodeMock(log)
+        val middle3 = PointerInputNodeMock(log)
+        val leaf3 = PointerInputNodeMock(log)
 
         val pointerId1 = PointerId(3)
         val pointerId2 = PointerId(5)
@@ -1416,7 +1424,7 @@
         val log1 = log.getOnCancelLog()
 
         assertThat(log1).hasSize(1)
-        assertThat(log1[0].pointerInputFilter).isEqualTo(leaf2)
+        assertThat(log1[0].pointerInputNode).isEqualTo(leaf2)
     }
 
     //  compositionRoot, root1 -> middle1 -> leaf1
@@ -1426,34 +1434,34 @@
     fun removeDetachedPointerInputFilters_3Roots2Detached_removesAndCancelsCorrect() {
         val log = mutableListOf<LogEntry>()
 
-        val root1 = PointerInputFilterMock(
+        val root1 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val middle1 = PointerInputFilterMock(
+        val middle1 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val leaf1 = PointerInputFilterMock(
+        val leaf1 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
-        val root2 = PointerInputFilterMock()
-        val middle2 = PointerInputFilterMock()
-        val leaf2 = PointerInputFilterMock()
+        val root2 = PointerInputNodeMock()
+        val middle2 = PointerInputNodeMock()
+        val leaf2 = PointerInputNodeMock()
 
-        val root3 = PointerInputFilterMock(
+        val root3 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val middle3 = PointerInputFilterMock(
+        val middle3 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val leaf3 = PointerInputFilterMock(
+        val leaf3 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
         val pointerId1 = PointerId(3)
@@ -1489,12 +1497,12 @@
         val log1 = log.getOnCancelLog()
 
         assertThat(log1).hasSize(6)
-        assertThat(log1[0].pointerInputFilter).isEqualTo(leaf1)
-        assertThat(log1[1].pointerInputFilter).isEqualTo(middle1)
-        assertThat(log1[2].pointerInputFilter).isEqualTo(root1)
-        assertThat(log1[3].pointerInputFilter).isEqualTo(leaf3)
-        assertThat(log1[4].pointerInputFilter).isEqualTo(middle3)
-        assertThat(log1[5].pointerInputFilter).isEqualTo(root3)
+        assertThat(log1[0].pointerInputNode).isEqualTo(leaf1)
+        assertThat(log1[1].pointerInputNode).isEqualTo(middle1)
+        assertThat(log1[2].pointerInputNode).isEqualTo(root1)
+        assertThat(log1[3].pointerInputNode).isEqualTo(leaf3)
+        assertThat(log1[4].pointerInputNode).isEqualTo(middle3)
+        assertThat(log1[5].pointerInputNode).isEqualTo(root3)
     }
 
     //  compositionRoot -> root1, middle1 -> leaf1
@@ -1504,29 +1512,29 @@
     fun removeDetachedPointerInputFilters_3Roots2MiddlesDetached_removesAndCancelsCorrect() {
         val log = mutableListOf<LogEntry>()
 
-        val root1 = PointerInputFilterMock(log)
-        val middle1 = PointerInputFilterMock(
+        val root1 = PointerInputNodeMock(log)
+        val middle1 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val leaf1 = PointerInputFilterMock(
+        val leaf1 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
-        val root2 = PointerInputFilterMock()
-        val middle2 = PointerInputFilterMock(
+        val root2 = PointerInputNodeMock()
+        val middle2 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val leaf2 = PointerInputFilterMock(
+        val leaf2 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
-        val root3 = PointerInputFilterMock()
-        val middle3 = PointerInputFilterMock()
-        val leaf3 = PointerInputFilterMock()
+        val root3 = PointerInputNodeMock()
+        val middle3 = PointerInputNodeMock()
+        val leaf3 = PointerInputNodeMock()
 
         val pointerId1 = PointerId(3)
         val pointerId2 = PointerId(5)
@@ -1571,10 +1579,10 @@
         val log1 = log.getOnCancelLog()
 
         assertThat(log1).hasSize(4)
-        assertThat(log1[0].pointerInputFilter).isEqualTo(leaf1)
-        assertThat(log1[1].pointerInputFilter).isEqualTo(middle1)
-        assertThat(log1[2].pointerInputFilter).isEqualTo(leaf2)
-        assertThat(log1[3].pointerInputFilter).isEqualTo(middle2)
+        assertThat(log1[0].pointerInputNode).isEqualTo(leaf1)
+        assertThat(log1[1].pointerInputNode).isEqualTo(middle1)
+        assertThat(log1[2].pointerInputNode).isEqualTo(leaf2)
+        assertThat(log1[3].pointerInputNode).isEqualTo(middle2)
     }
 
     //  compositionRoot -> root1 -> middle1 -> leaf1
@@ -1584,22 +1592,22 @@
     fun removeDetachedPointerInputFilters_3Roots2LeafsDetached_removesAndCancelsCorrect() {
         val log = mutableListOf<LogEntry>()
 
-        val root1 = PointerInputFilterMock(log)
-        val middle1 = PointerInputFilterMock(log)
-        val leaf1 = PointerInputFilterMock(log)
+        val root1 = PointerInputNodeMock(log)
+        val middle1 = PointerInputNodeMock(log)
+        val leaf1 = PointerInputNodeMock(log)
 
-        val root2 = PointerInputFilterMock(log)
-        val middle2 = PointerInputFilterMock(log)
-        val leaf2 = PointerInputFilterMock(
+        val root2 = PointerInputNodeMock(log)
+        val middle2 = PointerInputNodeMock(log)
+        val leaf2 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
-        val root3 = PointerInputFilterMock()
-        val middle3 = PointerInputFilterMock()
-        val leaf3 = PointerInputFilterMock(
+        val root3 = PointerInputNodeMock()
+        val middle3 = PointerInputNodeMock()
+        val leaf3 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
         val pointerId1 = PointerId(3)
@@ -1655,8 +1663,8 @@
         val log1 = log.getOnCancelLog()
 
         assertThat(log1).hasSize(2)
-        assertThat(log1[0].pointerInputFilter).isEqualTo(leaf2)
-        assertThat(log1[1].pointerInputFilter).isEqualTo(leaf3)
+        assertThat(log1[0].pointerInputNode).isEqualTo(leaf2)
+        assertThat(log1[1].pointerInputNode).isEqualTo(leaf3)
     }
 
     //  compositionRoot, root1 -> middle1 -> leaf1
@@ -1666,43 +1674,43 @@
     fun removeDetachedPointerInputFilters_3Roots3Detached_allRemovedAndCancelsCorrect() {
         val log = mutableListOf<LogEntry>()
 
-        val root1 = PointerInputFilterMock(
+        val root1 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val middle1 = PointerInputFilterMock(
+        val middle1 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val leaf1 = PointerInputFilterMock(
+        val leaf1 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
-        val root2 = PointerInputFilterMock(
+        val root2 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val middle2 = PointerInputFilterMock(
+        val middle2 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val leaf2 = PointerInputFilterMock(
+        val leaf2 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
-        val root3 = PointerInputFilterMock(
+        val root3 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val middle3 = PointerInputFilterMock(
+        val middle3 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val leaf3 = PointerInputFilterMock(
+        val leaf3 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
         hitPathTracker.addHitPath(PointerId(3), listOf(root1, middle1, leaf1))
@@ -1718,15 +1726,15 @@
         val log1 = log.getOnCancelLog()
 
         assertThat(log1).hasSize(9)
-        assertThat(log1[0].pointerInputFilter).isEqualTo(leaf1)
-        assertThat(log1[1].pointerInputFilter).isEqualTo(middle1)
-        assertThat(log1[2].pointerInputFilter).isEqualTo(root1)
-        assertThat(log1[3].pointerInputFilter).isEqualTo(leaf2)
-        assertThat(log1[4].pointerInputFilter).isEqualTo(middle2)
-        assertThat(log1[5].pointerInputFilter).isEqualTo(root2)
-        assertThat(log1[6].pointerInputFilter).isEqualTo(leaf3)
-        assertThat(log1[7].pointerInputFilter).isEqualTo(middle3)
-        assertThat(log1[8].pointerInputFilter).isEqualTo(root3)
+        assertThat(log1[0].pointerInputNode).isEqualTo(leaf1)
+        assertThat(log1[1].pointerInputNode).isEqualTo(middle1)
+        assertThat(log1[2].pointerInputNode).isEqualTo(root1)
+        assertThat(log1[3].pointerInputNode).isEqualTo(leaf2)
+        assertThat(log1[4].pointerInputNode).isEqualTo(middle2)
+        assertThat(log1[5].pointerInputNode).isEqualTo(root2)
+        assertThat(log1[6].pointerInputNode).isEqualTo(leaf3)
+        assertThat(log1[7].pointerInputNode).isEqualTo(middle3)
+        assertThat(log1[8].pointerInputNode).isEqualTo(root3)
     }
 
     //  compositionRoot -> root1, middle1 -> leaf1
@@ -1736,34 +1744,34 @@
     fun removeDetachedPointerInputFilters_3Roots3MiddlesDetached_removesAndCancelsCorrect() {
         val log = mutableListOf<LogEntry>()
 
-        val root1 = PointerInputFilterMock(log)
-        val middle1 = PointerInputFilterMock(
+        val root1 = PointerInputNodeMock(log)
+        val middle1 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val leaf1 = PointerInputFilterMock(
+        val leaf1 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
-        val root2 = PointerInputFilterMock(log)
-        val middle2 = PointerInputFilterMock(
+        val root2 = PointerInputNodeMock(log)
+        val middle2 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val leaf2 = PointerInputFilterMock(
+        val leaf2 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
-        val root3 = PointerInputFilterMock(log)
-        val middle3 = PointerInputFilterMock(
+        val root3 = PointerInputNodeMock(log)
+        val middle3 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val leaf3 = PointerInputFilterMock(
+        val leaf3 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
         val pointerId1 = PointerId(3)
@@ -1799,12 +1807,12 @@
         val log1 = log.getOnCancelLog()
 
         assertThat(log1).hasSize(6)
-        assertThat(log1[0].pointerInputFilter).isEqualTo(leaf1)
-        assertThat(log1[1].pointerInputFilter).isEqualTo(middle1)
-        assertThat(log1[2].pointerInputFilter).isEqualTo(leaf2)
-        assertThat(log1[3].pointerInputFilter).isEqualTo(middle2)
-        assertThat(log1[4].pointerInputFilter).isEqualTo(leaf3)
-        assertThat(log1[5].pointerInputFilter).isEqualTo(middle3)
+        assertThat(log1[0].pointerInputNode).isEqualTo(leaf1)
+        assertThat(log1[1].pointerInputNode).isEqualTo(middle1)
+        assertThat(log1[2].pointerInputNode).isEqualTo(leaf2)
+        assertThat(log1[3].pointerInputNode).isEqualTo(middle2)
+        assertThat(log1[4].pointerInputNode).isEqualTo(leaf3)
+        assertThat(log1[5].pointerInputNode).isEqualTo(middle3)
     }
 
     //  compositionRoot -> root1 -> middle1, leaf1
@@ -1814,25 +1822,25 @@
     fun removeDetachedPointerInputFilters_3Roots3LeafsDetached_removesAndCancelsCorrect() {
         val log = mutableListOf<LogEntry>()
 
-        val root1 = PointerInputFilterMock(log)
-        val middle1 = PointerInputFilterMock(log)
-        val leaf1 = PointerInputFilterMock(
+        val root1 = PointerInputNodeMock(log)
+        val middle1 = PointerInputNodeMock(log)
+        val leaf1 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
-        val root2 = PointerInputFilterMock(log)
-        val middle2 = PointerInputFilterMock(log)
-        val leaf2 = PointerInputFilterMock(
+        val root2 = PointerInputNodeMock(log)
+        val middle2 = PointerInputNodeMock(log)
+        val leaf2 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
-        val root3 = PointerInputFilterMock(log)
-        val middle3 = PointerInputFilterMock(log)
-        val leaf3 = PointerInputFilterMock(
+        val root3 = PointerInputNodeMock(log)
+        val middle3 = PointerInputNodeMock(log)
+        val leaf3 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
         val pointerId1 = PointerId(3)
@@ -1883,9 +1891,9 @@
         val log1 = log.getOnCancelLog()
 
         assertThat(log1).hasSize(3)
-        assertThat(log1[0].pointerInputFilter).isEqualTo(leaf1)
-        assertThat(log1[1].pointerInputFilter).isEqualTo(leaf2)
-        assertThat(log1[2].pointerInputFilter).isEqualTo(leaf3)
+        assertThat(log1[0].pointerInputNode).isEqualTo(leaf1)
+        assertThat(log1[1].pointerInputNode).isEqualTo(leaf2)
+        assertThat(log1[2].pointerInputNode).isEqualTo(leaf3)
     }
 
     // compositionRoot, root1 -> middle1 -> leaf1
@@ -1895,34 +1903,34 @@
     fun removeDetachedPointerInputFilters_3RootsStaggeredDetached_removesAndCancelsCorrect() {
         val log = mutableListOf<LogEntry>()
 
-        val root1 = PointerInputFilterMock(
+        val root1 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val middle1 = PointerInputFilterMock(
+        val middle1 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val leaf1 = PointerInputFilterMock(
+        val leaf1 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
-        val root2 = PointerInputFilterMock(log)
-        val middle2 = PointerInputFilterMock(
+        val root2 = PointerInputNodeMock(log)
+        val middle2 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val leaf2 = PointerInputFilterMock(
+        val leaf2 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
-        val root3 = PointerInputFilterMock(log)
-        val middle3 = PointerInputFilterMock(log)
-        val leaf3 = PointerInputFilterMock(
+        val root3 = PointerInputNodeMock(log)
+        val middle3 = PointerInputNodeMock(log)
+        val leaf3 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
         val pointerId1 = PointerId(3)
@@ -1958,12 +1966,12 @@
         val log1 = log.getOnCancelLog()
 
         assertThat(log1).hasSize(6)
-        assertThat(log1[0].pointerInputFilter).isEqualTo(leaf1)
-        assertThat(log1[1].pointerInputFilter).isEqualTo(middle1)
-        assertThat(log1[2].pointerInputFilter).isEqualTo(root1)
-        assertThat(log1[3].pointerInputFilter).isEqualTo(leaf2)
-        assertThat(log1[4].pointerInputFilter).isEqualTo(middle2)
-        assertThat(log1[5].pointerInputFilter).isEqualTo(leaf3)
+        assertThat(log1[0].pointerInputNode).isEqualTo(leaf1)
+        assertThat(log1[1].pointerInputNode).isEqualTo(middle1)
+        assertThat(log1[2].pointerInputNode).isEqualTo(root1)
+        assertThat(log1[3].pointerInputNode).isEqualTo(leaf2)
+        assertThat(log1[4].pointerInputNode).isEqualTo(middle2)
+        assertThat(log1[5].pointerInputNode).isEqualTo(leaf3)
     }
 
     // compositionRoot, root ->
@@ -1974,36 +1982,36 @@
     fun removeDetachedPointerInputFilters_rootWith3MiddlesDetached_allRemovedAndCorrectCancels() {
         val log = mutableListOf<LogEntry>()
 
-        val root = PointerInputFilterMock(
+        val root = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
-        val middle1 = PointerInputFilterMock(
+        val middle1 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val leaf1 = PointerInputFilterMock(
+        val leaf1 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
-        val middle2 = PointerInputFilterMock(
+        val middle2 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val leaf2 = PointerInputFilterMock(
+        val leaf2 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
-        val middle3 = PointerInputFilterMock(
+        val middle3 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val leaf3 = PointerInputFilterMock(
+        val leaf3 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
         hitPathTracker.addHitPath(PointerId(3), listOf(root, middle1, leaf1))
@@ -2017,37 +2025,37 @@
         assertThat(areEqual(hitPathTracker.root, expectedRoot)).isTrue()
 
         val log1 = log.getOnCancelLog().filter {
-            it.pointerInputFilter == leaf1 ||
-                it.pointerInputFilter == middle1 ||
-                it.pointerInputFilter == root
+            it.pointerInputNode == leaf1 ||
+                it.pointerInputNode == middle1 ||
+                it.pointerInputNode == root
         }
 
         val log2 = log.getOnCancelLog().filter {
-            it.pointerInputFilter == leaf2 ||
-                it.pointerInputFilter == middle2 ||
-                it.pointerInputFilter == root
+            it.pointerInputNode == leaf2 ||
+                it.pointerInputNode == middle2 ||
+                it.pointerInputNode == root
         }
 
         val log3 = log.getOnCancelLog().filter {
-            it.pointerInputFilter == leaf3 ||
-                it.pointerInputFilter == middle3 ||
-                it.pointerInputFilter == root
+            it.pointerInputNode == leaf3 ||
+                it.pointerInputNode == middle3 ||
+                it.pointerInputNode == root
         }
 
         assertThat(log1).hasSize(3)
-        assertThat(log1[0].pointerInputFilter).isEqualTo(leaf1)
-        assertThat(log1[1].pointerInputFilter).isEqualTo(middle1)
-        assertThat(log1[2].pointerInputFilter).isEqualTo(root)
+        assertThat(log1[0].pointerInputNode).isEqualTo(leaf1)
+        assertThat(log1[1].pointerInputNode).isEqualTo(middle1)
+        assertThat(log1[2].pointerInputNode).isEqualTo(root)
 
         assertThat(log2).hasSize(3)
-        assertThat(log2[0].pointerInputFilter).isEqualTo(leaf2)
-        assertThat(log2[1].pointerInputFilter).isEqualTo(middle2)
-        assertThat(log2[2].pointerInputFilter).isEqualTo(root)
+        assertThat(log2[0].pointerInputNode).isEqualTo(leaf2)
+        assertThat(log2[1].pointerInputNode).isEqualTo(middle2)
+        assertThat(log2[2].pointerInputNode).isEqualTo(root)
 
         assertThat(log3).hasSize(3)
-        assertThat(log3[0].pointerInputFilter).isEqualTo(leaf3)
-        assertThat(log3[1].pointerInputFilter).isEqualTo(middle3)
-        assertThat(log3[2].pointerInputFilter).isEqualTo(root)
+        assertThat(log3[0].pointerInputNode).isEqualTo(leaf3)
+        assertThat(log3[1].pointerInputNode).isEqualTo(middle3)
+        assertThat(log3[2].pointerInputNode).isEqualTo(root)
     }
 
     // compositionRoot -> root
@@ -2058,21 +2066,21 @@
     fun removeDetachedPointerInputFilters_rootWith3Middles1Detached_removesAndCancelsCorrect() {
         val log = mutableListOf<LogEntry>()
 
-        val root = PointerInputFilterMock(log)
+        val root = PointerInputNodeMock(log)
 
-        val middle1 = PointerInputFilterMock(log)
-        val leaf1 = PointerInputFilterMock(log)
+        val middle1 = PointerInputNodeMock(log)
+        val leaf1 = PointerInputNodeMock(log)
 
-        val middle2 = PointerInputFilterMock(log)
-        val leaf2 = PointerInputFilterMock(log)
+        val middle2 = PointerInputNodeMock(log)
+        val leaf2 = PointerInputNodeMock(log)
 
-        val middle3 = PointerInputFilterMock(
+        val middle3 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val leaf3 = PointerInputFilterMock(
+        val leaf3 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
         val pointerId1 = PointerId(3)
@@ -2120,8 +2128,8 @@
         val log1 = log.getOnCancelLog()
 
         assertThat(log1).hasSize(2)
-        assertThat(log1[0].pointerInputFilter).isEqualTo(leaf3)
-        assertThat(log1[1].pointerInputFilter).isEqualTo(middle3)
+        assertThat(log1[0].pointerInputNode).isEqualTo(leaf3)
+        assertThat(log1[1].pointerInputNode).isEqualTo(middle3)
     }
 
     // compositionRoot -> root
@@ -2132,28 +2140,28 @@
     fun removeDetachedPointerInputFilters_rootWith3Middles2Detached_removesAndCancelsCorrect() {
         val log = mutableListOf<LogEntry>()
 
-        val root = PointerInputFilterMock(log)
+        val root = PointerInputNodeMock(log)
 
-        val middle1 = PointerInputFilterMock(
+        val middle1 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val leaf1 = PointerInputFilterMock(
+        val leaf1 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
-        val middle2 = PointerInputFilterMock(
+        val middle2 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val leaf2 = PointerInputFilterMock(
+        val leaf2 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
-        val middle3 = PointerInputFilterMock(log)
-        val leaf3 = PointerInputFilterMock(log)
+        val middle3 = PointerInputNodeMock(log)
+        val leaf3 = PointerInputNodeMock(log)
 
         val pointerId1 = PointerId(3)
         val pointerId2 = PointerId(5)
@@ -2190,10 +2198,10 @@
         val log1 = log.getOnCancelLog()
 
         assertThat(log1).hasSize(4)
-        assertThat(log1[0].pointerInputFilter).isEqualTo(leaf1)
-        assertThat(log1[1].pointerInputFilter).isEqualTo(middle1)
-        assertThat(log1[2].pointerInputFilter).isEqualTo(leaf2)
-        assertThat(log1[3].pointerInputFilter).isEqualTo(middle2)
+        assertThat(log1[0].pointerInputNode).isEqualTo(leaf1)
+        assertThat(log1[1].pointerInputNode).isEqualTo(middle1)
+        assertThat(log1[2].pointerInputNode).isEqualTo(leaf2)
+        assertThat(log1[3].pointerInputNode).isEqualTo(middle2)
     }
 
     // compositionRoot -> root
@@ -2204,33 +2212,33 @@
     fun removeDetachedPointerInputFilters_rootWith3MiddlesAllDetached_allMiddlesRemoved() {
         val log = mutableListOf<LogEntry>()
 
-        val root = PointerInputFilterMock(log)
+        val root = PointerInputNodeMock(log)
 
-        val middle1 = PointerInputFilterMock(
+        val middle1 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val leaf1 = PointerInputFilterMock(
+        val leaf1 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
-        val middle2 = PointerInputFilterMock(
+        val middle2 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val leaf2 = PointerInputFilterMock(
+        val leaf2 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
-        val middle3 = PointerInputFilterMock(
+        val middle3 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val leaf3 = PointerInputFilterMock(
+        val leaf3 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
         val pointerId1 = PointerId(3)
@@ -2258,12 +2266,12 @@
         val log1 = log.getOnCancelLog()
 
         assertThat(log1).hasSize(6)
-        assertThat(log1[0].pointerInputFilter).isEqualTo(leaf1)
-        assertThat(log1[1].pointerInputFilter).isEqualTo(middle1)
-        assertThat(log1[2].pointerInputFilter).isEqualTo(leaf2)
-        assertThat(log1[3].pointerInputFilter).isEqualTo(middle2)
-        assertThat(log1[4].pointerInputFilter).isEqualTo(leaf3)
-        assertThat(log1[5].pointerInputFilter).isEqualTo(middle3)
+        assertThat(log1[0].pointerInputNode).isEqualTo(leaf1)
+        assertThat(log1[1].pointerInputNode).isEqualTo(middle1)
+        assertThat(log1[2].pointerInputNode).isEqualTo(leaf2)
+        assertThat(log1[3].pointerInputNode).isEqualTo(middle2)
+        assertThat(log1[4].pointerInputNode).isEqualTo(leaf3)
+        assertThat(log1[5].pointerInputNode).isEqualTo(middle3)
     }
 
     // compositionRoot -> root -> middle
@@ -2274,16 +2282,16 @@
     fun removeDetachedPointerInputFilters_middleWith3Leafs1Detached_correctLeafRemoved() {
         val log = mutableListOf<LogEntry>()
 
-        val root = PointerInputFilterMock(log)
+        val root = PointerInputNodeMock(log)
 
-        val middle = PointerInputFilterMock(log)
+        val middle = PointerInputNodeMock(log)
 
-        val leaf1 = PointerInputFilterMock(log)
-        val leaf2 = PointerInputFilterMock(
+        val leaf1 = PointerInputNodeMock(log)
+        val leaf2 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val leaf3 = PointerInputFilterMock(log)
+        val leaf3 = PointerInputNodeMock(log)
 
         val pointerId1 = PointerId(3)
         val pointerId2 = PointerId(5)
@@ -2327,7 +2335,7 @@
         val log1 = log.getOnCancelLog()
 
         assertThat(log1).hasSize(1)
-        assertThat(log1[0].pointerInputFilter).isEqualTo(leaf2)
+        assertThat(log1[0].pointerInputNode).isEqualTo(leaf2)
     }
 
     // compositionRoot -> root -> middle
@@ -2338,18 +2346,18 @@
     fun removeDetachedPointerInputFilters_middleWith3Leafs2Detached_correctLeafsRemoved() {
         val log = mutableListOf<LogEntry>()
 
-        val root = PointerInputFilterMock(log)
+        val root = PointerInputNodeMock(log)
 
-        val middle = PointerInputFilterMock(log)
+        val middle = PointerInputNodeMock(log)
 
-        val leaf1 = PointerInputFilterMock(
+        val leaf1 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val leaf2 = PointerInputFilterMock(log)
-        val leaf3 = PointerInputFilterMock(
+        val leaf2 = PointerInputNodeMock(log)
+        val leaf3 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
         val pointerId1 = PointerId(3)
@@ -2389,8 +2397,8 @@
         val log1 = log.getOnCancelLog()
 
         assertThat(log1).hasSize(2)
-        assertThat(log1[0].pointerInputFilter).isEqualTo(leaf1)
-        assertThat(log1[1].pointerInputFilter).isEqualTo(leaf3)
+        assertThat(log1[0].pointerInputNode).isEqualTo(leaf1)
+        assertThat(log1[1].pointerInputNode).isEqualTo(leaf3)
     }
 
     // compositionRoot -> root -> middle
@@ -2401,21 +2409,21 @@
     fun removeDetachedPointerInputFilters_middleWith3LeafsAllDetached_allLeafsRemoved() {
         val log = mutableListOf<LogEntry>()
 
-        val root = PointerInputFilterMock(log)
+        val root = PointerInputNodeMock(log)
 
-        val middle = PointerInputFilterMock(log)
+        val middle = PointerInputNodeMock(log)
 
-        val leaf1 = PointerInputFilterMock(
+        val leaf1 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val leaf2 = PointerInputFilterMock(
+        val leaf2 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
-        val leaf3 = PointerInputFilterMock(
+        val leaf3 = PointerInputNodeMock(
             log,
-            layoutCoordinates = LayoutCoordinatesStub(false)
+            coordinator = LayoutCoordinatesStub(false)
         )
 
         val pointerId1 = PointerId(3)
@@ -2450,9 +2458,9 @@
         val log1 = log.getOnCancelLog()
 
         assertThat(log1).hasSize(3)
-        assertThat(log1[0].pointerInputFilter).isEqualTo(leaf1)
-        assertThat(log1[1].pointerInputFilter).isEqualTo(leaf2)
-        assertThat(log1[2].pointerInputFilter).isEqualTo(leaf3)
+        assertThat(log1[0].pointerInputNode).isEqualTo(leaf1)
+        assertThat(log1[1].pointerInputNode).isEqualTo(leaf2)
+        assertThat(log1[2].pointerInputNode).isEqualTo(leaf3)
     }
 
     // arrange: root(3) -> middle(3) -> leaf(3)
@@ -2460,9 +2468,9 @@
     // assert: no path
     @Test
     fun removeHitPath_onePathPointerIdRemoved_hitTestResultIsEmpty() {
-        val root: PointerInputFilter = PointerInputFilterMock()
-        val middle: PointerInputFilter = PointerInputFilterMock()
-        val leaf: PointerInputFilter = PointerInputFilterMock()
+        val root = PointerInputNodeMock()
+        val middle = PointerInputNodeMock()
+        val leaf = PointerInputNodeMock()
 
         hitPathTracker.addHitPath(PointerId(3), listOf(root, middle, leaf))
 
@@ -2478,9 +2486,9 @@
     // assert: root(3) -> middle(3) -> leaf(3)
     @Test
     fun removeHitPath_onePathOtherPointerIdRemoved_hitTestResultIsNotChanged() {
-        val root: PointerInputFilter = PointerInputFilterMock()
-        val middle: PointerInputFilter = PointerInputFilterMock()
-        val leaf: PointerInputFilter = PointerInputFilterMock()
+        val root = PointerInputNodeMock()
+        val middle = PointerInputNodeMock()
+        val leaf = PointerInputNodeMock()
 
         val pointerId1 = PointerId(3)
 
@@ -2522,13 +2530,13 @@
     // root(3) -> middle(3) -> leaf(3)
     @Test
     fun removeHitPath_2IndependentPaths1PointerIdRemoved_resultContainsRemainingPath() {
-        val root1: PointerInputFilter = PointerInputFilterMock()
-        val middle1: PointerInputFilter = PointerInputFilterMock()
-        val leaf1: PointerInputFilter = PointerInputFilterMock()
+        val root1 = PointerInputNodeMock()
+        val middle1 = PointerInputNodeMock()
+        val leaf1 = PointerInputNodeMock()
 
-        val root2: PointerInputFilter = PointerInputFilterMock()
-        val middle2: PointerInputFilter = PointerInputFilterMock()
-        val leaf2: PointerInputFilter = PointerInputFilterMock()
+        val root2 = PointerInputNodeMock()
+        val middle2 = PointerInputNodeMock()
+        val leaf2 = PointerInputNodeMock()
 
         val pointerId1 = PointerId(3)
         val pointerId2 = PointerId(5)
@@ -2566,9 +2574,9 @@
     // root(5) -> middle(5) -> leaf(5)
     @Test
     fun removeHitPath_2PathsShareNodes1PointerIdRemoved_resultContainsRemainingPath() {
-        val root: PointerInputFilter = PointerInputFilterMock()
-        val middle: PointerInputFilter = PointerInputFilterMock()
-        val leaf: PointerInputFilter = PointerInputFilterMock()
+        val root = PointerInputNodeMock()
+        val middle = PointerInputNodeMock()
+        val leaf = PointerInputNodeMock()
 
         val pointerId1 = PointerId(3)
         val pointerId2 = PointerId(5)
@@ -2606,9 +2614,9 @@
     // Assert: root(5) -> middle(5)
     @Test
     fun removeHitPath_2PathsShare2NodesLongPathPointerIdRemoved_resultJustHasShortPath() {
-        val root: PointerInputFilter = PointerInputFilterMock()
-        val middle: PointerInputFilter = PointerInputFilterMock()
-        val leaf: PointerInputFilter = PointerInputFilterMock()
+        val root = PointerInputNodeMock()
+        val middle = PointerInputNodeMock()
+        val leaf = PointerInputNodeMock()
 
         val pointerId1 = PointerId(3)
         val pointerId2 = PointerId(5)
@@ -2641,9 +2649,9 @@
     // Assert: root(3) -> middle(3) -> leaf(3)
     @Test
     fun removeHitPath_2PathsShare2NodesShortPathPointerIdRemoved_resultJustHasLongPath() {
-        val root: PointerInputFilter = PointerInputFilterMock()
-        val middle: PointerInputFilter = PointerInputFilterMock()
-        val leaf: PointerInputFilter = PointerInputFilterMock()
+        val root = PointerInputNodeMock()
+        val middle = PointerInputNodeMock()
+        val leaf = PointerInputNodeMock()
 
         val pointerId1 = PointerId(3)
         val pointerId2 = PointerId(5)
@@ -2681,9 +2689,9 @@
     // Assert: root(5)
     @Test
     fun removeHitPath_2PathsShare1NodeLongPathPointerIdRemoved_resultJustHasShortPath() {
-        val root: PointerInputFilter = PointerInputFilterMock()
-        val middle: PointerInputFilter = PointerInputFilterMock()
-        val leaf: PointerInputFilter = PointerInputFilterMock()
+        val root = PointerInputNodeMock()
+        val middle = PointerInputNodeMock()
+        val leaf = PointerInputNodeMock()
 
         val pointerId1 = PointerId(3)
         val pointerId2 = PointerId(5)
@@ -2711,9 +2719,9 @@
     // Assert: root(3) -> middle(3) -> leaf(3)
     @Test
     fun removeHitPath_2PathsShare1NodeShortPathPointerIdRemoved_resultJustHasLongPath() {
-        val root: PointerInputFilter = PointerInputFilterMock()
-        val middle: PointerInputFilter = PointerInputFilterMock()
-        val leaf: PointerInputFilter = PointerInputFilterMock()
+        val root = PointerInputNodeMock()
+        val middle = PointerInputNodeMock()
+        val leaf = PointerInputNodeMock()
 
         val pointerId1 = PointerId(3)
         val pointerId2 = PointerId(5)
@@ -2754,7 +2762,7 @@
     // Pin -> Ln
     @Test
     fun processCancel_singlePin_cancelHandlerIsCalled() {
-        val pif = PointerInputFilterMock()
+        val pif = PointerInputNodeMock()
         hitPathTracker.addHitPath(PointerId(3), listOf(pif))
 
         hitPathTracker.processCancel()
@@ -2766,9 +2774,9 @@
     @Test
     fun processCancel_3Pins_cancelHandlersCalledOnceInOrder() {
         val log = mutableListOf<LogEntry>()
-        val childPif = PointerInputFilterMock(log)
-        val middlePif = PointerInputFilterMock(log)
-        val parentPif = PointerInputFilterMock(log)
+        val childPif = PointerInputNodeMock(log)
+        val middlePif = PointerInputNodeMock(log)
+        val parentPif = PointerInputNodeMock(log)
         hitPathTracker.addHitPath(
             PointerId(3),
             listOf(parentPif, middlePif, childPif)
@@ -2779,9 +2787,9 @@
         val log1 = log.getOnCancelLog()
 
         assertThat(log1).hasSize(3)
-        assertThat(log1[0].pointerInputFilter).isEqualTo(childPif)
-        assertThat(log1[1].pointerInputFilter).isEqualTo(middlePif)
-        assertThat(log1[2].pointerInputFilter).isEqualTo(parentPif)
+        assertThat(log1[0].pointerInputNode).isEqualTo(childPif)
+        assertThat(log1[1].pointerInputNode).isEqualTo(middlePif)
+        assertThat(log1[2].pointerInputNode).isEqualTo(parentPif)
     }
 
     // PIN -> PIN
@@ -2789,10 +2797,10 @@
     @Test
     fun processCancel_2IndependentPathsFromRoot_cancelHandlersCalledOnceInOrder() {
         val log = mutableListOf<LogEntry>()
-        val pifParent1 = PointerInputFilterMock(log)
-        val pifChild1 = PointerInputFilterMock(log)
-        val pifParent2 = PointerInputFilterMock(log)
-        val pifChild2 = PointerInputFilterMock(log)
+        val pifParent1 = PointerInputNodeMock(log)
+        val pifChild1 = PointerInputNodeMock(log)
+        val pifParent2 = PointerInputNodeMock(log)
+        val pifChild2 = PointerInputNodeMock(log)
 
         hitPathTracker.addHitPath(PointerId(3), listOf(pifParent1, pifChild1))
         hitPathTracker.addHitPath(PointerId(5), listOf(pifParent2, pifChild2))
@@ -2802,10 +2810,10 @@
         val log1 = log.getOnCancelLog()
 
         assertThat(log1).hasSize(4)
-        assertThat(log1[0].pointerInputFilter).isEqualTo(pifChild1)
-        assertThat(log1[1].pointerInputFilter).isEqualTo(pifParent1)
-        assertThat(log1[2].pointerInputFilter).isEqualTo(pifChild2)
-        assertThat(log1[3].pointerInputFilter).isEqualTo(pifParent2)
+        assertThat(log1[0].pointerInputNode).isEqualTo(pifChild1)
+        assertThat(log1[1].pointerInputNode).isEqualTo(pifParent1)
+        assertThat(log1[2].pointerInputNode).isEqualTo(pifChild2)
+        assertThat(log1[3].pointerInputNode).isEqualTo(pifParent2)
     }
 
     // PIN -> PIN
@@ -2813,30 +2821,30 @@
     @Test
     fun processCancel_2BranchingPaths_cancelHandlersCalledOnceInOrder() {
         val log = mutableListOf<LogEntry>()
-        val pifParent = PointerInputFilterMock(log)
-        val pifChild1 = PointerInputFilterMock(log)
-        val pifChild2 = PointerInputFilterMock(log)
+        val pifParent = PointerInputNodeMock(log)
+        val pifChild1 = PointerInputNodeMock(log)
+        val pifChild2 = PointerInputNodeMock(log)
         hitPathTracker.addHitPath(PointerId(3), listOf(pifParent, pifChild1))
         hitPathTracker.addHitPath(PointerId(5), listOf(pifParent, pifChild2))
 
         hitPathTracker.processCancel()
 
         val log1 = log.getOnCancelLog()
-            .filter { it.pointerInputFilter == pifChild1 || it.pointerInputFilter == pifParent }
+            .filter { it.pointerInputNode == pifChild1 || it.pointerInputNode == pifParent }
         val log2 = log.getOnCancelLog()
-            .filter { it.pointerInputFilter == pifChild2 || it.pointerInputFilter == pifParent }
+            .filter { it.pointerInputNode == pifChild2 || it.pointerInputNode == pifParent }
         assertThat(log1).hasSize(2)
-        assertThat(log1[0].pointerInputFilter).isEqualTo(pifChild1)
-        assertThat(log1[1].pointerInputFilter).isEqualTo(pifParent)
+        assertThat(log1[0].pointerInputNode).isEqualTo(pifChild1)
+        assertThat(log1[1].pointerInputNode).isEqualTo(pifParent)
         assertThat(log2).hasSize(2)
-        assertThat(log2[0].pointerInputFilter).isEqualTo(pifChild2)
-        assertThat(log2[1].pointerInputFilter).isEqualTo(pifParent)
+        assertThat(log2[0].pointerInputNode).isEqualTo(pifChild2)
+        assertThat(log2[1].pointerInputNode).isEqualTo(pifParent)
     }
 
     // Pin -> Ln
     @Test
     fun processCancel_singlePin_cleared() {
-        val pif = PointerInputFilterMock()
+        val pif = PointerInputNodeMock()
         hitPathTracker.addHitPath(PointerId(3), listOf(pif))
 
         hitPathTracker.processCancel()
@@ -2847,9 +2855,9 @@
     // Pin -> Pin -> Pin
     @Test
     fun processCancel_3Pins_cleared() {
-        val childPif = PointerInputFilterMock()
-        val middlePif = PointerInputFilterMock()
-        val parentPif = PointerInputFilterMock()
+        val childPif = PointerInputNodeMock()
+        val middlePif = PointerInputNodeMock()
+        val parentPif = PointerInputNodeMock()
         hitPathTracker.addHitPath(
             PointerId(3),
             listOf(parentPif, middlePif, childPif)
@@ -2864,10 +2872,10 @@
     // PIN -> PIN
     @Test
     fun processCancel_2IndependentPathsFromRoot_cleared() {
-        val pifParent1 = PointerInputFilterMock()
-        val pifChild1 = PointerInputFilterMock()
-        val pifParent2 = PointerInputFilterMock()
-        val pifChild2 = PointerInputFilterMock()
+        val pifParent1 = PointerInputNodeMock()
+        val pifChild1 = PointerInputNodeMock()
+        val pifParent2 = PointerInputNodeMock()
+        val pifChild2 = PointerInputNodeMock()
         hitPathTracker.addHitPath(PointerId(3), listOf(pifParent1, pifChild1))
         hitPathTracker.addHitPath(PointerId(5), listOf(pifParent2, pifChild2))
 
@@ -2880,9 +2888,9 @@
     //     -> PIN
     @Test
     fun processCancel_2BranchingPaths_cleared() {
-        val pifParent = PointerInputFilterMock()
-        val pifChild1 = PointerInputFilterMock()
-        val pifChild2 = PointerInputFilterMock()
+        val pifParent = PointerInputNodeMock()
+        val pifChild1 = PointerInputNodeMock()
+        val pifChild2 = PointerInputNodeMock()
         hitPathTracker.addHitPath(PointerId(3), listOf(pifParent, pifChild1))
         hitPathTracker.addHitPath(PointerId(5), listOf(pifParent, pifChild2))
 
@@ -2905,7 +2913,7 @@
 
     @Test
     fun dispatchChanges_1NodeDispatchToNode_reportsWasDispatchedToSomething() {
-        val pif = PointerInputFilterMock()
+        val pif = PointerInputNodeMock()
         hitPathTracker.addHitPath(PointerId(13), listOf(pif))
 
         val hitSomething = hitPathTracker.dispatchChanges(internalPointerEventOf(down(13)))
@@ -2915,7 +2923,7 @@
 
     @Test
     fun dispatchChanges_1NodeDispatchToDifferentNode_reportsWasDispatchedToNothing() {
-        val pif = PointerInputFilterMock()
+        val pif = PointerInputNodeMock()
         hitPathTracker.addHitPath(PointerId(13), listOf(pif))
 
         val hitSomething = hitPathTracker.dispatchChanges(internalPointerEventOf(down(69)))
@@ -2950,17 +2958,17 @@
         removalPass: PointerEventPass
     ) {
         val layoutCoordinates = LayoutCoordinatesStub(true)
-        lateinit var pifRef: PointerInputFilter
-        val pif = PointerInputFilterMock(
+        lateinit var pifRef: PointerInputNodeMock
+        val pif = PointerInputNodeMock(
             pointerEventHandler =
                 { pointerEvent, pass, _ ->
                     if (pass == removalPass) {
                         layoutCoordinates.isAttached = false
-                        pifRef.isAttached = false
+                        pifRef.remove()
                     }
                     pointerEvent.changes
                 },
-            layoutCoordinates = layoutCoordinates
+            coordinator = layoutCoordinates
         )
         pifRef = pif
         hitPathTracker.addHitPath(PointerId(13), listOf(pif))
@@ -3004,17 +3012,17 @@
     ) {
         val log = mutableListOf<LogEntry>()
         val childLayoutCoordinates = LayoutCoordinatesStub(true)
-        val childPif = PointerInputFilterMock(
+        val childPif = PointerInputNodeMock(
             log,
-            layoutCoordinates = childLayoutCoordinates
+            coordinator = childLayoutCoordinates
         )
-        val parentPif = PointerInputFilterMock(
+        val parentPif = PointerInputNodeMock(
             log,
             pointerEventHandler =
                 { pointerEvent, pass, _ ->
                     if (pass == removalPass) {
                         childLayoutCoordinates.isAttached = false
-                        childPif.isAttached = false
+                        childPif.remove()
                     }
                     pointerEvent.changes
                 }
@@ -3023,7 +3031,7 @@
 
         hitPathTracker.dispatchChanges(internalPointerEventOf(down(13)))
 
-        val log1 = log.getOnPointerEventLog().filter { it.pointerInputFilter == childPif }
+        val log1 = log.getOnPointerEventLog().filter { it.pointerInputNode == childPif }
         val count =
             when (removalPass) {
                 PointerEventPass.Initial -> 0
@@ -3064,17 +3072,17 @@
     ) {
         val log = mutableListOf<LogEntry>()
         val parentLayoutCoordinates = LayoutCoordinatesStub(true)
-        val parentPif = PointerInputFilterMock(
+        val parentPif = PointerInputNodeMock(
             log,
-            layoutCoordinates = parentLayoutCoordinates
+            coordinator = parentLayoutCoordinates
         )
-        val childPif = PointerInputFilterMock(
+        val childPif = PointerInputNodeMock(
             log,
             pointerEventHandler =
                 { pointerEvent, pass, _ ->
                     if (pass == removalPass) {
                         parentLayoutCoordinates.isAttached = false
-                        parentPif.isAttached = false
+                        parentPif.remove()
                     }
                     pointerEvent.changes
                 }
@@ -3083,7 +3091,7 @@
 
         hitPathTracker.dispatchChanges(internalPointerEventOf(down(13)))
 
-        val log1 = log.getOnPointerEventLog().filter { it.pointerInputFilter == parentPif }
+        val log1 = log.getOnPointerEventLog().filter { it.pointerInputNode == parentPif }
         val count =
             when (removalPass) {
                 PointerEventPass.Initial -> 1
@@ -3127,7 +3135,7 @@
     ) {
         val log = mutableListOf<LogEntry>()
         val layoutCoordinates = LayoutCoordinatesStub(true)
-        val pif = PointerInputFilterMock(
+        val pif = PointerInputNodeMock(
             log = log,
             pointerEventHandler =
                 { pointerEvent, pass, _ ->
@@ -3136,10 +3144,10 @@
                     }
                     pointerEvent.changes
                 },
-            layoutCoordinates = layoutCoordinates
+            coordinator = layoutCoordinates
         )
-        val parent = PointerInputFilterMock(log)
-        val child = PointerInputFilterMock(log)
+        val parent = PointerInputNodeMock(log)
+        val child = PointerInputNodeMock(log)
         hitPathTracker.addHitPath(PointerId(13), listOf(parent, pif, child))
 
         val actual = internalPointerEventOf(down(13, 120, 1.0f, 1.0f))
@@ -3148,7 +3156,7 @@
         hitPathTracker.dispatchChanges(actual)
 
         val log1 = log.getOnPointerEventLog()
-            .filter { it.pointerInputFilter == parent || it.pointerInputFilter == child }
+            .filter { it.pointerInputNode == parent || it.pointerInputNode == child }
 
         assertThat(log1).hasSize(6)
         log1.forEach {
@@ -3169,17 +3177,17 @@
     fun addHitPath_hoverMove_noChange() {
         val log = mutableListOf<LogEntry>()
         val parentLayoutCoordinates = LayoutCoordinatesStub(true)
-        val pif1: PointerInputFilter = PointerInputFilterMock(
+        val pif1 = PointerInputNodeMock(
             log = log,
-            layoutCoordinates = parentLayoutCoordinates
+            coordinator = parentLayoutCoordinates
         )
-        val pif2: PointerInputFilter = PointerInputFilterMock(
+        val pif2 = PointerInputNodeMock(
             log = log,
-            layoutCoordinates = parentLayoutCoordinates
+            coordinator = parentLayoutCoordinates
         )
-        val pif3: PointerInputFilter = PointerInputFilterMock(
+        val pif3 = PointerInputNodeMock(
             log = log,
-            layoutCoordinates = parentLayoutCoordinates
+            coordinator = parentLayoutCoordinates
         )
         val pointerId = PointerId(0)
 
@@ -3228,7 +3236,7 @@
 
     private fun assertHoverEvent(
         log: List<LogEntry>,
-        vararg filterAndTypes: Pair<PointerInputFilter, PointerEventType>
+        vararg filterAndTypes: Pair<PointerInputModifierNode, PointerEventType>
     ) {
         assertThat(log).hasSize(filterAndTypes.size * 3)
         log.forEachIndexed { index, logEntry ->
@@ -3254,30 +3262,30 @@
         message: String,
         pass: PointerEventPass,
         pointerEventType: PointerEventType,
-        pointerInputFilter: PointerInputFilter
+        pointerInputFilter: PointerInputModifierNode
     ) {
         assertThat(logEntry).isInstanceOf(OnPointerEventEntry::class.java)
         logEntry as OnPointerEventEntry
         assertWithMessage(message).that(logEntry.pass).isEqualTo(pass)
         assertWithMessage(message).that(logEntry.pointerEvent.type).isEqualTo(pointerEventType)
-        assertWithMessage(message).that(logEntry.pointerInputFilter).isEqualTo(pointerInputFilter)
+        assertWithMessage(message).that(logEntry.pointerInputNode).isEqualTo(pointerInputFilter)
     }
 
     @Test
     fun addHitPath_hoverMove_enterExit() {
         val log = mutableListOf<LogEntry>()
-        val layoutCoordinates = layoutNode.outerLayoutNodeWrapper
-        val pif1: PointerInputFilter = PointerInputFilterMock(
+        val layoutCoordinates = layoutNode.outerCoordinator
+        val pif1 = PointerInputNodeMock(
             log = log,
-            layoutCoordinates = layoutCoordinates
+            coordinator = layoutCoordinates
         )
-        val pif2: PointerInputFilter = PointerInputFilterMock(
+        val pif2 = PointerInputNodeMock(
             log = log,
-            layoutCoordinates = layoutCoordinates
+            coordinator = layoutCoordinates
         )
-        val pif3: PointerInputFilter = PointerInputFilterMock(
+        val pif3 = PointerInputNodeMock(
             log = log,
-            layoutCoordinates = layoutCoordinates
+            coordinator = layoutCoordinates
         )
         val pointerId = PointerId(0)
 
@@ -3364,18 +3372,18 @@
     @Test
     fun addHitPath_hoverExit() {
         val log = mutableListOf<LogEntry>()
-        val layoutCoordinates = layoutNode.outerLayoutNodeWrapper
-        val pif1: PointerInputFilter = PointerInputFilterMock(
+        val layoutCoordinates = layoutNode.outerCoordinator
+        val pif1 = PointerInputNodeMock(
             log = log,
-            layoutCoordinates = layoutCoordinates
+            coordinator = layoutCoordinates
         )
-        val pif2: PointerInputFilter = PointerInputFilterMock(
+        val pif2 = PointerInputNodeMock(
             log = log,
-            layoutCoordinates = layoutCoordinates
+            coordinator = layoutCoordinates
         )
-        val pif3: PointerInputFilter = PointerInputFilterMock(
+        val pif3 = PointerInputNodeMock(
             log = log,
-            layoutCoordinates = layoutCoordinates
+            coordinator = layoutCoordinates
         )
         val pointerId = PointerId(0)
 
@@ -3422,14 +3430,14 @@
     @Test
     fun dispatchChangesClearsStaleIds() {
         val layoutCoordinates = LayoutCoordinatesStub(isAttached = true)
-        val pif1: PointerInputFilter = PointerInputFilterMock(
-            layoutCoordinates = layoutCoordinates
+        val pif1 = PointerInputNodeMock(
+            coordinator = layoutCoordinates
         )
-        val pif2: PointerInputFilter = PointerInputFilterMock(
-            layoutCoordinates = layoutCoordinates
+        val pif2 = PointerInputNodeMock(
+            coordinator = layoutCoordinates
         )
-        val pif3: PointerInputFilter = PointerInputFilterMock(
-            layoutCoordinates = layoutCoordinates
+        val pif3 = PointerInputNodeMock(
+            coordinator = layoutCoordinates
         )
         val pointerId = PointerId(0)
 
@@ -3468,14 +3476,14 @@
     @Test
     fun dispatchChangesClearsStaleIdsPartialHit() {
         val parentLayoutCoordinates = LayoutCoordinatesStub(true)
-        val pif1: PointerInputFilter = PointerInputFilterMock(
-            layoutCoordinates = parentLayoutCoordinates
+        val pif1 = PointerInputNodeMock(
+            coordinator = parentLayoutCoordinates
         )
-        val pif2: PointerInputFilter = PointerInputFilterMock(
-            layoutCoordinates = parentLayoutCoordinates
+        val pif2 = PointerInputNodeMock(
+            coordinator = parentLayoutCoordinates
         )
-        val pif3: PointerInputFilter = PointerInputFilterMock(
-            layoutCoordinates = parentLayoutCoordinates
+        val pif3 = PointerInputNodeMock(
+            coordinator = parentLayoutCoordinates
         )
         val pointerId1 = PointerId(0)
         val pointerId2 = PointerId(5)
@@ -3516,7 +3524,7 @@
     }
 
     private fun areEqual(actualNode: Node, expectedNode: Node): Boolean {
-        if (actualNode.pointerInputFilter !== expectedNode.pointerInputFilter) {
+        if (actualNode.pointerInputNode !== expectedNode.pointerInputNode) {
             return false
         }
 
@@ -3544,28 +3552,49 @@
     }
 }
 
-class LayoutCoordinatesStub(
+internal class LayoutCoordinatesStub(
     override var isAttached: Boolean = true
-) : LayoutCoordinates {
+) : NodeCoordinator(LayoutNode()) {
 
     var additionalOffset = Offset.Zero
-
-    override val size: IntSize
-        get() = IntSize(Constraints.Infinity, Constraints.Infinity)
+    override fun createLookaheadDelegate(scope: LookaheadScope): LookaheadDelegate {
+        TODO("Not yet implemented")
+    }
 
     override val providedAlignmentLines: Set<AlignmentLine>
         get() = TODO("not implemented")
 
-    override val parentLayoutCoordinates: LayoutCoordinates?
-        get() = null
-    override val parentCoordinates: LayoutCoordinates?
-        get() = null
-
     override fun windowToLocal(relativeToWindow: Offset): Offset = relativeToWindow
 
     override fun localToWindow(relativeToLocal: Offset): Offset = relativeToLocal
 
     override fun localToRoot(relativeToLocal: Offset): Offset = relativeToLocal
+    override fun calculateAlignmentLine(alignmentLine: AlignmentLine): Int {
+        TODO("Not yet implemented")
+    }
+
+    @OptIn(ExperimentalComposeUiApi::class)
+    override val tail: androidx.compose.ui.Modifier.Node = object : Modifier.Node() {}
+
+    override fun measure(constraints: Constraints): Placeable {
+        TODO("Not yet implemented")
+    }
+
+    override fun minIntrinsicWidth(height: Int): Int {
+        TODO("Not yet implemented")
+    }
+
+    override fun maxIntrinsicWidth(height: Int): Int {
+        TODO("Not yet implemented")
+    }
+
+    override fun minIntrinsicHeight(width: Int): Int {
+        TODO("Not yet implemented")
+    }
+
+    override fun maxIntrinsicHeight(width: Int): Int {
+        TODO("Not yet implemented")
+    }
 
     override fun localPositionOf(
         sourceCoordinates: LayoutCoordinates,
@@ -3578,10 +3607,6 @@
     ): Rect {
         TODO("Not yet implemented")
     }
-
-    override fun get(alignmentLine: AlignmentLine): Int {
-        TODO("not implemented")
-    }
 }
 
 @OptIn(InternalCoreApi::class)
@@ -3635,6 +3660,7 @@
         get() = LayoutDirection.Ltr
     override var showLayoutBounds: Boolean = false
     override val snapshotObserver = OwnerSnapshotObserver { it.invoke() }
+    override val modifierLocalManager: ModifierLocalManager = ModifierLocalManager(this)
     override fun registerOnEndApplyChangesListener(listener: () -> Unit) {
         TODO("Not yet implemented")
     }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessorTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessorTest.kt
index 9509a43..e8bf395 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessorTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessorTest.kt
@@ -34,6 +34,7 @@
 import androidx.compose.ui.layout.MeasureResult
 import androidx.compose.ui.layout.MeasureScope
 import androidx.compose.ui.layout.layout
+import androidx.compose.ui.modifier.ModifierLocalManager
 import androidx.compose.ui.node.InternalCoreApi
 import androidx.compose.ui.node.LayoutNode
 import androidx.compose.ui.node.LayoutNodeDrawScope
@@ -162,7 +163,7 @@
 
         // Assert
 
-        val log = pointerInputFilter.log.getOnPointerEventLog()
+        val log = pointerInputFilter.log.getOnPointerEventFilterLog()
 
         // Verify call count
         assertThat(log)
@@ -285,7 +286,7 @@
 
         // Assert
 
-        val log = pointerInputFilter.log.getOnPointerEventLog()
+        val log = pointerInputFilter.log.getOnPointerEventFilterLog()
 
         // Verify call count
         assertThat(log)
@@ -356,7 +357,7 @@
         val log =
             pointerInputFilter
                 .log
-                .getOnPointerEventLog()
+                .getOnPointerEventFilterLog()
                 .filter { it.pass == PointerEventPass.Initial }
 
         // Verify call count
@@ -410,7 +411,7 @@
 
         // Assert
 
-        assertThat(pointerInputFilter.log.getOnPointerEventLog()).hasSize(0)
+        assertThat(pointerInputFilter.log.getOnPointerEventFilterLog()).hasSize(0)
     }
 
     @Test
@@ -478,7 +479,9 @@
 
         // Assert
 
-        val filteredLog = log.getOnPointerEventLog().filter { it.pass == PointerEventPass.Initial }
+        val filteredLog = log.getOnPointerEventFilterLog().filter {
+            it.pass == PointerEventPass.Initial
+        }
 
         when (numberOfChildrenHit) {
             3 -> {
@@ -575,7 +578,7 @@
 
         // Assert
 
-        val log = pointerInputFilter.log.getOnPointerEventLog()
+        val log = pointerInputFilter.log.getOnPointerEventFilterLog()
 
         assertThat(log).hasSize(3)
         PointerInputChangeSubject
@@ -732,7 +735,7 @@
 
         // Assert
 
-        val filteredLog = log.getOnPointerEventLog()
+        val filteredLog = log.getOnPointerEventFilterLog()
 
         // Verify call count
         assertThat(filteredLog).hasSize(PointerEventPass.values().size * 3)
@@ -888,10 +891,12 @@
 
         // Verify call count
 
-        val child1Log =
-            log.getOnPointerEventLog().filter { it.pointerInputFilter === childPointerInputFilter1 }
-        val child2Log =
-            log.getOnPointerEventLog().filter { it.pointerInputFilter === childPointerInputFilter2 }
+        val child1Log = log.getOnPointerEventFilterLog().filter {
+            it.pointerInputFilter === childPointerInputFilter1
+        }
+        val child2Log = log.getOnPointerEventFilterLog().filter {
+            it.pointerInputFilter === childPointerInputFilter2
+        }
         assertThat(child1Log).hasSize(PointerEventPass.values().size)
         assertThat(child2Log).hasSize(PointerEventPass.values().size)
 
@@ -1048,12 +1053,15 @@
 
         // Assert
 
-        val child1Log =
-            log.getOnPointerEventLog().filter { it.pointerInputFilter === childPointerInputFilter1 }
-        val child2Log =
-            log.getOnPointerEventLog().filter { it.pointerInputFilter === childPointerInputFilter2 }
-        val child3Log =
-            log.getOnPointerEventLog().filter { it.pointerInputFilter === childPointerInputFilter3 }
+        val child1Log = log.getOnPointerEventFilterLog().filter {
+            it.pointerInputFilter === childPointerInputFilter1
+        }
+        val child2Log = log.getOnPointerEventFilterLog().filter {
+            it.pointerInputFilter === childPointerInputFilter2
+        }
+        val child3Log = log.getOnPointerEventFilterLog().filter {
+            it.pointerInputFilter === childPointerInputFilter3
+        }
         assertThat(child1Log).hasSize(PointerEventPass.values().size)
         assertThat(child2Log).hasSize(PointerEventPass.values().size)
         assertThat(child3Log).hasSize(PointerEventPass.values().size)
@@ -1224,8 +1232,8 @@
 
         // Assert
 
-        val log1 = childPointerInputFilter1.log.getOnPointerEventLog()
-        val log2 = childPointerInputFilter2.log.getOnPointerEventLog()
+        val log1 = childPointerInputFilter1.log.getOnPointerEventFilterLog()
+        val log2 = childPointerInputFilter2.log.getOnPointerEventFilterLog()
 
         // Verify call count
         assertThat(log1).hasSize(PointerEventPass.values().size)
@@ -1341,8 +1349,8 @@
 
         // Assert
 
-        val log1 = childPointerInputFilter1.log.getOnPointerEventLog()
-        val log2 = childPointerInputFilter2.log.getOnPointerEventLog()
+        val log1 = childPointerInputFilter1.log.getOnPointerEventFilterLog()
+        val log2 = childPointerInputFilter2.log.getOnPointerEventFilterLog()
 
         // Verify call count
         assertThat(log1).hasSize(PointerEventPass.values().size)
@@ -1558,10 +1566,10 @@
 
         // Verify call values
 
-        val logTopLeft = pointerInputFilterTopLeft.log.getOnPointerEventLog()
-        val logTopRight = pointerInputFilterTopRight.log.getOnPointerEventLog()
-        val logBottomLeft = pointerInputFilterBottomLeft.log.getOnPointerEventLog()
-        val logBottomRight = pointerInputFilterBottomRight.log.getOnPointerEventLog()
+        val logTopLeft = pointerInputFilterTopLeft.log.getOnPointerEventFilterLog()
+        val logTopRight = pointerInputFilterTopRight.log.getOnPointerEventFilterLog()
+        val logBottomLeft = pointerInputFilterBottomLeft.log.getOnPointerEventFilterLog()
+        val logBottomRight = pointerInputFilterBottomRight.log.getOnPointerEventFilterLog()
 
         PointerEventPass.values().forEachIndexed { index, pass ->
             logTopLeft.verifyOnPointerEventCall(
@@ -1662,7 +1670,7 @@
                 )
             }
 
-        val log = singlePointerInputFilter.log.getOnPointerEventLog()
+        val log = singlePointerInputFilter.log.getOnPointerEventFilterLog()
 
         // Verify call count
         assertThat(log).hasSize(PointerEventPass.values().size)
@@ -1722,9 +1730,9 @@
 
         // Assert
 
-        val log1 = pointerInputFilter1.log.getOnPointerEventLog()
-        val log2 = pointerInputFilter2.log.getOnPointerEventLog()
-        val log3 = pointerInputFilter3.log.getOnPointerEventLog()
+        val log1 = pointerInputFilter1.log.getOnPointerEventFilterLog()
+        val log2 = pointerInputFilter2.log.getOnPointerEventFilterLog()
+        val log3 = pointerInputFilter3.log.getOnPointerEventFilterLog()
 
         // Verify call count
         assertThat(log1).hasSize(PointerEventPass.values().size)
@@ -1802,7 +1810,7 @@
 
         // Assert
 
-        val log = pointerInputFilter.log.getOnPointerEventLog()
+        val log = pointerInputFilter.log.getOnPointerEventFilterLog()
 
         // Verify call count
         assertThat(log).hasSize(PointerEventPass.values().size)
@@ -1896,10 +1904,10 @@
 
         // Assert
 
-        val log1 = pointerInputFilter1.log.getOnPointerEventLog()
-        val log2 = pointerInputFilter2.log.getOnPointerEventLog()
-        val log3 = pointerInputFilter3.log.getOnPointerEventLog()
-        val log4 = pointerInputFilter4.log.getOnPointerEventLog()
+        val log1 = pointerInputFilter1.log.getOnPointerEventFilterLog()
+        val log2 = pointerInputFilter2.log.getOnPointerEventFilterLog()
+        val log3 = pointerInputFilter3.log.getOnPointerEventFilterLog()
+        val log4 = pointerInputFilter4.log.getOnPointerEventFilterLog()
 
         // Verify call count
         assertThat(log1).hasSize(PointerEventPass.values().size)
@@ -1966,8 +1974,8 @@
         pointerInputEventProcessor.process(down)
 
         // Assert
-        assertThat(pointerInputFilter2.log.getOnPointerEventLog()).hasSize(3)
-        assertThat(pointerInputFilter1.log.getOnPointerEventLog()).hasSize(0)
+        assertThat(pointerInputFilter2.log.getOnPointerEventFilterLog()).hasSize(3)
+        assertThat(pointerInputFilter1.log.getOnPointerEventFilterLog()).hasSize(0)
     }
 
     @Test
@@ -1990,7 +1998,7 @@
         pointerInputEventProcessor.process(down)
 
         // Assert
-        assertThat(pointerInputFilter1.log.getOnPointerEventLog()).hasSize(0)
+        assertThat(pointerInputFilter1.log.getOnPointerEventFilterLog()).hasSize(0)
     }
 
     // Cancel Handlers
@@ -2041,7 +2049,9 @@
 
         // Assert
 
-        val log = pointerInputFilter.log.filter { it is OnPointerEventEntry || it is OnCancelEntry }
+        val log = pointerInputFilter.log.filter {
+            it is OnPointerEventFilterEntry || it is OnCancelFilterEntry
+        }
 
         // Verify call count
         assertThat(log).hasSize(PointerEventPass.values().size + 1)
@@ -2146,7 +2156,9 @@
 
         // Assert
 
-        val log = pointerInputFilter.log.filter { it is OnPointerEventEntry || it is OnCancelEntry }
+        val log = pointerInputFilter.log.filter {
+            it is OnPointerEventFilterEntry || it is OnCancelFilterEntry
+        }
 
         // Verify call count
         assertThat(log).hasSize(PointerEventPass.values().size * 2 + 1)
@@ -2244,9 +2256,13 @@
         // Assert
 
         val log1 =
-            pointerInputFilter1.log.filter { it is OnPointerEventEntry || it is OnCancelEntry }
+            pointerInputFilter1.log.filter {
+                it is OnPointerEventFilterEntry || it is OnCancelFilterEntry
+            }
         val log2 =
-            pointerInputFilter2.log.filter { it is OnPointerEventEntry || it is OnCancelEntry }
+            pointerInputFilter2.log.filter {
+                it is OnPointerEventFilterEntry || it is OnCancelFilterEntry
+            }
 
         // Verify call count
         assertThat(log1).hasSize(PointerEventPass.values().size + 1)
@@ -2332,7 +2348,9 @@
 
         // Assert
 
-        val log = pointerInputFilter.log.filter { it is OnPointerEventEntry || it is OnCancelEntry }
+        val log = pointerInputFilter.log.filter {
+            it is OnPointerEventFilterEntry || it is OnCancelFilterEntry
+        }
 
         // Verify call count
         assertThat(log).hasSize(PointerEventPass.values().size * 2 + 1)
@@ -2398,7 +2416,9 @@
 
         // Assert
 
-        val log = pointerInputFilter.log.filter { it is OnPointerEventEntry || it is OnCancelEntry }
+        val log = pointerInputFilter.log.filter {
+            it is OnPointerEventFilterEntry || it is OnCancelFilterEntry
+        }
 
         // Verify call count
         assertThat(log).hasSize(PointerEventPass.values().size + 1)
@@ -2479,7 +2499,9 @@
 
         // Assert
 
-        val log = pointerInputFilter.log.filter { it is OnPointerEventEntry || it is OnCancelEntry }
+        val log = pointerInputFilter.log.filter {
+            it is OnPointerEventFilterEntry || it is OnCancelFilterEntry
+        }
 
         // Verify call count
         assertThat(log).hasSize(PointerEventPass.values().size * 2 + 1)
@@ -2564,8 +2586,8 @@
 
         // Assert
 
-        val parentLog = parentPointerInputFilter.log.getOnPointerEventLog()
-        val childLog = childPointerInputFilter.log.getOnPointerEventLog()
+        val parentLog = parentPointerInputFilter.log.getOnPointerEventFilterLog()
+        val childLog = childPointerInputFilter.log.getOnPointerEventFilterLog()
 
         // Verify call count
         assertThat(parentLog).hasSize(PointerEventPass.values().size * 2)
@@ -2654,8 +2676,8 @@
         pointerInputEventProcessor.process(up)
 
         // Assert
-        assertThat(childPointerInputFilter.log.getOnCancelLog()).hasSize(1)
-        assertThat(parentPointerInputFilter.log.getOnCancelLog()).hasSize(0)
+        assertThat(childPointerInputFilter.log.getOnCancelFilterLog()).hasSize(1)
+        assertThat(parentPointerInputFilter.log.getOnCancelFilterLog()).hasSize(0)
     }
 
     @Test
@@ -2720,8 +2742,8 @@
 
         // Assert
 
-        val parentLog = parentPointerInputFilter.log.getOnPointerEventLog()
-        val childLog = childPointerInputFilter.log.getOnPointerEventLog()
+        val parentLog = parentPointerInputFilter.log.getOnPointerEventFilterLog()
+        val childLog = childPointerInputFilter.log.getOnPointerEventFilterLog()
 
         // Verify call count
         assertThat(parentLog).hasSize(PointerEventPass.values().size * 2)
@@ -2811,8 +2833,8 @@
         pointerInputEventProcessor.process(up)
 
         // Assert
-        assertThat(childPointerInputFilter.log.getOnCancelLog()).hasSize(1)
-        assertThat(parentPointerInputFilter.log.getOnCancelLog()).hasSize(0)
+        assertThat(childPointerInputFilter.log.getOnCancelFilterLog()).hasSize(1)
+        assertThat(parentPointerInputFilter.log.getOnCancelFilterLog()).hasSize(0)
     }
 
     @Test
@@ -3116,7 +3138,9 @@
             )
             pointerInputEventProcessor.process(event)
 
-            with((pointerInputFilter.log.last() as OnPointerEventEntry).pointerEvent.buttons) {
+            with(
+                (pointerInputFilter.log.last() as OnPointerEventFilterEntry).pointerEvent.buttons
+            ) {
                 assertThat(isPrimaryPressed).isEqualTo(validator.primary)
                 assertThat(isSecondaryPressed).isEqualTo(validator.secondary)
                 assertThat(isTertiaryPressed).isEqualTo(validator.tertiary)
@@ -3202,7 +3226,7 @@
             )
             pointerInputEventProcessor.process(event)
 
-            val keyboardModifiers = (pointerInputFilter.log.last() as OnPointerEventEntry)
+            val keyboardModifiers = (pointerInputFilter.log.last() as OnPointerEventFilterEntry)
                 .pointerEvent.keyboardModifiers
             with(keyboardModifiers) {
                 assertThat(isCtrlPressed).isEqualTo(validator.control)
@@ -3241,7 +3265,7 @@
                 measurables: List<Measurable>,
                 constraints: Constraints
             ): MeasureResult =
-                innerLayoutNodeWrapper.layout(x2 - x, y2 - y) {
+                innerCoordinator.layout(x2 - x, y2 - y) {
                     measurables.forEach { it.measure(constraints).place(0, 0) }
                 }
         }
@@ -3377,6 +3401,7 @@
     override val viewConfiguration: ViewConfiguration
         get() = TODO("Not yet implemented")
     override val snapshotObserver = OwnerSnapshotObserver { it.invoke() }
+    override val modifierLocalManager: ModifierLocalManager = ModifierLocalManager(this)
     override fun registerOnEndApplyChangesListener(listener: () -> Unit) {
         onEndListeners += listener
     }
@@ -3402,8 +3427,8 @@
     expectedBounds: IntSize? = null
 ) {
     val logEntry = this[index]
-    assertThat(logEntry).isInstanceOf(OnPointerEventEntry::class.java)
-    val entry = logEntry as OnPointerEventEntry
+    assertThat(logEntry).isInstanceOf(OnPointerEventFilterEntry::class.java)
+    val entry = logEntry as OnPointerEventFilterEntry
     if (expectedPif != null) {
         assertThat(entry.pointerInputFilter).isSameInstanceAs(expectedPif)
     }
@@ -3420,5 +3445,5 @@
     index: Int
 ) {
     val logEntry = this[index]
-    assertThat(logEntry).isInstanceOf(OnCancelEntry::class.java)
+    assertThat(logEntry).isInstanceOf(OnCancelFilterEntry::class.java)
 }
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/TestUtils.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/TestUtils.kt
index b5821b4..ce3d08b7 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/TestUtils.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/TestUtils.kt
@@ -28,6 +28,8 @@
 import androidx.compose.ui.composed
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.layout.LayoutCoordinates
+import androidx.compose.ui.node.NodeCoordinator
+import androidx.compose.ui.node.PointerInputModifierNode
 import androidx.compose.ui.unit.IntSize
 import com.google.common.truth.FailureMetadata
 import com.google.common.truth.Subject
@@ -268,16 +270,27 @@
     return InternalPointerEvent(changes, pointer)
 }
 
-internal class PointerInputFilterMock(
+@OptIn(ExperimentalComposeUiApi::class)
+internal class PointerInputNodeMock(
     val log: MutableList<LogEntry> = mutableListOf(),
     val pointerEventHandler: PointerEventHandler? = null,
-    layoutCoordinates: LayoutCoordinates? = null
-) :
-    PointerInputFilter() {
-
+    coordinator: NodeCoordinator = LayoutCoordinatesStub(true)
+) : PointerInputModifierNode, Modifier.Node() {
     init {
-        this.layoutCoordinates = layoutCoordinates ?: LayoutCoordinatesStub(true)
-        this.isAttached = this.layoutCoordinates!!.isAttached
+        updateCoordinator(coordinator)
+        if (coordinator.isAttached) {
+            attach()
+        }
+    }
+
+    fun remove() {
+        val coordinator = coordinator as LayoutCoordinatesStub
+        if (coordinator.isAttached) {
+            coordinator.isAttached = false
+        }
+        if (isAttached) {
+            detach()
+        }
     }
 
     override fun onPointerEvent(
@@ -296,25 +309,74 @@
         pointerEventHandler?.invokeOverPass(pointerEvent, pass, bounds)
     }
 
-    override fun onCancel() {
+    override fun onCancelPointerInput() {
         log.add(OnCancelEntry(this))
     }
 }
 
+internal class PointerInputFilterMock(
+    val log: MutableList<LogEntry> = mutableListOf(),
+    val pointerEventHandler: PointerEventHandler? = null,
+    layoutCoordinates: LayoutCoordinates? = null
+) :
+    PointerInputFilter() {
+
+    init {
+        this.layoutCoordinates = layoutCoordinates ?: LayoutCoordinatesStub(true)
+        this.isAttached = this.layoutCoordinates!!.isAttached
+    }
+
+    override fun onPointerEvent(
+        pointerEvent: PointerEvent,
+        pass: PointerEventPass,
+        bounds: IntSize
+    ) {
+        log.add(
+            OnPointerEventFilterEntry(
+                this,
+                pointerEvent.deepCopy(),
+                pass,
+                bounds
+            )
+        )
+        pointerEventHandler?.invokeOverPass(pointerEvent, pass, bounds)
+    }
+
+    override fun onCancel() {
+        log.add(OnCancelFilterEntry(this))
+    }
+}
+
 internal fun List<LogEntry>.getOnPointerEventLog() = filterIsInstance<OnPointerEventEntry>()
+internal fun List<LogEntry>.getOnPointerEventFilterLog() =
+    filterIsInstance<OnPointerEventFilterEntry>()
 
 internal fun List<LogEntry>.getOnCancelLog() = filterIsInstance<OnCancelEntry>()
+internal fun List<LogEntry>.getOnCancelFilterLog() = filterIsInstance<OnCancelFilterEntry>()
 
 internal sealed class LogEntry
 
+@OptIn(ExperimentalComposeUiApi::class)
 internal data class OnPointerEventEntry(
+    val pointerInputNode: PointerInputModifierNode,
+    val pointerEvent: PointerEvent,
+    val pass: PointerEventPass,
+    val bounds: IntSize
+) : LogEntry()
+
+internal data class OnPointerEventFilterEntry(
     val pointerInputFilter: PointerInputFilter,
     val pointerEvent: PointerEvent,
     val pass: PointerEventPass,
     val bounds: IntSize
 ) : LogEntry()
 
+@OptIn(ExperimentalComposeUiApi::class)
 internal class OnCancelEntry(
+    val pointerInputNode: PointerInputModifierNode
+) : LogEntry()
+
+internal class OnCancelFilterEntry(
     val pointerInputFilter: PointerInputFilter
 ) : LogEntry()
 
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/Helpers.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/Helpers.kt
index 82a4802..2ac2a5c 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/Helpers.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/Helpers.kt
@@ -26,6 +26,7 @@
 import androidx.compose.ui.input.InputModeManager
 import androidx.compose.ui.input.key.KeyEvent
 import androidx.compose.ui.input.pointer.PointerIconService
+import androidx.compose.ui.modifier.ModifierLocalManager
 import androidx.compose.ui.node.InternalCoreApi
 import androidx.compose.ui.node.LayoutNode
 import androidx.compose.ui.node.LayoutNodeDrawScope
@@ -96,6 +97,9 @@
     }
 
     override val snapshotObserver: OwnerSnapshotObserver = OwnerSnapshotObserver { it.invoke() }
+
+    override val modifierLocalManager: ModifierLocalManager = ModifierLocalManager(this)
+
     override fun registerOnEndApplyChangesListener(listener: () -> Unit) {
         TODO("Not yet implemented")
     }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/RtlLayoutTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/RtlLayoutTest.kt
index 197be27..038a111 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/RtlLayoutTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/RtlLayoutTest.kt
@@ -17,8 +17,12 @@
 package androidx.compose.ui.layout
 
 import androidx.activity.compose.setContent
+import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.IntrinsicSize
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.layout.width
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
@@ -26,13 +30,17 @@
 import androidx.compose.ui.FixedSize
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.node.Ref
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.runOnUiThreadIR
 import androidx.compose.ui.test.TestActivity
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.DpSize
 import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.dp
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import org.junit.Assert
@@ -44,6 +52,8 @@
 import org.junit.runner.RunWith
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.TimeUnit
+import kotlin.math.abs
+import kotlin.math.roundToInt
 
 @SmallTest
 @RunWith(AndroidJUnit4::class)
@@ -297,6 +307,94 @@
         assertEquals(LayoutDirection.Ltr, resultLayoutDirection.value)
     }
 
+    @Test
+    fun testChildGetsPlacedWithinContainerWithPaddingAndMinimumTouchTarget() {
+        // copy-pasted from TouchTarget.kt (internal in material module)
+        class MinimumTouchTargetModifier(val size: DpSize = DpSize(48.dp, 48.dp)) : LayoutModifier {
+            override fun MeasureScope.measure(
+                measurable: Measurable,
+                constraints: Constraints
+            ): MeasureResult {
+                val placeable = measurable.measure(constraints)
+                val width = maxOf(placeable.width, size.width.roundToPx())
+                val height = maxOf(placeable.height, size.height.roundToPx())
+                return layout(width, height) {
+                    val centerX = ((width - placeable.width) / 2f).roundToInt()
+                    val centerY = ((height - placeable.height) / 2f).roundToInt()
+                    placeable.place(centerX, centerY)
+                }
+            }
+
+            override fun equals(other: Any?): Boolean {
+                val otherModifier = other as? MinimumTouchTargetModifier ?: return false
+                return size == otherModifier.size
+            }
+
+            override fun hashCode(): Int = size.hashCode()
+        }
+
+        val latch = CountDownLatch(2)
+        var outerLC: LayoutCoordinates? = null
+        var innerLC: LayoutCoordinates? = null
+        var density: Density? = null
+
+        val rowWidth = 200.dp
+        val outerBoxWidth = 56.dp
+        val padding = 16.dp
+
+        activityTestRule.runOnUiThread {
+            activity.setContent {
+                density = LocalDensity.current
+                CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
+                    Row(modifier = Modifier.width(rowWidth)) {
+                        Box(
+                            modifier = Modifier
+                                .onGloballyPositioned {
+                                    outerLC = it
+                                    latch.countDown()
+                                }
+                                .size(outerBoxWidth)
+                                .background(color = Color.Red)
+                                .padding(horizontal = padding)
+                                .then(MinimumTouchTargetModifier())
+                        ) {
+                            Box(
+                                modifier = Modifier
+                                    .onGloballyPositioned {
+                                        innerLC = it
+                                        latch.countDown()
+                                    }
+                                    .size(30.dp)
+                                    .background(color = Color.Gray)
+                            )
+                        }
+                    }
+                }
+            }
+        }
+
+        assertTrue(latch.await(1, TimeUnit.SECONDS))
+        val (innerOffset, innerWidth) = with(innerLC!!) {
+            localToWindow(Offset.Zero) to size.width
+        }
+        val (outerOffset, outerWidth) = with(outerLC!!) {
+            localToWindow(Offset.Zero) to size.width
+        }
+        assertTrue(innerWidth < outerWidth)
+        assertTrue(innerOffset.x > outerOffset.x)
+        assertTrue(innerWidth + innerOffset.x < outerWidth + outerOffset.x)
+
+        with(density!!) {
+            assertEquals(outerOffset.x.roundToInt(), rowWidth.roundToPx() - outerWidth)
+            val paddingPx = padding.roundToPx()
+            // OuterBoxLeftEdge_padding-16dp_InnerBoxLeftEdge
+            assertTrue(abs(outerOffset.x + paddingPx - innerOffset.x) <= 1.0)
+            // InnerBoxRightEdge_padding-16dp_OuterRightEdge
+            val outerRightEdge = outerOffset.x + outerWidth
+            assertTrue(abs(outerRightEdge - paddingPx - (innerOffset.x + innerWidth)) <= 1)
+        }
+    }
+
     @Composable
     private fun CustomLayout(
         absolutePositioning: Boolean,
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/LayoutNodeWrapperInitializationTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/LayoutNodeWrapperInitializationTest.kt
deleted file mode 100644
index fbe4c8e..0000000
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/LayoutNodeWrapperInitializationTest.kt
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.compose.ui.node
-
-import androidx.compose.foundation.layout.Box
-import androidx.compose.runtime.RecomposeScope
-import androidx.compose.runtime.currentRecomposeScope
-import androidx.compose.ui.ExperimentalComposeUiApi
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.focus.FocusModifier
-import androidx.compose.ui.focus.FocusStateImpl
-import androidx.compose.ui.focus.focusTarget
-import androidx.compose.ui.input.key.KeyInputModifier
-import androidx.compose.ui.input.pointer.PointerInputModifier
-import androidx.compose.ui.input.pointer.PointerInteropFilter
-import androidx.compose.ui.layout.LayoutCoordinates
-import androidx.compose.ui.layout.onGloballyPositioned
-import androidx.compose.ui.test.junit4.createComposeRule
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.MediumTest
-import com.google.common.truth.Truth.assertThat
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@MediumTest
-@RunWith(AndroidJUnit4::class)
-class LayoutNodeWrapperInitializationTest {
-    @get:Rule
-    val rule = createComposeRule()
-
-    @Test
-    fun initializeIsCalledWhenFocusNodeIsCreated() {
-        // Arrange.
-        val focusModifier = FocusModifier(FocusStateImpl.Inactive)
-
-        // Act.
-        rule.setContent {
-            Box(Modifier.focusTarget(focusModifier))
-        }
-
-        // Assert.
-        rule.runOnIdle {
-            assertThat(focusModifier).isNotNull()
-        }
-    }
-
-    @Test
-    fun initializeIsCalledWhenKeyInputNodeIsCreated() {
-        // Arrange.
-        val keyInputModifier = KeyInputModifier(null, null)
-
-        // Act.
-        rule.setContent {
-            Box(modifier = keyInputModifier)
-        }
-
-        // Assert.
-        rule.runOnIdle {
-            assertThat(keyInputModifier.layoutNode).isNotNull()
-        }
-    }
-
-    @OptIn(ExperimentalComposeUiApi::class)
-    @Test
-    fun initializeIsCalledWhenPointerInputNodeWrapperIsCreated() {
-        // Arrange.
-        val pointerInputModifier = PointerInteropFilter()
-
-        // Act.
-        rule.setContent {
-            Box(modifier = pointerInputModifier)
-        }
-
-        // Assert.
-        rule.runOnIdle {
-            assertThat(pointerInputModifier.pointerInputFilter.layoutCoordinates).isNotNull()
-        }
-    }
-
-    @Test
-    fun initializeIsCalledWhenOnGloballyPositionedNodeIsCreated() {
-        // Arrange.
-        lateinit var layoutCoordinates: LayoutCoordinates
-
-        // Act.
-        rule.setContent {
-            Box(modifier = Modifier.onGloballyPositioned { layoutCoordinates = it })
-        }
-
-        // Assert.
-        rule.runOnIdle {
-            val layoutNodeWrapper = layoutCoordinates as LayoutNodeWrapper
-            val callbacks = layoutNodeWrapper.layoutNode.getOrCreateOnPositionedCallbacks()
-            assertThat(callbacks.asMutableList()).isNotEmpty()
-        }
-    }
-
-    @Test
-    fun initializeIsCalledWhenFocusNodeIsReused() {
-        // Arrange.
-        lateinit var focusModifier: FocusModifier
-        lateinit var scope: RecomposeScope
-        rule.setContent {
-            scope = currentRecomposeScope
-            focusModifier = FocusModifier(FocusStateImpl.Inactive)
-            Box(Modifier.focusTarget(focusModifier))
-        }
-
-        // Act.
-        rule.runOnIdle { scope.invalidate() }
-
-        // Assert.
-        rule.runOnIdle { assertThat(focusModifier).isNotNull() }
-    }
-
-    @Test
-    fun initializeIsCalledWhenKeyInputNodeIsReused() {
-        // Arrange.
-        lateinit var keyInputModifier: KeyInputModifier
-        lateinit var scope: RecomposeScope
-        rule.setContent {
-            scope = currentRecomposeScope
-            keyInputModifier = KeyInputModifier(null, null)
-            Box(modifier = keyInputModifier)
-        }
-
-        // Act.
-        rule.runOnIdle { scope.invalidate() }
-
-        // Assert.
-        rule.runOnIdle {
-            assertThat(keyInputModifier.layoutNode).isNotNull()
-        }
-    }
-
-    @ExperimentalComposeUiApi
-    @Test
-    fun initializeIsCalledWhenPointerInputNodeIsReused() {
-        // Arrange.
-        lateinit var pointerInputModifier: PointerInputModifier
-        lateinit var scope: RecomposeScope
-        rule.setContent {
-            scope = currentRecomposeScope
-            pointerInputModifier = PointerInteropFilter()
-            Box(modifier = pointerInputModifier)
-        }
-
-        // Act.
-        rule.runOnIdle { scope.invalidate() }
-
-        // Assert.
-        rule.runOnIdle {
-            assertThat(pointerInputModifier.pointerInputFilter.layoutCoordinates).isNotNull()
-        }
-    }
-
-    @Test
-    fun initializeIsCalledWhenOnGloballyPositionedNodeIsReused() {
-        // Arrange.
-        lateinit var layoutCoordinates: LayoutCoordinates
-        lateinit var scope: RecomposeScope
-        rule.setContent {
-            scope = currentRecomposeScope
-            Box(modifier = Modifier.onGloballyPositioned { layoutCoordinates = it })
-        }
-
-        // Act.
-        rule.runOnIdle { scope.invalidate() }
-
-        // Assert.
-        rule.runOnIdle {
-            val layoutNodeWrapper = layoutCoordinates as LayoutNodeWrapper
-            val callbacks = layoutNodeWrapper.layoutNode.getOrCreateOnPositionedCallbacks()
-            assertThat(callbacks.asMutableList()).isNotEmpty()
-        }
-    }
-}
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/MyersDiffTests.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/MyersDiffTests.kt
new file mode 100644
index 0000000..856b882
--- /dev/null
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/MyersDiffTests.kt
@@ -0,0 +1,116 @@
+/*
+ * 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.node
+
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class MyersDiffTests {
+
+    @Test
+    fun testDiff() {
+        val a = listOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
+        val b = listOf(0, 1, 2, 3, 4, 6, 7, 8, 9, 10)
+        val (c, log) = executeListDiff(a, b)
+        assertEquals(b, c)
+        assertEquals(
+            """
+            Equals(x = 10, y = 9)
+            Equals(x = 9, y = 8)
+            Equals(x = 8, y = 7)
+            Equals(x = 7, y = 6)
+            Equals(x = 6, y = 5)
+            Remove(5)
+            Equals(x = 4, y = 4)
+            Equals(x = 3, y = 3)
+            Equals(x = 2, y = 2)
+            Equals(x = 1, y = 1)
+            Equals(x = 0, y = 0)
+            """.trimIndent(),
+            log.joinToString("\n")
+        )
+    }
+
+    @Test
+    fun stringDiff() {
+        stringDiff(
+            "ihfiwjfowijefoiwjfe",
+            "ihfawwjwfowwijefwicwfe"
+        )
+
+        stringDiff("", "abcde")
+
+        stringDiff("abcde", "")
+
+        stringDiff(
+            "aaaa",
+            "bbbb",
+            """
+            Remove(3)
+            Remove(2)
+            Remove(1)
+            Remove(0)
+            Insert(b at 0)
+            Insert(b at 0)
+            Insert(b at 0)
+            Insert(b at 0)
+            """.trimIndent()
+        )
+
+        stringDiff("abcd", "bcda")
+
+        stringDiff(
+            "abc",
+            "abccbacbac"
+        )
+    }
+}
+
+fun stringDiff(before: String, after: String, expectedLog: String? = null) {
+    val (result, log) = executeListDiff(before.toCharArray().asList(), after.toCharArray().asList())
+    if (expectedLog != null) {
+        assertEquals(expectedLog, log.joinToString("\n"))
+    }
+    assertEquals(result.joinToString(separator = ""), after)
+}
+
+data class DiffResult<T>(val result: List<T>, val log: List<String>)
+
+fun <T> executeListDiff(x: List<T>, y: List<T>): DiffResult<T> {
+    val log = mutableListOf<String>()
+    val result = x.toMutableList()
+    executeDiff(x.size, y.size, object : DiffCallback {
+        override fun areItemsTheSame(oldIndex: Int, newIndex: Int): Boolean {
+            return x[oldIndex] == y[newIndex]
+        }
+
+        override fun insert(atIndex: Int, newIndex: Int) {
+            log.add("Insert(${y[newIndex]} at $atIndex)")
+            result.add(atIndex, y[newIndex])
+        }
+
+        override fun remove(oldIndex: Int) {
+            log.add("Remove($oldIndex)")
+            result.removeAt(oldIndex)
+        }
+
+        override fun same(oldIndex: Int, newIndex: Int) {
+            log.add("Equals(x = $oldIndex, y = $newIndex)")
+        }
+    })
+    return DiffResult(result, log)
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/NestedVectorStackTests.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/NestedVectorStackTests.kt
new file mode 100644
index 0000000..67f3d39
--- /dev/null
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/NestedVectorStackTests.kt
@@ -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 androidx.compose.ui.node
+
+import androidx.compose.runtime.collection.mutableVectorOf
+import org.junit.Assert
+import org.junit.Test
+
+class NestedVectorStackTests {
+
+    @Test
+    fun testPushPopOrder() {
+        val stack = NestedVectorStack<Int>()
+        stack.push(mutableVectorOf(1, 2, 3))
+        stack.push(mutableVectorOf(4, 5, 6))
+        stack.push(mutableVectorOf())
+        stack.push(mutableVectorOf(7))
+        stack.push(mutableVectorOf(8, 9))
+        val result = buildString {
+            while (stack.isNotEmpty()) {
+                append(stack.pop())
+            }
+        }
+        Assert.assertEquals("987654321", result)
+    }
+
+    @Test
+    fun testPopInBetweenPushes() {
+        val stack = NestedVectorStack<Int>()
+        stack.push(mutableVectorOf(1, 2, 3, 4))
+        stack.pop()
+        stack.push(mutableVectorOf(4, 5, 6))
+        stack.pop()
+        stack.pop()
+        stack.push(mutableVectorOf())
+        stack.push(mutableVectorOf(5, 6, 7))
+        stack.push(mutableVectorOf(8, 9))
+        val result = buildString {
+            while (stack.isNotEmpty()) {
+                append(stack.pop())
+            }
+        }
+        Assert.assertEquals("987654321", result)
+    }
+}
\ 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
new file mode 100644
index 0000000..d3ddedd
--- /dev/null
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/NodeChainTester.kt
@@ -0,0 +1,279 @@
+/*
+ * 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.
+ */
+
+@file:OptIn(ExperimentalComposeUiApi::class)
+
+package androidx.compose.ui.node
+
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import org.junit.Assert
+
+internal fun chainTester() = NodeChainTester()
+
+class DiffLog() {
+    val oplog = mutableListOf<DiffOp>()
+    fun op(op: DiffOp) = oplog.add(op)
+    fun clear() = oplog.clear()
+
+    fun assertElementDiff(expected: String) {
+        Assert.assertEquals(
+            expected,
+            oplog.reversed().joinToString("\n") {
+                it.elementDiffString()
+            }
+        )
+    }
+
+    fun debug(): String = buildString {
+        for (op in oplog) {
+            appendLine(op.debug())
+        }
+    }
+}
+
+internal class NodeChainTester : NodeChain.Logger {
+    val layoutNode = LayoutNode()
+    val chain = layoutNode.nodes.also { it.useLogger(this) }
+    val log = DiffLog()
+
+    val tail get() = chain.tail
+    val head get() = chain.head
+    val nodes: List<Modifier.Node>
+        get() {
+            val result = mutableListOf<Modifier.Node>()
+            chain.headToTailExclusive {
+                result.add(it)
+            }
+            return result
+        }
+
+    val aggregateChildMasks: List<Int> get() = nodes.map { it.aggregateChildKindSet }
+
+    fun clearLog(): NodeChainTester {
+        log.clear()
+        return this
+    }
+
+    fun debug(): NodeChainTester {
+        if (true) error(log.debug())
+        return this
+    }
+
+    fun withModifiers(vararg modifiers: Modifier): NodeChainTester {
+        chain.updateFrom(modifierOf(*modifiers))
+        return this
+    }
+
+    fun assertStringEquals(expected: String): NodeChainTester {
+        Assert.assertEquals(expected, chain.toString())
+        return this
+    }
+
+    fun assertElementDiff(expected: String): NodeChainTester {
+        log.assertElementDiff(expected)
+        return this
+    }
+
+    override fun linearDiffAborted(
+        index: Int,
+        prev: Modifier.Element,
+        next: Modifier.Element,
+        node: Modifier.Node
+    ) {
+        // TODO
+    }
+
+    override fun nodeUpdated(
+        oldIndex: Int,
+        newIndex: Int,
+        prev: Modifier.Element,
+        next: Modifier.Element,
+        before: Modifier.Node,
+        after: Modifier.Node
+    ) {
+        log.op(DiffOp.Same(oldIndex, newIndex, prev, next, before, after, true))
+    }
+
+    override fun nodeReused(
+        oldIndex: Int,
+        newIndex: Int,
+        prev: Modifier.Element,
+        next: Modifier.Element,
+        node: Modifier.Node
+    ) {
+        log.op(DiffOp.Same(oldIndex, newIndex, prev, next, node, node, false))
+    }
+
+    override fun nodeInserted(
+        atIndex: Int,
+        newIndex: Int,
+        element: Modifier.Element,
+        child: Modifier.Node,
+        inserted: Modifier.Node
+    ) {
+        log.op(DiffOp.Insert(atIndex, newIndex, element, child, inserted))
+    }
+
+    override fun nodeRemoved(oldIndex: Int, element: Modifier.Element, node: Modifier.Node) {
+        log.op(DiffOp.Remove(oldIndex, element, node))
+    }
+}
+
+sealed class DiffOp(
+    val element: Modifier.Element,
+    val opChar: String,
+    val opString: String,
+) {
+    fun elementDiffString(): String {
+        return "$opChar$element"
+    }
+
+    abstract fun debug(): String
+    class Same(
+        val oldIndex: Int,
+        val newIndex: Int,
+        val beforeEl: Modifier.Element,
+        val afterEl: Modifier.Element,
+        val beforeEntity: Modifier.Node,
+        val afterEntity: Modifier.Node,
+        val updated: Boolean,
+    ) : DiffOp(beforeEl, if (updated) "*" else " ", "Same") {
+        override fun debug() = """
+            <$opString>
+                $beforeEl @ $oldIndex = $afterEl @ $newIndex
+                before = $beforeEntity
+                after = $afterEntity
+                updated? = $updated
+            </$opString>
+        """.trimIndent()
+    }
+
+    class Insert(
+        val oldIndex: Int,
+        val newIndex: Int,
+        val afterEl: Modifier.Element,
+        val child: Modifier.Node,
+        val inserted: Modifier.Node,
+    ) : DiffOp(afterEl, "+", "Insert") {
+        override fun debug() = """
+            <$opString>
+                $afterEl @ $newIndex (inserted at $oldIndex)
+                child = $child
+                inserted = $inserted
+            </$opString>
+        """.trimIndent()
+    }
+
+    class Remove(
+        val oldIndex: Int,
+        val beforeEl: Modifier.Element,
+        val beforeEntity: Modifier.Node,
+    ) : DiffOp(beforeEl, "-", "Remove") {
+        override fun debug() = """
+            <$opString>
+                $beforeEl @ $oldIndex
+                beforeEntity = $beforeEntity
+            </$opString>
+        """.trimIndent()
+    }
+}
+
+fun modifierOf(vararg modifiers: Modifier): Modifier {
+    var result: Modifier = Modifier
+    for (m in modifiers) {
+        result = result.then(m)
+    }
+    return result
+}
+
+fun reusableModifier(name: String): Modifier.Element = object : Modifier.Element {
+    override fun toString(): String = name
+}
+
+fun reusableModifiers(vararg names: String): List<Modifier.Element> {
+    return names.map { reusableModifier(it) }
+}
+
+class A : Modifier.Node() {
+    override fun toString(): String = "a"
+}
+
+fun modifierA(params: Any? = null): Modifier.Element {
+    return object : ModifierNodeElement<A>(params) {
+        override fun create(): A = A()
+        override fun update(node: A): A = node
+        override fun toString(): String = "a"
+    }
+}
+
+class B : Modifier.Node() {
+    override fun toString(): String = "b"
+}
+
+fun modifierB(params: Any? = null): Modifier.Element {
+    return object : ModifierNodeElement<B>(params) {
+        override fun create(): B = B()
+        override fun update(node: B): B = node
+        override fun toString(): String = "b"
+    }
+}
+
+class C : Modifier.Node() {
+    override fun toString(): String = "c"
+}
+
+fun modifierC(params: Any? = null): Modifier.Element {
+    return object : ModifierNodeElement<C>(params) {
+        override fun create(): C = C()
+        override fun update(node: C): C = node
+        override fun toString(): String = "c"
+    }
+}
+
+fun modifierD(params: Any? = null): Modifier.Element {
+    class N : Modifier.Node() {
+        override fun toString(): String = "d"
+    }
+    return object : ModifierNodeElement<N>(params) {
+        override fun create(): N = N()
+        override fun update(node: N): N = node
+        override fun toString(): String = "d"
+    }
+}
+
+fun managedModifier(
+    name: String,
+    params: Any? = null
+): ModifierNodeElement<*> = object : ModifierNodeElement<Modifier.Node>(params) {
+    override fun create(): Modifier.Node = object : Modifier.Node() {}
+    override fun update(node: Modifier.Node): Modifier.Node = node
+    override fun toString(): String = name
+}
+
+fun entityModifiers(vararg names: String): List<ModifierNodeElement<*>> {
+    return names.map { managedModifier(it, null) }
+}
+
+fun assertReused(before: Modifier.Element, after: Modifier.Element) {
+    with(chainTester()) {
+        withModifiers(before)
+        val beforeEntity = chain.tail
+        withModifiers(after)
+        val afterEntity = chain.tail
+        assert(beforeEntity === afterEntity)
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/NodeChainTests.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/NodeChainTests.kt
new file mode 100644
index 0000000..f13a71f
--- /dev/null
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/NodeChainTests.kt
@@ -0,0 +1,153 @@
+/*
+ * 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.
+ */
+
+@file:OptIn(ExperimentalComposeUiApi::class)
+package androidx.compose.ui.node
+
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.areObjectsOfSameType
+import org.junit.Test
+
+class NodeChainTests {
+
+    @Test
+    fun testInsertsAndDeletesAtTail() {
+        val (a, b, c) = reusableModifiers("a", "b", "c")
+        chainTester()
+            .withModifiers(a, b, c)
+            .assertStringEquals("[a,b,c]")
+            .withModifiers(a, b, c, b)
+            .assertStringEquals("[a,b,c,b]")
+            .withModifiers(a, b, c)
+            .assertStringEquals("[a,b,c]")
+    }
+
+    @Test
+    fun testInsertsAndDeletesAtHead() {
+        val (a, b, c) = reusableModifiers("a", "b", "c")
+        chainTester()
+            .withModifiers(a, b, c)
+            .assertStringEquals("[a,b,c]")
+            .withModifiers(c, a, b, c)
+            .assertStringEquals("[c,a,b,c]")
+            .withModifiers(a, b, c)
+            .assertStringEquals("[a,b,c]")
+    }
+
+    @Test
+    fun testInsertsInMiddle() {
+        val (a, b, c) = reusableModifiers("a", "b", "c")
+        chainTester()
+            .withModifiers(a, b, c)
+            .assertStringEquals("[a,b,c]")
+            .withModifiers(a, b, a, c)
+            .assertStringEquals("[a,b,a,c]")
+            .withModifiers(a, b, c)
+            .assertStringEquals("[a,b,c]")
+    }
+
+    @Test
+    fun testRemovingEverything() {
+        val (a, b, c) = reusableModifiers("a", "b", "c")
+        chainTester()
+            .withModifiers(a, b, c)
+            .assertStringEquals("[a,b,c]")
+            .withModifiers(Modifier)
+            .assertStringEquals("[]")
+    }
+
+    @Test
+    fun testSwapModifierInMiddle() {
+        val (a, b, c) = reusableModifiers("a", "b", "c")
+        chainTester()
+            .withModifiers(a, b, b, b, c)
+            .assertStringEquals("[a,b,b,b,c]")
+            .withModifiers(a, b, c, b, c)
+            .assertStringEquals("[a,b,c,b,c]")
+    }
+
+    @Test
+    fun testSwapModifierAtHead() {
+        val (a, b, c) = reusableModifiers("a", "b", "c")
+        chainTester()
+            .withModifiers(a, b, b, b, c)
+            .assertStringEquals("[a,b,b,b,c]")
+            .withModifiers(c, b, b, b, c)
+            .assertStringEquals("[c,b,b,b,c]")
+    }
+
+    @Test
+    fun testSwapModifierAtTail() {
+        val (a, b, c) = reusableModifiers("a", "b", "c")
+        chainTester()
+            .withModifiers(a, b, b, b, c)
+            .assertStringEquals("[a,b,b,b,c]")
+            .withModifiers(a, b, b, b, a)
+            .assertStringEquals("[a,b,b,b,a]")
+    }
+
+    @Test
+    fun testReused() {
+        val (a1, b1, c1) = reusableModifiers("a", "b", "c")
+        val (a2, b2, c2) = reusableModifiers("a", "b", "c")
+        chainTester()
+            .withModifiers(a1, b1, c1)
+            .assertStringEquals("[a,b,c]")
+            .withModifiers(a2, b2, c2)
+            .assertStringEquals("[a,b,c]")
+    }
+
+    @Test
+    fun testSimple() {
+        val a1 = modifierA()
+        val a2 = modifierA()
+        val b1 = modifierB()
+        val c1 = modifierC()
+        val c2 = modifierC()
+        assert(areObjectsOfSameType(c1, c2))
+        assert(!areObjectsOfSameType(a1, b1))
+        chainTester()
+            .withModifiers(a1, b1, c1)
+            .assertStringEquals("[a,b,c]")
+            .clearLog()
+            .withModifiers(a2, c2)
+            .assertStringEquals("[a,c]")
+            .assertElementDiff(
+                """
+                 a
+                -b
+                 c
+                """.trimIndent()
+            ).apply {
+                val (entA, entC) = nodes
+                withModifiers(a1, modifierD(), b1)
+                val (entA2, entB2) = nodes
+                assert(entA === entA2)
+                assert(entC !== entB2)
+            }
+    }
+
+    // TODO(b/241856927)
+    // - aggregate masks are correct
+    // - tree traversal
+    // - next/prev and entity types
+    // - entity modifier lifecycles
+    // - reuse vs recreate etc.
+    // - number of inserts/deletes/etc for different types of updates
+    // - ensure which same-size updates go through diff vs not
+    // - ensure that entities in chain are attached, out of chain are detached
+}
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/NodeCoordinatorInitializationTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/NodeCoordinatorInitializationTest.kt
new file mode 100644
index 0000000..ea142f4
--- /dev/null
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/NodeCoordinatorInitializationTest.kt
@@ -0,0 +1,151 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.ui.node
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.runtime.RecomposeScope
+import androidx.compose.runtime.currentRecomposeScope
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.focus.FocusModifier
+import androidx.compose.ui.focus.FocusStateImpl
+import androidx.compose.ui.focus.focusTarget
+import androidx.compose.ui.input.key.KeyInputModifier
+import androidx.compose.ui.input.pointer.PointerInputModifier
+import androidx.compose.ui.input.pointer.PointerInteropFilter
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class NodeCoordinatorInitializationTest {
+    @get:Rule
+    val rule = createComposeRule()
+
+    @Test
+    fun initializeIsCalledWhenFocusNodeIsCreated() {
+        // Arrange.
+        val focusModifier = FocusModifier(FocusStateImpl.Inactive)
+
+        // Act.
+        rule.setContent {
+            Box(Modifier.focusTarget(focusModifier))
+        }
+
+        // Assert.
+        rule.runOnIdle {
+            assertThat(focusModifier).isNotNull()
+        }
+    }
+
+    @Test
+    fun initializeIsCalledWhenKeyInputNodeIsCreated() {
+        // Arrange.
+        val keyInputModifier = KeyInputModifier(null, null)
+
+        // Act.
+        rule.setContent {
+            Box(modifier = keyInputModifier)
+        }
+
+        // Assert.
+        rule.runOnIdle {
+            assertThat(keyInputModifier.layoutNode).isNotNull()
+        }
+    }
+
+    @OptIn(ExperimentalComposeUiApi::class)
+    @Test
+    fun initializeIsCalledWhenPointerInputNodeWrapperIsCreated() {
+        // Arrange.
+        val pointerInputModifier = PointerInteropFilter()
+
+        // Act.
+        rule.setContent {
+            Box(modifier = pointerInputModifier)
+        }
+
+        // Assert.
+        rule.runOnIdle {
+            assertThat(pointerInputModifier.pointerInputFilter.layoutCoordinates).isNotNull()
+        }
+    }
+
+    @Test
+    fun initializeIsCalledWhenFocusNodeIsReused() {
+        // Arrange.
+        lateinit var focusModifier: FocusModifier
+        lateinit var scope: RecomposeScope
+        rule.setContent {
+            scope = currentRecomposeScope
+            focusModifier = FocusModifier(FocusStateImpl.Inactive)
+            Box(Modifier.focusTarget(focusModifier))
+        }
+
+        // Act.
+        rule.runOnIdle { scope.invalidate() }
+
+        // Assert.
+        rule.runOnIdle { assertThat(focusModifier).isNotNull() }
+    }
+
+    @Test
+    fun initializeIsCalledWhenKeyInputNodeIsReused() {
+        // Arrange.
+        lateinit var keyInputModifier: KeyInputModifier
+        lateinit var scope: RecomposeScope
+        rule.setContent {
+            scope = currentRecomposeScope
+            keyInputModifier = KeyInputModifier(null, null)
+            Box(modifier = keyInputModifier)
+        }
+
+        // Act.
+        rule.runOnIdle { scope.invalidate() }
+
+        // Assert.
+        rule.runOnIdle {
+            assertThat(keyInputModifier.layoutNode).isNotNull()
+        }
+    }
+
+    @ExperimentalComposeUiApi
+    @Test
+    fun initializeIsCalledWhenPointerInputNodeIsReused() {
+        // Arrange.
+        lateinit var pointerInputModifier: PointerInputModifier
+        lateinit var scope: RecomposeScope
+        rule.setContent {
+            scope = currentRecomposeScope
+            pointerInputModifier = PointerInteropFilter()
+            Box(modifier = pointerInputModifier)
+        }
+
+        // Act.
+        rule.runOnIdle { scope.invalidate() }
+
+        // Assert.
+        rule.runOnIdle {
+            assertThat(pointerInputModifier.pointerInputFilter.layoutCoordinates).isNotNull()
+        }
+    }
+}
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/AndroidComposeViewsInRecyclerViewTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/AndroidComposeViewsInRecyclerViewTest.kt
new file mode 100644
index 0000000..dbeebe7
--- /dev/null
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/AndroidComposeViewsInRecyclerViewTest.kt
@@ -0,0 +1,589 @@
+/*
+ * 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.platform
+
+import android.content.Context
+import android.os.Build
+import android.view.View
+import android.view.ViewGroup
+import android.widget.FrameLayout
+import android.widget.LinearLayout
+import androidx.activity.ComponentActivity
+import androidx.annotation.RequiresApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.DisposableEffect
+import androidx.recyclerview.widget.DefaultItemAnimator
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import androidx.test.ext.junit.rules.ActivityScenarioRule
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.testutils.AnimationDurationScaleRule
+import com.google.common.truth.Truth.assertThat
+import kotlin.coroutines.resume
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.android.awaitFrame
+import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.suspendCancellableCoroutine
+import kotlinx.coroutines.withContext
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Used to check the size of the RecycledViewPool
+ */
+private const val MaxItemsInAnyTest = 100
+
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = Build.VERSION_CODES.KITKAT)
+/**
+ * Note: this test's structure largely parallels PoolingContainerRecyclerViewTest
+ * (though there are notable implementation differences)
+ *
+ * Consider if new tests added here should also be added there.
+ */
+class AndroidComposeViewsRecyclerViewTest {
+    @get:Rule
+    val animationRule = AnimationDurationScaleRule.create()
+
+    @get:Rule
+    var activityRule = ActivityScenarioRule(ComponentActivity::class.java)
+
+    lateinit var recyclerView: RecyclerView
+    lateinit var container: FrameLayout
+
+    private val instrumentation = InstrumentationRegistry.getInstrumentation()!!
+
+    @Before
+    fun setup() {
+        activityRule.scenario.onActivity { activity ->
+            container = FrameLayout(activity)
+            container.layoutParams = ViewGroup.LayoutParams(
+                ViewGroup.LayoutParams.MATCH_PARENT,
+                ViewGroup.LayoutParams.MATCH_PARENT
+            )
+            activity.setContentView(container)
+            recyclerView = RecyclerView(activity)
+            setUpRecyclerView(recyclerView)
+            container.addView(recyclerView)
+        }
+    }
+
+    private fun setUpRecyclerView(rv: RecyclerView) {
+        activityRule.scenario.onActivity { activity ->
+            // Animators cause items to stick around and prevent clean rebinds, which we don't want,
+            // since it makes testing this less straightforward.
+            rv.itemAnimator = null
+            rv.layoutManager =
+                LinearLayoutManager(activity, RecyclerView.VERTICAL, false)
+            rv.layoutParams = FrameLayout.LayoutParams(
+                ViewGroup.LayoutParams.MATCH_PARENT, 100
+            )
+        }
+    }
+
+    @Test
+    fun allItemsChanged_noDisposals() {
+        lateinit var adapter: PoolingContainerTestAdapter
+        activityRule.scenario.onActivity { activity ->
+            adapter = PoolingContainerTestAdapter(activity, 100)
+            recyclerView.adapter = adapter
+        }
+        instrumentation.runOnMainSync { }
+
+        // All items created and bound
+        assertThat(adapter.creations).isEqualTo(100)
+        assertThat(adapter.compositions).isEqualTo(100)
+        assertThat(adapter.binds).isEqualTo(100)
+
+        instrumentation.runOnMainSync { adapter.notifyItemRangeChanged(0, 100) }
+        instrumentation.runOnMainSync { }
+
+        // All items changed: no new creations, but all items rebound
+        assertThat(adapter.creations).isEqualTo(100)
+        assertThat(adapter.compositions).isEqualTo(100)
+        assertThat(adapter.releases).isEqualTo(0)
+        assertThat(adapter.binds).isEqualTo(200)
+    }
+
+    @Test
+    fun viewDiscarded_allDisposed() {
+        lateinit var adapter: PoolingContainerTestAdapter
+        activityRule.scenario.onActivity { activity ->
+            adapter = PoolingContainerTestAdapter(activity, 100)
+            recyclerView.adapter = adapter
+        }
+
+        instrumentation.runOnMainSync { }
+        assertThat(adapter.creations).isEqualTo(100)
+        assertThat(adapter.compositions).isEqualTo(100)
+        assertThat(adapter.releases).isEqualTo(0)
+
+        instrumentation.runOnMainSync { container.removeAllViews() }
+        assertThat(adapter.releases).isEqualTo(100)
+    }
+
+    @Test
+    fun reattachedAndDetached_disposedTwice() {
+        lateinit var adapter: PoolingContainerTestAdapter
+
+        activityRule.scenario.onActivity { activity ->
+            adapter = PoolingContainerTestAdapter(activity, 100)
+            recyclerView.adapter = adapter
+        }
+        instrumentation.runOnMainSync { }
+
+        // Initially added: all items created, no disposals
+        assertThat(adapter.creations).isEqualTo(100)
+        assertThat(adapter.compositions).isEqualTo(100)
+        assertThat(adapter.releases).isEqualTo(0)
+
+        instrumentation.runOnMainSync { container.removeAllViews() }
+
+        // Removed: all items disposed
+        assertThat(adapter.releases).isEqualTo(100)
+
+        activityRule.scenario.onActivity { container.addView(recyclerView) }
+
+        // Re-added: no new disposals, no new creations, all items recomposed
+        assertThat(adapter.creations).isEqualTo(100)
+        assertThat(adapter.compositions).isEqualTo(200)
+        assertThat(adapter.releases).isEqualTo(100)
+
+        activityRule.scenario.onActivity { container.removeAllViews() }
+
+        // Removed again: all items disposed a second time
+        assertThat(adapter.releases).isEqualTo(200)
+    }
+
+    @Test
+    fun poolReplaced_allDisposed() = runBlocking {
+        lateinit var adapter: PoolingContainerTestAdapter
+        activityRule.scenario.onActivity { activity ->
+            adapter = PoolingContainerTestAdapter(activity, 100, 2)
+            val pool = recyclerView.recycledViewPool
+            for (i in 0..9) {
+                pool.setMaxRecycledViews(i, 10)
+            }
+            recyclerView.adapter = adapter
+        }
+        instrumentation.runOnMainSync { }
+        assertThat(recyclerView.height).isEqualTo(100)
+        assertThat(adapter.creations).isEqualTo(50)
+
+        // Scroll to put some views into the shared pool
+        instrumentation.runOnMainSync {
+            recyclerView.smoothScrollBy(0, 100)
+        }
+
+        recyclerView.awaitScrollIdle()
+
+        assertThat(adapter.creations).isEqualTo(100)
+        assertThat(adapter.compositions).isEqualTo(100)
+        assertThat(adapter.releases).isEqualTo(0)
+
+        // Swap pool, confirm contents of old pool are disposed
+        instrumentation.runOnMainSync {
+            recyclerView.setRecycledViewPool(RecyclerView.RecycledViewPool())
+        }
+        activityRule.scenario.onActivity { container.removeAllViews() }
+        assertThat(adapter.releases).isEqualTo(100)
+    }
+
+    @Test
+    fun poolCleared_allDisposed() = runBlocking {
+        lateinit var adapter: PoolingContainerTestAdapter
+        activityRule.scenario.onActivity { activity ->
+            adapter = PoolingContainerTestAdapter(activity, 100, 2)
+        }
+        instrumentation.runOnMainSync {
+            val pool = recyclerView.recycledViewPool
+            for (i in 0..9) {
+                pool.setMaxRecycledViews(i, 10)
+            }
+            recyclerView.adapter = adapter
+        }
+
+        instrumentation.runOnMainSync { }
+
+        // Scroll to put some views into the shared pool
+        instrumentation.runOnMainSync {
+            recyclerView.smoothScrollBy(0, 100)
+        }
+
+        recyclerView.awaitScrollIdle()
+
+        assertThat(adapter.creations).isEqualTo(100)
+        assertThat(adapter.compositions).isEqualTo(100)
+        assertThat(adapter.releases).isEqualTo(0)
+
+        // Clear pool, remove from Activity, confirm contents of pool are disposed
+        instrumentation.runOnMainSync {
+            recyclerView.recycledViewPool.clear()
+            container.removeAllViews()
+        }
+        assertThat(adapter.releases).isEqualTo(100)
+    }
+
+    @Test
+    fun setAdapter_allDisposed() {
+        // Replacing the adapter when it is the only adapter attached to the pool means that
+        // the pool is cleared, so everything should be disposed.
+        doSetOrSwapTest(expectedDisposalsAfterBlock = 100) {
+            recyclerView.adapter = it
+        }
+    }
+
+    @Test
+    fun swapAdapter_noDisposals() {
+        doSetOrSwapTest(expectedDisposalsAfterBlock = 0) {
+            recyclerView.swapAdapter(it, false)
+        }
+    }
+
+    @Test
+    fun setAdapterToNull_allDisposed() {
+        doSetOrSwapTest(expectedDisposalsAfterBlock = 100) {
+            recyclerView.adapter = null
+        }
+    }
+
+    private fun doSetOrSwapTest(
+        expectedDisposalsAfterBlock: Int,
+        setOrSwapBlock: (PoolingContainerTestAdapter) -> Unit,
+    ) = runBlocking {
+        lateinit var adapter: PoolingContainerTestAdapter
+        lateinit var adapter2: PoolingContainerTestAdapter
+        activityRule.scenario.onActivity { activity ->
+            adapter = PoolingContainerTestAdapter(activity, 100, 2)
+            adapter2 = PoolingContainerTestAdapter(activity, 100, 2)
+            val pool = recyclerView.recycledViewPool
+            for (i in 0..9) {
+                pool.setMaxRecycledViews(i, 10)
+            }
+            recyclerView.adapter = adapter
+        }
+        instrumentation.runOnMainSync { }
+
+        // Scroll to put some views into the shared pool
+        withContext(Dispatchers.Main) {
+            recyclerView.smoothScrollBy(0, 100)
+        }
+        recyclerView.awaitScrollIdle()
+
+        assertThat(adapter.creations).isEqualTo(100)
+        assertThat(adapter.compositions).isEqualTo(100)
+        assertThat(adapter.releases).isEqualTo(0)
+
+        withContext(Dispatchers.Main) {
+            // Set or swap adapter, confirm expected results
+            setOrSwapBlock(adapter2)
+        }
+
+        assertThat(adapter.releases + adapter2.releases).isEqualTo(expectedDisposalsAfterBlock)
+
+        // Remove the RecyclerView, confirm everything is disposed
+        instrumentation.runOnMainSync { container.removeAllViews() }
+        assertThat(adapter.releases).isEqualTo(100)
+        assertThat(adapter2.creations).isEqualTo(adapter2.releases)
+        assertThat(adapter2.compositions).isEqualTo(adapter2.creations)
+        // ...and that nothing unexpected happened
+        assertThat(adapter.creations).isEqualTo(100)
+        assertThat(adapter.compositions).isEqualTo(100)
+    }
+
+    @Test
+    fun overflowingScrapTest() {
+        lateinit var adapter: PoolingContainerTestAdapter
+        activityRule.scenario.onActivity { activity ->
+            adapter = PoolingContainerTestAdapter(activity, 100)
+            recyclerView.adapter = adapter
+            val pool = recyclerView.recycledViewPool
+            for (i in 0..9) {
+                // We'll generate more scrap views of each type than this
+                pool.setMaxRecycledViews(i, 3)
+            }
+        }
+
+        instrumentation.runOnMainSync { }
+
+        // All items created and bound
+        assertThat(adapter.creations).isEqualTo(100)
+        assertThat(adapter.compositions).isEqualTo(100)
+        assertThat(adapter.binds).isEqualTo(100)
+
+        // Simulate removing and re-adding the first 100 items
+        instrumentation.runOnMainSync {
+            adapter.notifyItemRangeRemoved(0, 100)
+            adapter.notifyItemRangeInserted(0, 100)
+        }
+        instrumentation.runOnMainSync { }
+
+        assertThat(adapter.creations).isEqualTo(200)
+        assertThat(adapter.compositions).isEqualTo(200)
+
+        instrumentation.runOnMainSync { container.removeAllViews() }
+
+        // Make sure that all views were disposed, including those that never made it to the pool
+        assertThat(adapter.releases).isEqualTo(200)
+    }
+
+    @Test
+    fun sharedViewPool() = runBlocking {
+        val itemViewCacheSize = 2
+        instrumentation.runOnMainSync {
+            container.removeAllViews()
+        }
+        val lp1 = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0, 1f)
+        val lp2 = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0, 1f)
+        val rv1: RecyclerView = recyclerView.also { it.layoutParams = lp1 }
+        lateinit var rv2: RecyclerView
+        lateinit var testContainer: LinearLayout
+        val pool = RecyclerView.RecycledViewPool()
+        lateinit var adapter1: PoolingContainerTestAdapter
+        lateinit var adapter2: PoolingContainerTestAdapter
+        activityRule.scenario.onActivity { activity ->
+            adapter1 = PoolingContainerTestAdapter(activity, 100, 10)
+            adapter2 = PoolingContainerTestAdapter(activity, 100, 10)
+
+            rv2 = RecyclerView(activity).also { setUpRecyclerView(it); it.layoutParams = lp2 }
+            testContainer = LinearLayout(activity).also {
+                it.layoutParams = FrameLayout.LayoutParams(
+                    ViewGroup.LayoutParams.MATCH_PARENT,
+                    200
+                )
+                it.orientation = LinearLayout.VERTICAL
+            }
+            rv1.setItemViewCacheSize(itemViewCacheSize)
+            rv2.setItemViewCacheSize(itemViewCacheSize)
+            rv1.adapter = adapter1
+            rv2.adapter = adapter2
+            testContainer.addView(rv1)
+            testContainer.addView(rv2)
+            container.addView(testContainer)
+            for (i in 0..9) {
+                pool.setMaxRecycledViews(i, 10)
+            }
+            rv1.setRecycledViewPool(pool)
+            rv2.setRecycledViewPool(pool)
+        }
+
+        instrumentation.runOnMainSync { }
+        assertThat(adapter1.creations).isEqualTo(10)
+        assertThat(adapter1.compositions).isEqualTo(10)
+
+        // Scroll to put some views into the shared pool
+        instrumentation.runOnMainSync {
+            rv1.smoothScrollBy(0, 100)
+        }
+        rv1.awaitScrollIdle()
+
+        // The RV keeps a couple items in its view cache before returning them to the pool
+        val expectedRecycledItems = 10 - itemViewCacheSize
+        assertThat(pool.getRecycledViewCount(0)).isEqualTo(expectedRecycledItems)
+
+        // Nothing should have been disposed yet, everything should have gone to the pool
+        assertThat(adapter1.releases + adapter2.releases).isEqualTo(0)
+
+        val adapter1Creations = adapter1.creations
+        // There were 10, we scrolled 10 more into view, plus maybe prefetching
+        assertThat(adapter1Creations).isAtLeast(20)
+        val adapter1Compositions = adapter1.compositions
+        // Currently, prefetched views don't end up being composed, but that could change
+        assertThat(adapter1Compositions).isAtLeast(20)
+
+        // Remove the first RecyclerView
+        instrumentation.runOnMainSync {
+            testContainer.removeView(rv1)
+        }
+        instrumentation.runOnMainSync { } // get the relayout
+
+        // After the first RecyclerView is removed, we expect everything it created to be disposed,
+        // *except* for what's in the shared pool
+        assertThat(adapter1.creations).isEqualTo(adapter1Creations) // just checking
+        assertThat(adapter1Compositions).isEqualTo(adapter1.compositions) // just checking
+        assertThat(pool.size).isEqualTo(expectedRecycledItems)
+        // We need to check compositions, not creations, because if it's not composed, it won't be
+        // disposed.
+        assertThat(adapter1.releases).isEqualTo(adapter1.compositions - expectedRecycledItems)
+        assertThat(adapter2.creations).isEqualTo(20) // it's twice as tall with rv1 gone
+        assertThat(adapter2.compositions).isEqualTo(20) // it's twice as tall with rv1 gone
+        assertThat(adapter2.releases).isEqualTo(0) // it hasn't scrolled
+
+        instrumentation.runOnMainSync {
+            testContainer.removeView(rv2)
+        }
+        assertThat(adapter1.creations).isEqualTo(adapter1Creations) // just to be really sure...
+        // double-check that nothing weird happened
+        assertThat(adapter1.compositions).isEqualTo(20)
+        // at this point they're all off
+        assertThat(adapter1.releases).isEqualTo(adapter1.compositions)
+        assertThat(adapter2.creations).isEqualTo(20) // again, just checking
+        assertThat(adapter2.compositions).isEqualTo(20) // again, just checking
+        assertThat(adapter2.releases).isEqualTo(20) // all of these should be gone too
+    }
+
+    @Test
+    fun animationTest() = runBlocking {
+        animationRule.setAnimationDurationScale(1f)
+
+        withContext(Dispatchers.Main) {
+            recyclerView.itemAnimator = DefaultItemAnimator()
+        }
+
+        lateinit var adapter: PoolingContainerTestAdapter
+        activityRule.scenario.onActivity { activity ->
+            adapter = PoolingContainerTestAdapter(activity, 100, itemHeightPx = 2)
+            recyclerView.adapter = adapter
+        }
+        awaitFrame()
+
+        // All this needs to be on the main thread so that the animation doesn't progress and lead
+        // to race conditions.
+        withContext(Dispatchers.Main) {
+            // Remove all onscreen items
+            adapter.items = 50
+            adapter.notifyItemRangeRemoved(0, 50)
+
+            // For some reason, one frame isn't enough
+            awaitFrame()
+            awaitFrame()
+
+            // Animation started: 50 new items created, existing 50 animating out
+            // and so they can't be released yet
+            assertThat(adapter.releases).isEqualTo(0)
+            assertThat(adapter.creations).isEqualTo(100)
+            assertThat(adapter.compositions).isEqualTo(100)
+
+            // After the animation, the original 50 are either disposed or in the pool
+            recyclerView.awaitItemAnimationsComplete()
+            // Assumption check: if they're *all* in the pool,
+            // this test isn't very useful and we need to make the pool smaller for this test.
+            assertThat(adapter.releases).isGreaterThan(0)
+            assertThat(adapter.releases).isEqualTo(50 - recyclerView.recycledViewPool.size)
+            assertThat(adapter.creations).isEqualTo(100)
+            assertThat(adapter.compositions).isEqualTo(100)
+        }
+    }
+}
+
+class PoolingContainerTestAdapter(
+    val context: Context,
+    var items: Int,
+    private val itemHeightPx: Int = 1
+) : RecyclerView.Adapter<PoolingContainerTestAdapter.ViewHolder>() {
+    init {
+        if (items > MaxItemsInAnyTest) {
+            throw IllegalArgumentException(
+                "$items > $MaxItemsInAnyTest, increase MaxItemsInAnyTest"
+            )
+        }
+    }
+
+    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
+
+    var creations = 0
+    var compositions = 0
+    var binds = 0
+    var releases = 0
+
+    @RequiresApi(Build.VERSION_CODES.KITKAT)
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
+        val view = DisposalCountingComposeView(context, this)
+        view.layoutParams =
+            RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, itemHeightPx)
+
+        creations++
+
+        return ViewHolder(view)
+    }
+
+    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+        binds++
+    }
+
+    override fun getItemViewType(position: Int): Int {
+        return position / 10
+    }
+
+    override fun getItemCount(): Int = items
+}
+
+class DisposalCountingComposeView(
+    context: Context,
+    private val adapter: PoolingContainerTestAdapter
+) : AbstractComposeView(context) {
+    @Composable
+    override fun Content() {
+        DisposableEffect(true) {
+            adapter.compositions++
+            onDispose {
+                adapter.releases++
+            }
+        }
+    }
+}
+
+private suspend fun RecyclerView.awaitScrollIdle() {
+    val rv = this
+    withContext(Dispatchers.Main) {
+        suspendCancellableCoroutine<Unit> { continuation ->
+            val listener = object : RecyclerView.OnScrollListener() {
+                override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
+                    if (newState == RecyclerView.SCROLL_STATE_IDLE) {
+                        continuation.resume(Unit)
+                    }
+                }
+            }
+
+            rv.addOnScrollListener(listener)
+
+            continuation.invokeOnCancellation { rv.removeOnScrollListener(listener) }
+
+            if (rv.scrollState == RecyclerView.SCROLL_STATE_IDLE) {
+                continuation.resume(Unit)
+            }
+        }
+    }
+}
+
+private suspend fun RecyclerView.awaitItemAnimationsComplete() {
+    val rv = this
+    withContext(Dispatchers.Main) {
+        suspendCancellableCoroutine<Unit> { continuation ->
+            val animator = rv.itemAnimator ?: throw IllegalStateException(
+                "awaitItemAnimationsComplete() was called on a RecyclerView with no ItemAnimator." +
+                    " This may have been unintended."
+            )
+            animator.isRunning { continuation.resume(Unit) }
+        }
+    }
+}
+
+private val RecyclerView.RecycledViewPool.size: Int
+    get() {
+        var items = 0
+        for (type in 0..(MaxItemsInAnyTest - 1) / 10) {
+            items += this.getRecycledViewCount(type)
+        }
+        return items
+    }
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/ActivityWithInsets.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/ActivityWithInsets.kt
new file mode 100644
index 0000000..be8f248
--- /dev/null
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/ActivityWithInsets.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.compose.ui.window
+
+import android.os.Bundle
+import androidx.activity.ComponentActivity
+import androidx.core.view.WindowCompat
+
+class ActivityWithInsets : ComponentActivity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        WindowCompat.setDecorFitsSystemWindows(window, false)
+        super.onCreate(savedInstanceState)
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/DialogScreenshotTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/DialogScreenshotTest.kt
index bb15949..8fbb979 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/DialogScreenshotTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/DialogScreenshotTest.kt
@@ -34,6 +34,7 @@
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
 import androidx.test.screenshot.AndroidXScreenshotTestRule
+import androidx.test.screenshot.matchers.MSSIMMatcher
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -71,7 +72,7 @@
     fun dialogWithElevation() {
         rule.setContent {
             Dialog(onDismissRequest = {}) {
-                val elevation = with(LocalDensity.current) { 16.dp.toPx() }
+                val elevation = with(LocalDensity.current) { 8.dp.toPx() }
                 Box(
                     Modifier
                         .graphicsLayer(
@@ -87,6 +88,10 @@
 
         rule.onNode(isDialog())
             .captureToImage()
-            .assertAgainstGolden(screenshotRule, "dialogWithElevation")
+            .assertAgainstGolden(
+                screenshotRule,
+                "dialogWithElevation",
+                matcher = MSSIMMatcher(threshold = 0.999)
+            )
     }
 }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/DialogWithInsetsTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/DialogWithInsetsTest.kt
new file mode 100644
index 0000000..e761e7b
--- /dev/null
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/DialogWithInsetsTest.kt
@@ -0,0 +1,138 @@
+/*
+ * 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.window
+
+import android.view.View
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.WindowInsets
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.ime
+import androidx.compose.foundation.layout.imePadding
+import androidx.compose.material.TextField
+import androidx.compose.runtime.SideEffect
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.background
+import androidx.compose.ui.focus.FocusRequester
+import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.layout.onSizeChanged
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalView
+import androidx.compose.ui.test.junit4.createAndroidComposeRule
+import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.core.graphics.Insets
+import androidx.core.view.WindowInsetsCompat
+import androidx.core.view.WindowInsetsControllerCompat
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import org.junit.Assert.assertNotEquals
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class DialogWithInsetsTest {
+    @get:Rule
+    val rule = createAndroidComposeRule<ActivityWithInsets>()
+
+    /**
+     * Make sure that insets are available in the Dialog.
+     */
+    @OptIn(ExperimentalComposeUiApi::class)
+    @Test
+    fun dialogSupportsWindowInsets() {
+        var dialogSize = IntSize.Zero
+        val focusRequester = FocusRequester()
+        var imeInsets = Insets.NONE
+        lateinit var controller: WindowInsetsControllerCompat
+        rule.setContent {
+            Dialog(
+                onDismissRequest = {},
+                properties = DialogProperties(decorFitsSystemWindows = false)
+            ) {
+                val view = LocalView.current
+                SideEffect {
+                    val dialogWindowProvider = findDialogWindowProviderInParent(view)
+                    if (dialogWindowProvider != null) {
+                        controller = WindowInsetsControllerCompat(dialogWindowProvider.window, view)
+                    }
+                }
+                val density = LocalDensity.current
+                imeInsets = Insets.of(
+                    WindowInsets.ime.getLeft(density, LayoutDirection.Ltr),
+                    WindowInsets.ime.getTop(density),
+                    WindowInsets.ime.getRight(density, LayoutDirection.Ltr),
+                    WindowInsets.ime.getBottom(density),
+                )
+                Box(
+                    Modifier
+                        .fillMaxSize()
+                        .background(Color.White)
+                        .imePadding()
+                ) {
+                    Box(
+                        Modifier
+                            .fillMaxSize()
+                            .onSizeChanged {
+                                dialogSize = it
+                            }) {
+                        TextField(
+                            value = "Hello World",
+                            onValueChange = { },
+                            modifier = Modifier
+                                .focusRequester(focusRequester)
+                                .align(Alignment.Center)
+                        )
+                    }
+                }
+            }
+        }
+        rule.waitForIdle()
+
+        val originalSize = dialogSize
+
+        // show the IME
+        rule.runOnUiThread {
+            focusRequester.requestFocus()
+        }
+
+        rule.waitForIdle()
+        rule.runOnUiThread {
+            controller.show(WindowInsetsCompat.Type.ime())
+        }
+
+        rule.waitUntil {
+            dialogSize != originalSize
+        }
+        rule.waitForIdle()
+        assertNotEquals(Insets.NONE, imeInsets)
+    }
+
+    private fun findDialogWindowProviderInParent(view: View): DialogWindowProvider? {
+        if (view is DialogWindowProvider) {
+            return view
+        }
+        val parent = view.parent ?: return null
+        if (parent is View) {
+            return findDialogWindowProviderInParent(parent)
+        }
+        return null
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt
index aec4d3c..9440289 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
@@ -122,6 +122,7 @@
 import androidx.compose.ui.node.LayoutNode.UsageByParent
 import androidx.compose.ui.node.LayoutNodeDrawScope
 import androidx.compose.ui.node.MeasureAndLayoutDelegate
+import androidx.compose.ui.modifier.ModifierLocalManager
 import androidx.compose.ui.node.OwnedLayer
 import androidx.compose.ui.node.Owner
 import androidx.compose.ui.node.OwnerSnapshotObserver
@@ -224,13 +225,13 @@
 
     override val root = LayoutNode().also {
         it.measurePolicy = RootMeasurePolicy
+        it.density = density
         // Composed modifiers cannot be added here directly
         it.modifier = Modifier
             .then(semanticsModifier)
             .then(rotaryInputModifier)
             .then(_focusManager.modifier)
             .then(keyInputModifier)
-        it.density = density
     }
 
     override val rootForTest: RootForTest = this
@@ -433,6 +434,8 @@
     )
     override val inputModeManager: InputModeManager get() = _inputModeManager
 
+    override val modifierLocalManager: ModifierLocalManager = ModifierLocalManager(this)
+
     /**
      * Provide textToolbar to the user, for text-related operation. Use the Android version of
      * floating toolbar(post-M) and primary toolbar(pre-M).
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 b7ff6d8..28d39d8 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
@@ -53,6 +53,9 @@
 import androidx.compose.ui.node.HitTestResult
 import androidx.compose.ui.node.LayoutNode
 import androidx.compose.ui.node.OwnerScope
+import androidx.compose.ui.node.SemanticsModifierNode
+import androidx.compose.ui.node.collapsedSemanticsConfiguration
+import androidx.compose.ui.node.requireLayoutNode
 import androidx.compose.ui.platform.accessibility.hasCollectionInfo
 import androidx.compose.ui.platform.accessibility.setCollectionInfo
 import androidx.compose.ui.platform.accessibility.setCollectionItemInfo
@@ -69,7 +72,6 @@
 import androidx.compose.ui.semantics.SemanticsOwner
 import androidx.compose.ui.semantics.SemanticsProperties
 import androidx.compose.ui.semantics.SemanticsPropertiesAndroid
-import androidx.compose.ui.semantics.SemanticsEntity
 import androidx.compose.ui.semantics.getOrNull
 import androidx.compose.ui.semantics.outerSemantics
 import androidx.compose.ui.state.ToggleableState
@@ -387,6 +389,15 @@
         info: AccessibilityNodeInfoCompat,
         semanticsNode: SemanticsNode
     ) {
+        val isUnmergedLeafNode =
+            !semanticsNode.isFake &&
+            semanticsNode.replacedChildren.isEmpty() &&
+            semanticsNode.layoutNode.findClosestParentNode {
+                it.outerSemantics
+                    ?.collapsedSemanticsConfiguration()
+                    ?.isMergingSemanticsOfDescendants == true
+            } == null
+
         // set classname
         info.className = ClassName
         val role = semanticsNode.unmergedConfig.getOrNull(SemanticsProperties.Role)
@@ -403,21 +414,13 @@
                         Role.Image -> "android.widget.ImageView"
                         else -> null
                     }
-                    if (role != Role.Image) {
+                    // Images are often minor children of larger widgets, so we only want to
+                    // announce the Image role when the image itself is focusable.
+                    if (role != Role.Image ||
+                        isUnmergedLeafNode ||
+                        semanticsNode.unmergedConfig.isMergingSemanticsOfDescendants
+                    ) {
                         info.className = className
-                    } else {
-                        // If ancestor of the image is a merging container (e.g. IconButton), we
-                        // don't want to announce Image role to avoid "Favorite, Image, Button"
-                        val ancestor = semanticsNode.layoutNode.findClosestParentNode { parent ->
-                            parent.outerSemantics
-                                ?.collapsedSemanticsConfiguration()
-                                ?.isMergingSemanticsOfDescendants == true
-                        }
-                        if (ancestor == null ||
-                            semanticsNode.unmergedConfig.isMergingSemanticsOfDescendants
-                        ) {
-                            info.className = className
-                        }
                     }
                 }
             }
@@ -522,10 +525,6 @@
             )?.firstOrNull()
         }
 
-        if (semanticsNode.unmergedConfig.isMergingSemanticsOfDescendants) {
-            info.isScreenReaderFocusable = true
-        }
-
         // Map testTag to resourceName if testTagsAsResourceId == true (which can be set by an ancestor)
         val testTag = semanticsNode.unmergedConfig.getOrNull(SemanticsProperties.TestTag)
         if (testTag != null) {
@@ -570,9 +569,9 @@
         val wrapperToCheckTransparency = if (semanticsNode.isFake) {
             // when node is fake, its parent that is the original semantics node should define the
             // alpha value
-            semanticsNode.parent?.findWrapperToGetBounds()
+            semanticsNode.parent?.findCoordinatorToGetBounds()
         } else {
-            semanticsNode.findWrapperToGetBounds()
+            semanticsNode.findCoordinatorToGetBounds()
         }
         val isTransparent = wrapperToCheckTransparency?.isTransparent() ?: false
         info.isVisibleToUser = !isTransparent &&
@@ -919,6 +918,13 @@
                 labelToActionId.put(virtualViewId, currentLabelToActionId)
             }
         }
+
+        val isSpeakingNode = info.contentDescription != null || info.text != null ||
+            info.hintText != null || info.stateDescription != null || info.isCheckable
+
+        info.isScreenReaderFocusable =
+            semanticsNode.unmergedConfig.isMergingSemanticsOfDescendants ||
+            isUnmergedLeafNode && isSpeakingNode
     }
 
     /** Set the error text for this node */
@@ -1536,30 +1542,34 @@
     internal fun hitTestSemanticsAt(x: Float, y: Float): Int {
         view.measureAndLayout()
 
-        val hitSemanticsEntities = HitTestResult<SemanticsEntity>()
+        val hitSemanticsEntities = HitTestResult<SemanticsModifierNode>()
         view.root.hitTestSemantics(
             pointerPosition = Offset(x, y),
             hitSemanticsEntities = hitSemanticsEntities
         )
 
-        val wrapper = hitSemanticsEntities.lastOrNull()?.layoutNode?.outerSemantics
+        val wrapper = hitSemanticsEntities.lastOrNull()?.requireLayoutNode()?.outerSemantics
         var virtualViewId = InvalidId
         if (wrapper != null) {
 
             // The node below is not added to the tree; it's a wrapper around outer semantics to
             // use the methods available to the SemanticsNode
             val semanticsNode = SemanticsNode(wrapper, false)
-            val wrapperToCheckAlpha = semanticsNode.findWrapperToGetBounds()
+            val wrapperToCheckAlpha = semanticsNode.findCoordinatorToGetBounds()
 
             // Do not 'find' invisible nodes when exploring by touch. This will prevent us from
             // sending events for invisible nodes
             if (!semanticsNode.unmergedConfig.contains(SemanticsProperties.InvisibleToUser) &&
                 !wrapperToCheckAlpha.isTransparent()
             ) {
-                val androidView = view.androidViewsHandler.layoutNodeToHolder[wrapper.layoutNode]
+                val layoutNode = wrapper.requireLayoutNode()
+                val androidView = view
+                    .androidViewsHandler
+                    .layoutNodeToHolder[layoutNode]
                 if (androidView == null) {
-                    virtualViewId =
-                        semanticsNodeIdToAccessibilityVirtualNodeId(wrapper.layoutNode.semanticsId)
+                    virtualViewId = semanticsNodeIdToAccessibilityVirtualNodeId(
+                        layoutNode.semanticsId
+                    )
                 }
             }
         }
@@ -1696,6 +1706,7 @@
         }
     }
 
+    @OptIn(ExperimentalComposeUiApi::class)
     private fun sendSubtreeChangeAccessibilityEvents(
         layoutNode: LayoutNode,
         subtreeChangedSemanticsNodesIds: ArraySet<Int>
@@ -1720,7 +1731,7 @@
                     ?.isMergingSemanticsOfDescendants == true
             }?.outerSemantics?.let { semanticsWrapper = it }
         }
-        val id = semanticsWrapper.layoutNode.semanticsId
+        val id = semanticsWrapper.requireLayoutNode().semanticsId
         if (!subtreeChangedSemanticsNodesIds.add(id)) {
             return
         }
@@ -1855,8 +1866,9 @@
                                     AccessibilityEvent.TYPE_VIEW_SELECTED
                                 )
                                 // Here we use the merged node
+                                @OptIn(ExperimentalComposeUiApi::class)
                                 val mergedNode =
-                                    SemanticsNode(newNode.outerSemanticsEntity, true)
+                                    SemanticsNode(newNode.outerSemanticsNode, true)
                                 val contentDescription = mergedNode.config.getOrNull(
                                     SemanticsProperties.ContentDescription
                                 )?.fastJoinToString(",")
@@ -2499,6 +2511,7 @@
 private val SemanticsNode.isTextField get() = this.unmergedConfig.contains(SemanticsActions.SetText)
 private val SemanticsNode.isRtl get() = layoutInfo.layoutDirection == LayoutDirection.Rtl
 
+@OptIn(ExperimentalComposeUiApi::class)
 private fun SemanticsNode.excludeLineAndPageGranularities(): Boolean {
     // text field that is not in focus
     if (isTextField && unmergedConfig.getOrNull(SemanticsProperties.Focused) != true) return true
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidCompositionLocals.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidCompositionLocals.android.kt
index ef684ae..1f2a4b3 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidCompositionLocals.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidCompositionLocals.android.kt
@@ -135,14 +135,15 @@
     configuration: Configuration?
 ): ImageVectorCache {
     val imageVectorCache = remember { ImageVectorCache() }
-    var currentConfiguration = remember { configuration }
+    val currentConfiguration: Configuration = remember {
+        Configuration().apply { configuration?.let { this.setTo(it) } }
+    }
     val callbacks = remember {
         object : ComponentCallbacks2 {
             override fun onConfigurationChanged(configuration: Configuration) {
-                // If there is no configuration, assume all flags have changed.
-                val changedFlags = currentConfiguration?.updateFrom(configuration) ?: -0x1
+                val changedFlags = currentConfiguration.updateFrom(configuration)
                 imageVectorCache.prune(changedFlags)
-                currentConfiguration = configuration
+                currentConfiguration.setTo(configuration)
             }
 
             override fun onLowMemory() {
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/PainterResources.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/PainterResources.android.kt
index f97b970..6158d92 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/PainterResources.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/PainterResources.android.kt
@@ -56,17 +56,17 @@
 @Composable
 fun painterResource(@DrawableRes id: Int): Painter {
     val context = LocalContext.current
-    val res = context.resources
+    val res = resources()
     val value = remember { TypedValue() }
     res.getValue(id, value, true)
     val path = value.string
     // Assume .xml suffix implies loading a VectorDrawable resource
     return if (path?.endsWith(".xml") == true) {
-        val imageVector = loadVectorResource(context.theme, res, id)
+        val imageVector = loadVectorResource(context.theme, res, id, value.changingConfigurations)
         rememberVectorPainter(imageVector)
     } else {
         // Otherwise load the bitmap resource
-        val imageBitmap = remember(path, id) {
+        val imageBitmap = remember(path, id, context.theme) {
             loadImageBitmapResource(res, id)
         }
         BitmapPainter(imageBitmap)
@@ -82,7 +82,8 @@
 private fun loadVectorResource(
     theme: Resources.Theme,
     res: Resources,
-    id: Int
+    id: Int,
+    changingConfigurations: Int
 ): ImageVector {
     val imageVectorCache = LocalImageVectorCache.current
     val key = ImageVectorCache.Key(theme, id)
@@ -92,7 +93,7 @@
         if (parser.seekToStartTag().name != "vector") {
             throw IllegalArgumentException(errorMessage)
         }
-        imageVectorEntry = loadVectorResourceInner(theme, res, parser)
+        imageVectorEntry = loadVectorResourceInner(theme, res, parser, changingConfigurations)
         imageVectorCache[key] = imageVectorEntry
     }
     return imageVectorEntry.imageVector
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/Resources.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/Resources.android.kt
new file mode 100644
index 0000000..d034198
--- /dev/null
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/Resources.android.kt
@@ -0,0 +1,34 @@
+/*
+ * 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.res
+
+import android.content.res.Resources
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.ui.platform.LocalConfiguration
+import androidx.compose.ui.platform.LocalContext
+
+/**
+ * A composable function that returns the [Resources]. It will be recomposed when [Configuration]
+ * gets updated.
+ */
+@Composable
+@ReadOnlyComposable
+internal fun resources(): Resources {
+    LocalConfiguration.current
+    return LocalContext.current.resources
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/StringResources.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/StringResources.android.kt
index 57f3561..261616f 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/StringResources.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/StringResources.android.kt
@@ -16,15 +16,12 @@
 
 package androidx.compose.ui.res
 
-import android.content.res.Resources
 import androidx.annotation.ArrayRes
 import androidx.annotation.PluralsRes
 import androidx.annotation.StringRes
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.ReadOnlyComposable
 import androidx.compose.ui.ExperimentalComposeUiApi
-import androidx.compose.ui.platform.LocalConfiguration
-import androidx.compose.ui.platform.LocalContext
 
 /**
  * Load a string resource.
@@ -96,14 +93,3 @@
     val resources = resources()
     return resources.getQuantityString(id, count, *formatArgs)
 }
-
-/**
- * A composable function that returns the [Resources]. It will be recomposed when [Configuration]
- * gets updated.
- */
-@Composable
-@ReadOnlyComposable
-private fun resources(): Resources {
-    LocalConfiguration.current
-    return LocalContext.current.resources
-}
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/VectorResources.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/VectorResources.android.kt
index 878f99c..e484aff 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/VectorResources.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/VectorResources.android.kt
@@ -19,6 +19,7 @@
 import android.content.res.Configuration
 import android.content.res.Resources
 import android.content.res.XmlResourceParser
+import android.util.TypedValue
 import android.util.Xml
 import androidx.annotation.DrawableRes
 import androidx.compose.runtime.Composable
@@ -46,9 +47,10 @@
 @Composable
 fun ImageVector.Companion.vectorResource(@DrawableRes id: Int): ImageVector {
     val context = LocalContext.current
-    val res = context.resources
+    val res = resources()
     val theme = context.theme
-    return remember(id) {
+
+    return remember(id, res, theme, res.configuration) {
         vectorResource(theme, res, id)
     }
 }
@@ -57,9 +59,18 @@
 fun ImageVector.Companion.vectorResource(
     theme: Resources.Theme? = null,
     res: Resources,
-    resId: Int,
-): ImageVector =
-    loadVectorResourceInner(theme, res, res.getXml(resId).apply { seekToStartTag() }).imageVector
+    resId: Int
+): ImageVector {
+    val value = TypedValue()
+    res.getValue(resId, value, true)
+
+    return loadVectorResourceInner(
+        theme,
+        res,
+        res.getXml(resId).apply { seekToStartTag() },
+        value.changingConfigurations
+    ).imageVector
+}
 
 /**
  * Helper method that parses a vector asset from the given [XmlResourceParser] position.
@@ -70,7 +81,8 @@
 internal fun loadVectorResourceInner(
     theme: Resources.Theme? = null,
     res: Resources,
-    parser: XmlResourceParser
+    parser: XmlResourceParser,
+    changingConfigurations: Int
 ): ImageVectorCache.ImageVectorEntry {
     val attrs = Xml.asAttributeSet(parser)
     val resourceParser = AndroidVectorParser(parser)
@@ -87,7 +99,7 @@
         )
         parser.next()
     }
-    return ImageVectorCache.ImageVectorEntry(builder.build(), resourceParser.config)
+    return ImageVectorCache.ImageVectorEntry(builder.build(), changingConfigurations)
 }
 
 /**
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidDialog.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidDialog.android.kt
index 48b889e..f7a7972 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidDialog.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidDialog.android.kt
@@ -19,6 +19,7 @@
 import android.app.Dialog
 import android.content.Context
 import android.graphics.Outline
+import android.os.Build
 import android.view.ContextThemeWrapper
 import android.view.MotionEvent
 import android.view.View
@@ -55,6 +56,7 @@
 import androidx.compose.ui.util.fastForEach
 import androidx.compose.ui.util.fastMap
 import androidx.compose.ui.util.fastMaxBy
+import androidx.core.view.WindowCompat
 import androidx.lifecycle.ViewTreeLifecycleOwner
 import androidx.lifecycle.ViewTreeViewModelStoreOwner
 import androidx.savedstate.findViewTreeSavedStateRegistryOwner
@@ -73,26 +75,38 @@
  * dialog's window.
  * @property usePlatformDefaultWidth Whether the width of the dialog's content should be limited to
  * the platform default, which is smaller than the screen width.
+ * @property decorFitsSystemWindows Sets [WindowCompat.setDecorFitsSystemWindows] value. Set to
+ * `false` to use WindowInsets. If `false`, the
+ * [soft input mode][WindowManager.LayoutParams.softInputMode] will be changed to
+ * [WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE] and `android:windowIsFloating` is
+ * set to `false` for Android [R][Build.VERSION_CODES.R] and earlier.
  */
 @Immutable
 class DialogProperties @ExperimentalComposeUiApi constructor(
     val dismissOnBackPress: Boolean = true,
     val dismissOnClickOutside: Boolean = true,
     val securePolicy: SecureFlagPolicy = SecureFlagPolicy.Inherit,
-    val usePlatformDefaultWidth: Boolean = true
+    val usePlatformDefaultWidth: Boolean = true,
+    decorFitsSystemWindows: Boolean = true
 ) {
+    @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET", "CanBePrimaryConstructorProperty")
+    @get:ExperimentalComposeUiApi
+    @ExperimentalComposeUiApi
+    val decorFitsSystemWindows: Boolean = decorFitsSystemWindows
     @OptIn(ExperimentalComposeUiApi::class)
     constructor(
         dismissOnBackPress: Boolean = true,
         dismissOnClickOutside: Boolean = true,
         securePolicy: SecureFlagPolicy = SecureFlagPolicy.Inherit,
-    ) : this (
+    ) : this(
         dismissOnBackPress = dismissOnBackPress,
         dismissOnClickOutside = dismissOnClickOutside,
         securePolicy = securePolicy,
-        usePlatformDefaultWidth = true
+        usePlatformDefaultWidth = true,
+        decorFitsSystemWindows = true
     )
 
+    @OptIn(ExperimentalComposeUiApi::class)
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is DialogProperties) return false
@@ -101,15 +115,18 @@
         if (dismissOnClickOutside != other.dismissOnClickOutside) return false
         if (securePolicy != other.securePolicy) return false
         if (usePlatformDefaultWidth != other.usePlatformDefaultWidth) return false
+        if (decorFitsSystemWindows != other.decorFitsSystemWindows) return false
 
         return true
     }
 
+    @OptIn(ExperimentalComposeUiApi::class)
     override fun hashCode(): Int {
         var result = dismissOnBackPress.hashCode()
         result = 31 * result + dismissOnClickOutside.hashCode()
         result = 31 * result + securePolicy.hashCode()
         result = 31 * result + usePlatformDefaultWidth.hashCode()
+        result = 31 * result + decorFitsSystemWindows.hashCode()
         return result
     }
 }
@@ -255,6 +272,7 @@
     }
 }
 
+@OptIn(ExperimentalComposeUiApi::class)
 private class DialogWrapper(
     private var onDismissRequest: () -> Unit,
     private var properties: DialogProperties,
@@ -267,20 +285,34 @@
      * [Window.setClipToOutline] is only available from 22+, but the style attribute exists on 21.
      * So use a wrapped context that sets this attribute for compatibility back to 21.
      */
-    ContextThemeWrapper(composeView.context, R.style.DialogWindowTheme)
+    ContextThemeWrapper(composeView.context,
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S || properties.decorFitsSystemWindows) {
+            R.style.DialogWindowTheme
+        } else {
+            R.style.FloatingDialogWindowTheme
+        }
+    )
 ),
     ViewRootForInspector {
 
     private val dialogLayout: DialogLayout
 
-    private val maxSupportedElevation = 30.dp
+    // On systems older than Android S, there is a bug in the surface insets matrix math used by
+    // elevation, so high values of maxSupportedElevation break accessibility services: b/232788477.
+    private val maxSupportedElevation = 8.dp
 
     override val subCompositionView: AbstractComposeView get() = dialogLayout
 
+    private val defaultSoftInputMode: Int
+
     init {
         val window = window ?: error("Dialog has no window")
+        defaultSoftInputMode =
+            window.attributes.softInputMode and WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST
         window.requestFeature(Window.FEATURE_NO_TITLE)
         window.setBackgroundDrawableResource(android.R.color.transparent)
+        @OptIn(ExperimentalComposeUiApi::class)
+        WindowCompat.setDecorFitsSystemWindows(window, properties.decorFitsSystemWindows)
         dialogLayout = DialogLayout(context, window).apply {
             // Set unique id for AbstractComposeView. This allows state restoration for the state
             // defined inside the Dialog via rememberSaveable()
@@ -365,6 +397,15 @@
         setSecurePolicy(properties.securePolicy)
         setLayoutDirection(layoutDirection)
         dialogLayout.usePlatformDefaultWidth = properties.usePlatformDefaultWidth
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
+            @OptIn(ExperimentalComposeUiApi::class)
+            if (properties.decorFitsSystemWindows) {
+                window?.setSoftInputMode(defaultSoftInputMode)
+            } else {
+                @Suppress("DEPRECATION")
+                window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
+            }
+        }
     }
 
     fun disposeComposition() {
@@ -408,4 +449,4 @@
             placeables.fastForEach { it.placeRelative(0, 0) }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidPopup.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidPopup.android.kt
index 1250af4..9702046 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidPopup.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidPopup.android.kt
@@ -406,7 +406,9 @@
         parentLayoutCoordinates != null && popupContentSize != null
     }
 
-    private val maxSupportedElevation = 30.dp
+    // On systems older than Android S, there is a bug in the surface insets matrix math used by
+    // elevation, so high values of maxSupportedElevation break accessibility services: b/232788477.
+    private val maxSupportedElevation = 8.dp
 
     // The window visible frame used for the last popup position calculation.
     private val previousWindowVisibleFrame = Rect()
diff --git a/compose/ui/ui/src/androidMain/res/values/styles.xml b/compose/ui/ui/src/androidMain/res/values/styles.xml
index 6fc708a..e1211d4 100644
--- a/compose/ui/ui/src/androidMain/res/values/styles.xml
+++ b/compose/ui/ui/src/androidMain/res/values/styles.xml
@@ -19,4 +19,13 @@
     <style name="DialogWindowTheme">
         <item name="android:windowClipToOutline">false</item>
     </style>
+    <!-- Style for decorFitsSystemWindows = false on API 30 and earlier. WindowInsets won't
+     be set on Dialogs without android:windowIsFloating set to false. -->
+    <style name="FloatingDialogWindowTheme">
+        <item name="android:windowClipToOutline">false</item>
+        <item name="android:dialogTheme">@style/FloatingDialogTheme</item>
+    </style>
+    <style name="FloatingDialogTheme">
+        <item name="android:windowIsFloating">false</item>
+    </style>
 </resources>
\ No newline at end of file
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/Expect.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/Expect.kt
new file mode 100644
index 0000000..17fbd15
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/Expect.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.compose.ui
+
+internal expect fun areObjectsOfSameType(a: Any, b: Any): Boolean
\ 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 2895f8f..def6e6d 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
@@ -18,6 +18,10 @@
 
 import androidx.compose.runtime.Stable
 import androidx.compose.ui.internal.JvmDefaultWithCompatibility
+import androidx.compose.ui.node.DelegatableNode
+import androidx.compose.ui.node.NodeCoordinator
+import androidx.compose.ui.node.NodeKind
+import androidx.compose.ui.node.requireOwner
 
 /**
  * An ordered, immutable collection of [modifier elements][Modifier.Element] that decorate or add
@@ -117,6 +121,72 @@
         override fun all(predicate: (Element) -> Boolean): Boolean = predicate(this)
     }
 
+    @ExperimentalComposeUiApi
+    abstract class Node : DelegatableNode {
+        @Suppress("LeakingThis")
+        final override var node: Node = this
+            private set
+        internal var kindSet: Int = 0
+        // NOTE: We use an aggregate mask that or's all of the type masks of the children of the
+        // chain so that we can quickly prune a subtree. This INCLUDES the kindSet of this node
+        // as well
+        internal var aggregateChildKindSet: Int = 0
+        internal var parent: Node? = null
+        internal var child: Node? = null
+        internal var coordinator: NodeCoordinator? = null
+            private set
+        var isAttached: Boolean = false
+            private set
+
+        internal open fun updateCoordinator(coordinator: NodeCoordinator?) {
+            this.coordinator = coordinator
+        }
+
+        @Suppress("NOTHING_TO_INLINE")
+        internal inline fun isKind(kind: NodeKind<*>) = kindSet and kind.mask != 0
+
+        internal fun attach() {
+            check(!isAttached)
+            check(coordinator != null)
+            isAttached = true
+            onAttach()
+            // TODO(lmr): run side effects?
+        }
+
+        internal fun detach() {
+            check(isAttached)
+            check(coordinator != null)
+            onDetach()
+            isAttached = false
+//            coordinator = null
+            // TODO(lmr): cancel jobs / side effects?
+        }
+
+        /**
+         * When called, `node` is guaranteed to be non-null. You can call sideEffect,
+         * coroutineScope, etc.
+         */
+        open fun onAttach() {}
+
+        /**
+         * This should be called right before the node gets removed from the list, so you should
+         * still be able to traverse inside of this method. Ideally we would not allow you to
+         * trigger side effects here.
+         */
+        open fun onDetach() {}
+
+        /**
+         *
+         */
+        fun sideEffect(effect: () -> Unit) {
+            requireOwner().registerOnEndApplyChangesListener(effect)
+        }
+
+        internal fun setAsDelegateTo(owner: Node) {
+            node = owner
+        }
+    }
+
     /**
      * The companion object `Modifier` is the empty, default, or starter [Modifier]
      * that contains no [elements][Element]. Use it to create a new [Modifier] using
@@ -145,8 +215,8 @@
  * a Modifier [outer] that wraps around the Modifier [inner].
  */
 class CombinedModifier(
-    private val outer: Modifier,
-    private val inner: Modifier
+    internal val outer: Modifier,
+    internal val inner: Modifier
 ) : Modifier {
     override fun <R> foldIn(initial: R, operation: (R, Modifier.Element) -> R): R =
         inner.foldIn(outer.foldIn(initial, operation), operation)
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusModifier.kt
index 8ec8245..1a71a0b9e 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusModifier.kt
@@ -42,7 +42,7 @@
 import androidx.compose.ui.modifier.ModifierLocalReadScope
 import androidx.compose.ui.modifier.ProvidableModifierLocal
 import androidx.compose.ui.modifier.modifierLocalOf
-import androidx.compose.ui.node.LayoutNodeWrapper
+import androidx.compose.ui.node.NodeCoordinator
 import androidx.compose.ui.node.OwnerScope
 import androidx.compose.ui.platform.InspectorInfo
 import androidx.compose.ui.platform.InspectorValueInfo
@@ -87,7 +87,7 @@
     var focusPropertiesModifier: FocusPropertiesModifier? = null
     val focusProperties: FocusProperties = FocusPropertiesImpl()
     var focusRequester: FocusRequesterModifierLocal? = null
-    var layoutNodeWrapper: LayoutNodeWrapper? = null
+    var coordinator: NodeCoordinator? = null
     var focusRequestedOnPlaced = false
 
     /**
@@ -111,7 +111,7 @@
                 if (newParent != parent) {
                     if (newParent == null) {
                         when (focusState) {
-                            Active, Captured -> layoutNodeWrapper?.layoutNode?.owner
+                            Active, Captured -> coordinator?.layoutNode?.owner
                                 ?.focusManager?.clearFocus(force = true)
                             ActiveParent, DeactivatedParent, Deactivated, Inactive -> {
                                 // do nothing.
@@ -167,8 +167,8 @@
         get() = this
 
     override fun onPlaced(coordinates: LayoutCoordinates) {
-        val wasNull = layoutNodeWrapper == null
-        layoutNodeWrapper = coordinates as LayoutNodeWrapper
+        val wasNull = coordinator == null
+        coordinator = coordinates as NodeCoordinator
         if (wasNull) {
             refreshFocusProperties()
         }
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 ad4aedc..baa4e97 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
@@ -244,9 +244,9 @@
 }
 
 internal fun FocusModifier.refreshFocusProperties() {
-    val layoutNodeWrapper = layoutNodeWrapper ?: return
+    val coordinator = coordinator ?: return
     focusProperties.clear()
-    layoutNodeWrapper.layoutNode.owner?.snapshotObserver?.observeReads(this,
+    coordinator.layoutNode.owner?.snapshotObserver?.observeReads(this,
         FocusModifier.RefreshFocusProperties
     ) {
         focusPropertiesModifier?.calculateProperties(focusProperties)
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 08e1c34..664b1ec 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
@@ -98,8 +98,8 @@
     fun findFocusNode(): FocusModifier? {
         // find the first child:
         val first = focusModifiers.fold(null as FocusModifier?) { mod1, mod2 ->
-            var layoutNode1 = mod1?.layoutNodeWrapper?.layoutNode ?: return@fold mod2
-            var layoutNode2 = mod2.layoutNodeWrapper?.layoutNode ?: return@fold mod1
+            var layoutNode1 = mod1?.coordinator?.layoutNode ?: return@fold mod2
+            var layoutNode2 = mod2.coordinator?.layoutNode ?: return@fold mod1
 
             while (layoutNode1.depth > layoutNode2.depth) {
                 layoutNode1 = layoutNode1.parent!!
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTransactions.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTransactions.kt
index 173bf9c..99e9627 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTransactions.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTransactions.kt
@@ -31,7 +31,7 @@
  * [FocusNode][FocusModifier]'s parent [FocusNode][FocusModifier].
  */
 internal fun FocusModifier.requestFocus() {
-    if (layoutNodeWrapper?.layoutNode?.owner == null) {
+    if (coordinator?.layoutNode?.owner == null) {
         // Not placed yet. Try requestFocus() after placement.
         focusRequestedOnPlaced = true
         return
@@ -78,7 +78,7 @@
     when (focusState) {
         ActiveParent -> focusState = DeactivatedParent
         Active, Captured -> {
-            layoutNodeWrapper?.layoutNode?.owner?.focusManager?.clearFocus(force = true)
+            coordinator?.layoutNode?.owner?.focusManager?.clearFocus(force = true)
             focusState = Deactivated
         }
         Inactive -> focusState = Deactivated
@@ -269,7 +269,7 @@
 }
 
 private fun FocusModifier.requestFocusForOwner(): Boolean {
-    return layoutNodeWrapper?.layoutNode?.owner?.requestFocus() ?: error("Owner not initialized.")
+    return coordinator?.layoutNode?.owner?.requestFocus() ?: error("Owner not initialized.")
 }
 
 /**
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 f86a03c..b789a12 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
@@ -183,10 +183,9 @@
  * Returns the bounding box of the focus layout area in the root or [Rect.Zero] if the
  * FocusModifier has not had a layout.
  */
-internal fun FocusModifier.focusRect(): Rect = layoutNodeWrapper?.let {
+internal fun FocusModifier.focusRect(): Rect = coordinator?.let {
     it.findRootCoordinates().localBoundingBoxOf(it, clipBounds = false)
 } ?: Rect.Zero
-
 /**
  * Returns all [FocusModifier] children that are not [FocusStateImpl.isDeactivated]. Any
  * child that is deactivated will add activated children instead.
@@ -211,7 +210,7 @@
  */
 @Suppress("ModifierFactoryExtensionFunction", "ModifierFactoryReturnType")
 internal fun FocusModifier.findLastKeyInputModifier(): KeyInputModifier? {
-    val layoutNode = layoutNodeWrapper?.layoutNode ?: return null
+    val layoutNode = coordinator?.layoutNode ?: return null
     var best: KeyInputModifier? = null
     keyInputChildren.forEach { keyInputModifier ->
         if (keyInputModifier.layoutNode == layoutNode) {
@@ -229,8 +228,8 @@
  * Whether this node should be considered when searching for the next item during a traversal.
  */
 internal val FocusModifier.isEligibleForFocusSearch: Boolean
-    get() = layoutNodeWrapper?.layoutNode?.isPlaced == true &&
-            layoutNodeWrapper?.layoutNode?.isAttached == true
+    get() = coordinator?.layoutNode?.isPlaced == true &&
+            coordinator?.layoutNode?.isAttached == true
 
 /**
  * Returns [one] if it comes after [two] in the modifier chain or [two] if it comes after [one].
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/OneDimensionalFocusSearch.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/OneDimensionalFocusSearch.kt
index e31773d..81c1629a 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/OneDimensionalFocusSearch.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/OneDimensionalFocusSearch.kt
@@ -27,7 +27,6 @@
 import androidx.compose.ui.focus.FocusStateImpl.DeactivatedParent
 import androidx.compose.ui.focus.FocusStateImpl.Inactive
 import androidx.compose.ui.node.LayoutNode
-import androidx.compose.ui.node.LayoutNodeWrapper
 import kotlin.contracts.ExperimentalContracts
 import kotlin.contracts.contract
 
@@ -209,15 +208,20 @@
     override fun compare(focusModifier1: FocusModifier?, focusModifier2: FocusModifier?): Int {
         requireNotNull(focusModifier1)
         requireNotNull(focusModifier2)
-        if (focusModifier1 === focusModifier2) return 0
 
-        // Ignore non-attached focus modifiers as they won't be considered during focus search.
-        val wrapper1 = focusModifier1.layoutNodeWrapper ?: return 0
-        val wrapper2 = focusModifier2.layoutNodeWrapper ?: return 0
+        // Ignore focus modifiers that won't be considered during focus search.
+        if (!focusModifier1.isEligibleForFocusSearch) return 0
+        if (!focusModifier2.isEligibleForFocusSearch) return 0
+
+        val layoutNode1 = checkNotNull(focusModifier1.coordinator?.layoutNode)
+        val layoutNode2 = checkNotNull(focusModifier2.coordinator?.layoutNode)
+
+        // Use natural order for focus modifiers within the same layout node.
+        if (layoutNode1 == layoutNode2) return 0
 
         // Compare the place order of the children of the least common ancestor.
-        val pathFromRoot1 = pathFromRoot(wrapper1)
-        val pathFromRoot2 = pathFromRoot(wrapper2)
+        val pathFromRoot1 = pathFromRoot(layoutNode1)
+        val pathFromRoot2 = pathFromRoot(layoutNode2)
         for (depth in 0..minOf(pathFromRoot1.lastIndex, pathFromRoot2.lastIndex)) {
             // If the items from the two paths are not equal, we have
             // found the first two children after the least common ancestor.
@@ -229,9 +233,9 @@
         error("Could not find a common ancestor between the two FocusModifiers.")
     }
 
-    private fun pathFromRoot(layoutNodeWrapper: LayoutNodeWrapper): MutableVector<LayoutNode> {
+    private fun pathFromRoot(layoutNode: LayoutNode): MutableVector<LayoutNode> {
         val path = mutableVectorOf<LayoutNode>()
-        var current: LayoutNode? = layoutNodeWrapper.layoutNode
+        var current: LayoutNode? = layoutNode
         while (current != null) {
             path.add(0, current)
             current = current.parent
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/focus/FocusAwareInputModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/focus/FocusAwareInputModifier.kt
index 24d7b77..a559215 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/focus/FocusAwareInputModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/focus/FocusAwareInputModifier.kt
@@ -21,19 +21,19 @@
 import androidx.compose.ui.modifier.ModifierLocalReadScope
 import androidx.compose.ui.modifier.ProvidableModifierLocal
 
-internal interface FocusAwareEvent
+internal interface FocusDirectedInputEvent
 
 /**
- * A modifier that routes [FocusAwareEvent]s to the currently focused item.
+ * A modifier that routes [FocusDirectedInputEvent]s to the currently focused item.
  *
  * The event is routed to the focused item. Before reaching the focused item, [onPreEvent]() is
  * called for parents of the focused item. If the parents don't consume the event, [onPreEvent]()
  * is called for the focused item. If the event is still not consumed, [onEvent]() is called on the
  * focused item's parents.
  */
-internal open class FocusAwareInputModifier<T : FocusAwareEvent>(
-    val onEvent: ((FocusAwareEvent) -> Boolean)?,
-    val onPreEvent: ((FocusAwareEvent) -> Boolean)?,
+internal open class FocusAwareInputModifier<T : FocusDirectedInputEvent>(
+    val onEvent: ((FocusDirectedInputEvent) -> Boolean)?,
+    val onPreEvent: ((FocusDirectedInputEvent) -> Boolean)?,
     override val key: ProvidableModifierLocal<FocusAwareInputModifier<T>?>
 ) : ModifierLocalConsumer,
     ModifierLocalProvider<FocusAwareInputModifier<T>?> {
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 2bc182b..542bf03 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
@@ -29,7 +29,7 @@
 import androidx.compose.ui.modifier.ProvidableModifierLocal
 import androidx.compose.ui.modifier.modifierLocalOf
 import androidx.compose.ui.node.LayoutNode
-import androidx.compose.ui.node.LayoutNodeWrapper
+import androidx.compose.ui.node.NodeCoordinator
 import androidx.compose.ui.platform.debugInspectorInfo
 import androidx.compose.ui.platform.inspectable
 
@@ -129,6 +129,6 @@
     }
 
     override fun onPlaced(coordinates: LayoutCoordinates) {
-        layoutNode = (coordinates as LayoutNodeWrapper).layoutNode
+        layoutNode = (coordinates as NodeCoordinator).layoutNode
     }
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/HitPathTracker.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/HitPathTracker.kt
index 012fa0d..bf51c11 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/HitPathTracker.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/HitPathTracker.kt
@@ -21,6 +21,9 @@
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.layout.LayoutCoordinates
 import androidx.compose.ui.node.InternalCoreApi
+import androidx.compose.ui.node.PointerInputModifierNode
+import androidx.compose.ui.node.isAttached
+import androidx.compose.ui.node.layoutCoordinates
 import androidx.compose.ui.util.fastFirstOrNull
 import androidx.compose.ui.util.fastForEach
 
@@ -31,32 +34,32 @@
  * @property rootCoordinates the root [LayoutCoordinates] that [PointerInputChange]s will be
  * relative to.
  */
-@OptIn(InternalCoreApi::class)
+@OptIn(InternalCoreApi::class, ExperimentalComposeUiApi::class)
 internal class HitPathTracker(private val rootCoordinates: LayoutCoordinates) {
 
     /*@VisibleForTesting*/
     internal val root: NodeParent = NodeParent()
 
     /**
-     * Associates a [pointerId] to a list of hit [pointerInputFilters] and keeps track of them.
+     * Associates a [pointerId] to a list of hit [pointerInputNodes] and keeps track of them.
      *
      * This enables future calls to [dispatchChanges] to dispatch the correct [PointerInputChange]s
      * to the right [PointerInputFilter]s at the right time.
      *
-     * If [pointerInputFilters] is empty, nothing will be added.
+     * If [pointerInputNodes] is empty, nothing will be added.
      *
      * @param pointerId The id of the pointer that was hit tested against [PointerInputFilter]s
-     * @param pointerInputFilters The [PointerInputFilter]s that were hit by [pointerId].  Must be
+     * @param pointerInputNodes The [PointerInputFilter]s that were hit by [pointerId].  Must be
      * ordered from ancestor to descendant.
      */
-    fun addHitPath(pointerId: PointerId, pointerInputFilters: List<PointerInputFilter>) {
+    fun addHitPath(pointerId: PointerId, pointerInputNodes: List<PointerInputModifierNode>) {
         var parent: NodeParent = root
         var merging = true
-        eachPin@ for (i in pointerInputFilters.indices) {
-            val pointerInputFilter = pointerInputFilters[i]
+        eachPin@ for (i in pointerInputNodes.indices) {
+            val pointerInputNode = pointerInputNodes[i]
             if (merging) {
                 val node = parent.children.firstOrNull {
-                    it.pointerInputFilter == pointerInputFilter
+                    it.pointerInputNode == pointerInputNode
                 }
                 if (node != null) {
                     node.markIsIn()
@@ -67,7 +70,8 @@
                     merging = false
                 }
             }
-            val node = Node(pointerInputFilter).apply {
+            // TODO(lmr): i wonder if Node here and PointerInputNode ought to be the same thing?
+            val node = Node(pointerInputNode).apply {
                 pointerIds.add(pointerId)
             }
             parent.children.add(node)
@@ -134,7 +138,7 @@
  * pointer or [PointerInputFilter] information.
  */
 /*@VisibleForTesting*/
-@OptIn(InternalCoreApi::class)
+@OptIn(InternalCoreApi::class, ExperimentalComposeUiApi::class)
 internal open class NodeParent {
     val children: MutableVector<Node> = mutableVectorOf()
 
@@ -222,7 +226,7 @@
         var index = 0
         while (index < children.size) {
             val child = children[index]
-            if (!child.pointerInputFilter.isAttached) {
+            if (!child.pointerInputNode.isAttached) {
                 children.removeAt(index)
                 child.dispatchCancel()
             } else {
@@ -247,8 +251,8 @@
  * hit it (tracked as [PointerId]s).
  */
 /*@VisibleForTesting*/
-@OptIn(InternalCoreApi::class)
-internal class Node(val pointerInputFilter: PointerInputFilter) : NodeParent() {
+@OptIn(InternalCoreApi::class, ExperimentalComposeUiApi::class)
+internal class Node(val pointerInputNode: PointerInputModifierNode) : NodeParent() {
 
     // Note: this is essentially a set, and writes should be guarded accordingly. We use a
     // MutableVector here instead since a set ends up being quite heavy, and calls to
@@ -289,10 +293,10 @@
             val event = pointerEvent!!
             val size = coordinates!!.size
             // Dispatch on the tunneling pass.
-            pointerInputFilter.onPointerEvent(event, PointerEventPass.Initial, size)
+            pointerInputNode.onPointerEvent(event, PointerEventPass.Initial, size)
 
             // Dispatch to children.
-            if (pointerInputFilter.isAttached) {
+            if (pointerInputNode.isAttached) {
                 children.forEach {
                     it.dispatchMainEventPass(
                         // Pass only the already-filtered and position-translated changes down to
@@ -305,9 +309,9 @@
                 }
             }
 
-            if (pointerInputFilter.isAttached) {
+            if (pointerInputNode.isAttached) {
                 // Dispatch on the bubbling pass.
-                pointerInputFilter.onPointerEvent(event, PointerEventPass.Main, size)
+                pointerInputNode.onPointerEvent(event, PointerEventPass.Main, size)
             }
         }
     }
@@ -323,10 +327,10 @@
             val event = pointerEvent!!
             val size = coordinates!!.size
             // Dispatch on the tunneling pass.
-            pointerInputFilter.onPointerEvent(event, PointerEventPass.Final, size)
+            pointerInputNode.onPointerEvent(event, PointerEventPass.Final, size)
 
             // Dispatch to children.
-            if (pointerInputFilter.isAttached) {
+            if (pointerInputNode.isAttached) {
                 children.forEach { it.dispatchFinalEventPass(internalPointerEvent) }
             }
         }
@@ -358,9 +362,9 @@
             )
 
         // Avoid future work if we know this node will no-op
-        if (!pointerInputFilter.isAttached) return true
+        if (!pointerInputNode.isAttached) return true
 
-        coordinates = pointerInputFilter.layoutCoordinates
+        coordinates = pointerInputNode.layoutCoordinates
 
         @OptIn(ExperimentalComposeUiApi::class)
         for ((key, change) in changes) {
@@ -471,7 +475,7 @@
     }
 
     /**
-     * Calls [block] if there are relevant changes, and if [pointerInputFilter] is attached
+     * Calls [block] if there are relevant changes, and if [pointerInputNode] is attached
      *
      * @return whether [block] was called
      */
@@ -481,7 +485,7 @@
         // If there are no relevant changes, there is nothing to process so return false.
         if (relevantChanges.isEmpty()) return false
         // If the input filter is not attached, avoid dispatching
-        if (!pointerInputFilter.isAttached) return false
+        if (!pointerInputNode.isAttached) return false
 
         block()
 
@@ -498,7 +502,7 @@
      */
     override fun dispatchCancel() {
         children.forEach { it.dispatchCancel() }
-        pointerInputFilter.onCancel()
+        pointerInputNode.onCancelPointerInput()
     }
 
     fun markIsIn() {
@@ -527,7 +531,7 @@
     }
 
     override fun toString(): String {
-        return "Node(pointerInputFilter=$pointerInputFilter, children=$children, " +
+        return "Node(pointerInputFilter=$pointerInputNode, children=$children, " +
             "pointerIds=$pointerIds)"
     }
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessor.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessor.kt
index b927ded..d9e1f91 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessor.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessor.kt
@@ -21,6 +21,7 @@
 import androidx.compose.ui.node.HitTestResult
 import androidx.compose.ui.node.InternalCoreApi
 import androidx.compose.ui.node.LayoutNode
+import androidx.compose.ui.node.PointerInputModifierNode
 import androidx.compose.ui.util.fastForEach
 
 internal interface PositionCalculator {
@@ -31,12 +32,12 @@
 /**
  * The core element that receives [PointerInputEvent]s and process them in Compose UI.
  */
-@OptIn(InternalCoreApi::class)
+@OptIn(InternalCoreApi::class, ExperimentalComposeUiApi::class)
 internal class PointerInputEventProcessor(val root: LayoutNode) {
 
     private val hitPathTracker = HitPathTracker(root.coordinates)
     private val pointerInputChangeEventProducer = PointerInputChangeEventProducer()
-    private val hitResult = HitTestResult<PointerInputFilter>()
+    private val hitResult = HitTestResult<PointerInputModifierNode>()
 
     /**
      * [process] doesn't currently support reentrancy. This prevents reentrant calls
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 039fb6f..a8a5189 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
@@ -18,7 +18,7 @@
 
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.input.focus.FocusAwareEvent
+import androidx.compose.ui.input.focus.FocusDirectedInputEvent
 import androidx.compose.ui.input.focus.FocusAwareInputModifier
 import androidx.compose.ui.modifier.modifierLocalOf
 import androidx.compose.ui.platform.debugInspectorInfo
@@ -101,7 +101,7 @@
     modifierLocalOf<FocusAwareInputModifier<RotaryScrollEvent>?> { null }
 
 @ExperimentalComposeUiApi
-private fun ((RotaryScrollEvent) -> Boolean).focusAwareCallback() = { e: FocusAwareEvent ->
+private fun ((RotaryScrollEvent) -> Boolean).focusAwareCallback() = { e: FocusDirectedInputEvent ->
     check(e is RotaryScrollEvent) {
         "FocusAwareEvent is dispatched to the wrong FocusAwareParent."
     }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryScrollEvent.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryScrollEvent.kt
index 641ba78..e79fdd4 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryScrollEvent.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryScrollEvent.kt
@@ -17,7 +17,7 @@
 package androidx.compose.ui.input.rotary
 
 import androidx.compose.ui.ExperimentalComposeUiApi
-import androidx.compose.ui.input.focus.FocusAwareEvent
+import androidx.compose.ui.input.focus.FocusDirectedInputEvent
 
 /**
  * This event represents a rotary input event.
@@ -44,7 +44,7 @@
      * platform-dependent.
      */
     val uptimeMillis: Long
-) : FocusAwareEvent {
+) : FocusDirectedInputEvent {
     override fun equals(other: Any?): Boolean = other is RotaryScrollEvent &&
         other.verticalScrollPixels == verticalScrollPixels &&
         other.horizontalScrollPixels == horizontalScrollPixels &&
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutCoordinates.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutCoordinates.kt
index c41e953..83d9751 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutCoordinates.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutCoordinates.kt
@@ -19,7 +19,7 @@
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.graphics.Matrix
-import androidx.compose.ui.node.LayoutNodeWrapper
+import androidx.compose.ui.node.NodeCoordinator
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.internal.JvmDefaultWithCompatibility
 
@@ -97,7 +97,12 @@
      * Modifies [matrix] to be a transform to convert a coordinate in [sourceCoordinates]
      * to a coordinate in `this` [LayoutCoordinates].
      */
-    fun transformFrom(sourceCoordinates: LayoutCoordinates, matrix: Matrix) {}
+    @Suppress("DocumentExceptions")
+    fun transformFrom(sourceCoordinates: LayoutCoordinates, matrix: Matrix) {
+        throw UnsupportedOperationException(
+            "transformFrom is not implemented on this LayoutCoordinates"
+        )
+    }
 
     /**
      * Returns the position in pixels of an [alignment line][AlignmentLine],
@@ -177,11 +182,11 @@
         root = parent
         parent = root.parentLayoutCoordinates
     }
-    var rootLayoutNodeWrapper = root as? LayoutNodeWrapper ?: return root
-    var parentLayoutNodeWrapper = rootLayoutNodeWrapper.wrappedBy
-    while (parentLayoutNodeWrapper != null) {
-        rootLayoutNodeWrapper = parentLayoutNodeWrapper
-        parentLayoutNodeWrapper = parentLayoutNodeWrapper.wrappedBy
+    var rootCoordinator = root as? NodeCoordinator ?: return root
+    var parentCoordinator = rootCoordinator.wrappedBy
+    while (parentCoordinator != null) {
+        rootCoordinator = parentCoordinator
+        parentCoordinator = parentCoordinator.wrappedBy
     }
-    return rootLayoutNodeWrapper
+    return rootCoordinator
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LookaheadLayout.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LookaheadLayout.kt
index 4704d21..a63eee4 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LookaheadLayout.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LookaheadLayout.kt
@@ -28,7 +28,7 @@
 import androidx.compose.ui.materialize
 import androidx.compose.ui.node.ComposeUiNode
 import androidx.compose.ui.node.LayoutNode
-import androidx.compose.ui.node.LayoutNodeWrapper
+import androidx.compose.ui.node.NodeCoordinator
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.LocalViewConfiguration
@@ -85,7 +85,7 @@
             set(layoutDirection, ComposeUiNode.SetLayoutDirection)
             set(viewConfiguration, ComposeUiNode.SetViewConfiguration)
             set(scope) { scope ->
-                scope.root = innerLayoutNodeWrapper
+                scope.root = innerCoordinator
             }
             init {
                 isLookaheadRoot = true
@@ -163,7 +163,7 @@
 
 @OptIn(ExperimentalComposeUiApi::class)
 private class LookaheadLayoutScopeImpl : LookaheadLayoutScope {
-    var root: LayoutNodeWrapper? = null
+    var root: NodeCoordinator? = null
     override fun Modifier.onPlaced(
         onPlaced: (
             lookaheadScopeCoordinates: LookaheadLayoutCoordinates,
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LookaheadLayoutCoordinates.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LookaheadLayoutCoordinates.kt
index dc47e9e..e81434d 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LookaheadLayoutCoordinates.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LookaheadLayoutCoordinates.kt
@@ -22,7 +22,7 @@
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.graphics.Matrix
-import androidx.compose.ui.node.LayoutNodeWrapper
+import androidx.compose.ui.node.NodeCoordinator
 import androidx.compose.ui.node.LookaheadDelegate
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.round
@@ -48,15 +48,15 @@
 
 internal class LookaheadLayoutCoordinatesImpl(val lookaheadDelegate: LookaheadDelegate) :
     LookaheadLayoutCoordinates {
-    val wrapper: LayoutNodeWrapper
-        get() = lookaheadDelegate.wrapper
+    val coordinator: NodeCoordinator
+        get() = lookaheadDelegate.coordinator
 
     override fun localLookaheadPositionOf(
         sourceCoordinates: LookaheadLayoutCoordinates,
         relativeToSource: Offset
     ): Offset {
         val source = (sourceCoordinates as LookaheadLayoutCoordinatesImpl).lookaheadDelegate
-        val commonAncestor = wrapper.findCommonAncestor(source.wrapper)
+        val commonAncestor = coordinator.findCommonAncestor(source.coordinator)
 
         return commonAncestor.lookaheadDelegate?.let { ancestor ->
             // Common ancestor is in lookahead
@@ -71,49 +71,49 @@
                     (positionIn(rootLookaheadDelegate) + rootLookaheadDelegate.position)
                 }
 
-            lookaheadDelegate.rootLookaheadDelegate.wrapper.wrappedBy!!.localPositionOf(
-                sourceRoot.wrapper.wrappedBy!!, relativePosition.toOffset()
+            lookaheadDelegate.rootLookaheadDelegate.coordinator.wrappedBy!!.localPositionOf(
+                sourceRoot.coordinator.wrappedBy!!, relativePosition.toOffset()
             )
         }
     }
 
     override val size: IntSize
-        get() = wrapper.size
+        get() = coordinator.size
     override val providedAlignmentLines: Set<AlignmentLine>
-        get() = wrapper.providedAlignmentLines
+        get() = coordinator.providedAlignmentLines
 
     override val parentLayoutCoordinates: LayoutCoordinates?
-        get() = wrapper.parentLayoutCoordinates
+        get() = coordinator.parentLayoutCoordinates
     override val parentCoordinates: LayoutCoordinates?
-        get() = wrapper.parentCoordinates
+        get() = coordinator.parentCoordinates
     override val isAttached: Boolean
-        get() = wrapper.isAttached
+        get() = coordinator.isAttached
 
     override fun windowToLocal(relativeToWindow: Offset): Offset =
-        wrapper.windowToLocal(relativeToWindow)
+        coordinator.windowToLocal(relativeToWindow)
 
     override fun localToWindow(relativeToLocal: Offset): Offset =
-        wrapper.localToWindow(relativeToLocal)
+        coordinator.localToWindow(relativeToLocal)
 
     override fun localToRoot(relativeToLocal: Offset): Offset =
-        wrapper.localToRoot(relativeToLocal)
+        coordinator.localToRoot(relativeToLocal)
 
     override fun localPositionOf(
         sourceCoordinates: LayoutCoordinates,
         relativeToSource: Offset
-    ): Offset = wrapper.localPositionOf(sourceCoordinates, relativeToSource)
+    ): Offset = coordinator.localPositionOf(sourceCoordinates, relativeToSource)
 
     override fun localBoundingBoxOf(
         sourceCoordinates: LayoutCoordinates,
         clipBounds: Boolean
-    ): Rect = wrapper.localBoundingBoxOf(sourceCoordinates, clipBounds)
+    ): Rect = coordinator.localBoundingBoxOf(sourceCoordinates, clipBounds)
 
     override fun transformFrom(sourceCoordinates: LayoutCoordinates, matrix: Matrix) {
-        wrapper.transformFrom(sourceCoordinates, matrix)
+        coordinator.transformFrom(sourceCoordinates, matrix)
     }
 
-    override fun get(alignmentLine: AlignmentLine): Int = wrapper.get(alignmentLine)
+    override fun get(alignmentLine: AlignmentLine): Int = coordinator.get(alignmentLine)
 }
 
 private val LookaheadDelegate.rootLookaheadDelegate: LookaheadDelegate
-    get() = lookaheadScope.root.outerLayoutNodeWrapper.lookaheadDelegate!!
+    get() = lookaheadScope.root.outerCoordinator.lookaheadDelegate!!
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Placeable.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Placeable.kt
index f6d24c3..f2f70d3 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Placeable.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Placeable.kt
@@ -19,7 +19,7 @@
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.graphics.GraphicsLayerScope
 import androidx.compose.ui.node.LayoutNodeLayoutDelegate
-import androidx.compose.ui.node.LayoutNodeWrapper
+import androidx.compose.ui.node.NodeCoordinator
 import androidx.compose.ui.node.LookaheadCapablePlaceable
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.IntOffset
@@ -319,7 +319,7 @@
                 placeApparentToRealOffset(position, zIndex, layerBlock)
             } else {
                 placeApparentToRealOffset(
-                    IntOffset(parentWidth - measuredSize.width - position.x, position.y),
+                    IntOffset((parentWidth - width - position.x), position.y),
                     zIndex,
                     layerBlock
                 )
@@ -375,16 +375,16 @@
 
             /**
              * Configures [_coordinates] and [layoutDelegate] based on the [scope].
-             * When it is [LayoutNodeWrapper.isPlacingForAlignment], then [_coordinates] should
+             * When it is [NodeCoordinator.isPlacingForAlignment], then [_coordinates] should
              * be `null`, and when [coordinates] is accessed, it indicates that the placement
-             * should not be finalized. When [LayoutNodeWrapper.isShallowPlacing], then
+             * should not be finalized. When [NodeCoordinator.isShallowPlacing], then
              * [_coordinates] should be `null`, but we don't have to do anything else
              * to trigger relayout because shallow placing will replace again anyway.
              *
-             * [LayoutNodeWrapper.isPlacingForAlignment] will be set to true if its parent's
+             * [NodeCoordinator.isPlacingForAlignment] will be set to true if its parent's
              * value is `true`.
              *
-             * @return the value for [LayoutNodeWrapper.isPlacingForAlignment] that should
+             * @return the value for [NodeCoordinator.isPlacingForAlignment] that should
              * be set after completing the lambda.
              */
             private fun configureForPlacingForAlignment(
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/SubcomposeLayout.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/SubcomposeLayout.kt
index 5ddd959..575a9ba 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/SubcomposeLayout.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/SubcomposeLayout.kt
@@ -116,11 +116,11 @@
         update = {
             set(state, state.setRoot)
             set(compositionContext, state.setCompositionContext)
-            set(materialized, ComposeUiNode.SetModifier)
             set(measurePolicy, state.setMeasurePolicy)
             set(density, ComposeUiNode.SetDensity)
             set(layoutDirection, ComposeUiNode.SetLayoutDirection)
             set(viewConfiguration, ComposeUiNode.SetViewConfiguration)
+            set(materialized, ComposeUiNode.SetModifier)
         }
     )
     if (!currentComposer.skipping) {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalManager.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalManager.kt
new file mode 100644
index 0000000..3842944
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalManager.kt
@@ -0,0 +1,119 @@
+/*
+ * 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.modifier
+
+import androidx.compose.runtime.collection.mutableVectorOf
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.node.BackwardsCompatNode
+import androidx.compose.ui.node.LayoutNode
+import androidx.compose.ui.node.Nodes
+import androidx.compose.ui.node.Owner
+import androidx.compose.ui.node.requireLayoutNode
+import androidx.compose.ui.node.visitSubtreeIf
+
+/**
+ * This is a (maybe temporary?) thing to provide proper backwards compatibility with ModifierLocals.
+ * This class makes it possible to properly "update" ModifierLocalConsumers whenever
+ * ModiferLocalProviders get added/removed in the tree somewhere dynamically. This can be quite
+ * costly, so we attempt to do this in a way where we don't waste time on nodes that are being
+ * inserted for the first time and thus don't have any consumers below them that need to be
+ * invalidated, and also ignore the case where a provider is being detached because a chunk of UI
+ * is being removed, meaning that no consumers below them are going to be around to be updated
+ * anyway.
+ *
+ * I think we need to have a bigger discussion around what modifier locals should look like in the
+ * Modifer.Node world.
+ */
+@OptIn(ExperimentalComposeUiApi::class)
+internal class ModifierLocalManager(val owner: Owner) {
+    private val inserted = mutableVectorOf<Pair<BackwardsCompatNode, ModifierLocal<*>>>()
+    private val updated = mutableVectorOf<Pair<BackwardsCompatNode, ModifierLocal<*>>>()
+    private val removed = mutableVectorOf<Pair<LayoutNode, ModifierLocal<*>>>()
+    private var invalidated: Boolean = false
+
+    fun invalidate() {
+        if (!invalidated) {
+            invalidated = true
+            owner.registerOnEndApplyChangesListener { this.triggerUpdates() }
+        }
+    }
+
+    fun triggerUpdates() {
+        invalidated = false
+        // We want to make sure that we only call update on a node once, but if a provider gets
+        // removed and a new one gets inserted in its place, we will encounter it when we iterate
+        // both the rmoved node and the inserted one, so we store all of the consumers we want to
+        // update in a set and call update on them at the end.
+        val toUpdate = hashSetOf<BackwardsCompatNode>()
+        removed.forEach { (layout, key) ->
+            if (layout.isAttached) {
+                // if the layout is still attached, that means that this provider got removed and
+                // there's possible some consumers below it that need to be updated
+                invalidateConsumersOfNodeForKey(layout.nodes.head, key, toUpdate)
+            }
+        }
+        removed.clear()
+        // TODO(lmr): we could potentially opt for a more sophisticated strategy here where we
+        //  start from the higher up nodes, and invalidate in a way where during traversal if we
+        //  happen upon other inserted nodes we can remove them from the inserted set
+        inserted.forEach { (node, key) ->
+            if (node.isAttached) {
+                invalidateConsumersOfNodeForKey(node, key, toUpdate)
+            }
+        }
+        inserted.clear()
+        updated.forEach { (node, key) ->
+            if (node.isAttached) {
+                invalidateConsumersOfNodeForKey(node, key, toUpdate)
+            }
+        }
+        updated.clear()
+        toUpdate.forEach { it.updateModifierLocalConsumer() }
+    }
+
+    private fun invalidateConsumersOfNodeForKey(
+        node: Modifier.Node,
+        key: ModifierLocal<*>,
+        set: MutableSet<BackwardsCompatNode>
+    ) {
+        node.visitSubtreeIf(Nodes.Locals) {
+            if (it is BackwardsCompatNode && it.element is ModifierLocalConsumer) {
+                if (it.readValues.contains(key)) {
+                    set.add(it)
+                }
+            }
+            // only continue if this node didn't also provide it
+            !it.providedValues.contains(key)
+        }
+    }
+
+    fun updatedProvider(node: BackwardsCompatNode, key: ModifierLocal<*>) {
+        updated += node to key
+        invalidate()
+    }
+
+    fun insertedProvider(node: BackwardsCompatNode, key: ModifierLocal<*>) {
+        inserted += node to key
+        invalidate()
+    }
+
+    fun removedProvider(node: BackwardsCompatNode, key: ModifierLocal<*>) {
+        removed += node.requireLayoutNode() to key
+        invalidate()
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalNode.kt
new file mode 100644
index 0000000..446caf6
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalNode.kt
@@ -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.compose.ui.modifier
+
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateMapOf
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.node.DelegatableNode
+import androidx.compose.ui.node.Nodes
+import androidx.compose.ui.node.visitAncestors
+
+@ExperimentalComposeUiApi
+sealed class ModifierLocalMap() {
+    internal abstract operator fun <T> set(key: ModifierLocal<T>, value: T)
+    internal abstract operator fun <T> get(key: ModifierLocal<T>): T?
+    internal abstract operator fun contains(key: ModifierLocal<*>): Boolean
+}
+
+@OptIn(ExperimentalComposeUiApi::class)
+internal class SingleLocalMap(
+    private val key: ModifierLocal<*>
+) : ModifierLocalMap() {
+    private var value: Any? by mutableStateOf(null)
+    internal fun forceValue(value: Any?) {
+        this.value = value
+    }
+
+    override operator fun <T> set(key: ModifierLocal<T>, value: T) {
+        check(key === this.key)
+        this.value = value
+    }
+
+    override operator fun <T> get(key: ModifierLocal<T>): T? {
+        check(key === this.key)
+        @Suppress("UNCHECKED_CAST")
+        return value as? T?
+    }
+
+    override operator fun contains(key: ModifierLocal<*>): Boolean = key === this.key
+}
+
+@OptIn(ExperimentalComposeUiApi::class)
+internal class BackwardsCompatLocalMap(
+    var element: ModifierLocalProvider<*>
+) : ModifierLocalMap() {
+    override operator fun <T> set(key: ModifierLocal<T>, value: T) {
+        error("Set is not allowed on a backwards compat provider")
+    }
+
+    override operator fun <T> get(key: ModifierLocal<T>): T? {
+        check(key === element.key)
+        @Suppress("UNCHECKED_CAST")
+        return element.value as T
+    }
+
+    override operator fun contains(key: ModifierLocal<*>): Boolean = key === element.key
+}
+
+@OptIn(ExperimentalComposeUiApi::class)
+internal class MultiLocalMap(
+    vararg entries: Pair<ModifierLocal<*>, Any?>
+) : ModifierLocalMap() {
+    private val map = mutableStateMapOf<ModifierLocal<*>, Any?>()
+
+    init {
+        map.putAll(entries.toMap())
+    }
+
+    override operator fun <T> set(key: ModifierLocal<T>, value: T) {
+        map[key] = value
+    }
+
+    override operator fun <T> get(key: ModifierLocal<T>): T? {
+        @Suppress("UNCHECKED_CAST")
+        return map[key] as? T?
+    }
+
+    override operator fun contains(key: ModifierLocal<*>): Boolean = map.containsKey(key)
+}
+
+@OptIn(ExperimentalComposeUiApi::class)
+internal object EmptyMap : ModifierLocalMap() {
+    override fun <T> set(key: ModifierLocal<T>, value: T) = error("")
+    override fun <T> get(key: ModifierLocal<T>): T? = error("")
+    override fun contains(key: ModifierLocal<*>): Boolean = false
+}
+
+@ExperimentalComposeUiApi
+interface ModifierLocalNode : ModifierLocalReadScope, DelegatableNode {
+    val providedValues: ModifierLocalMap get() = EmptyMap
+    fun <T> provide(key: ModifierLocal<T>, value: T) {
+        require(providedValues !== EmptyMap) {
+            "In order to provide locals you must override providedValues: ModifierLocalMap"
+        }
+        providedValues[key] = value
+    }
+
+    override val <T> ModifierLocal<T>.current: T
+        get() {
+            require(node.isAttached)
+            val key = this
+            visitAncestors(Nodes.Locals) {
+                if (it.providedValues.contains(key)) {
+                    @Suppress("UNCHECKED_CAST")
+                    return it.providedValues[key] as T
+                }
+            }
+            return key.defaultFactory()
+        }
+}
+
+@ExperimentalComposeUiApi
+fun modifierLocalMapOf(): ModifierLocalMap = EmptyMap
+
+@ExperimentalComposeUiApi
+fun <T> modifierLocalMapOf(
+    key: ModifierLocal<T>
+): ModifierLocalMap = SingleLocalMap(key)
+
+@ExperimentalComposeUiApi
+fun <T> modifierLocalMapOf(
+    entry: Pair<ModifierLocal<T>, T>
+): ModifierLocalMap = SingleLocalMap(entry.first).also { it[entry.first] = entry.second }
+
+@ExperimentalComposeUiApi
+fun modifierLocalMapOf(
+    vararg keys: ModifierLocal<*>
+): ModifierLocalMap = MultiLocalMap(*keys.map { it to null }.toTypedArray())
+
+@ExperimentalComposeUiApi
+fun modifierLocalMapOf(
+    vararg entries: Pair<ModifierLocal<*>, Any>
+): ModifierLocalMap = MultiLocalMap(*entries)
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/BackwardsCompatNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/BackwardsCompatNode.kt
new file mode 100644
index 0000000..76b26aa
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/BackwardsCompatNode.kt
@@ -0,0 +1,464 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("DEPRECATION")
+
+package androidx.compose.ui.node
+
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.BuildDrawCacheParams
+import androidx.compose.ui.draw.DrawCacheModifier
+import androidx.compose.ui.draw.DrawModifier
+import androidx.compose.ui.focus.FocusOrderModifier
+import androidx.compose.ui.focus.FocusOrderModifierToProperties
+import androidx.compose.ui.focus.FocusPropertiesModifier
+import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.graphics.drawscope.ContentDrawScope
+import androidx.compose.ui.input.pointer.PointerEvent
+import androidx.compose.ui.input.pointer.PointerEventPass
+import androidx.compose.ui.input.pointer.PointerInputModifier
+import androidx.compose.ui.layout.IntermediateLayoutModifier
+import androidx.compose.ui.layout.IntrinsicMeasurable
+import androidx.compose.ui.layout.IntrinsicMeasureScope
+import androidx.compose.ui.layout.LayoutCoordinates
+import androidx.compose.ui.layout.LayoutModifier
+import androidx.compose.ui.layout.LookaheadLayoutCoordinates
+import androidx.compose.ui.layout.LookaheadOnPlacedModifier
+import androidx.compose.ui.layout.Measurable
+import androidx.compose.ui.layout.MeasureResult
+import androidx.compose.ui.layout.MeasureScope
+import androidx.compose.ui.layout.OnGloballyPositionedModifier
+import androidx.compose.ui.layout.OnPlacedModifier
+import androidx.compose.ui.layout.OnRemeasuredModifier
+import androidx.compose.ui.layout.ParentDataModifier
+import androidx.compose.ui.layout.RemeasurementModifier
+import androidx.compose.ui.modifier.BackwardsCompatLocalMap
+import androidx.compose.ui.modifier.ModifierLocal
+import androidx.compose.ui.modifier.ModifierLocalConsumer
+import androidx.compose.ui.modifier.ModifierLocalMap
+import androidx.compose.ui.modifier.ModifierLocalNode
+import androidx.compose.ui.modifier.ModifierLocalProvider
+import androidx.compose.ui.modifier.ModifierLocalReadScope
+import androidx.compose.ui.modifier.modifierLocalMapOf
+import androidx.compose.ui.platform.debugInspectorInfo
+import androidx.compose.ui.semantics.SemanticsConfiguration
+import androidx.compose.ui.semantics.SemanticsModifier
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.toSize
+
+/**
+ * This entity will end up implementing all of the entity type interfaces, but its [kindSet]
+ * will only be set to the expected values based on the interface(s) that the modifier element that
+ * it has implements. This is nice because it will be one class that simply delegates / pipes
+ * everything to the modifier instance, but those interfaces should only be called in the cases
+ * where the modifier would have been previously.
+ */
+@Suppress("NOTHING_TO_INLINE")
+@OptIn(ExperimentalComposeUiApi::class)
+internal class BackwardsCompatNode(element: Modifier.Element) :
+    LayoutModifierNode,
+    IntermediateLayoutModifierNode,
+    DrawModifierNode,
+    SemanticsModifierNode,
+    PointerInputModifierNode,
+    ModifierLocalNode,
+    ModifierLocalReadScope,
+    ParentDataModifierNode,
+    LayoutAwareModifierNode,
+    GlobalPositionAwareModifierNode,
+    OwnerScope,
+    BuildDrawCacheParams,
+    Modifier.Node() {
+    init {
+        kindSet = calculateNodeKindSetFrom(element)
+    }
+
+    var element: Modifier.Element = element
+        set(value) {
+            // TODO(lmr): do we need to do a detach type thing with the previous element?
+            field = value
+            kindSet = calculateNodeKindSetFrom(value)
+            if (isAttached) onModifierUpdated(false)
+        }
+
+    override fun onDetach() {
+        val element = element
+        if (isKind(Nodes.Locals)) {
+            if (element is ModifierLocalProvider<*>) {
+                requireOwner()
+                    .modifierLocalManager
+                    .removedProvider(this, element.key)
+            }
+            if (element is ModifierLocalConsumer) {
+                element.onModifierLocalsUpdated(DetachedModifierLocalReadScope)
+            }
+            if (element is FocusOrderModifier) {
+                val focusOrderElement = focusOrderElement
+                if (focusOrderElement != null) {
+                    requireOwner()
+                        .modifierLocalManager
+                        .removedProvider(this, focusOrderElement.key)
+                }
+            }
+        }
+        if (isKind(Nodes.Semantics)) {
+            requireOwner().onSemanticsChange()
+        }
+    }
+
+    override fun onAttach() {
+        onModifierUpdated(true)
+    }
+
+    private fun onModifierUpdated(duringAttach: Boolean) {
+        check(isAttached)
+        val element = element
+        if (isKind(Nodes.Locals)) {
+            if (element is ModifierLocalProvider<*>) {
+                updateModifierLocalProvider(element)
+            }
+            if (element is ModifierLocalConsumer) {
+                if (duringAttach)
+                    updateModifierLocalConsumer()
+                else
+                    sideEffect { updateModifierLocalConsumer() }
+            }
+            // Special handling for FocusOrderModifier -- we have to use modifier local
+            // consumers and providers for it.
+            if (element is FocusOrderModifier) {
+                // Have to create a new consumer/provider
+                val scope = FocusOrderModifierToProperties(element)
+                focusOrderElement = FocusPropertiesModifier(
+                    focusPropertiesScope = scope,
+                    inspectorInfo = debugInspectorInfo {
+                        name = "focusProperties"
+                        properties["scope"] = scope
+                    }
+                )
+                updateModifierLocalProvider(focusOrderElement!!)
+                if (duringAttach)
+                    updateFocusOrderModifierLocalConsumer()
+                else
+                    sideEffect { updateFocusOrderModifierLocalConsumer() }
+            }
+        }
+        if (isKind(Nodes.Draw)) {
+            if (element is DrawCacheModifier) {
+                invalidateCache = true
+            }
+            invalidateLayer()
+        }
+        if (isKind(Nodes.Layout)) {
+            val isChainUpdate = requireLayoutNode().nodes.tail.isAttached
+            if (isChainUpdate) {
+                val coordinator = coordinator!!
+                coordinator as LayoutModifierNodeCoordinator
+                coordinator.layoutModifierNode = this
+                coordinator.onLayoutModifierNodeChanged()
+            }
+            invalidateLayer()
+            requireLayoutNode().invalidateMeasurements()
+        }
+        if (element is RemeasurementModifier) {
+            element.onRemeasurementAvailable(this)
+        }
+        if (isKind(Nodes.LayoutAware)) {
+            if (element is OnRemeasuredModifier) {
+                // if the modifier was added but layout has already happened and might not change,
+                // we want to call remeasured in case layout doesn't happen again
+                val isChainUpdate = requireLayoutNode().nodes.tail.isAttached
+                if (isChainUpdate) {
+                    requireLayoutNode().invalidateMeasurements()
+                }
+            }
+            if (element is OnPlacedModifier) {
+                lastOnPlacedCoordinates = null
+                val isChainUpdate = requireLayoutNode().nodes.tail.isAttached
+                if (isChainUpdate) {
+                    requireOwner().registerOnLayoutCompletedListener(
+                        object : Owner.OnLayoutCompletedListener {
+                            override fun onLayoutComplete() {
+                                if (lastOnPlacedCoordinates == null) {
+                                    onPlaced(requireCoordinator(Nodes.LayoutAware))
+                                }
+                            }
+                        }
+                    )
+                }
+            }
+        }
+        if (isKind(Nodes.GlobalPositionAware)) {
+            // if the modifier was added but layout has already happened and might not change,
+            // we want to call remeasured in case layout doesn't happen again
+            if (element is OnGloballyPositionedModifier) {
+                val isChainUpdate = requireLayoutNode().nodes.tail.isAttached
+                if (isChainUpdate) {
+                    requireLayoutNode().invalidateMeasurements()
+                }
+            }
+        }
+        if (isKind(Nodes.PointerInput)) {
+            if (element is PointerInputModifier) {
+                element.pointerInputFilter.layoutCoordinates = coordinator
+            }
+        }
+        if (isKind(Nodes.Semantics)) {
+            requireOwner().onSemanticsChange()
+        }
+    }
+
+    // BuildDrawCacheParams
+    override val density get() = requireLayoutNode().density
+    override val layoutDirection: LayoutDirection get() = requireLayoutNode().layoutDirection
+    override val size: Size
+        get() {
+            return requireCoordinator(Nodes.LayoutAware).size.toSize()
+        }
+
+    // Flag to determine if the cache should be re-built
+    private var invalidateCache = true
+
+    override fun onMeasureResultChanged() {
+        invalidateCache = true
+        requestDraw()
+    }
+
+    private fun updateDrawCache() {
+        val element = element
+        if (element is DrawCacheModifier) {
+            requireOwner()
+                .snapshotObserver
+                .observeReads(this, onDrawCacheReadsChanged) {
+                    element.onBuildCache(this)
+                }
+        }
+        invalidateCache = false
+    }
+
+    internal fun onDrawCacheReadsChanged() {
+        invalidateCache = true
+        requestDraw()
+    }
+
+    private var focusOrderElement: FocusPropertiesModifier? = null
+    private var _providedValues: BackwardsCompatLocalMap? = null
+    var readValues = hashSetOf<ModifierLocal<*>>()
+    override val providedValues: ModifierLocalMap get() = _providedValues ?: modifierLocalMapOf()
+
+    override val <T> ModifierLocal<T>.current: T
+        get() {
+            val key = this
+            readValues.add(key)
+            visitAncestors(Nodes.Locals) {
+                if (it.providedValues.contains(key)) {
+                    @Suppress("UNCHECKED_CAST")
+                    return it.providedValues[key] as T
+                }
+            }
+            return key.defaultFactory()
+        }
+
+    fun updateModifierLocalConsumer() {
+        if (isAttached) {
+            readValues.clear()
+            requireOwner().snapshotObserver.observeReads(
+                this,
+                updateModifierLocalConsumer
+            ) {
+                (element as ModifierLocalConsumer).onModifierLocalsUpdated(this)
+            }
+        }
+    }
+
+    fun updateFocusOrderModifierLocalConsumer() {
+        if (isAttached) {
+            requireOwner().snapshotObserver.observeReads(
+                this,
+                updateFocusOrderModifierLocalConsumer
+            ) {
+                (focusOrderElement!! as ModifierLocalConsumer).onModifierLocalsUpdated(this)
+            }
+        }
+    }
+
+    fun updateModifierLocalProvider(element: ModifierLocalProvider<*>) {
+        val providedValues = _providedValues
+        if (providedValues != null && providedValues.contains(element.key)) {
+            providedValues.element = element
+            requireOwner()
+                .modifierLocalManager
+                .updatedProvider(this, element.key)
+        } else {
+            _providedValues = BackwardsCompatLocalMap(element)
+            // we only need to notify the modifierLocalManager of an inserted provider
+            // in the cases where a provider was added to the chain where it was possible
+            // that consumers below it could need to be invalidated. If this layoutnode
+            // is just now being created, then that is impossible. In this case, we can just
+            // do nothing and wait for the child consumers to read us. We infer this by
+            // checking to see if the tail node is attached or not. If it is not, then the node
+            // chain is being attached for the first time.
+            val isChainUpdate = requireLayoutNode().nodes.tail.isAttached
+            if (isChainUpdate) {
+                requireOwner()
+                    .modifierLocalManager
+                    .insertedProvider(this, element.key)
+            }
+        }
+    }
+
+    override val isValid: Boolean get() = isAttached
+    override var targetSize: IntSize
+        get() = (element as IntermediateLayoutModifier).targetSize
+        set(value) {
+            (element as IntermediateLayoutModifier).targetSize = value
+        }
+
+    override fun MeasureScope.measure(
+        measurable: Measurable,
+        constraints: Constraints
+    ): MeasureResult {
+        return with(element as LayoutModifier) {
+            measure(measurable, constraints)
+        }
+    }
+
+    override fun IntrinsicMeasureScope.minIntrinsicWidth(
+        measurable: IntrinsicMeasurable,
+        height: Int
+    ): Int = with(element as LayoutModifier) {
+        minIntrinsicWidth(measurable, height)
+    }
+
+    override fun IntrinsicMeasureScope.minIntrinsicHeight(
+        measurable: IntrinsicMeasurable,
+        width: Int
+    ): Int = with(element as LayoutModifier) {
+        minIntrinsicHeight(measurable, width)
+    }
+
+    override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+        measurable: IntrinsicMeasurable,
+        height: Int
+    ): Int = with(element as LayoutModifier) {
+        maxIntrinsicWidth(measurable, height)
+    }
+
+    override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+        measurable: IntrinsicMeasurable,
+        width: Int
+    ): Int = with(element as LayoutModifier) {
+        maxIntrinsicHeight(measurable, width)
+    }
+
+    override fun ContentDrawScope.draw() {
+        val element = element
+        with(element as DrawModifier) {
+            if (invalidateCache && element is DrawCacheModifier) {
+                updateDrawCache()
+            }
+            draw()
+        }
+    }
+
+    override val semanticsConfiguration: SemanticsConfiguration
+        get() = (element as SemanticsModifier).semanticsConfiguration
+
+    override fun onPointerEvent(
+        pointerEvent: PointerEvent,
+        pass: PointerEventPass,
+        bounds: IntSize
+    ) {
+        with(element as PointerInputModifier) {
+            pointerInputFilter.onPointerEvent(pointerEvent, pass, bounds)
+        }
+    }
+
+    override fun onCancelPointerInput() {
+        with(element as PointerInputModifier) {
+            pointerInputFilter.onCancel()
+        }
+    }
+
+    @OptIn(ExperimentalComposeUiApi::class)
+    override fun sharePointerInputWithSiblings(): Boolean {
+        return with(element as PointerInputModifier) {
+            pointerInputFilter.shareWithSiblings
+        }
+    }
+
+    override fun interceptOutOfBoundsChildEvents(): Boolean {
+        return with(element as PointerInputModifier) {
+            pointerInputFilter.interceptOutOfBoundsChildEvents
+        }
+    }
+
+    override fun Density.modifyParentData(parentData: Any?): Any? {
+        return with(element as ParentDataModifier) {
+            modifyParentData(parentData)
+        }
+    }
+
+    override fun onGloballyPositioned(coordinates: LayoutCoordinates) {
+        (element as OnGloballyPositionedModifier).onGloballyPositioned(coordinates)
+    }
+
+    @OptIn(ExperimentalComposeUiApi::class)
+    override fun onLookaheadPlaced(coordinates: LookaheadLayoutCoordinates) {
+        val element = element
+        if (element is LookaheadOnPlacedModifier) {
+            element.onPlaced(coordinates)
+        }
+    }
+
+    override fun onRemeasured(size: IntSize) {
+        val element = element
+        if (element is OnRemeasuredModifier) {
+            element.onRemeasured(size)
+        }
+    }
+
+    private var lastOnPlacedCoordinates: LayoutCoordinates? = null
+    override fun onPlaced(coordinates: LayoutCoordinates) {
+        lastOnPlacedCoordinates = coordinates
+        val element = element
+        if (element is OnPlacedModifier) {
+            element.onPlaced(coordinates)
+        }
+    }
+
+    override fun toString(): String = element.toString()
+}
+
+private val DetachedModifierLocalReadScope = object : ModifierLocalReadScope {
+    override val <T> ModifierLocal<T>.current: T
+        get() = defaultFactory()
+}
+
+private val onDrawCacheReadsChanged = { it: BackwardsCompatNode ->
+    it.onDrawCacheReadsChanged()
+}
+
+private val updateModifierLocalConsumer = { it: BackwardsCompatNode ->
+    it.updateModifierLocalConsumer()
+}
+
+private val updateFocusOrderModifierLocalConsumer = { it: BackwardsCompatNode ->
+    it.updateFocusOrderModifierLocalConsumer()
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DelegatableNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DelegatableNode.kt
new file mode 100644
index 0000000..d31045a
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DelegatableNode.kt
@@ -0,0 +1,296 @@
+
+/*
+ * 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.node
+
+import androidx.compose.runtime.collection.MutableVector
+import androidx.compose.runtime.collection.mutableVectorOf
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+
+// TODO(lmr): this interface needs a better name
+@ExperimentalComposeUiApi
+interface DelegatableNode {
+    val node: Modifier.Node
+}
+
+// TREE TRAVERSAL APIS
+// For now, traversing the node tree and layout node tree will be kept out of public API.
+// Some internal modifiers, such as Focus, PointerInput, etc. will all need to utilize this
+// a bit, but I think we want to avoid giving this power to public API just yet. We can
+// introduce this as valid cases arise
+@ExperimentalComposeUiApi
+internal fun DelegatableNode.localChild(mask: Int): Modifier.Node? {
+    val child = node.child ?: return null
+    if (child.aggregateChildKindSet and mask == 0) return null
+    var next: Modifier.Node? = child
+    while (next != null) {
+        if (next.kindSet and mask != 0) {
+            return next
+        }
+        next = next.child
+    }
+    return null
+}
+
+@ExperimentalComposeUiApi
+internal fun DelegatableNode.localParent(mask: Int): Modifier.Node? {
+    var next = node.parent
+    while (next != null) {
+        if (next.kindSet and mask != 0) {
+            return next
+        }
+        next = next.parent
+    }
+    return null
+}
+
+@ExperimentalComposeUiApi
+internal inline fun DelegatableNode.visitAncestors(mask: Int, block: (Modifier.Node) -> Unit) {
+    // TODO(lmr): we might want to add some safety wheels to prevent this from being called
+    //  while one of the chains is being diffed / updated. Although that might only be
+    //  necessary for visiting subtree.
+    check(node.isAttached)
+    var node: Modifier.Node? = node.parent
+    var layout: LayoutNode? = requireLayoutNode()
+    while (layout != null) {
+        val head = layout.nodes.head
+        if (head.aggregateChildKindSet and mask != 0) {
+            while (node != null) {
+                if (node.kindSet and mask != 0) {
+                    block(node)
+                }
+                node = node.parent
+            }
+        }
+        layout = layout.parent
+        node = layout?.nodes?.tail
+    }
+}
+
+@ExperimentalComposeUiApi
+internal fun DelegatableNode.nearestAncestor(mask: Int): Modifier.Node? {
+    check(node.isAttached)
+    var node: Modifier.Node? = node.parent
+    var layout: LayoutNode? = requireLayoutNode()
+    while (layout != null) {
+        val head = layout.nodes.head
+        if (head.aggregateChildKindSet and mask != 0) {
+            while (node != null) {
+                if (node.kindSet and mask != 0) {
+                    return node
+                }
+                node = node.parent
+            }
+        }
+        layout = layout.parent
+        node = layout?.nodes?.tail
+    }
+    return null
+}
+
+@ExperimentalComposeUiApi
+internal inline fun DelegatableNode.visitSubtree(mask: Int, block: (Modifier.Node) -> Unit) {
+    // TODO(lmr): we might want to add some safety wheels to prevent this from being called
+    //  while one of the chains is being diffed / updated.
+    check(node.isAttached)
+    var node: Modifier.Node? = node.child
+    var layout: LayoutNode? = requireLayoutNode()
+    // we use this bespoke data structure here specifically for traversing children. In the
+    // depth first traversal you would typically do a `stack.addAll(node.children)` type
+    // call, but to avoid enumerating the vector and moving into our stack, we simply keep
+    // a stack of vectors and keep track of where we are in each
+    val nodes = NestedVectorStack<LayoutNode>()
+    while (layout != null) {
+        // NOTE: the ?: is important here for the starting condition, since we are starting
+        // at THIS node, and not the head of this node chain.
+        node = node ?: layout.nodes.head
+        if (node.aggregateChildKindSet and mask != 0) {
+            while (node != null) {
+                if (node.kindSet and mask != 0) {
+                    block(node)
+                }
+                node = node.child
+            }
+            node = null
+        }
+        nodes.push(layout._children)
+        layout = if (nodes.isNotEmpty()) nodes.pop() else null
+    }
+}
+
+@OptIn(ExperimentalComposeUiApi::class)
+private fun MutableVector<Modifier.Node>.addLayoutNodeChildren(node: Modifier.Node) {
+    node.requireLayoutNode()._children.forEach {
+        add(it.nodes.head)
+    }
+}
+
+@ExperimentalComposeUiApi
+internal inline fun DelegatableNode.visitChildren(mask: Int, block: (Modifier.Node) -> Unit) {
+    check(node.isAttached)
+    val branches = mutableVectorOf<Modifier.Node>()
+    val child = node.child
+    if (child == null)
+        branches.addLayoutNodeChildren(node)
+    else
+        branches.add(child)
+    while (branches.isNotEmpty()) {
+        val branch = branches.removeAt(branches.size)
+        if (branch.aggregateChildKindSet and mask == 0) {
+            branches.addLayoutNodeChildren(branch)
+            // none of these nodes match the mask, so don't bother traversing them
+            continue
+        }
+        var node: Modifier.Node? = branch
+        while (node != null) {
+            if (node.kindSet and mask != 0) {
+                block(node)
+                break
+            }
+            node = node.child
+        }
+    }
+}
+
+/**
+ * visit the shallow tree of children of a given mask, but if block returns true, we will continue
+ * traversing below it
+ */
+@ExperimentalComposeUiApi
+internal inline fun DelegatableNode.visitSubtreeIf(mask: Int, block: (Modifier.Node) -> Boolean) {
+    check(node.isAttached)
+    val branches = mutableVectorOf<Modifier.Node>()
+    val child = node.child
+    if (child == null)
+        branches.addLayoutNodeChildren(node)
+    else
+        branches.add(child)
+    outer@ while (branches.isNotEmpty()) {
+        val branch = branches.removeAt(branches.size - 1)
+        if (branch.aggregateChildKindSet and mask != 0) {
+            var node: Modifier.Node? = branch
+            while (node != null) {
+                if (node.kindSet and mask != 0) {
+                    val diveDeeper = block(node)
+                    if (!diveDeeper) continue@outer
+                }
+                node = node.child
+            }
+        }
+        branches.addLayoutNodeChildren(branch)
+    }
+}
+
+@ExperimentalComposeUiApi
+internal inline fun DelegatableNode.visitLocalChildren(mask: Int, block: (Modifier.Node) -> Unit) {
+    check(node.isAttached)
+    val self = node
+    if (self.aggregateChildKindSet and mask == 0) return
+    var next = self.child
+    while (next != null) {
+        if (next.kindSet and mask != 0) {
+            block(next)
+        }
+        next = next.child
+    }
+}
+
+@ExperimentalComposeUiApi
+internal inline fun DelegatableNode.visitLocalParents(mask: Int, block: (Modifier.Node) -> Unit) {
+    check(node.isAttached)
+    var next = node.parent
+    while (next != null) {
+        if (next.kindSet and mask != 0) {
+            block(next)
+        }
+        next = next.parent
+    }
+}
+
+@ExperimentalComposeUiApi
+internal inline fun <reified T> DelegatableNode.visitLocalChildren(
+    type: NodeKind<T>,
+    block: (T) -> Unit
+) = visitLocalChildren(type.mask) {
+    if (it is T) block(it)
+}
+
+@ExperimentalComposeUiApi
+internal inline fun <reified T> DelegatableNode.visitLocalParents(
+    type: NodeKind<T>,
+    block: (T) -> Unit
+) = visitLocalParents(type.mask) {
+    if (it is T) block(it)
+}
+
+@ExperimentalComposeUiApi
+internal inline fun <reified T> DelegatableNode.localParent(type: NodeKind<T>): T? =
+    localParent(type.mask) as? T
+
+@ExperimentalComposeUiApi
+internal inline fun <reified T> DelegatableNode.localChild(type: NodeKind<T>): T? =
+    localChild(type.mask) as? T
+
+@ExperimentalComposeUiApi
+internal inline fun <reified T> DelegatableNode.visitAncestors(
+    type: NodeKind<T>,
+    block: (T) -> Unit
+) = visitAncestors(type.mask) { if (it is T) block(it) }
+
+@ExperimentalComposeUiApi
+internal inline fun <reified T : Any> DelegatableNode.nearestAncestor(type: NodeKind<T>): T? =
+    nearestAncestor(type.mask) as? T
+
+@ExperimentalComposeUiApi
+internal inline fun <reified T> DelegatableNode.visitSubtree(
+    type: NodeKind<T>,
+    block: (T) -> Unit
+) = visitSubtree(type.mask) { if (it is T) block(it) }
+
+@ExperimentalComposeUiApi
+internal inline fun <reified T> DelegatableNode.visitChildren(
+    type: NodeKind<T>,
+    block: (T) -> Unit
+) = visitChildren(type.mask) { if (it is T) block(it) }
+
+@ExperimentalComposeUiApi
+internal inline fun <reified T> DelegatableNode.visitSubtreeIf(
+    type: NodeKind<T>,
+    block: (T) -> Boolean
+) = visitSubtreeIf(type.mask) { if (it is T) block(it) else true }
+
+@ExperimentalComposeUiApi
+internal fun DelegatableNode.has(type: NodeKind<*>): Boolean =
+    node.aggregateChildKindSet and type.mask != 0
+
+@ExperimentalComposeUiApi
+internal fun DelegatableNode.requireCoordinator(kind: NodeKind<*>): NodeCoordinator {
+    val coordinator = node.coordinator!!
+    return if (coordinator.tail !== this)
+        coordinator
+    else if (kind.includeSelfInTraversal)
+        coordinator.wrapped!!
+    else
+        coordinator
+}
+
+@ExperimentalComposeUiApi
+internal fun DelegatableNode.requireLayoutNode(): LayoutNode = node.coordinator!!.layoutNode
+
+@ExperimentalComposeUiApi
+internal fun DelegatableNode.requireOwner(): Owner = requireLayoutNode().owner!!
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DelegatingNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DelegatingNode.kt
new file mode 100644
index 0000000..b846e6f
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DelegatingNode.kt
@@ -0,0 +1,76 @@
+/*
+ * 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.node
+
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+
+@ExperimentalComposeUiApi
+abstract class DelegatingNode : Modifier.Node() {
+    override fun updateCoordinator(coordinator: NodeCoordinator?) {
+        super.updateCoordinator(coordinator)
+        forEachDelegate {
+            it.updateCoordinator(coordinator)
+        }
+    }
+
+    private var delegate: Modifier.Node? = null
+    fun <T : Modifier.Node> delegated(fn: () -> T): T {
+        val owner = node
+        val delegate = fn()
+        delegate.setAsDelegateTo(owner)
+        if (isAttached) {
+            updateCoordinator(owner.coordinator)
+            delegate.attach()
+        }
+        addDelegate(delegate)
+        return delegate
+    }
+
+    private fun addDelegate(node: Modifier.Node) {
+        val tail = delegate
+        if (tail != null) {
+            node.parent = tail
+        }
+        delegate = node
+    }
+
+    fun <T : Modifier.Node> lazyDelegated(fn: () -> T): Lazy<T> = lazy(LazyThreadSafetyMode.NONE) {
+        delegated(fn)
+    }
+
+    private inline fun forEachDelegate(block: (Modifier.Node) -> Unit) {
+        var node: Modifier.Node? = delegate
+        while (node != null) {
+            block(node)
+            node = node.parent
+        }
+    }
+
+    override fun onAttach() {
+        super.onAttach()
+        forEachDelegate {
+            updateCoordinator(coordinator)
+            it.attach()
+        }
+    }
+
+    override fun onDetach() {
+        forEachDelegate { it.detach() }
+        super.onDetach()
+    }
+}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DrawEntity.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DrawEntity.kt
deleted file mode 100644
index 04e3dc9..0000000
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DrawEntity.kt
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.compose.ui.node
-
-import androidx.compose.ui.draw.BuildDrawCacheParams
-import androidx.compose.ui.draw.DrawCacheModifier
-import androidx.compose.ui.draw.DrawModifier
-import androidx.compose.ui.geometry.Size
-import androidx.compose.ui.graphics.Canvas
-import androidx.compose.ui.unit.LayoutDirection
-import androidx.compose.ui.unit.toSize
-
-internal class DrawEntity(
-    layoutNodeWrapper: LayoutNodeWrapper,
-    modifier: DrawModifier
-) : LayoutNodeEntity<DrawEntity, DrawModifier>(layoutNodeWrapper, modifier), OwnerScope {
-    private var cacheDrawModifier: DrawCacheModifier? = updateCacheDrawModifier()
-
-    private val buildCacheParams: BuildDrawCacheParams = object : BuildDrawCacheParams {
-        // b/173669932 we should not cache this here, however, on subsequent modifier updates
-        // the density provided via layoutNode.density becomes 1
-        override val density = layoutNode.density
-
-        override val layoutDirection: LayoutDirection get() = layoutNode.layoutDirection
-
-        override val size: Size get() = layoutNodeWrapper.size.toSize()
-    }
-
-    // Flag to determine if the cache should be re-built
-    private var invalidateCache = true
-
-    // Callback used to build the drawing cache
-    private val updateCache = {
-        // b/173669932 figure out why layoutNode.mDrawScope density is 1 after observation updates
-        // and use that here instead of the cached density we get in the constructor
-        cacheDrawModifier?.onBuildCache(buildCacheParams)
-        invalidateCache = false
-    }
-
-    // Intentionally returning DrawCacheModifier not generic Modifier type
-    // to make sure that we are updating the current DrawCacheModifier in the
-    // event that a new DrawCacheModifier is provided
-    // Suppressing insepctorinfo as relying on the inspector info for
-    // DrawCacheModifier
-    @Suppress(
-        "ModifierInspectorInfo",
-        "ModifierFactoryReturnType",
-        "ModifierFactoryExtensionFunction"
-    )
-    private fun updateCacheDrawModifier(): DrawCacheModifier? {
-        val current = modifier
-        return if (current is DrawCacheModifier) {
-            current
-        } else {
-            null
-        }
-    }
-
-    override fun onAttach() {
-        cacheDrawModifier = updateCacheDrawModifier()
-        invalidateCache = true
-        super.onAttach()
-    }
-
-    fun onMeasureResultChanged() {
-        invalidateCache = true
-    }
-
-    // This is not thread safe
-    fun draw(canvas: Canvas) {
-        val size = size.toSize()
-        if (cacheDrawModifier != null && invalidateCache) {
-            layoutNode.requireOwner().snapshotObserver.observeReads(
-                this,
-                onCommitAffectingDrawEntity,
-                updateCache
-            )
-        }
-
-        val drawScope = layoutNode.mDrawScope
-        drawScope.draw(canvas, size, layoutNodeWrapper, this) {
-            with(drawScope) {
-                with(modifier) {
-                    draw()
-                }
-            }
-        }
-    }
-
-    companion object {
-        // Callback invoked whenever a state parameter that is read within the cache
-        // execution callback is updated. This marks the cache flag as dirty and
-        // invalidates the current layer.
-        private val onCommitAffectingDrawEntity: (DrawEntity) -> Unit =
-            { drawEntity ->
-                if (drawEntity.isValid) {
-                    drawEntity.invalidateCache = true
-                    drawEntity.layoutNodeWrapper.invalidateLayer()
-                }
-            }
-    }
-
-    override val isValid: Boolean
-        get() = layoutNodeWrapper.isAttached
-}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DrawModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DrawModifierNode.kt
new file mode 100644
index 0000000..3cf3d50
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DrawModifierNode.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.compose.ui.node
+
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.graphics.drawscope.ContentDrawScope
+
+@ExperimentalComposeUiApi
+interface DrawModifierNode : DelegatableNode {
+    fun ContentDrawScope.draw()
+    fun onMeasureResultChanged() {}
+}
+
+@ExperimentalComposeUiApi
+internal fun DrawModifierNode.requestDraw() = requireLayoutNode().invalidateLayer()
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/EntityList.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/EntityList.kt
deleted file mode 100644
index d290fdd..0000000
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/EntityList.kt
+++ /dev/null
@@ -1,164 +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.node
-
-import androidx.compose.ui.ExperimentalComposeUiApi
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.draw.DrawModifier
-import androidx.compose.ui.input.pointer.PointerInputModifier
-import androidx.compose.ui.layout.OnPlacedModifier
-import androidx.compose.ui.layout.OnRemeasuredModifier
-import androidx.compose.ui.layout.LookaheadOnPlacedModifier
-import androidx.compose.ui.layout.ParentDataModifier
-import androidx.compose.ui.semantics.SemanticsEntity
-import androidx.compose.ui.semantics.SemanticsModifier
-
-/**
- * A collection of [LayoutNodeEntity] elements. [LayoutNodeEntity] is a node in
- * a linked list and this contains the [head] of the list.
- *
- * This linked list structure makes it easier to execute recursing algorithms
- * using the [LayoutNodeEntity.next] without having to allocate any lambdas.
- */
-@kotlin.jvm.JvmInline
-internal value class EntityList(
-    val entities: Array<LayoutNodeEntity<*, *>?> = arrayOfNulls(TypeCount)
-) {
-    /**
-     * Add [LayoutNodeEntity] values for types that [modifier] supports that should be
-     * added before the LayoutModifier.
-     */
-    fun addBeforeLayoutModifier(layoutNodeWrapper: LayoutNodeWrapper, modifier: Modifier) {
-        if (modifier is DrawModifier) {
-            add(DrawEntity(layoutNodeWrapper, modifier), DrawEntityType.index)
-        }
-        if (modifier is PointerInputModifier) {
-            add(PointerInputEntity(layoutNodeWrapper, modifier), PointerInputEntityType.index)
-        }
-        if (modifier is SemanticsModifier) {
-            add(SemanticsEntity(layoutNodeWrapper, modifier), SemanticsEntityType.index)
-        }
-        if (modifier is ParentDataModifier) {
-            add(SimpleEntity(layoutNodeWrapper, modifier), ParentDataEntityType.index)
-        }
-    }
-
-    /**
-     * Add [LayoutNodeEntity] values that must be added after the LayoutModifier.
-     */
-    @OptIn(ExperimentalComposeUiApi::class)
-    fun addAfterLayoutModifier(layoutNodeWrapper: LayoutNodeWrapper, modifier: Modifier) {
-        if (modifier is OnPlacedModifier) {
-            add(SimpleEntity(layoutNodeWrapper, modifier), OnPlacedEntityType.index)
-        }
-        if (modifier is OnRemeasuredModifier) {
-            add(SimpleEntity(layoutNodeWrapper, modifier), RemeasureEntityType.index)
-        }
-        if (modifier is LookaheadOnPlacedModifier) {
-            add(SimpleEntity(layoutNodeWrapper, modifier), LookaheadOnPlacedEntityType.index)
-        }
-    }
-
-    private fun <T : LayoutNodeEntity<T, *>> add(entity: T, index: Int) {
-        @Suppress("UNCHECKED_CAST")
-        val head = entities[index] as T?
-        entity.next = head
-        entities[index] = entity
-    }
-
-    /**
-     * The head of the linked list of [LayoutNodeEntity] elements of the type [entityType].
-     */
-    @Suppress("UNCHECKED_CAST")
-    fun <T : LayoutNodeEntity<T, M>, M : Modifier> head(entityType: EntityType<T, M>): T? =
-        entities[entityType.index] as T?
-
-    /**
-     * Returns `true` if there are any elements of the given type.
-     */
-    fun has(entityType: EntityType<*, *>): Boolean = entities[entityType.index] != null
-
-    /**
-     * Remove all entries from the list and call [LayoutNodeEntity.onDetach] on them.
-     */
-    fun clear() {
-        forEach {
-            if (it.isAttached) {
-                it.onDetach()
-            }
-        }
-        for (index in entities.indices) {
-            entities[index] = null
-        }
-    }
-
-    /**
-     * Calls [block] on all entries.
-     */
-    inline fun forEach(block: (LayoutNodeEntity<*, *>) -> Unit) {
-        entities.forEach { head ->
-            var node = head
-            while (node != null) {
-                block(node)
-                node = node.next
-            }
-        }
-    }
-
-    /**
-     * Executes [block] over all entities with [entityType].
-     */
-    inline fun <T : LayoutNodeEntity<T, M>, M : Modifier> forEach(
-        entityType: EntityType<T, M>,
-        block: (T) -> Unit
-    ) {
-        entities[entityType.index].forEach(block)
-    }
-
-    private inline fun <T : LayoutNodeEntity<T, M>, M : Modifier> LayoutNodeEntity<*, *>?.forEach(
-        block: (T) -> Unit
-    ) {
-        var node = this
-        while (node != null) {
-            @Suppress("UNCHECKED_CAST")
-            block(node as T)
-            node = node.next
-        }
-    }
-
-    @kotlin.jvm.JvmInline
-    value class EntityType<T : LayoutNodeEntity<T, M>, M : Modifier>(val index: Int)
-
-    companion object {
-        val DrawEntityType = EntityType<DrawEntity, DrawModifier>(0)
-        val PointerInputEntityType = EntityType<PointerInputEntity, PointerInputModifier>(1)
-        val SemanticsEntityType = EntityType<SemanticsEntity, SemanticsModifier>(2)
-        val ParentDataEntityType =
-            EntityType<SimpleEntity<ParentDataModifier>, ParentDataModifier>(3)
-        val OnPlacedEntityType =
-            EntityType<SimpleEntity<OnPlacedModifier>, OnPlacedModifier>(4)
-        val RemeasureEntityType =
-            EntityType<SimpleEntity<OnRemeasuredModifier>, OnRemeasuredModifier>(5)
-        @OptIn(ExperimentalComposeUiApi::class)
-        val LookaheadOnPlacedEntityType =
-            EntityType<SimpleEntity<LookaheadOnPlacedModifier>, LookaheadOnPlacedModifier>(
-                6
-            )
-
-        private const val TypeCount = 7
-    }
-}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/GlobalPositionAwareModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/GlobalPositionAwareModifierNode.kt
new file mode 100644
index 0000000..4f8bbb3
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/GlobalPositionAwareModifierNode.kt
@@ -0,0 +1,25 @@
+/*
+ * 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.node
+
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.layout.LayoutCoordinates
+
+@ExperimentalComposeUiApi
+interface GlobalPositionAwareModifierNode : DelegatableNode {
+    fun onGloballyPositioned(coordinates: LayoutCoordinates)
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/HitTestResult.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/HitTestResult.kt
index b51bb7e..0c2ede1 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/HitTestResult.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/HitTestResult.kt
@@ -28,8 +28,7 @@
  * The List<T> interface should only be used after hit testing has completed.
  *
  * @see LayoutNode.hitTest
- * @see LayoutNodeWrapper.hitTest
- * @see PointerInputEntity.hitTest
+ * @see NodeCoordinator.hitTest
  */
 internal class HitTestResult<T> : List<T> {
     private var values = arrayOfNulls<Any>(16)
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/InnerNodeCoordinator.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/InnerNodeCoordinator.kt
new file mode 100644
index 0000000..25ff32b
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/InnerNodeCoordinator.kt
@@ -0,0 +1,222 @@
+/*
+ * 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.node
+
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.graphics.Canvas
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.GraphicsLayerScope
+import androidx.compose.ui.graphics.Paint
+import androidx.compose.ui.graphics.PaintingStyle
+import androidx.compose.ui.layout.AlignmentLine
+import androidx.compose.ui.layout.LookaheadScope
+import androidx.compose.ui.layout.Placeable
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.IntOffset
+
+internal class InnerNodeCoordinator(
+    layoutNode: LayoutNode
+) : NodeCoordinator(layoutNode) {
+    @OptIn(ExperimentalComposeUiApi::class)
+    override val tail: Modifier.Node = object : Modifier.Node() {
+        override fun toString(): String {
+            return "<tail>"
+        }
+    }
+    init {
+        @OptIn(ExperimentalComposeUiApi::class)
+        tail.updateCoordinator(this)
+    }
+
+    private inner class LookaheadDelegateImpl(
+        scope: LookaheadScope
+    ) : LookaheadDelegate(this, scope) {
+
+        // Lookahead measure
+        override fun measure(constraints: Constraints): Placeable =
+            performingMeasure(constraints) {
+                // before rerunning the user's measure block reset previous measuredByParent for children
+                layoutNode.forEachChild {
+                    it.measuredByParentInLookahead = LayoutNode.UsageByParent.NotUsed
+                }
+                val measureResult = with(layoutNode.measurePolicy) {
+                    measure(
+                        layoutNode.childLookaheadMeasurables,
+                        constraints
+                    )
+                }
+                measureResult
+            }
+
+        override fun calculateAlignmentLine(alignmentLine: AlignmentLine): Int {
+            return (alignmentLinesOwner
+                .calculateAlignmentLines()[alignmentLine] ?: AlignmentLine.Unspecified).also {
+                cachedAlignmentLinesMap[alignmentLine] = it
+            }
+        }
+
+        override fun placeChildren() {
+            layoutNode.layoutDelegate.lookaheadPassDelegate!!.onPlaced()
+            alignmentLinesOwner.layoutChildren()
+        }
+
+        override fun minIntrinsicWidth(height: Int) =
+            layoutNode.intrinsicsPolicy.minLookaheadIntrinsicWidth(height)
+
+        override fun minIntrinsicHeight(width: Int) =
+            layoutNode.intrinsicsPolicy.minLookaheadIntrinsicHeight(width)
+
+        override fun maxIntrinsicWidth(height: Int) =
+            layoutNode.intrinsicsPolicy.maxLookaheadIntrinsicWidth(height)
+
+        override fun maxIntrinsicHeight(width: Int) =
+            layoutNode.intrinsicsPolicy.maxLookaheadIntrinsicHeight(width)
+    }
+
+    override fun createLookaheadDelegate(scope: LookaheadScope): LookaheadDelegate {
+        return LookaheadDelegateImpl(scope)
+    }
+
+    override fun measure(constraints: Constraints): Placeable = performingMeasure(constraints) {
+        // before rerunning the user's measure block reset previous measuredByParent for children
+        layoutNode.forEachChild {
+            it.measuredByParent = LayoutNode.UsageByParent.NotUsed
+        }
+
+        measureResult = with(layoutNode.measurePolicy) {
+            measure(layoutNode.childMeasurables, constraints)
+        }
+        onMeasured()
+        return this
+    }
+
+    override fun minIntrinsicWidth(height: Int) =
+        layoutNode.intrinsicsPolicy.minIntrinsicWidth(height)
+
+    override fun minIntrinsicHeight(width: Int) =
+        layoutNode.intrinsicsPolicy.minIntrinsicHeight(width)
+
+    override fun maxIntrinsicWidth(height: Int) =
+        layoutNode.intrinsicsPolicy.maxIntrinsicWidth(height)
+
+    override fun maxIntrinsicHeight(width: Int) =
+        layoutNode.intrinsicsPolicy.maxIntrinsicHeight(width)
+
+    override fun placeAt(
+        position: IntOffset,
+        zIndex: Float,
+        layerBlock: (GraphicsLayerScope.() -> Unit)?
+    ) {
+        super.placeAt(position, zIndex, layerBlock)
+
+        // The coordinator only runs their placement block to obtain our position, which allows them
+        // to calculate the offset of an alignment line we have already provided a position for.
+        // No need to place our wrapped as well (we might have actually done this already in
+        // get(line), to obtain the position of the alignment line the coordinator currently needs
+        // our position in order ot know how to offset the value we provided).
+        if (isShallowPlacing) return
+
+        onPlaced()
+
+        layoutNode.onNodePlaced()
+    }
+
+    override fun calculateAlignmentLine(alignmentLine: AlignmentLine): Int {
+        return lookaheadDelegate?.calculateAlignmentLine(alignmentLine)
+            ?: alignmentLinesOwner
+                .calculateAlignmentLines()[alignmentLine]
+            ?: AlignmentLine.Unspecified
+    }
+
+    override fun performDraw(canvas: Canvas) {
+        val owner = layoutNode.requireOwner()
+        layoutNode.zSortedChildren.forEach { child ->
+            if (child.isPlaced) {
+                child.draw(canvas)
+            }
+        }
+        if (owner.showLayoutBounds) {
+            drawBorder(canvas, innerBoundsPaint)
+        }
+    }
+
+    @OptIn(ExperimentalComposeUiApi::class)
+    override fun <T : DelegatableNode> hitTestChild(
+        hitTestSource: HitTestSource<T>,
+        pointerPosition: Offset,
+        hitTestResult: HitTestResult<T>,
+        isTouchEvent: Boolean,
+        isInLayer: Boolean
+    ) {
+        var inLayer = isInLayer
+        var hitTestChildren = false
+
+        if (hitTestSource.shouldHitTestChildren(layoutNode)) {
+            if (withinLayerBounds(pointerPosition)) {
+                hitTestChildren = true
+            } else if (isTouchEvent &&
+                distanceInMinimumTouchTarget(pointerPosition, minimumTouchTargetSize).isFinite()
+            ) {
+                inLayer = false
+                hitTestChildren = true
+            }
+        }
+
+        if (hitTestChildren) {
+            hitTestResult.siblingHits {
+                // Any because as soon as true is returned, we know we have found a hit path and we must
+                // not add hit results on different paths so we should not even go looking.
+                layoutNode.zSortedChildren.reversedAny { child ->
+                    if (child.isPlaced) {
+                        hitTestSource.childHitTest(
+                            child,
+                            pointerPosition,
+                            hitTestResult,
+                            isTouchEvent,
+                            inLayer
+                        )
+                        val wasHit = hitTestResult.hasHit()
+                        val continueHitTest: Boolean
+                        if (!wasHit) {
+                            continueHitTest = true
+                        } else if (
+                            child.outerCoordinator.shouldSharePointerInputWithSiblings()
+                        ) {
+                            hitTestResult.acceptHits()
+                            continueHitTest = true
+                        } else {
+                            continueHitTest = false
+                        }
+                        !continueHitTest
+                    } else {
+                        false
+                    }
+                }
+            }
+        }
+    }
+
+    internal companion object {
+        val innerBoundsPaint = Paint().also { paint ->
+            paint.color = Color.Red
+            paint.strokeWidth = 1f
+            paint.style = PaintingStyle.Stroke
+        }
+    }
+}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/InnerPlaceable.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/InnerPlaceable.kt
deleted file mode 100644
index 64d6c57..0000000
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/InnerPlaceable.kt
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.compose.ui.node
-
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.graphics.Canvas
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.GraphicsLayerScope
-import androidx.compose.ui.graphics.Paint
-import androidx.compose.ui.graphics.PaintingStyle
-import androidx.compose.ui.layout.AlignmentLine
-import androidx.compose.ui.layout.LookaheadScope
-import androidx.compose.ui.layout.Placeable
-import androidx.compose.ui.unit.Constraints
-import androidx.compose.ui.unit.IntOffset
-
-internal class InnerPlaceable(
-    layoutNode: LayoutNode
-) : LayoutNodeWrapper(layoutNode) {
-
-    private inner class LookaheadDelegateImpl(
-        scope: LookaheadScope
-    ) : LookaheadDelegate(this, scope) {
-
-        // Lookahead measure
-        override fun measure(constraints: Constraints): Placeable =
-            performingMeasure(constraints) {
-                // before rerunning the user's measure block reset previous measuredByParent for children
-                layoutNode.forEachChild {
-                    it.measuredByParentInLookahead = LayoutNode.UsageByParent.NotUsed
-                }
-                val measureResult = with(layoutNode.measurePolicy) {
-                    measure(
-                        layoutNode.childLookaheadMeasurables,
-                        constraints
-                    )
-                }
-                measureResult
-            }
-
-        override fun calculateAlignmentLine(alignmentLine: AlignmentLine): Int {
-            return (alignmentLinesOwner
-                .calculateAlignmentLines()[alignmentLine] ?: AlignmentLine.Unspecified).also {
-                cachedAlignmentLinesMap[alignmentLine] = it
-            }
-        }
-
-        override fun placeChildren() {
-            layoutNode.layoutDelegate.lookaheadPassDelegate!!.onPlaced()
-            alignmentLinesOwner.layoutChildren()
-        }
-
-        override fun minIntrinsicWidth(height: Int) =
-            layoutNode.intrinsicsPolicy.minLookaheadIntrinsicWidth(height)
-
-        override fun minIntrinsicHeight(width: Int) =
-            layoutNode.intrinsicsPolicy.minLookaheadIntrinsicHeight(width)
-
-        override fun maxIntrinsicWidth(height: Int) =
-            layoutNode.intrinsicsPolicy.maxLookaheadIntrinsicWidth(height)
-
-        override fun maxIntrinsicHeight(width: Int) =
-            layoutNode.intrinsicsPolicy.maxLookaheadIntrinsicHeight(width)
-    }
-
-    override fun createLookaheadDelegate(scope: LookaheadScope): LookaheadDelegate {
-        return LookaheadDelegateImpl(scope)
-    }
-
-    override fun measure(constraints: Constraints): Placeable = performingMeasure(constraints) {
-        // before rerunning the user's measure block reset previous measuredByParent for children
-        layoutNode.forEachChild {
-            it.measuredByParent = LayoutNode.UsageByParent.NotUsed
-        }
-
-        measureResult = with(layoutNode.measurePolicy) {
-            measure(layoutNode.childMeasurables, constraints)
-        }
-        onMeasured()
-        return this
-    }
-
-    override fun minIntrinsicWidth(height: Int) =
-        layoutNode.intrinsicsPolicy.minIntrinsicWidth(height)
-
-    override fun minIntrinsicHeight(width: Int) =
-        layoutNode.intrinsicsPolicy.minIntrinsicHeight(width)
-
-    override fun maxIntrinsicWidth(height: Int) =
-        layoutNode.intrinsicsPolicy.maxIntrinsicWidth(height)
-
-    override fun maxIntrinsicHeight(width: Int) =
-        layoutNode.intrinsicsPolicy.maxIntrinsicHeight(width)
-
-    override fun placeAt(
-        position: IntOffset,
-        zIndex: Float,
-        layerBlock: (GraphicsLayerScope.() -> Unit)?
-    ) {
-        super.placeAt(position, zIndex, layerBlock)
-
-        // The wrapper only runs their placement block to obtain our position, which allows them
-        // to calculate the offset of an alignment line we have already provided a position for.
-        // No need to place our wrapped as well (we might have actually done this already in
-        // get(line), to obtain the position of the alignment line the wrapper currently needs
-        // our position in order ot know how to offset the value we provided).
-        if (isShallowPlacing) return
-
-        onPlaced()
-
-        layoutNode.onNodePlaced()
-    }
-
-    override fun calculateAlignmentLine(alignmentLine: AlignmentLine): Int {
-        return lookaheadDelegate?.calculateAlignmentLine(alignmentLine)
-            ?: alignmentLinesOwner
-                .calculateAlignmentLines()[alignmentLine]
-            ?: AlignmentLine.Unspecified
-    }
-
-    override fun performDraw(canvas: Canvas) {
-        val owner = layoutNode.requireOwner()
-        layoutNode.zSortedChildren.forEach { child ->
-            if (child.isPlaced) {
-                child.draw(canvas)
-            }
-        }
-        if (owner.showLayoutBounds) {
-            drawBorder(canvas, innerBoundsPaint)
-        }
-    }
-
-    override fun <T : LayoutNodeEntity<T, M>, C, M : Modifier> hitTestChild(
-        hitTestSource: HitTestSource<T, C, M>,
-        pointerPosition: Offset,
-        hitTestResult: HitTestResult<C>,
-        isTouchEvent: Boolean,
-        isInLayer: Boolean
-    ) {
-        var inLayer = isInLayer
-        var hitTestChildren = false
-
-        if (hitTestSource.shouldHitTestChildren(layoutNode)) {
-            if (withinLayerBounds(pointerPosition)) {
-                hitTestChildren = true
-            } else if (isTouchEvent &&
-                distanceInMinimumTouchTarget(pointerPosition, minimumTouchTargetSize).isFinite()
-            ) {
-                inLayer = false
-                hitTestChildren = true
-            }
-        }
-
-        if (hitTestChildren) {
-            hitTestResult.siblingHits {
-                // Any because as soon as true is returned, we know we have found a hit path and we must
-                // not add hit results on different paths so we should not even go looking.
-                layoutNode.zSortedChildren.reversedAny { child ->
-                    if (child.isPlaced) {
-                        hitTestSource.childHitTest(
-                            child,
-                            pointerPosition,
-                            hitTestResult,
-                            isTouchEvent,
-                            inLayer
-                        )
-                        val wasHit = hitTestResult.hasHit()
-                        val continueHitTest: Boolean
-                        if (!wasHit) {
-                            continueHitTest = true
-                        } else if (
-                            child.outerLayoutNodeWrapper.shouldSharePointerInputWithSiblings()
-                        ) {
-                            hitTestResult.acceptHits()
-                            continueHitTest = true
-                        } else {
-                            continueHitTest = false
-                        }
-                        !continueHitTest
-                    } else {
-                        false
-                    }
-                }
-            }
-        }
-    }
-
-    internal companion object {
-        val innerBoundsPaint = Paint().also { paint ->
-            paint.color = Color.Red
-            paint.strokeWidth = 1f
-            paint.style = PaintingStyle.Stroke
-        }
-    }
-}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/IntrinsicsPolicy.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/IntrinsicsPolicy.kt
index 7fa410c..a352269 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/IntrinsicsPolicy.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/IntrinsicsPolicy.kt
@@ -34,44 +34,44 @@
     }
 
     fun minIntrinsicWidth(height: Int) = with(measurePolicyFromState()) {
-        layoutNode.outerLayoutNodeWrapper.minIntrinsicWidth(layoutNode.childMeasurables, height)
+        layoutNode.outerCoordinator.minIntrinsicWidth(layoutNode.childMeasurables, height)
     }
 
     fun minIntrinsicHeight(width: Int) = with(measurePolicyFromState()) {
-        layoutNode.outerLayoutNodeWrapper.minIntrinsicHeight(layoutNode.childMeasurables, width)
+        layoutNode.outerCoordinator.minIntrinsicHeight(layoutNode.childMeasurables, width)
     }
 
     fun maxIntrinsicWidth(height: Int) = with(measurePolicyFromState()) {
-        layoutNode.outerLayoutNodeWrapper.maxIntrinsicWidth(layoutNode.childMeasurables, height)
+        layoutNode.outerCoordinator.maxIntrinsicWidth(layoutNode.childMeasurables, height)
     }
 
     fun maxIntrinsicHeight(width: Int) = with(measurePolicyFromState()) {
-        layoutNode.outerLayoutNodeWrapper.maxIntrinsicHeight(layoutNode.childMeasurables, width)
+        layoutNode.outerCoordinator.maxIntrinsicHeight(layoutNode.childMeasurables, width)
     }
 
     fun minLookaheadIntrinsicWidth(height: Int) = with(measurePolicyFromState()) {
-        layoutNode.outerLayoutNodeWrapper.minIntrinsicWidth(
+        layoutNode.outerCoordinator.minIntrinsicWidth(
             layoutNode.childLookaheadMeasurables,
             height
         )
     }
 
     fun minLookaheadIntrinsicHeight(width: Int) = with(measurePolicyFromState()) {
-        layoutNode.outerLayoutNodeWrapper.minIntrinsicHeight(
+        layoutNode.outerCoordinator.minIntrinsicHeight(
             layoutNode.childLookaheadMeasurables,
             width
         )
     }
 
     fun maxLookaheadIntrinsicWidth(height: Int) = with(measurePolicyFromState()) {
-        layoutNode.outerLayoutNodeWrapper.maxIntrinsicWidth(
+        layoutNode.outerCoordinator.maxIntrinsicWidth(
             layoutNode.childLookaheadMeasurables,
             height
         )
     }
 
     fun maxLookaheadIntrinsicHeight(width: Int) = with(measurePolicyFromState()) {
-        layoutNode.outerLayoutNodeWrapper.maxIntrinsicHeight(
+        layoutNode.outerCoordinator.maxIntrinsicHeight(
             layoutNode.childLookaheadMeasurables,
             width
         )
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutAwareModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutAwareModifierNode.kt
new file mode 100644
index 0000000..71464bc
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutAwareModifierNode.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.compose.ui.node
+
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.layout.LayoutCoordinates
+import androidx.compose.ui.layout.LookaheadLayoutCoordinates
+import androidx.compose.ui.unit.IntSize
+
+@ExperimentalComposeUiApi
+interface LayoutAwareModifierNode : DelegatableNode {
+    fun onPlaced(coordinates: LayoutCoordinates) {}
+    fun onLookaheadPlaced(coordinates: LookaheadLayoutCoordinates) {}
+    fun onRemeasured(size: IntSize) {}
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutModifierNode.kt
new file mode 100644
index 0000000..78778ca
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutModifierNode.kt
@@ -0,0 +1,103 @@
+/*
+ * 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.node
+
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.layout.IntrinsicMeasurable
+import androidx.compose.ui.layout.IntrinsicMeasureScope
+import androidx.compose.ui.layout.Measurable
+import androidx.compose.ui.layout.MeasureResult
+import androidx.compose.ui.layout.MeasureScope
+import androidx.compose.ui.layout.Remeasurement
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.IntSize
+
+@ExperimentalComposeUiApi
+interface LayoutModifierNode : Remeasurement, DelegatableNode {
+    // NOTE(lmr): i guess RemeasurementModifier was created because there are some use
+    //  cases where we want to call forceRemeasure but we don't want to implement MeasureNode.
+    //  I think maybe we should just add this as an API on DelegatingNode. I don't think we need
+    //  to burn a NodeType on this...
+    override fun forceRemeasure() = requireLayoutNode().forceRemeasure()
+
+    /**
+     * The function used to measure the modifier. The [measurable] corresponds to the
+     * wrapped content, and it can be measured with the desired constraints according
+     * to the logic of the [LayoutModifierNode]. The modifier needs to choose its own
+     * size, which can depend on the size chosen by the wrapped content (the obtained
+     * [Placeable]), if the wrapped content was measured. The size needs to be returned
+     * as part of a [MeasureResult], alongside the placement logic of the
+     * [Placeable], which defines how the wrapped content should be positioned inside
+     * the [LayoutModifierNode]. A convenient way to create the [MeasureResult]
+     * is to use the [MeasureScope.layout] factory function.
+     *
+     * A [LayoutModifierNode] uses the same measurement and layout concepts and principles as a
+     * [Layout], the only difference is that they apply to exactly one child. For a more detailed
+     * explanation of measurement and layout, see [MeasurePolicy].
+     */
+    fun MeasureScope.measure(
+        measurable: Measurable,
+        constraints: Constraints
+    ): MeasureResult
+
+    /**
+     * The function used to calculate [IntrinsicMeasurable.minIntrinsicWidth].
+     */
+    fun IntrinsicMeasureScope.minIntrinsicWidth(
+        measurable: IntrinsicMeasurable,
+        height: Int
+    ): Int
+
+    /**
+     * The lambda used to calculate [IntrinsicMeasurable.minIntrinsicHeight].
+     */
+    fun IntrinsicMeasureScope.minIntrinsicHeight(
+        measurable: IntrinsicMeasurable,
+        width: Int
+    ): Int
+
+    /**
+     * The function used to calculate [IntrinsicMeasurable.maxIntrinsicWidth].
+     */
+    fun IntrinsicMeasureScope.maxIntrinsicWidth(
+        measurable: IntrinsicMeasurable,
+        height: Int
+    ): Int
+
+    /**
+     * The lambda used to calculate [IntrinsicMeasurable.maxIntrinsicHeight].
+     */
+    fun IntrinsicMeasureScope.maxIntrinsicHeight(
+        measurable: IntrinsicMeasurable,
+        width: Int
+    ): Int
+}
+
+@ExperimentalComposeUiApi
+internal fun LayoutModifierNode.invalidateLayer() =
+    requireCoordinator(Nodes.Layout).invalidateLayer()
+
+@ExperimentalComposeUiApi
+internal fun LayoutModifierNode.requestRelayout() = requireLayoutNode().requestRelayout()
+
+@ExperimentalComposeUiApi
+internal fun LayoutModifierNode.requestRemeasure() = requireLayoutNode().requestRemeasure()
+
+@ExperimentalComposeUiApi
+interface IntermediateLayoutModifierNode : LayoutModifierNode {
+    var targetSize: IntSize
+}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutModifierNodeCoordinator.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutModifierNodeCoordinator.kt
new file mode 100644
index 0000000..43d50b6
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutModifierNodeCoordinator.kt
@@ -0,0 +1,276 @@
+/*
+ * 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.node
+
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Canvas
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.GraphicsLayerScope
+import androidx.compose.ui.graphics.Paint
+import androidx.compose.ui.graphics.PaintingStyle
+import androidx.compose.ui.layout.AlignmentLine
+import androidx.compose.ui.layout.HorizontalAlignmentLine
+import androidx.compose.ui.layout.IntermediateLayoutModifier
+import androidx.compose.ui.layout.LayoutModifier
+import androidx.compose.ui.layout.LookaheadScope
+import androidx.compose.ui.layout.MeasureResult
+import androidx.compose.ui.layout.Placeable
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.IntOffset
+import androidx.compose.ui.unit.IntSize
+
+@OptIn(ExperimentalComposeUiApi::class)
+internal class LayoutModifierNodeCoordinator(
+    layoutNode: LayoutNode,
+    measureNode: LayoutModifierNode,
+) : NodeCoordinator(layoutNode) {
+    var layoutModifierNode: LayoutModifierNode = measureNode
+        internal set
+
+    override val tail: Modifier.Node
+        get() = layoutModifierNode.node
+
+    val wrappedNonNull: NodeCoordinator get() = wrapped!!
+
+    private var lookAheadTransientMeasureNode: IntermediateLayoutModifierNode? = measureNode.run {
+        if (node.isKind(Nodes.IntermediateMeasure) && this is IntermediateLayoutModifierNode) this
+        else null
+    }
+
+    /**
+     * LookaheadDelegate impl for when the modifier is any [LayoutModifier] except
+     * [IntermediateLayoutModifier]. This impl will invoke [LayoutModifier.measure] for
+     * the lookahead measurement.
+     */
+    private inner class LookaheadDelegateForLayoutModifierNode(
+        scope: LookaheadScope
+    ) : LookaheadDelegate(this, scope) {
+        // LookaheadMeasure
+        override fun measure(constraints: Constraints): Placeable =
+            performingMeasure(constraints) {
+                with(layoutModifierNode) {
+                    measure(
+                        // This allows `measure` calls in the modifier to be redirected to
+                        // calling lookaheadMeasure in wrapped.
+                        wrappedNonNull.lookaheadDelegate!!, constraints
+                    )
+                }
+            }
+
+        override fun calculateAlignmentLine(alignmentLine: AlignmentLine): Int {
+            return calculateAlignmentAndPlaceChildAsNeeded(alignmentLine).also {
+                cachedAlignmentLinesMap[alignmentLine] = it
+            }
+        }
+
+        override fun minIntrinsicWidth(height: Int): Int =
+            with(layoutModifierNode) {
+                minIntrinsicWidth(wrappedNonNull.lookaheadDelegate!!, height)
+            }
+
+        override fun maxIntrinsicWidth(height: Int): Int =
+            with(layoutModifierNode) {
+                maxIntrinsicWidth(wrappedNonNull.lookaheadDelegate!!, height)
+            }
+
+        override fun minIntrinsicHeight(width: Int): Int =
+            with(layoutModifierNode) {
+                minIntrinsicHeight(wrappedNonNull.lookaheadDelegate!!, width)
+            }
+
+        override fun maxIntrinsicHeight(width: Int): Int =
+            with(layoutModifierNode) {
+                maxIntrinsicHeight(wrappedNonNull.lookaheadDelegate!!, width)
+            }
+    }
+
+    /**
+     * LookaheadDelegate impl for when the [layoutModifierNode] is an
+     * [IntermediateLayoutModifierNode]. This impl will redirect the measure call to the next
+     * lookahead delegate in the chain, without invoking the measure lambda defined in the modifier.
+     * This is necessary because [IntermediateLayoutModifierNode] does not participate in lookahead.
+     */
+    private inner class LookaheadDelegateForIntermediateLayoutModifier(
+        scope: LookaheadScope,
+        val intermediateMeasureNode: IntermediateLayoutModifierNode
+    ) : LookaheadDelegate(this, scope) {
+        private inner class PassThroughMeasureResult : MeasureResult {
+            override val width: Int
+                get() = wrappedNonNull.lookaheadDelegate!!.measureResult.width
+            override val height: Int
+                get() = wrappedNonNull.lookaheadDelegate!!.measureResult.height
+            override val alignmentLines: Map<AlignmentLine, Int> = emptyMap()
+
+            override fun placeChildren() {
+                with(PlacementScope) {
+                    wrappedNonNull.lookaheadDelegate!!.place(0, 0)
+                }
+            }
+        }
+        private val passThroughMeasureResult = PassThroughMeasureResult()
+
+        // LookaheadMeasure
+        override fun measure(constraints: Constraints): Placeable =
+            with(intermediateMeasureNode) {
+                performingMeasure(constraints) {
+                    wrappedNonNull.lookaheadDelegate!!.run {
+                        measure(constraints)
+                        targetSize = IntSize(measureResult.width, measureResult.height)
+                    }
+                    passThroughMeasureResult
+                }
+            }
+
+        override fun calculateAlignmentLine(alignmentLine: AlignmentLine): Int {
+            return calculateAlignmentAndPlaceChildAsNeeded(alignmentLine).also {
+                cachedAlignmentLinesMap[alignmentLine] = it
+            }
+        }
+    }
+
+    override fun createLookaheadDelegate(scope: LookaheadScope): LookaheadDelegate {
+        return lookAheadTransientMeasureNode?.let {
+            LookaheadDelegateForIntermediateLayoutModifier(scope, it)
+        } ?: LookaheadDelegateForLayoutModifierNode(scope)
+    }
+
+    override fun measure(constraints: Constraints): Placeable {
+        performingMeasure(constraints) {
+            with(layoutModifierNode) {
+                measureResult = measure(wrappedNonNull, constraints)
+                this@LayoutModifierNodeCoordinator
+            }
+        }
+        onMeasured()
+        return this
+    }
+
+    override fun minIntrinsicWidth(height: Int): Int {
+        return with(layoutModifierNode) {
+            minIntrinsicWidth(wrappedNonNull, height)
+        }
+    }
+
+    override fun maxIntrinsicWidth(height: Int): Int =
+        with(layoutModifierNode) {
+            maxIntrinsicWidth(wrappedNonNull, height)
+        }
+
+    override fun minIntrinsicHeight(width: Int): Int =
+        with(layoutModifierNode) {
+            minIntrinsicHeight(wrappedNonNull, width)
+        }
+
+    override fun maxIntrinsicHeight(width: Int): Int =
+        with(layoutModifierNode) {
+            maxIntrinsicHeight(wrappedNonNull, width)
+        }
+
+    override fun placeAt(
+        position: IntOffset,
+        zIndex: Float,
+        layerBlock: (GraphicsLayerScope.() -> Unit)?
+    ) {
+        super.placeAt(position, zIndex, layerBlock)
+        // The coordinator only runs their placement block to obtain our position, which allows them
+        // to calculate the offset of an alignment line we have already provided a position for.
+        // No need to place our wrapped as well (we might have actually done this already in
+        // get(line), to obtain the position of the alignment line the coordinator currently needs
+        // our position in order ot know how to offset the value we provided).
+        if (isShallowPlacing) return
+        onPlaced()
+        PlacementScope.executeWithRtlMirroringValues(
+            measuredSize.width,
+            layoutDirection,
+            this
+        ) {
+            measureResult.placeChildren()
+        }
+    }
+
+    override fun onLayoutModifierNodeChanged() {
+        super.onLayoutModifierNodeChanged()
+        layoutModifierNode.let { node ->
+            // Creates different [LookaheadDelegate]s based on the type of the modifier.
+            if (node.node.isKind(Nodes.IntermediateMeasure) &&
+                node is IntermediateLayoutModifierNode
+            ) {
+                lookAheadTransientMeasureNode = node
+                lookaheadDelegate?.let {
+                    updateLookaheadDelegate(
+                        LookaheadDelegateForIntermediateLayoutModifier(it.lookaheadScope, node)
+                    )
+                }
+            } else {
+                lookAheadTransientMeasureNode = null
+                lookaheadDelegate?.let {
+                    updateLookaheadDelegate(
+                        LookaheadDelegateForLayoutModifierNode(it.lookaheadScope)
+                    )
+                }
+            }
+        }
+    }
+
+    override fun calculateAlignmentLine(alignmentLine: AlignmentLine): Int {
+        return lookaheadDelegate?.getCachedAlignmentLine(alignmentLine)
+            ?: calculateAlignmentAndPlaceChildAsNeeded(alignmentLine)
+    }
+
+    override fun performDraw(canvas: Canvas) {
+        wrappedNonNull.draw(canvas)
+        if (layoutNode.requireOwner().showLayoutBounds) {
+            drawBorder(canvas, modifierBoundsPaint)
+        }
+    }
+
+    internal companion object {
+        val modifierBoundsPaint = Paint().also { paint ->
+            paint.color = Color.Blue
+            paint.strokeWidth = 1f
+            paint.style = PaintingStyle.Stroke
+        }
+    }
+}
+
+private fun LookaheadCapablePlaceable.calculateAlignmentAndPlaceChildAsNeeded(
+    alignmentLine: AlignmentLine
+): Int {
+    val child = child
+    check(child != null) {
+        "Child of $this cannot be null when calculating alignment line"
+    }
+    if (measureResult.alignmentLines.containsKey(alignmentLine)) {
+        return measureResult.alignmentLines[alignmentLine] ?: AlignmentLine.Unspecified
+    }
+    val positionInWrapped = child[alignmentLine]
+    if (positionInWrapped == AlignmentLine.Unspecified) {
+        return AlignmentLine.Unspecified
+    }
+    // Place our wrapped to obtain their position inside ourselves.
+    child.isShallowPlacing = true
+    isPlacingForAlignment = true
+    replace()
+    child.isShallowPlacing = false
+    isPlacingForAlignment = false
+    return if (alignmentLine is HorizontalAlignmentLine) {
+        positionInWrapped + child.position.y
+    } else {
+        positionInWrapped + child.position.x
+    }
+}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt
index e97628a..5a4a960 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt
@@ -17,9 +17,8 @@
 
 import androidx.compose.runtime.collection.MutableVector
 import androidx.compose.runtime.collection.mutableVectorOf
+import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.focus.FocusOrderModifierToProperties
-import androidx.compose.ui.focus.FocusPropertiesModifier
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.input.pointer.PointerInputFilter
@@ -28,7 +27,6 @@
 import androidx.compose.ui.layout.IntrinsicMeasureScope
 import androidx.compose.ui.layout.LayoutCoordinates
 import androidx.compose.ui.layout.LayoutInfo
-import androidx.compose.ui.layout.LayoutModifier
 import androidx.compose.ui.layout.LayoutNodeSubcompositionsState
 import androidx.compose.ui.layout.Measurable
 import androidx.compose.ui.layout.MeasurePolicy
@@ -37,21 +35,14 @@
 import androidx.compose.ui.layout.OnGloballyPositionedModifier
 import androidx.compose.ui.layout.Placeable
 import androidx.compose.ui.layout.Remeasurement
-import androidx.compose.ui.layout.RemeasurementModifier
 import androidx.compose.ui.layout.LookaheadScope
-import androidx.compose.ui.modifier.ModifierLocalConsumer
-import androidx.compose.ui.modifier.ModifierLocalProvider
-import androidx.compose.ui.modifier.ProvidableModifierLocal
-import androidx.compose.ui.modifier.modifierLocalOf
 import androidx.compose.ui.node.LayoutNode.LayoutState.Idle
 import androidx.compose.ui.node.LayoutNode.LayoutState.LayingOut
 import androidx.compose.ui.node.LayoutNode.LayoutState.Measuring
 import androidx.compose.ui.node.LayoutNode.LayoutState.LookaheadLayingOut
 import androidx.compose.ui.node.LayoutNode.LayoutState.LookaheadMeasuring
 import androidx.compose.ui.platform.ViewConfiguration
-import androidx.compose.ui.platform.debugInspectorInfo
 import androidx.compose.ui.platform.simpleIdentityToString
-import androidx.compose.ui.semantics.SemanticsEntity
 import androidx.compose.ui.semantics.SemanticsModifierCore.Companion.generateSemanticsId
 import androidx.compose.ui.semantics.outerSemantics
 import androidx.compose.ui.unit.Constraints
@@ -136,7 +127,7 @@
      * This should **not** be mutated or even accessed directly from outside of [LayoutNode]. Use
      * [forEachChild]/[forEachChildIndexed] when there's a need to iterate through the vector.
      */
-    private val _children: MutableVector<LayoutNode>
+    internal val _children: MutableVector<LayoutNode>
         get() {
             updateChildrenIfDirty()
             return if (virtualChildrenCount == 0) {
@@ -220,11 +211,6 @@
         get() = layoutDelegate.measurePassDelegate
 
     /**
-     * A cache of modifiers to be used when setting and reusing previous modifiers.
-     */
-    private var wrapperCache = mutableVectorOf<ModifiedLayoutNode>()
-
-    /**
      * [requestRemeasure] calls will be ignored while this flag is true.
      */
     private var ignoreRemeasureRequests = false
@@ -259,16 +245,16 @@
         }
         invalidateUnfoldedVirtualChildren()
 
-        instance.outerLayoutNodeWrapper.wrappedBy = if (isVirtual) {
-            // if this node is virtual we use the inner wrapper of our parent
-            _foldedParent?.innerLayoutNodeWrapper
+        instance.outerCoordinator.wrappedBy = if (isVirtual) {
+            // if this node is virtual we use the inner coordinator of our parent
+            _foldedParent?.innerCoordinator
         } else {
-            innerLayoutNodeWrapper
+            innerCoordinator
         }
-        // and if the child is virtual we set our inner wrapper for the grandchildren
+        // and if the child is virtual we set our inner coordinator for the grandchildren
         if (instance.isVirtual) {
             instance._foldedChildren.forEach {
-                it.outerLayoutNodeWrapper.wrappedBy = innerLayoutNodeWrapper
+                it.outerCoordinator.wrappedBy = innerCoordinator
             }
         }
 
@@ -324,12 +310,12 @@
             child.detach()
         }
         child._foldedParent = null
-        child.outerLayoutNodeWrapper.wrappedBy = null
+        child.outerCoordinator.wrappedBy = null
 
         if (child.isVirtual) {
             virtualChildrenCount--
             child._foldedChildren.forEach {
-                it.outerLayoutNodeWrapper.wrappedBy = null
+                it.outerCoordinator.wrappedBy = null
             }
         }
         invalidateUnfoldedVirtualChildren()
@@ -388,6 +374,7 @@
 
         this.owner = owner
         this.depth = (parent?.depth ?: -1) + 1
+        @OptIn(ExperimentalComposeUiApi::class)
         if (outerSemantics != null) {
             owner.onSemanticsChange()
         }
@@ -397,6 +384,7 @@
         mLookaheadScope =
             parent?.mLookaheadScope ?: if (isLookaheadRoot) LookaheadScope(this) else null
 
+        nodes.attach()
         _foldedChildren.forEach { child ->
             child.attach(owner)
         }
@@ -404,8 +392,7 @@
         invalidateMeasurements()
         parent?.invalidateMeasurements()
 
-        forEachDelegateIncludingInner { it.attach() }
-        forEachModifierLocalProvider { it.attach() }
+        forEachCoordinatorIncludingInner { it.attach() }
         onAttach?.invoke(owner)
     }
 
@@ -426,12 +413,13 @@
         }
         layoutDelegate.resetAlignmentLines()
         onDetach?.invoke(owner)
-        forEachModifierLocalProvider { it.detach() }
-        forEachDelegateIncludingInner { it.detach() }
+        forEachCoordinatorIncludingInner { it.detach() }
 
+        @OptIn(ExperimentalComposeUiApi::class)
         if (outerSemantics != null) {
             owner.onSemanticsChange()
         }
+        nodes.detach()
         owner.onDetach(this)
         this.owner = null
         depth = 0
@@ -557,8 +545,8 @@
             if (newScope != field) {
                 field = newScope
                 layoutDelegate.onLookaheadScopeChanged(newScope)
-                forEachDelegateIncludingInner { wrapper ->
-                    wrapper.updateLookaheadScope(newScope)
+                forEachCoordinatorIncludingInner { coordinator ->
+                    coordinator.updateLookaheadScope(newScope)
                 }
             }
         }
@@ -577,6 +565,7 @@
     override var viewConfiguration: ViewConfiguration = DummyViewConfiguration
 
     private fun onDensityOrLayoutDirectionChanged() {
+        // TODO(b/242120396): it seems like we need to update some densities in the node coordinators here
         // measure/layout modifiers on the node
         invalidateMeasurements()
         // draw modifiers on the node
@@ -671,10 +660,12 @@
             }
         }
 
-    internal val innerLayoutNodeWrapper = InnerPlaceable(this)
-    internal val layoutDelegate = LayoutNodeLayoutDelegate(this, innerLayoutNodeWrapper)
-    internal val outerLayoutNodeWrapper: LayoutNodeWrapper
-        get() = layoutDelegate.outerWrapper
+    internal val nodes = NodeChain(this)
+    internal val innerCoordinator: NodeCoordinator
+        get() = nodes.innerCoordinator
+    internal val layoutDelegate = LayoutNodeLayoutDelegate(this)
+    internal val outerCoordinator: NodeCoordinator
+        get() = nodes.outerCoordinator
 
     /**
      * zIndex defines the drawing order of the LayoutNode. Children with larger zIndex are drawn
@@ -690,56 +681,40 @@
     internal var subcompositionsState: LayoutNodeSubcompositionsState? = null
 
     /**
-     * The inner-most layer wrapper. Used for performance for LayoutNodeWrapper.findLayer().
+     * The inner-most layer coordinator. Used for performance for NodeCoordinator.findLayer().
      */
-    private var _innerLayerWrapper: LayoutNodeWrapper? = null
-    internal var innerLayerWrapperIsDirty = true
-    private val innerLayerWrapper: LayoutNodeWrapper?
+    private var _innerLayerCoordinator: NodeCoordinator? = null
+    internal var innerLayerCoordinatorIsDirty = true
+    private val innerLayerCoordinator: NodeCoordinator?
         get() {
-            if (innerLayerWrapperIsDirty) {
-                var delegate: LayoutNodeWrapper? = innerLayoutNodeWrapper
-                val final = outerLayoutNodeWrapper.wrappedBy
-                _innerLayerWrapper = null
-                while (delegate != final) {
-                    if (delegate?.layer != null) {
-                        _innerLayerWrapper = delegate
+            if (innerLayerCoordinatorIsDirty) {
+                var coordinator: NodeCoordinator? = innerCoordinator
+                val final = outerCoordinator.wrappedBy
+                _innerLayerCoordinator = null
+                while (coordinator != final) {
+                    if (coordinator?.layer != null) {
+                        _innerLayerCoordinator = coordinator
                         break
                     }
-                    delegate = delegate?.wrappedBy
+                    coordinator = coordinator?.wrappedBy
                 }
             }
-            val layerWrapper = _innerLayerWrapper
-            if (layerWrapper != null) {
-                requireNotNull(layerWrapper.layer)
+            val layerCoordinator = _innerLayerCoordinator
+            if (layerCoordinator != null) {
+                requireNotNull(layerCoordinator.layer)
             }
-            return layerWrapper
+            return layerCoordinator
         }
 
     /**
-     * The head of the [ModifierLocalProviderEntity] linked list. The head is always a sentinel
-     * provider that doesn't provide any value, so consumers attached to it don't read any
-     * provided values from this LayoutNode and instead reads only from ModifierLocalProviders
-     * on parent LayoutNodes.
-     */
-    internal val modifierLocalsHead =
-        ModifierLocalProviderEntity(this, SentinelModifierLocalProvider)
-
-    /**
-     * The tail of the [ModifierLocalProviderEntity] linked list. This is used for finding
-     * the ModifierLocalProvider by following backwards along the linked list.
-     */
-    internal var modifierLocalsTail = modifierLocalsHead
-        private set
-
-    /**
      * Invalidates the inner-most layer as part of this LayoutNode or from the containing
-     * LayoutNode. This is added for performance so that LayoutNodeWrapper.invalidateLayer() can be
+     * LayoutNode. This is added for performance so that NodeCoordinator.invalidateLayer() can be
      * faster.
      */
     internal fun invalidateLayer() {
-        val innerLayerWrapper = innerLayerWrapper
-        if (innerLayerWrapper != null) {
-            innerLayerWrapper.invalidateLayer()
+        val innerLayerCoordinator = innerLayerCoordinator
+        if (innerLayerCoordinator != null) {
+            innerLayerCoordinator.invalidateLayer()
         } else {
             val parent = this.parent
             parent?.invalidateLayer()
@@ -752,100 +727,39 @@
     override var modifier: Modifier = Modifier
         set(value) {
             if (value == field) return
-            if (modifier != Modifier) {
-                require(!isVirtual) { "Modifiers are not supported on virtual LayoutNodes" }
+            require(!isVirtual || modifier === Modifier) {
+                "Modifiers are not supported on virtual LayoutNodes"
             }
             field = value
+            val oldShouldInvalidateParentLayer = shouldInvalidateParentLayer()
+            val oldOuterCoordinator = outerCoordinator
 
-            val invalidateParentLayer = shouldInvalidateParentLayer()
+            nodes.updateFrom(value)
 
-            copyWrappersToCache()
-            forEachDelegateIncludingInner { it.entities.clear() }
-            markReusedModifiers(value)
-
-            // Rebuild LayoutNodeWrapper
-            val oldOuterWrapper = layoutDelegate.outerWrapper
-            if (outerSemantics != null && isAttached) {
-                owner!!.onSemanticsChange()
-            }
-            val addedCallback = hasNewPositioningCallback()
-            onPositionedCallbacks?.clear()
-
-            innerLayoutNodeWrapper.onInitialize()
-
-            // Create a new chain of LayoutNodeWrappers, reusing existing ones from wrappers
-            // when possible.
-            val innerPlaceable: LayoutNodeWrapper = innerLayoutNodeWrapper
-            val outerWrapper = modifier.foldOut(innerPlaceable) { mod, toWrap ->
-                if (mod is RemeasurementModifier) {
-                    mod.onRemeasurementAvailable(this)
-                }
-
-                toWrap.entities.addBeforeLayoutModifier(toWrap, mod)
-
-                if (mod is OnGloballyPositionedModifier) {
-                    getOrCreateOnPositionedCallbacks() += toWrap to mod
-                }
-
-                val wrapper = if (mod is LayoutModifier) {
-                    // Re-use the layoutNodeWrapper if possible.
-                    (reuseLayoutNodeWrapper(toWrap, mod)
-                        ?: ModifiedLayoutNode(toWrap, mod)).apply {
-                        onInitialize()
-                        updateLookaheadScope(mLookaheadScope)
-                    }
-                } else {
-                    toWrap
-                }
-                wrapper.entities.addAfterLayoutModifier(wrapper, mod)
-                wrapper
+            // TODO(lmr): we don't need to do this every time and should attempt to avoid it
+            //  whenever possible!
+            forEachCoordinatorIncludingInner {
+                it.onInitialize()
+                it.updateLookaheadScope(mLookaheadScope)
             }
 
-            setModifierLocals(value)
+            // TODO(lmr): lets move this to the responsibility of the nodes
+            layoutDelegate.updateParentData()
 
-            outerWrapper.wrappedBy = parent?.innerLayoutNodeWrapper
-            layoutDelegate.outerWrapper = outerWrapper
+            // TODO(lmr): lets move this to the responsibility of the nodes
+            if (oldShouldInvalidateParentLayer || shouldInvalidateParentLayer())
+                parent?.invalidateLayer()
 
-            if (isAttached) {
-                // call detach() on all removed LayoutNodeWrappers
-                wrapperCache.forEach {
-                    it.detach()
-                }
-
-                // attach() all new LayoutNodeWrappers
-                forEachDelegateIncludingInner { layoutNodeWrapper ->
-                    if (!layoutNodeWrapper.isAttached) {
-                        layoutNodeWrapper.attach()
-                    } else {
-                        layoutNodeWrapper.entities.forEach { it.onAttach() }
-                    }
-                }
-            }
-            wrapperCache.clear()
-
-            // call onModifierChanged() on all LayoutNodeWrappers
-            forEachDelegateIncludingInner { it.onModifierChanged() }
-
+            // TODO(lmr): this logic is not clear to me, but we want to move all invalidate* calls
+            //  to the responsibility of the nodes to avoid unnecessary work. Let's try to include
+            //  this one as well since it looks like it will be hit quite a bit
             // Optimize the case where the layout itself is not modified. A common reason for
             // this is if no wrapping actually occurs above because no LayoutModifiers are
             // present in the modifier chain.
-            if (oldOuterWrapper != innerLayoutNodeWrapper ||
-                outerWrapper != innerLayoutNodeWrapper
+            if (oldOuterCoordinator != innerCoordinator ||
+                outerCoordinator != innerCoordinator
             ) {
                 invalidateMeasurements()
-            } else if (layoutState == Idle && !measurePending && addedCallback) {
-                // We need to notify the callbacks of a change in position since there's
-                // a new one.
-                invalidateMeasurements()
-            } else if (innerLayoutNodeWrapper.entities.has(EntityList.OnPlacedEntityType)) {
-                // We need to be sure that OnPlacedModifiers are called, even if we don't
-                // have a relayout.
-                owner?.registerOnLayoutCompletedListener(this)
-            }
-            // If the parent data has changed, the parent needs remeasurement.
-            layoutDelegate.updateParentData()
-            if (invalidateParentLayer || shouldInvalidateParentLayer()) {
-                parent?.invalidateLayer()
             }
         }
 
@@ -853,7 +767,7 @@
      * Coordinates of just the contents of the [LayoutNode], after being affected by all modifiers.
      */
     override val coordinates: LayoutCoordinates
-        get() = innerLayoutNodeWrapper
+        get() = innerCoordinator
 
     /**
      * Callback to be executed whenever the [LayoutNode] is attached to a new [Owner].
@@ -866,17 +780,6 @@
     internal var onDetach: ((Owner) -> Unit)? = null
 
     /**
-     * List of all OnPositioned callbacks in the modifier chain.
-     */
-    private var onPositionedCallbacks:
-        MutableVector<Pair<LayoutNodeWrapper, OnGloballyPositionedModifier>>? = null
-
-    internal fun getOrCreateOnPositionedCallbacks() = onPositionedCallbacks
-        ?: mutableVectorOf<Pair<LayoutNodeWrapper, OnGloballyPositionedModifier>>().also {
-            onPositionedCallbacks = it
-        }
-
-    /**
      * Flag used by [OnPositionedDispatcher] to identify LayoutNodes that have already
      * had their [OnGloballyPositionedModifier]'s dispatch called so that they aren't called
      * multiple times.
@@ -893,7 +796,7 @@
             Placeable.PlacementScope.executeWithRtlMirroringValues(
                 measuredWidth,
                 layoutDirection,
-                parent?.innerLayoutNodeWrapper
+                parent?.innerCoordinator
             ) {
                 placeRelative(x, y)
             }
@@ -933,7 +836,7 @@
      */
     private var relayoutWithoutParentInProgress = false
 
-    internal fun draw(canvas: Canvas) = outerLayoutNodeWrapper.draw(canvas)
+    internal fun draw(canvas: Canvas) = outerCoordinator.draw(canvas)
 
     /**
      * Carries out a hit test on the [PointerInputModifier]s associated with this [LayoutNode] and
@@ -948,15 +851,16 @@
      * @param hitTestResult The collection that the hit [PointerInputFilter]s will be
      * added to if hit.
      */
+    @OptIn(ExperimentalComposeUiApi::class)
     internal fun hitTest(
         pointerPosition: Offset,
-        hitTestResult: HitTestResult<PointerInputFilter>,
+        hitTestResult: HitTestResult<PointerInputModifierNode>,
         isTouchEvent: Boolean = false,
         isInLayer: Boolean = true
     ) {
-        val positionInWrapped = outerLayoutNodeWrapper.fromParentPosition(pointerPosition)
-        outerLayoutNodeWrapper.hitTest(
-            LayoutNodeWrapper.PointerInputSource,
+        val positionInWrapped = outerCoordinator.fromParentPosition(pointerPosition)
+        outerCoordinator.hitTest(
+            NodeCoordinator.PointerInputSource,
             positionInWrapped,
             hitTestResult,
             isTouchEvent,
@@ -965,15 +869,16 @@
     }
 
     @Suppress("UNUSED_PARAMETER")
+    @OptIn(ExperimentalComposeUiApi::class)
     internal fun hitTestSemantics(
         pointerPosition: Offset,
-        hitSemanticsEntities: HitTestResult<SemanticsEntity>,
+        hitSemanticsEntities: HitTestResult<SemanticsModifierNode>,
         isTouchEvent: Boolean = true,
         isInLayer: Boolean = true
     ) {
-        val positionInWrapped = outerLayoutNodeWrapper.fromParentPosition(pointerPosition)
-        outerLayoutNodeWrapper.hitTest(
-            LayoutNodeWrapper.SemanticsSource,
+        val positionInWrapped = outerCoordinator.fromParentPosition(pointerPosition)
+        outerCoordinator.hitTest(
+            NodeCoordinator.SemanticsSource,
             positionInWrapped,
             hitSemanticsEntities,
             isTouchEvent = true,
@@ -982,24 +887,13 @@
     }
 
     /**
-     * Return true if there is a new [OnGloballyPositionedModifier] assigned to this Layout.
-     */
-    private fun hasNewPositioningCallback(): Boolean {
-        val onPositionedCallbacks = onPositionedCallbacks
-        return modifier.foldOut(false) { mod, hasNewCallback ->
-            hasNewCallback || mod is OnGloballyPositionedModifier &&
-                (onPositionedCallbacks?.firstOrNull { mod == it.second } == null)
-        }
-    }
-
-    /**
      * Invoked when the parent placed the node. It will trigger the layout.
      */
     internal fun onNodePlaced() {
         val parent = parent
 
-        var newZIndex = innerLayoutNodeWrapper.zIndex
-        forEachDelegate {
+        var newZIndex = innerCoordinator.zIndex
+        forEachCoordinator {
             newZIndex += it.zIndex
         }
         if (newZIndex != zIndex) {
@@ -1068,7 +962,7 @@
     private fun markNodeAndSubtreeAsPlaced() {
         isPlaced = true
         // invalidate all the nodes layers that were invalidated while the node was not placed
-        forEachDelegateIncludingInner {
+        forEachCoordinatorIncludingInner {
             if (it.lastLayerDrawingWasSkipped) {
                 it.invalidateLayer()
             }
@@ -1174,6 +1068,7 @@
         }
     }
 
+    @OptIn(ExperimentalComposeUiApi::class)
     internal fun dispatchOnPositionedCallbacks() {
         if (layoutState != Idle || layoutPending || measurePending) {
             return // it hasn't yet been properly positioned, so don't make a call
@@ -1181,8 +1076,8 @@
         if (!isPlaced) {
             return // it hasn't been placed, so don't make a call
         }
-        onPositionedCallbacks?.forEach {
-            it.second.onGloballyPositioned(it.first)
+        nodes.headToTail(Nodes.GlobalPositionAware) {
+            it.onGloballyPositioned(it.requireCoordinator(Nodes.GlobalPositionAware))
         }
     }
 
@@ -1191,205 +1086,16 @@
      * that may be useful. This is used for tooling to retrieve layout modifier and layer
      * information.
      */
-    override fun getModifierInfo(): List<ModifierInfo> {
-        val infoList = mutableVectorOf<ModifierInfo>()
-        forEachDelegate { wrapper ->
-            val layer = wrapper.layer
-            val info = ModifierInfo(wrapper.modifier, wrapper, layer)
-            infoList += info
-            wrapper.entities.forEach {
-                infoList += ModifierInfo(it.modifier, wrapper, layer)
-            }
-        }
-        innerLayoutNodeWrapper.entities.forEach {
-            infoList += ModifierInfo(
-                it.modifier,
-                innerLayoutNodeWrapper,
-                innerLayoutNodeWrapper.layer
-            )
-        }
-        return infoList.asMutableList()
-    }
+    override fun getModifierInfo(): List<ModifierInfo> = nodes.getModifierInfo()
 
     /**
      * Invalidates layers defined on this LayoutNode.
      */
     internal fun invalidateLayers() {
-        forEachDelegate { wrapper ->
-            wrapper.layer?.invalidate()
+        forEachCoordinator { coordinator ->
+            coordinator.layer?.invalidate()
         }
-        innerLayoutNodeWrapper.layer?.invalidate()
-    }
-
-    private fun setModifierLocals(modifier: Modifier) {
-        // Collect existing consumers and providers
-        val consumers = mutableVectorOf<ModifierLocalConsumerEntity>()
-        var node: ModifierLocalProviderEntity? = modifierLocalsHead
-        while (node != null) {
-            consumers.addAll(node.consumers)
-            node.consumers.clear()
-            node = node.next
-        }
-
-        // Create the chain
-        modifierLocalsTail = modifier.foldIn(modifierLocalsHead) { lastProvider, mod ->
-            // Ensure that ModifierLocalConsumers come before ModifierLocalProviders
-            // so that consumers don't consume values from their own providers.
-            var provider = lastProvider
-
-            // Special handling for FocusOrderModifier -- we have to use modifier local
-            // consumers and providers for it.
-            @Suppress("DEPRECATION")
-            if (mod is androidx.compose.ui.focus.FocusOrderModifier) {
-                val focusPropertiesModifier = findFocusPropertiesModifier(mod, consumers)
-                    ?: run {
-                        // Have to create a new consumer/provider
-                        val scope = FocusOrderModifierToProperties(mod)
-                        FocusPropertiesModifier(
-                            focusPropertiesScope = scope,
-                            inspectorInfo = debugInspectorInfo {
-                                name = "focusProperties"
-                                properties["scope"] = scope
-                            }
-                        )
-                    }
-                addModifierLocalConsumer(focusPropertiesModifier, provider, consumers)
-                provider = addModifierLocalProvider(focusPropertiesModifier, provider)
-            }
-            if (mod is ModifierLocalConsumer) {
-                addModifierLocalConsumer(mod, provider, consumers)
-            }
-            if (mod is ModifierLocalProvider<*>) {
-                provider = addModifierLocalProvider(mod, provider)
-            }
-            provider
-        }
-        // Capture the value after the tail. Anything after the tail can be removed.
-        node = modifierLocalsTail.next
-
-        // Terminate the linked list at the tail.
-        modifierLocalsTail.next = null
-
-        if (isAttached) {
-            // These have been removed and should be detached
-            consumers.forEach { it.detach() }
-
-            // detach all removed providers
-            while (node != null) {
-                node.detach()
-                node = node.next
-            }
-
-            // Attach or invalidate all providers and consumers
-            forEachModifierLocalProvider { it.attachDelayed() }
-        }
-    }
-
-    @Suppress("DEPRECATION", "ModifierFactoryExtensionFunction", "ModifierFactoryReturnType")
-    private fun findFocusPropertiesModifier(
-        mod: androidx.compose.ui.focus.FocusOrderModifier,
-        consumers: MutableVector<ModifierLocalConsumerEntity>
-    ): FocusPropertiesModifier? = consumers.firstOrNull {
-        it.modifier is FocusPropertiesModifier &&
-            it.modifier.focusPropertiesScope is FocusOrderModifierToProperties &&
-            it.modifier.focusPropertiesScope.modifier === mod
-    }?.modifier as? FocusPropertiesModifier
-
-    private fun addModifierLocalConsumer(
-        mod: ModifierLocalConsumer,
-        provider: ModifierLocalProviderEntity,
-        consumers: MutableVector<ModifierLocalConsumerEntity>
-    ) {
-        val index = consumers.indexOfFirst { it.modifier === mod }
-        val consumer = if (index < 0) {
-            // Not found, so make a new one:
-            ModifierLocalConsumerEntity(provider, mod)
-        } else {
-            // Reuse the existing one:
-            consumers.removeAt(index).also { it.provider = provider }
-        }
-        provider.consumers += consumer
-    }
-
-    private fun addModifierLocalProvider(
-        mod: ModifierLocalProvider<*>,
-        provider: ModifierLocalProviderEntity
-    ): ModifierLocalProviderEntity {
-        // Look for the existing one:
-        var providerNode = provider.next
-        while (providerNode != null && providerNode.modifier !== mod) {
-            providerNode = providerNode.next
-        }
-        if (providerNode == null) {
-            // Couldn't find one to reuse, so create a new one:
-            providerNode = ModifierLocalProviderEntity(this, mod)
-        } else {
-            // Reuse the existing one, just tell the linked list to skip it.
-            providerNode.prev?.next = providerNode.next
-            providerNode.next?.prev = providerNode.prev
-        }
-        // Add the provider:
-        providerNode.next = provider.next
-        provider.next?.prev = providerNode
-        provider.next = providerNode
-        providerNode.prev = provider
-
-        return providerNode
-    }
-
-    /**
-     * Reuses a [ModifiedLayoutNode] from [wrapperCache]. If none can be reused, `null` is returned.
-     */
-    private fun reuseLayoutNodeWrapper(
-        toWrap: LayoutNodeWrapper,
-        modifier: LayoutModifier
-    ): ModifiedLayoutNode? {
-        if (wrapperCache.isEmpty()) {
-            return null
-        }
-        // Look for exact match
-        var lastIndex = wrapperCache.indexOfLast {
-            it.toBeReusedForSameModifier && it.modifier === modifier
-        }
-
-        if (lastIndex < 0) {
-            // Look for one that isn't reused
-            lastIndex = wrapperCache.indexOfLast {
-                !it.toBeReusedForSameModifier
-            }
-        }
-
-        if (lastIndex < 0) {
-            return null
-        }
-
-        return wrapperCache.removeAt(lastIndex).also {
-            it.modifier = modifier
-            it.wrapped = toWrap
-        }
-    }
-
-    /**
-     * Copies all [ModifiedLayoutNode]s currently in use and returns them in a new
-     * Array.
-     */
-    private fun copyWrappersToCache() {
-        forEachDelegate {
-            wrapperCache += it
-        }
-    }
-
-    private fun markReusedModifiers(modifier: Modifier) {
-        wrapperCache.forEach {
-            it.toBeReusedForSameModifier = false
-        }
-
-        modifier.foldIn(Unit) { _, mod ->
-            val wrapper = wrapperCache.lastOrNull {
-                it.modifier === mod && !it.toBeReusedForSameModifier
-            }
-            wrapper?.toBeReusedForSameModifier = true
-        }
+        innerCoordinator.layer?.invalidate()
     }
 
     internal fun lookaheadRemeasure(
@@ -1478,54 +1184,47 @@
         }
     }
 
+    @OptIn(ExperimentalComposeUiApi::class)
     override fun onLayoutComplete() {
-        innerLayoutNodeWrapper.entities.forEach(EntityList.OnPlacedEntityType) {
-            it.modifier.onPlaced(innerLayoutNodeWrapper)
+        innerCoordinator.visitNodes(Nodes.LayoutAware) {
+            it.onPlaced(innerCoordinator)
         }
     }
 
     /**
-     * Calls [block] on all [ModifiedLayoutNode]s in the LayoutNodeWrapper chain.
+     * Calls [block] on all [LayoutModifierNodeCoordinator]s in the NodeCoordinator chain.
      */
-    private inline fun forEachDelegate(block: (ModifiedLayoutNode) -> Unit) {
-        var delegate = outerLayoutNodeWrapper
-        val inner = innerLayoutNodeWrapper
-        while (delegate != inner) {
-            block(delegate as ModifiedLayoutNode)
-            delegate = delegate.wrapped
+    private inline fun forEachCoordinator(block: (LayoutModifierNodeCoordinator) -> Unit) {
+        var coordinator: NodeCoordinator? = outerCoordinator
+        val inner = innerCoordinator
+        while (coordinator !== inner) {
+            block(coordinator as LayoutModifierNodeCoordinator)
+            coordinator = coordinator.wrapped
         }
     }
 
     /**
-     * Calls [block] on all [LayoutNodeWrapper]s in the LayoutNodeWrapper chain.
+     * Calls [block] on all [NodeCoordinator]s in the NodeCoordinator chain.
      */
-    private inline fun forEachDelegateIncludingInner(block: (LayoutNodeWrapper) -> Unit) {
-        var delegate: LayoutNodeWrapper? = outerLayoutNodeWrapper
-        val final = innerLayoutNodeWrapper.wrapped
+    private inline fun forEachCoordinatorIncludingInner(block: (NodeCoordinator) -> Unit) {
+        var delegate: NodeCoordinator? = outerCoordinator
+        val final = innerCoordinator.wrapped
         while (delegate != final && delegate != null) {
             block(delegate)
             delegate = delegate.wrapped
         }
     }
 
-    /**
-     * Iterates over the [ModifierLocalProviderEntity]s and execute [block] on each one.
-     */
-    private inline fun forEachModifierLocalProvider(block: (ModifierLocalProviderEntity) -> Unit) {
-        var node: ModifierLocalProviderEntity? = modifierLocalsHead
-        while (node != null) {
-            block(node)
-            node = node.next
-        }
-    }
-
+    @OptIn(ExperimentalComposeUiApi::class)
     private fun shouldInvalidateParentLayer(): Boolean {
-        forEachDelegateIncludingInner {
-            if (it.layer != null) {
-                return false
-            } else if (it.entities.has(EntityList.DrawEntityType)) {
-                return true
+        if (nodes.has(Nodes.Draw) && !nodes.has(Nodes.Layout)) return true
+        nodes.headToTail {
+            if (it.isKind(Nodes.Layout) && it is LayoutModifierNode) {
+                if (it.requireCoordinator(Nodes.Layout).layer != null) {
+                    return false
+                }
             }
+            if (it.isKind(Nodes.Draw)) return true
         }
         return true
     }
@@ -1639,20 +1338,6 @@
             override val minimumTouchTargetSize: DpSize
                 get() = DpSize.Zero
         }
-
-        // key for EmptyModifierLocalProvider
-        private val ModifierLocalNothing = modifierLocalOf {
-            error("default value for sentinel shouldn't be read")
-        }
-
-        // sentinel value for a provider that doesn't supply any values. This is important
-        // for modifier local consumers that don't have any provider before it in the chain.
-        private val SentinelModifierLocalProvider = object : ModifierLocalProvider<Nothing> {
-            override val key: ProvidableModifierLocal<Nothing>
-                get() = ModifierLocalNothing
-            override val value: Nothing
-                get() = error("Sentinel ModifierLocal shouldn't be read")
-        }
     }
 
     /**
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeAlignmentLines.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeAlignmentLines.kt
index dd20025..fc84004 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeAlignmentLines.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeAlignmentLines.kt
@@ -107,8 +107,8 @@
 
     fun getLastCalculation(): Map<AlignmentLine, Int> = alignmentLineMap
 
-    protected abstract val LayoutNodeWrapper.alignmentLinesMap: Map<AlignmentLine, Int>
-    protected abstract fun LayoutNodeWrapper.getPositionFor(alignmentLine: AlignmentLine): Int
+    protected abstract val NodeCoordinator.alignmentLinesMap: Map<AlignmentLine, Int>
+    protected abstract fun NodeCoordinator.getPositionFor(alignmentLine: AlignmentLine): Int
 
     /**
      * Returns the alignment line value for a given alignment line without affecting whether
@@ -117,16 +117,16 @@
     private fun addAlignmentLine(
         alignmentLine: AlignmentLine,
         initialPosition: Int,
-        initialWrapper: LayoutNodeWrapper
+        initialCoordinator: NodeCoordinator
     ) {
         var position = Offset(initialPosition.toFloat(), initialPosition.toFloat())
-        var wrapper = initialWrapper
+        var coordinator = initialCoordinator
         while (true) {
-            position = wrapper.calculatePositionInParent(position)
-            wrapper = wrapper.wrappedBy!!
-            if (wrapper == alignmentLinesOwner.innerLayoutNodeWrapper) break
-            if (alignmentLine in wrapper.alignmentLinesMap) {
-                val newPosition = wrapper.getPositionFor(alignmentLine)
+            position = coordinator.calculatePositionInParent(position)
+            coordinator = coordinator.wrappedBy!!
+            if (coordinator == alignmentLinesOwner.innerCoordinator) break
+            if (alignmentLine in coordinator.alignmentLinesMap) {
+                val newPosition = coordinator.getPositionFor(alignmentLine)
                 position = Offset(newPosition.toFloat(), newPosition.toFloat())
             }
         }
@@ -161,19 +161,19 @@
             }
             // Add alignment lines on the child node.
             childOwner.alignmentLines.alignmentLineMap.forEach { (childLine, linePosition) ->
-                addAlignmentLine(childLine, linePosition, childOwner.innerLayoutNodeWrapper)
+                addAlignmentLine(childLine, linePosition, childOwner.innerCoordinator)
             }
 
             // Add alignment lines on the modifier of the child.
-            var wrapper = childOwner.innerLayoutNodeWrapper.wrappedBy!!
-            while (wrapper != alignmentLinesOwner.innerLayoutNodeWrapper) {
-                wrapper.alignmentLinesMap.keys.forEach { childLine ->
-                    addAlignmentLine(childLine, wrapper.getPositionFor(childLine), wrapper)
+            var coordinator = childOwner.innerCoordinator.wrappedBy!!
+            while (coordinator != alignmentLinesOwner.innerCoordinator) {
+                coordinator.alignmentLinesMap.keys.forEach { childLine ->
+                    addAlignmentLine(childLine, coordinator.getPositionFor(childLine), coordinator)
                 }
-                wrapper = wrapper.wrappedBy!!
+                coordinator = coordinator.wrappedBy!!
             }
         }
-        alignmentLineMap += alignmentLinesOwner.innerLayoutNodeWrapper.alignmentLinesMap
+        alignmentLineMap += alignmentLinesOwner.innerCoordinator.alignmentLinesMap
         dirty = false
     }
 
@@ -208,7 +208,7 @@
         parent.alignmentLines.onAlignmentsChanged()
     }
 
-    protected abstract fun LayoutNodeWrapper.calculatePositionInParent(position: Offset): Offset
+    protected abstract fun NodeCoordinator.calculatePositionInParent(position: Offset): Offset
 }
 
 /**
@@ -218,13 +218,13 @@
     alignmentLinesOwner: AlignmentLinesOwner
 ) : AlignmentLines(alignmentLinesOwner) {
 
-    override val LayoutNodeWrapper.alignmentLinesMap: Map<AlignmentLine, Int>
+    override val NodeCoordinator.alignmentLinesMap: Map<AlignmentLine, Int>
         get() = measureResult.alignmentLines
 
-    override fun LayoutNodeWrapper.getPositionFor(alignmentLine: AlignmentLine): Int =
+    override fun NodeCoordinator.getPositionFor(alignmentLine: AlignmentLine): Int =
         get(alignmentLine)
 
-    override fun LayoutNodeWrapper.calculatePositionInParent(position: Offset): Offset =
+    override fun NodeCoordinator.calculatePositionInParent(position: Offset): Offset =
         toParentPosition(position)
 }
 
@@ -235,12 +235,12 @@
     alignmentLinesOwner: AlignmentLinesOwner
 ) : AlignmentLines(alignmentLinesOwner) {
 
-    override val LayoutNodeWrapper.alignmentLinesMap: Map<AlignmentLine, Int>
+    override val NodeCoordinator.alignmentLinesMap: Map<AlignmentLine, Int>
         get() = lookaheadDelegate!!.measureResult.alignmentLines
 
-    override fun LayoutNodeWrapper.getPositionFor(alignmentLine: AlignmentLine): Int =
+    override fun NodeCoordinator.getPositionFor(alignmentLine: AlignmentLine): Int =
         lookaheadDelegate!![alignmentLine]
 
-    override fun LayoutNodeWrapper.calculatePositionInParent(position: Offset): Offset =
+    override fun NodeCoordinator.calculatePositionInParent(position: Offset): Offset =
         this.lookaheadDelegate!!.position.toOffset() + position
 }
\ No newline at end of file
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeDrawScope.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeDrawScope.kt
index 155a08e..0fa9d4e 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeDrawScope.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeDrawScope.kt
@@ -16,17 +16,21 @@
 
 package androidx.compose.ui.node
 
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Size
 import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.graphics.drawscope.CanvasDrawScope
 import androidx.compose.ui.graphics.drawscope.ContentDrawScope
 import androidx.compose.ui.graphics.drawscope.DrawScope
 import androidx.compose.ui.graphics.drawscope.drawIntoCanvas
+import androidx.compose.ui.unit.toSize
 
 /**
  * [ContentDrawScope] implementation that extracts density and layout direction information
- * from the given LayoutNodeWrapper
+ * from the given NodeCoordinator
  */
+@OptIn(ExperimentalComposeUiApi::class)
 internal class LayoutNodeDrawScope(
     private val canvasDrawScope: CanvasDrawScope = CanvasDrawScope()
 ) : DrawScope by canvasDrawScope, ContentDrawScope {
@@ -36,36 +40,75 @@
     // draw calls for all composables.
     // As a result there could be thread safety concerns here for multi-threaded drawing
     // scenarios, generally a single ComponentDrawScope should be shared for a particular thread
-    private var drawEntity: DrawEntity? = null
+    private var drawNode: DrawModifierNode? = null
 
     override fun drawContent() {
         drawIntoCanvas { canvas ->
-            val drawEntity = drawEntity!!
-            val nextDrawEntity = drawEntity.next
-            if (nextDrawEntity != null) {
-                nextDrawEntity.draw(canvas)
+            val drawNode = drawNode!!
+            val nextDrawNode = drawNode.nextDrawNode()
+            // NOTE(lmr): we only run performDraw directly on the node if the node's coordinator
+            // is our own. This seems to work, but we should think about a cleaner way to dispatch
+            // the draw pass as with the new modifier.node / coordinator structure this feels
+            // somewhat error prone.
+            if (nextDrawNode != null) {
+                nextDrawNode.performDraw(canvas)
             } else {
-                drawEntity.layoutNodeWrapper.performDraw(canvas)
+                // TODO(lmr): this is needed in the case that the drawnode is also a measure node,
+                //  but we should think about the right ways to handle this as this is very error
+                //  prone i think
+                val coordinator = drawNode.requireCoordinator(Nodes.Draw)
+                val nextCoordinator = if (coordinator.tail === drawNode)
+                    coordinator.wrapped!!
+                else
+                    coordinator
+                nextCoordinator.performDraw(canvas)
             }
         }
     }
 
-    internal inline fun draw(
+    // This is not thread safe
+    fun DrawModifierNode.performDraw(canvas: Canvas) {
+        val coordinator = requireCoordinator(Nodes.Draw)
+        val size = coordinator.size.toSize()
+        val drawScope = coordinator.layoutNode.mDrawScope
+        drawScope.draw(canvas, size, coordinator, this)
+    }
+
+    internal fun draw(
         canvas: Canvas,
         size: Size,
-        layoutNodeWrapper: LayoutNodeWrapper,
-        drawEntity: DrawEntity,
-        block: DrawScope.() -> Unit
+        coordinator: NodeCoordinator,
+        drawNode: DrawModifierNode,
     ) {
-        val previousDrawEntity = this.drawEntity
-        this.drawEntity = drawEntity
+        val previousDrawNode = this.drawNode
+        this.drawNode = drawNode
         canvasDrawScope.draw(
-            layoutNodeWrapper,
-            layoutNodeWrapper.layoutDirection,
+            coordinator,
+            coordinator.layoutDirection,
             canvas,
-            size,
-            block
-        )
-        this.drawEntity = previousDrawEntity
+            size
+        ) {
+            with(drawNode) {
+                this@LayoutNodeDrawScope.draw()
+            }
+        }
+        this.drawNode = previousDrawNode
     }
 }
+
+@OptIn(ExperimentalComposeUiApi::class)
+private fun DelegatableNode.nextDrawNode(): DrawModifierNode? {
+    val drawMask = Nodes.Draw.mask
+    val measureMask = Nodes.Layout.mask
+    val child = node.child ?: return null
+    if (child.aggregateChildKindSet and drawMask == 0) return null
+    var next: Modifier.Node? = child
+    while (next != null) {
+        if (next.kindSet and measureMask != 0) return null
+        if (next.kindSet and drawMask != 0) {
+            return next as DrawModifierNode
+        }
+        next = next.child
+    }
+    return null
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeEntity.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeEntity.kt
deleted file mode 100644
index 015a8f2..0000000
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeEntity.kt
+++ /dev/null
@@ -1,67 +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.node
-
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.unit.IntSize
-
-/**
- * Base class for entities in [LayoutNodeWrapper]. a [LayoutNodeEntity] is
- * a node in a linked list referenced from [EntityList].
- */
-internal open class LayoutNodeEntity<T : LayoutNodeEntity<T, M>, M : Modifier>(
-    val layoutNodeWrapper: LayoutNodeWrapper,
-    val modifier: M
-) {
-    /**
-     * The next element in the list. [next] is the element that is wrapped
-     * by this [LayoutNodeEntity].
-     */
-    var next: T? = null
-
-    /**
-     * Convenience access to [LayoutNode]
-     */
-    val layoutNode: LayoutNode
-        get() = layoutNodeWrapper.layoutNode
-
-    /**
-     * Convenience access to [LayoutNodeWrapper.size]
-     */
-    val size: IntSize
-        get() = layoutNodeWrapper.size
-
-    /**
-     * `true` only when the entity is attached to the hierarchy.
-     */
-    var isAttached = false
-        private set
-
-    /**
-     * Called when the entity is attached to the layout hierarchy.
-     */
-    open fun onAttach() {
-        isAttached = true
-    }
-
-    /**
-     * Called when the entity has been detached from the layout hierarchy.
-     */
-    open fun onDetach() {
-        isAttached = false
-    }
-}
\ No newline at end of file
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeLayoutDelegate.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeLayoutDelegate.kt
index d948d5b..6d91114 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeLayoutDelegate.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeLayoutDelegate.kt
@@ -35,8 +35,9 @@
  */
 internal class LayoutNodeLayoutDelegate(
     private val layoutNode: LayoutNode,
-    var outerWrapper: LayoutNodeWrapper
 ) {
+    val outerCoordinator: NodeCoordinator
+        get() = layoutNode.nodes.outerCoordinator
     val lastConstraints: Constraints?
         get() = measurePassDelegate.lastConstraints
     val lastLookaheadConstraints: Constraints?
@@ -226,8 +227,8 @@
             private set
         override val isPlaced: Boolean
             get() = layoutNode.isPlaced
-        override val innerLayoutNodeWrapper: LayoutNodeWrapper
-            get() = layoutNode.innerLayoutNodeWrapper
+        override val innerCoordinator: NodeCoordinator
+            get() = layoutNode.innerCoordinator
         override val alignmentLines: AlignmentLines = LayoutNodeAlignmentLines(this)
 
         private val _childMeasurables = MutableVector<Measurable>()
@@ -256,7 +257,7 @@
             // as a result of the previous operation we can figure out a child has been resized
             // and we need to be remeasured, not relaid out
             if (layoutPendingForAlignment ||
-                (!duringAlignmentLinesQuery && !innerLayoutNodeWrapper.isPlacingForAlignment &&
+                (!duringAlignmentLinesQuery && !innerCoordinator.isPlacingForAlignment &&
                     layoutPending)) {
                 layoutPending = false
                 layoutState = LayoutState.LayingOut
@@ -270,7 +271,7 @@
                         forEachChildAlignmentLinesOwner {
                             it.alignmentLines.usedDuringParentLayout
                         }
-                        innerLayoutNodeWrapper.measureResult.placeChildren()
+                        innerCoordinator.measureResult.placeChildren()
 
                         layoutNode.checkChildrenPlaceOrderForUpdates()
                         forEachChildAlignmentLinesOwner {
@@ -281,7 +282,7 @@
                 }
                 layoutState = LayoutState.Idle
 
-                if (innerLayoutNodeWrapper.isPlacingForAlignment &&
+                if (innerCoordinator.isPlacingForAlignment &&
                     coordinatesAccessedDuringPlacement
                 ) {
                     requestLayout()
@@ -334,14 +335,14 @@
                     it.alignmentLines.usedDuringParentMeasurement = false
                 }
                 measuredOnce = true
-                val outerWrapperPreviousMeasuredSize = outerWrapper.size
+                val outerPreviousMeasuredSize = outerCoordinator.size
                 measurementConstraints = constraints
                 performMeasure(constraints)
-                val sizeChanged = outerWrapper.size != outerWrapperPreviousMeasuredSize ||
-                    outerWrapper.width != width ||
-                    outerWrapper.height != height
-                // We are using the coerced wrapper size here to avoid double offset in layout coop.
-                measuredSize = IntSize(outerWrapper.width, outerWrapper.height)
+                val sizeChanged = outerCoordinator.size != outerPreviousMeasuredSize ||
+                    outerCoordinator.width != width ||
+                    outerCoordinator.height != height
+                // We are using the coerced coordinator size here to avoid double offset in layout coop.
+                measuredSize = IntSize(outerCoordinator.width, outerCoordinator.height)
                 return sizeChanged
             } else {
                 // this node doesn't require being remeasured. however in order to make sure we have
@@ -382,12 +383,12 @@
             }
         }
 
-        // We are setting our measuredSize to match the coerced outerWrapper size, to prevent
+        // We are setting our measuredSize to match the coerced outerCoordinator size, to prevent
         // double offseting for layout cooperation. However, this means that here we need
         // to override these getters to make the measured values correct in Measured.
         // TODO(popam): clean this up
-        override val measuredWidth: Int get() = outerWrapper.measuredWidth
-        override val measuredHeight: Int get() = outerWrapper.measuredHeight
+        override val measuredWidth: Int get() = outerCoordinator.measuredWidth
+        override val measuredHeight: Int get() = outerCoordinator.measuredHeight
 
         override fun get(alignmentLine: AlignmentLine): Int {
             if (layoutNode.parent?.layoutState == LayoutState.Measuring) {
@@ -396,7 +397,7 @@
                 alignmentLines.usedDuringParentLayout = true
             }
             duringAlignmentLinesQuery = true
-            val result = outerWrapper[alignmentLine]
+            val result = outerCoordinator[alignmentLine]
             duringAlignmentLinesQuery = false
             return result
         }
@@ -421,10 +422,10 @@
             }
 
             // Post-lookahead (if any) placement
-            placeOuterWrapper(position, zIndex, layerBlock)
+            placeOuterCoordinator(position, zIndex, layerBlock)
         }
 
-        private fun placeOuterWrapper(
+        private fun placeOuterCoordinator(
             position: IntOffset,
             zIndex: Float,
             layerBlock: (GraphicsLayerScope.() -> Unit)?
@@ -443,42 +444,42 @@
             ) {
                 with(PlacementScope) {
                     if (layerBlock == null) {
-                        outerWrapper.place(position, zIndex)
+                        outerCoordinator.place(position, zIndex)
                     } else {
-                        outerWrapper.placeWithLayer(position, zIndex, layerBlock)
+                        outerCoordinator.placeWithLayer(position, zIndex, layerBlock)
                     }
                 }
             }
         }
 
         /**
-         * Calls [placeOuterWrapper] with the same position used during the last
-         * [placeOuterWrapper] call. [placeOuterWrapper] only does the placement for
+         * Calls [placeOuterCoordinator] with the same position used during the last
+         * [placeOuterCoordinator] call. [placeOuterCoordinator] only does the placement for
          * post-lookahead pass.
          */
         fun replace() {
             check(placedOnce)
-            placeOuterWrapper(lastPosition, lastZIndex, lastLayerBlock)
+            placeOuterCoordinator(lastPosition, lastZIndex, lastLayerBlock)
         }
 
         override fun minIntrinsicWidth(height: Int): Int {
             onIntrinsicsQueried()
-            return outerWrapper.minIntrinsicWidth(height)
+            return outerCoordinator.minIntrinsicWidth(height)
         }
 
         override fun maxIntrinsicWidth(height: Int): Int {
             onIntrinsicsQueried()
-            return outerWrapper.maxIntrinsicWidth(height)
+            return outerCoordinator.maxIntrinsicWidth(height)
         }
 
         override fun minIntrinsicHeight(width: Int): Int {
             onIntrinsicsQueried()
-            return outerWrapper.minIntrinsicHeight(width)
+            return outerCoordinator.minIntrinsicHeight(width)
         }
 
         override fun maxIntrinsicHeight(width: Int): Int {
             onIntrinsicsQueried()
-            return outerWrapper.maxIntrinsicHeight(width)
+            return outerCoordinator.maxIntrinsicHeight(width)
         }
 
         private fun onIntrinsicsQueried() {
@@ -507,8 +508,8 @@
         }
 
         fun updateParentData(): Boolean {
-            val changed = parentData != outerWrapper.parentData
-            parentData = outerWrapper.parentData
+            val changed = parentData != outerCoordinator.parentData
+            parentData = outerCoordinator.parentData
             return changed
         }
 
@@ -525,9 +526,9 @@
                     alignmentLines.usedByModifierLayout = true
                 }
             }
-            innerLayoutNodeWrapper.isPlacingForAlignment = true
+            innerCoordinator.isPlacingForAlignment = true
             layoutChildren()
-            innerLayoutNodeWrapper.isPlacingForAlignment = false
+            innerCoordinator.isPlacingForAlignment = false
             return alignmentLines.getLastCalculation()
         }
 
@@ -651,8 +652,8 @@
         // is triggered by [LayoutNode.attach]
         override var isPlaced: Boolean = true
         private var isPreviouslyPlaced: Boolean = false
-        override val innerLayoutNodeWrapper: LayoutNodeWrapper
-            get() = layoutNode.innerLayoutNodeWrapper
+        override val innerCoordinator: NodeCoordinator
+            get() = layoutNode.innerCoordinator
         override val alignmentLines: AlignmentLines = LookaheadAlignmentLines(this)
 
         private val _childMeasurables = MutableVector<Measurable>()
@@ -682,7 +683,7 @@
             if (lookaheadLayoutPending) {
                 onBeforeLayoutChildren()
             }
-            val lookaheadDelegate = innerLayoutNodeWrapper.lookaheadDelegate!!
+            val lookaheadDelegate = innerCoordinator.lookaheadDelegate!!
             // as a result of the previous operation we can figure out a child has been resized
             // and we need to be remeasured, not relaid out
             if (lookaheadLayoutPendingForAlignment ||
@@ -752,9 +753,9 @@
                     alignmentLines.usedByModifierLayout = true
                 }
             }
-            innerLayoutNodeWrapper.lookaheadDelegate?.isPlacingForAlignment = true
+            innerCoordinator.lookaheadDelegate?.isPlacingForAlignment = true
             layoutChildren()
-            innerLayoutNodeWrapper.lookaheadDelegate?.isPlacingForAlignment = false
+            innerCoordinator.lookaheadDelegate?.isPlacingForAlignment = false
             return alignmentLines.getLastCalculation()
         }
 
@@ -858,7 +859,7 @@
                     it.alignmentLines.usedDuringParentMeasurement = false
                 }
                 measuredOnce = true
-                val lookaheadDelegate = outerWrapper.lookaheadDelegate
+                val lookaheadDelegate = outerCoordinator.lookaheadDelegate
                 check(lookaheadDelegate != null) {
                     "Lookahead result from lookaheadRemeasure cannot be null"
                 }
@@ -888,18 +889,18 @@
             coordinatesAccessedDuringPlacement = false
             owner.snapshotObserver.observeLayoutModifierSnapshotReads(layoutNode) {
                 with(PlacementScope) {
-                    outerWrapper.lookaheadDelegate!!.place(position)
+                    outerCoordinator.lookaheadDelegate!!.place(position)
                 }
             }
             lastPosition = position
         }
 
-        // We are setting our measuredSize to match the coerced outerWrapper size, to prevent
+        // We are setting our measuredSize to match the coerced outerCoordinator size, to prevent
         // double offseting for layout cooperation. However, this means that here we need
         // to override these getters to make the measured values correct in Measured.
         // TODO(popam): clean this up
-        override val measuredWidth: Int get() = outerWrapper.lookaheadDelegate!!.measuredWidth
-        override val measuredHeight: Int get() = outerWrapper.lookaheadDelegate!!.measuredHeight
+        override val measuredWidth: Int get() = outerCoordinator.lookaheadDelegate!!.measuredWidth
+        override val measuredHeight: Int get() = outerCoordinator.lookaheadDelegate!!.measuredHeight
 
         override fun get(alignmentLine: AlignmentLine): Int {
             if (layoutNode.parent?.layoutState == LayoutState.LookaheadMeasuring) {
@@ -908,29 +909,29 @@
                 alignmentLines.usedDuringParentLayout = true
             }
             duringAlignmentLinesQuery = true
-            val result = outerWrapper.lookaheadDelegate!![alignmentLine]
+            val result = outerCoordinator.lookaheadDelegate!![alignmentLine]
             duringAlignmentLinesQuery = false
             return result
         }
 
         override fun minIntrinsicWidth(height: Int): Int {
             onIntrinsicsQueried()
-            return outerWrapper.lookaheadDelegate!!.minIntrinsicWidth(height)
+            return outerCoordinator.lookaheadDelegate!!.minIntrinsicWidth(height)
         }
 
         override fun maxIntrinsicWidth(height: Int): Int {
             onIntrinsicsQueried()
-            return outerWrapper.lookaheadDelegate!!.maxIntrinsicWidth(height)
+            return outerCoordinator.lookaheadDelegate!!.maxIntrinsicWidth(height)
         }
 
         override fun minIntrinsicHeight(width: Int): Int {
             onIntrinsicsQueried()
-            return outerWrapper.lookaheadDelegate!!.minIntrinsicHeight(width)
+            return outerCoordinator.lookaheadDelegate!!.minIntrinsicHeight(width)
         }
 
         override fun maxIntrinsicHeight(width: Int): Int {
             onIntrinsicsQueried()
-            return outerWrapper.lookaheadDelegate!!.maxIntrinsicHeight(width)
+            return outerCoordinator.lookaheadDelegate!!.maxIntrinsicHeight(width)
         }
 
         private fun onIntrinsicsQueried() {
@@ -982,8 +983,8 @@
         }
 
         fun updateParentData(): Boolean {
-            val changed = parentData != outerWrapper.lookaheadDelegate!!.parentData
-            parentData = outerWrapper.lookaheadDelegate!!.parentData
+            val changed = parentData != outerCoordinator.lookaheadDelegate!!.parentData
+            parentData = outerCoordinator.lookaheadDelegate!!.parentData
             return changed
         }
 
@@ -1067,7 +1068,7 @@
             layoutNode,
             affectsLookahead = false
         ) {
-            outerWrapper.measure(constraints)
+            outerCoordinator.measure(constraints)
         }
         // The resulting layout state might be Ready. This can happen when the layout node's
         // own modifier is querying an alignment line during measurement, therefore we
@@ -1084,7 +1085,7 @@
         layoutState = LayoutState.LookaheadMeasuring
         lookaheadMeasurePending = false
         layoutNode.requireOwner().snapshotObserver.observeMeasureSnapshotReads(layoutNode) {
-            outerWrapper.lookaheadDelegate!!.measure(constraints)
+            outerCoordinator.lookaheadDelegate!!.measure(constraints)
         }
         markLookaheadLayoutPending()
         if (layoutNode.isOutMostLookaheadRoot()) {
@@ -1162,9 +1163,9 @@
     val isPlaced: Boolean
 
     /**
-     * InnerPlaceable of the LayoutNode that the AlignmentLinesOwner operates on.
+     * InnerNodeCoordinator of the LayoutNode that the AlignmentLinesOwner operates on.
      */
-    val innerLayoutNodeWrapper: LayoutNodeWrapper
+    val innerCoordinator: NodeCoordinator
 
     /**
      * Alignment lines for either lookahead pass or post-lookahead pass, depending on the
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeWrapper.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeWrapper.kt
deleted file mode 100644
index 39d3be2..0000000
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeWrapper.kt
+++ /dev/null
@@ -1,1307 +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:Suppress("NOTHING_TO_INLINE")
-@file:OptIn(ExperimentalComposeUiApi::class)
-
-package androidx.compose.ui.node
-
-import androidx.compose.runtime.snapshots.Snapshot
-import androidx.compose.ui.ExperimentalComposeUiApi
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.geometry.MutableRect
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.geometry.Rect
-import androidx.compose.ui.geometry.Size
-import androidx.compose.ui.geometry.isFinite
-import androidx.compose.ui.geometry.toRect
-import androidx.compose.ui.graphics.Canvas
-import androidx.compose.ui.graphics.DefaultCameraDistance
-import androidx.compose.ui.graphics.GraphicsLayerScope
-import androidx.compose.ui.graphics.Matrix
-import androidx.compose.ui.graphics.Paint
-import androidx.compose.ui.graphics.ReusableGraphicsLayerScope
-import androidx.compose.ui.graphics.TransformOrigin
-import androidx.compose.ui.input.pointer.PointerInputFilter
-import androidx.compose.ui.input.pointer.PointerInputModifier
-import androidx.compose.ui.layout.AlignmentLine
-import androidx.compose.ui.layout.LayoutCoordinates
-import androidx.compose.ui.layout.LookaheadLayoutCoordinatesImpl
-import androidx.compose.ui.layout.LookaheadScope
-import androidx.compose.ui.layout.Measurable
-import androidx.compose.ui.layout.MeasureResult
-import androidx.compose.ui.layout.ParentDataModifier
-import androidx.compose.ui.layout.Placeable
-import androidx.compose.ui.layout.findRootCoordinates
-import androidx.compose.ui.layout.positionInRoot
-import androidx.compose.ui.semantics.SemanticsEntity
-import androidx.compose.ui.semantics.SemanticsModifier
-import androidx.compose.ui.semantics.outerSemantics
-import androidx.compose.ui.unit.Constraints
-import androidx.compose.ui.unit.Density
-import androidx.compose.ui.unit.IntOffset
-import androidx.compose.ui.unit.IntSize
-import androidx.compose.ui.unit.LayoutDirection
-import androidx.compose.ui.unit.minus
-import androidx.compose.ui.unit.plus
-
-/**
- * Measurable and Placeable type that has a position.
- */
-internal abstract class LayoutNodeWrapper(
-    override val layoutNode: LayoutNode
-) : LookaheadCapablePlaceable(), Measurable, LayoutCoordinates, OwnerScope,
-        (Canvas) -> Unit {
-
-    internal open val wrapped: LayoutNodeWrapper? get() = null
-    internal var wrappedBy: LayoutNodeWrapper? = null
-
-    override val layoutDirection: LayoutDirection
-        get() = layoutNode.layoutDirection
-
-    override val density: Float
-        get() = layoutNode.density.density
-
-    override val fontScale: Float
-        get() = layoutNode.density.fontScale
-
-    override val parent: LookaheadCapablePlaceable?
-        get() = wrappedBy
-
-    override val coordinates: LayoutCoordinates
-        get() = this
-
-    // Size exposed to LayoutCoordinates.
-    final override val size: IntSize get() = measuredSize
-
-    private var isClipping: Boolean = false
-
-    protected var layerBlock: (GraphicsLayerScope.() -> Unit)? = null
-        private set
-    private var layerDensity: Density = layoutNode.density
-    private var layerLayoutDirection: LayoutDirection = layoutNode.layoutDirection
-
-    private var lastLayerAlpha: Float = 0.8f
-    fun isTransparent(): Boolean {
-        if (layer != null && lastLayerAlpha <= 0f) return true
-        return this.wrappedBy?.isTransparent() ?: return false
-    }
-
-    override val alignmentLinesOwner: AlignmentLinesOwner
-        get() = layoutNode.layoutDelegate.alignmentLinesOwner
-
-    override val child: LookaheadCapablePlaceable?
-        get() = wrapped
-
-    override fun replace() {
-        placeAt(position, zIndex, layerBlock)
-    }
-
-    override val hasMeasureResult: Boolean
-        get() = _measureResult != null
-
-    private var _isAttached = false
-    final override val isAttached: Boolean
-        get() {
-            if (_isAttached) {
-                require(layoutNode.isAttached)
-            }
-            return _isAttached
-        }
-
-    private var _measureResult: MeasureResult? = null
-    override var measureResult: MeasureResult
-        get() = _measureResult ?: error(UnmeasuredError)
-        internal set(value) {
-            val old = _measureResult
-            if (value !== old) {
-                _measureResult = value
-                if (old == null || value.width != old.width || value.height != old.height) {
-                    onMeasureResultChanged(value.width, value.height)
-                }
-                // We do not simply compare against old.alignmentLines in case this is a
-                // MutableStateMap and the same instance might be passed.
-                if ((!oldAlignmentLines.isNullOrEmpty() || value.alignmentLines.isNotEmpty()) &&
-                    value.alignmentLines != oldAlignmentLines
-                ) {
-                    alignmentLinesOwner.alignmentLines.onAlignmentsChanged()
-
-                    val oldLines = oldAlignmentLines
-                        ?: (mutableMapOf<AlignmentLine, Int>().also { oldAlignmentLines = it })
-                    oldLines.clear()
-                    oldLines.putAll(value.alignmentLines)
-                }
-            }
-        }
-
-    internal var lookaheadDelegate: LookaheadDelegate? = null
-        private set
-
-    private var oldAlignmentLines: MutableMap<AlignmentLine, Int>? = null
-
-    /**
-     * Creates a new lookaheadDelegate instance when the scope changes. If the provided scope is
-     * null, it means the lookahead root does not exit (or no longer exists), set
-     * the [lookaheadDelegate] to null.
-     */
-    internal fun updateLookaheadScope(scope: LookaheadScope?) {
-        lookaheadDelegate = scope?.let {
-            if (it != lookaheadDelegate?.lookaheadScope) {
-                createLookaheadDelegate(it)
-            } else {
-                lookaheadDelegate
-            }
-        }
-    }
-
-    protected fun updateLookaheadDelegate(lookaheadDelegate: LookaheadDelegate) {
-        this.lookaheadDelegate = lookaheadDelegate
-    }
-
-    abstract fun createLookaheadDelegate(scope: LookaheadScope): LookaheadDelegate
-
-    override val providedAlignmentLines: Set<AlignmentLine>
-        get() {
-            var set: MutableSet<AlignmentLine>? = null
-            var wrapper: LayoutNodeWrapper? = this
-            while (wrapper != null) {
-                val alignmentLines = wrapper._measureResult?.alignmentLines
-                if (alignmentLines?.isNotEmpty() == true) {
-                    if (set == null) {
-                        set = mutableSetOf()
-                    }
-                    set.addAll(alignmentLines.keys)
-                }
-                wrapper = wrapper.wrapped
-            }
-            return set ?: emptySet()
-        }
-
-    /**
-     * Called when the width or height of [measureResult] change. The object instance pointed to
-     * by [measureResult] may or may not have changed.
-     */
-    protected open fun onMeasureResultChanged(width: Int, height: Int) {
-        val layer = layer
-        if (layer != null) {
-            layer.resize(IntSize(width, height))
-        } else {
-            wrappedBy?.invalidateLayer()
-        }
-        layoutNode.owner?.onLayoutChange(layoutNode)
-        measuredSize = IntSize(width, height)
-        entities.forEach(EntityList.DrawEntityType) { it.onMeasureResultChanged() }
-    }
-
-    override var position: IntOffset = IntOffset.Zero
-        protected set
-
-    var zIndex: Float = 0f
-        protected set
-
-    override val parentData: Any?
-        get() = entities.head(EntityList.ParentDataEntityType).parentData
-
-    private val SimpleEntity<ParentDataModifier>?.parentData: Any?
-        get() = if (this == null) {
-            wrapped?.parentData
-        } else {
-            with(modifier) {
-                /**
-                 * ParentData provided through the parentData node will override the data provided
-                 * through a modifier.
-                 */
-                modifyParentData(next.parentData)
-            }
-        }
-
-    final override val parentLayoutCoordinates: LayoutCoordinates?
-        get() {
-            check(isAttached) { ExpectAttachedLayoutCoordinates }
-            return layoutNode.outerLayoutNodeWrapper.wrappedBy
-        }
-
-    final override val parentCoordinates: LayoutCoordinates?
-        get() {
-            check(isAttached) { ExpectAttachedLayoutCoordinates }
-            return wrappedBy
-        }
-
-    private var _rectCache: MutableRect? = null
-    protected val rectCache: MutableRect
-        get() = _rectCache ?: MutableRect(0f, 0f, 0f, 0f).also {
-            _rectCache = it
-        }
-
-    private val snapshotObserver get() = layoutNode.requireOwner().snapshotObserver
-
-    /**
-     * All [LayoutNodeEntity] elements that are associated with this [LayoutNodeWrapper].
-     */
-    val entities = EntityList()
-
-    /**
-     * The current layer's positional attributes.
-     */
-    private var layerPositionalProperties: LayerPositionalProperties? = null
-
-    protected inline fun performingMeasure(
-        constraints: Constraints,
-        block: () -> Placeable
-    ): Placeable {
-        measurementConstraints = constraints
-        val result = block()
-        layer?.resize(measuredSize)
-        return result
-    }
-
-    fun onMeasured() {
-        if (entities.has(EntityList.RemeasureEntityType)) {
-            Snapshot.withoutReadObservation {
-                entities.forEach(EntityList.RemeasureEntityType) {
-                    it.modifier.onRemeasured(measuredSize)
-                }
-            }
-        }
-    }
-
-    /**
-     * An initialization function that is called when the [LayoutNodeWrapper] is initially created,
-     * and also called when the [LayoutNodeWrapper] is re-used.
-     */
-    open fun onInitialize() {
-        layer?.invalidate()
-    }
-
-    /**
-     * Places the modified child.
-     */
-    /*@CallSuper*/
-    override fun placeAt(
-        position: IntOffset,
-        zIndex: Float,
-        layerBlock: (GraphicsLayerScope.() -> Unit)?
-    ) {
-        onLayerBlockUpdated(layerBlock)
-        if (this.position != position) {
-            this.position = position
-            layoutNode.layoutDelegate.measurePassDelegate
-                .notifyChildrenUsingCoordinatesWhilePlacing()
-            val layer = layer
-            if (layer != null) {
-                layer.move(position)
-            } else {
-                wrappedBy?.invalidateLayer()
-            }
-            invalidateAlignmentLinesFromPositionChange()
-            layoutNode.owner?.onLayoutChange(layoutNode)
-        }
-        this.zIndex = zIndex
-    }
-
-    /**
-     * Draws the content of the LayoutNode
-     */
-    fun draw(canvas: Canvas) {
-        val layer = layer
-        if (layer != null) {
-            layer.drawLayer(canvas)
-        } else {
-            val x = position.x.toFloat()
-            val y = position.y.toFloat()
-            canvas.translate(x, y)
-            drawContainedDrawModifiers(canvas)
-            canvas.translate(-x, -y)
-        }
-    }
-
-    private fun drawContainedDrawModifiers(canvas: Canvas) {
-        val head = entities.head(EntityList.DrawEntityType)
-        if (head == null) {
-            performDraw(canvas)
-        } else {
-            head.draw(canvas)
-        }
-    }
-
-    open fun performDraw(canvas: Canvas) {
-        wrapped?.draw(canvas)
-    }
-
-    fun onPlaced() {
-        entities.forEach(EntityList.LookaheadOnPlacedEntityType) {
-            it.modifier.onPlaced(lookaheadDelegate!!.lookaheadLayoutCoordinates)
-        }
-        entities.forEach(EntityList.OnPlacedEntityType) {
-            it.modifier.onPlaced(this)
-        }
-    }
-
-    // implementation of draw block passed to the OwnedLayer
-    @Suppress("LiftReturnOrAssignment")
-    override fun invoke(canvas: Canvas) {
-        if (layoutNode.isPlaced) {
-            snapshotObserver.observeReads(this, onCommitAffectingLayer) {
-                drawContainedDrawModifiers(canvas)
-            }
-            lastLayerDrawingWasSkipped = false
-        } else {
-            // The invalidation is requested even for nodes which are not placed. As we are not
-            // going to display them we skip the drawing. It is safe to just draw nothing as the
-            // layer will be invalidated again when the node will be finally placed.
-            lastLayerDrawingWasSkipped = true
-        }
-    }
-
-    fun onLayerBlockUpdated(layerBlock: (GraphicsLayerScope.() -> Unit)?) {
-        val layerInvalidated = this.layerBlock !== layerBlock || layerDensity != layoutNode
-            .density || layerLayoutDirection != layoutNode.layoutDirection
-        this.layerBlock = layerBlock
-        this.layerDensity = layoutNode.density
-        this.layerLayoutDirection = layoutNode.layoutDirection
-        if (isAttached && layerBlock != null) {
-            if (layer == null) {
-                layer = layoutNode.requireOwner().createLayer(
-                    this,
-                    invalidateParentLayer
-                ).apply {
-                    resize(measuredSize)
-                    move(position)
-                }
-                updateLayerParameters()
-                layoutNode.innerLayerWrapperIsDirty = true
-                invalidateParentLayer()
-            } else if (layerInvalidated) {
-                updateLayerParameters()
-            }
-        } else {
-            layer?.let {
-                it.destroy()
-                layoutNode.innerLayerWrapperIsDirty = true
-                invalidateParentLayer()
-                if (isAttached) {
-                    layoutNode.owner?.onLayoutChange(layoutNode)
-                }
-            }
-            layer = null
-            lastLayerDrawingWasSkipped = false
-        }
-    }
-
-    private fun updateLayerParameters() {
-        val layer = layer
-        if (layer != null) {
-            val layerBlock = requireNotNull(layerBlock)
-            graphicsLayerScope.reset()
-            graphicsLayerScope.graphicsDensity = layoutNode.density
-            snapshotObserver.observeReads(this, onCommitAffectingLayerParams) {
-                layerBlock.invoke(graphicsLayerScope)
-            }
-            val layerPositionalProperties = layerPositionalProperties
-                ?: LayerPositionalProperties().also { layerPositionalProperties = it }
-            layerPositionalProperties.copyFrom(graphicsLayerScope)
-            layer.updateLayerProperties(
-                scaleX = graphicsLayerScope.scaleX,
-                scaleY = graphicsLayerScope.scaleY,
-                alpha = graphicsLayerScope.alpha,
-                translationX = graphicsLayerScope.translationX,
-                translationY = graphicsLayerScope.translationY,
-                shadowElevation = graphicsLayerScope.shadowElevation,
-                ambientShadowColor = graphicsLayerScope.ambientShadowColor,
-                spotShadowColor = graphicsLayerScope.spotShadowColor,
-                rotationX = graphicsLayerScope.rotationX,
-                rotationY = graphicsLayerScope.rotationY,
-                rotationZ = graphicsLayerScope.rotationZ,
-                cameraDistance = graphicsLayerScope.cameraDistance,
-                transformOrigin = graphicsLayerScope.transformOrigin,
-                shape = graphicsLayerScope.shape,
-                clip = graphicsLayerScope.clip,
-                renderEffect = graphicsLayerScope.renderEffect,
-                layoutDirection = layoutNode.layoutDirection,
-                density = layoutNode.density
-            )
-            isClipping = graphicsLayerScope.clip
-        } else {
-            require(layerBlock == null)
-        }
-        lastLayerAlpha = graphicsLayerScope.alpha
-        layoutNode.owner?.onLayoutChange(layoutNode)
-    }
-
-    private val invalidateParentLayer: () -> Unit = {
-        wrappedBy?.invalidateLayer()
-    }
-
-    /**
-     * True when the last drawing of this layer didn't draw the real content as the LayoutNode
-     * containing this layer was not placed by the parent.
-     */
-    internal var lastLayerDrawingWasSkipped = false
-        private set
-
-    var layer: OwnedLayer? = null
-        private set
-
-    override val isValid: Boolean
-        get() = layer != null
-
-    val minimumTouchTargetSize: Size
-        get() = with(layerDensity) { layoutNode.viewConfiguration.minimumTouchTargetSize.toSize() }
-
-    /**
-     * Executes a hit test for this [LayoutNodeWrapper].
-     *
-     * @param hitTestSource The hit test specifics for pointer input or semantics
-     * @param pointerPosition The tested pointer position, which is relative to
-     * the [LayoutNodeWrapper].
-     * @param hitTestResult The parent [HitTestResult] that any hit should be added to.
-     * @param isTouchEvent `true` if this is from a touch source. Touch sources allow for
-     * minimum touch target. Semantics hit tests always treat hits as needing minimum touch target.
-     * @param isInLayer `true` if the touch event is in the layer of this and all parents or `false`
-     * if it is outside the layer, but within the minimum touch target of the edge of the layer.
-     * This can only be `false` when [isTouchEvent] is `true` or else a layer miss means the event
-     * will be clipped out.
-     */
-    fun <T : LayoutNodeEntity<T, M>, C, M : Modifier> hitTest(
-        hitTestSource: HitTestSource<T, C, M>,
-        pointerPosition: Offset,
-        hitTestResult: HitTestResult<C>,
-        isTouchEvent: Boolean,
-        isInLayer: Boolean
-    ) {
-        val head = entities.head(hitTestSource.entityType())
-        if (!withinLayerBounds(pointerPosition)) {
-            // This missed the clip, but if this layout is too small and this is within the
-            // minimum touch target, we still consider it a hit.
-            if (isTouchEvent) {
-                val distanceFromEdge =
-                    distanceInMinimumTouchTarget(pointerPosition, minimumTouchTargetSize)
-                if (distanceFromEdge.isFinite() &&
-                    hitTestResult.isHitInMinimumTouchTargetBetter(distanceFromEdge, false)
-                ) {
-                    head.hitNear(
-                        hitTestSource,
-                        pointerPosition,
-                        hitTestResult,
-                        isTouchEvent,
-                        false,
-                        distanceFromEdge
-                    )
-                } // else it is a complete miss.
-            }
-        } else if (head == null) {
-            hitTestChild(hitTestSource, pointerPosition, hitTestResult, isTouchEvent, isInLayer)
-        } else if (isPointerInBounds(pointerPosition)) {
-            // A real hit
-            head.hit(
-                hitTestSource,
-                pointerPosition,
-                hitTestResult,
-                isTouchEvent,
-                isInLayer
-            )
-        } else {
-            val distanceFromEdge = if (!isTouchEvent) Float.POSITIVE_INFINITY else {
-                distanceInMinimumTouchTarget(pointerPosition, minimumTouchTargetSize)
-            }
-
-            if (distanceFromEdge.isFinite() &&
-                hitTestResult.isHitInMinimumTouchTargetBetter(distanceFromEdge, isInLayer)
-            ) {
-                // Hit closer than existing handlers, so just record it
-                head.hitNear(
-                    hitTestSource,
-                    pointerPosition,
-                    hitTestResult,
-                    isTouchEvent,
-                    isInLayer,
-                    distanceFromEdge
-                )
-            } else {
-                head.speculativeHit(
-                    hitTestSource,
-                    pointerPosition,
-                    hitTestResult,
-                    isTouchEvent,
-                    isInLayer,
-                    distanceFromEdge
-                )
-            }
-        }
-    }
-
-    /**
-     * The [LayoutNodeWrapper] had a hit in bounds and can record any children in the
-     * [hitTestResult].
-     */
-    private fun <T : LayoutNodeEntity<T, M>, C, M : Modifier> T?.hit(
-        hitTestSource: HitTestSource<T, C, M>,
-        pointerPosition: Offset,
-        hitTestResult: HitTestResult<C>,
-        isTouchEvent: Boolean,
-        isInLayer: Boolean
-    ) {
-        if (this == null) {
-            hitTestChild(hitTestSource, pointerPosition, hitTestResult, isTouchEvent, isInLayer)
-        } else {
-            hitTestResult.hit(hitTestSource.contentFrom(this), isInLayer) {
-                next.hit(hitTestSource, pointerPosition, hitTestResult, isTouchEvent, isInLayer)
-            }
-        }
-    }
-
-    /**
-     * The [LayoutNodeWrapper] had a hit [distanceFromEdge] from the bounds and it is within
-     * the minimum touch target distance, so it should be recorded as such in the [hitTestResult].
-     */
-    private fun <T : LayoutNodeEntity<T, M>, C, M : Modifier> T?.hitNear(
-        hitTestSource: HitTestSource<T, C, M>,
-        pointerPosition: Offset,
-        hitTestResult: HitTestResult<C>,
-        isTouchEvent: Boolean,
-        isInLayer: Boolean,
-        distanceFromEdge: Float
-    ) {
-        if (this == null) {
-            hitTestChild(hitTestSource, pointerPosition, hitTestResult, isTouchEvent, isInLayer)
-        } else {
-            // Hit closer than existing handlers, so just record it
-            hitTestResult.hitInMinimumTouchTarget(
-                hitTestSource.contentFrom(this),
-                distanceFromEdge,
-                isInLayer
-            ) {
-                next.hitNear(
-                    hitTestSource,
-                    pointerPosition,
-                    hitTestResult,
-                    isTouchEvent,
-                    isInLayer,
-                    distanceFromEdge
-                )
-            }
-        }
-    }
-
-    /**
-     * The [LayoutNodeWrapper] had a miss, but it hasn't been clipped out. The child must be
-     * checked to see if it hit.
-     */
-    private fun <T : LayoutNodeEntity<T, M>, C, M : Modifier> T?.speculativeHit(
-        hitTestSource: HitTestSource<T, C, M>,
-        pointerPosition: Offset,
-        hitTestResult: HitTestResult<C>,
-        isTouchEvent: Boolean,
-        isInLayer: Boolean,
-        distanceFromEdge: Float
-    ) {
-        if (this == null) {
-            hitTestChild(hitTestSource, pointerPosition, hitTestResult, isTouchEvent, isInLayer)
-        } else if (hitTestSource.interceptOutOfBoundsChildEvents(this)) {
-            // We only want to replace the existing touch target if there are better
-            // hits in the children
-            hitTestResult.speculativeHit(
-                hitTestSource.contentFrom(this),
-                distanceFromEdge,
-                isInLayer
-            ) {
-                next.speculativeHit(
-                    hitTestSource,
-                    pointerPosition,
-                    hitTestResult,
-                    isTouchEvent,
-                    isInLayer,
-                    distanceFromEdge
-                )
-            }
-        } else {
-            next.speculativeHit(
-                hitTestSource,
-                pointerPosition,
-                hitTestResult,
-                isTouchEvent,
-                isInLayer,
-                distanceFromEdge
-            )
-        }
-    }
-
-    /**
-     * Do a [hitTest] on the children of this [LayoutNodeWrapper].
-     */
-    open fun <T : LayoutNodeEntity<T, M>, C, M : Modifier> hitTestChild(
-        hitTestSource: HitTestSource<T, C, M>,
-        pointerPosition: Offset,
-        hitTestResult: HitTestResult<C>,
-        isTouchEvent: Boolean,
-        isInLayer: Boolean
-    ) {
-        // Also, keep looking to see if we also might hit any children.
-        // This avoids checking layer bounds twice as when we call super.hitTest()
-        val wrapped = wrapped
-        if (wrapped != null) {
-            val positionInWrapped = wrapped.fromParentPosition(pointerPosition)
-            wrapped.hitTest(
-                hitTestSource,
-                positionInWrapped,
-                hitTestResult,
-                isTouchEvent,
-                isInLayer
-            )
-        }
-    }
-
-    /**
-     * Returns the bounds of this [LayoutNodeWrapper], including the minimum touch target.
-     */
-    fun touchBoundsInRoot(): Rect {
-        if (!isAttached) {
-            return Rect.Zero
-        }
-
-        val root = findRootCoordinates()
-
-        val bounds = rectCache
-        val padding = calculateMinimumTouchTargetPadding(minimumTouchTargetSize)
-        bounds.left = -padding.width
-        bounds.top = -padding.height
-        bounds.right = measuredWidth + padding.width
-        bounds.bottom = measuredHeight + padding.height
-
-        var wrapper: LayoutNodeWrapper = this
-        while (wrapper !== root) {
-            wrapper.rectInParent(bounds, clipBounds = false, clipToMinimumTouchTargetSize = true)
-            if (bounds.isEmpty) {
-                return Rect.Zero
-            }
-
-            wrapper = wrapper.wrappedBy!!
-        }
-        return bounds.toRect()
-    }
-
-    override fun windowToLocal(relativeToWindow: Offset): Offset {
-        check(isAttached) { ExpectAttachedLayoutCoordinates }
-        val root = findRootCoordinates()
-        val positionInRoot = layoutNode.requireOwner()
-            .calculateLocalPosition(relativeToWindow) - root.positionInRoot()
-        return localPositionOf(root, positionInRoot)
-    }
-
-    override fun localToWindow(relativeToLocal: Offset): Offset {
-        val positionInRoot = localToRoot(relativeToLocal)
-        val owner = layoutNode.requireOwner()
-        return owner.calculatePositionInWindow(positionInRoot)
-    }
-
-    private fun LayoutCoordinates.toWrapper() =
-        (this as? LookaheadLayoutCoordinatesImpl)?.wrapper ?: this as LayoutNodeWrapper
-
-    override fun localPositionOf(
-        sourceCoordinates: LayoutCoordinates,
-        relativeToSource: Offset
-    ): Offset {
-        val layoutNodeWrapper = sourceCoordinates.toWrapper()
-        val commonAncestor = findCommonAncestor(layoutNodeWrapper)
-
-        var position = relativeToSource
-        var wrapper = layoutNodeWrapper
-        while (wrapper !== commonAncestor) {
-            position = wrapper.toParentPosition(position)
-            wrapper = wrapper.wrappedBy!!
-        }
-
-        return ancestorToLocal(commonAncestor, position)
-    }
-
-    override fun transformFrom(sourceCoordinates: LayoutCoordinates, matrix: Matrix) {
-        val layoutNodeWrapper = sourceCoordinates.toWrapper()
-        val commonAncestor = findCommonAncestor(layoutNodeWrapper)
-
-        matrix.reset()
-        // Transform from the source to the common ancestor
-        layoutNodeWrapper.transformToAncestor(commonAncestor, matrix)
-        // Transform from the common ancestor to this
-        transformFromAncestor(commonAncestor, matrix)
-    }
-
-    private fun transformToAncestor(ancestor: LayoutNodeWrapper, matrix: Matrix) {
-        var wrapper = this
-        while (wrapper != ancestor) {
-            wrapper.layer?.transform(matrix)
-            val position = wrapper.position
-            if (position != IntOffset.Zero) {
-                tmpMatrix.reset()
-                tmpMatrix.translate(position.x.toFloat(), position.y.toFloat())
-                matrix.timesAssign(tmpMatrix)
-            }
-            wrapper = wrapper.wrappedBy!!
-        }
-    }
-
-    private fun transformFromAncestor(ancestor: LayoutNodeWrapper, matrix: Matrix) {
-        if (ancestor != this) {
-            wrappedBy!!.transformFromAncestor(ancestor, matrix)
-            if (position != IntOffset.Zero) {
-                tmpMatrix.reset()
-                tmpMatrix.translate(-position.x.toFloat(), -position.y.toFloat())
-                matrix.timesAssign(tmpMatrix)
-            }
-            layer?.inverseTransform(matrix)
-        }
-    }
-
-    override fun localBoundingBoxOf(
-        sourceCoordinates: LayoutCoordinates,
-        clipBounds: Boolean
-    ): Rect {
-        check(isAttached) { ExpectAttachedLayoutCoordinates }
-        check(sourceCoordinates.isAttached) {
-            "LayoutCoordinates $sourceCoordinates is not attached!"
-        }
-        val layoutNodeWrapper = sourceCoordinates.toWrapper()
-        val commonAncestor = findCommonAncestor(layoutNodeWrapper)
-
-        val bounds = rectCache
-        bounds.left = 0f
-        bounds.top = 0f
-        bounds.right = sourceCoordinates.size.width.toFloat()
-        bounds.bottom = sourceCoordinates.size.height.toFloat()
-
-        var wrapper = layoutNodeWrapper
-        while (wrapper !== commonAncestor) {
-            wrapper.rectInParent(bounds, clipBounds)
-            if (bounds.isEmpty) {
-                return Rect.Zero
-            }
-
-            wrapper = wrapper.wrappedBy!!
-        }
-
-        ancestorToLocal(commonAncestor, bounds, clipBounds)
-        return bounds.toRect()
-    }
-
-    private fun ancestorToLocal(ancestor: LayoutNodeWrapper, offset: Offset): Offset {
-        if (ancestor === this) {
-            return offset
-        }
-        val wrappedBy = wrappedBy
-        if (wrappedBy == null || ancestor == wrappedBy) {
-            return fromParentPosition(offset)
-        }
-        return fromParentPosition(wrappedBy.ancestorToLocal(ancestor, offset))
-    }
-
-    private fun ancestorToLocal(
-        ancestor: LayoutNodeWrapper,
-        rect: MutableRect,
-        clipBounds: Boolean
-    ) {
-        if (ancestor === this) {
-            return
-        }
-        wrappedBy?.ancestorToLocal(ancestor, rect, clipBounds)
-        return fromParentRect(rect, clipBounds)
-    }
-
-    override fun localToRoot(relativeToLocal: Offset): Offset {
-        check(isAttached) { ExpectAttachedLayoutCoordinates }
-        var wrapper: LayoutNodeWrapper? = this
-        var position = relativeToLocal
-        while (wrapper != null) {
-            position = wrapper.toParentPosition(position)
-            wrapper = wrapper.wrappedBy
-        }
-        return position
-    }
-
-    protected inline fun withPositionTranslation(canvas: Canvas, block: (Canvas) -> Unit) {
-        val x = position.x.toFloat()
-        val y = position.y.toFloat()
-        canvas.translate(x, y)
-        block(canvas)
-        canvas.translate(-x, -y)
-    }
-
-    /**
-     * Converts [position] in the local coordinate system to a [Offset] in the
-     * [parentLayoutCoordinates] coordinate system.
-     */
-    open fun toParentPosition(position: Offset): Offset {
-        val layer = layer
-        val targetPosition = layer?.mapOffset(position, inverse = false) ?: position
-        return targetPosition + this.position
-    }
-
-    /**
-     * Converts [position] in the [parentLayoutCoordinates] coordinate system to a [Offset] in the
-     * local coordinate system.
-     */
-    open fun fromParentPosition(position: Offset): Offset {
-        val relativeToWrapperPosition = position - this.position
-        val layer = layer
-        return layer?.mapOffset(relativeToWrapperPosition, inverse = true)
-            ?: relativeToWrapperPosition
-    }
-
-    protected fun drawBorder(canvas: Canvas, paint: Paint) {
-        val rect = Rect(
-            left = 0.5f,
-            top = 0.5f,
-            right = measuredSize.width.toFloat() - 0.5f,
-            bottom = measuredSize.height.toFloat() - 0.5f
-        )
-        canvas.drawRect(rect, paint)
-    }
-
-    /**
-     * Attaches the [LayoutNodeWrapper] and its wrapped [LayoutNodeWrapper] to an active
-     * LayoutNode.
-     *
-     * This will be called when the [LayoutNode] associated with this [LayoutNodeWrapper] is
-     * attached to the [Owner].
-     *
-     * It is also called whenever the modifier chain is replaced and the [LayoutNodeWrapper]s are
-     * recreated.
-     */
-    open fun attach() {
-        _isAttached = true
-        onLayerBlockUpdated(layerBlock)
-        entities.forEach { it.onAttach() }
-    }
-
-    /**
-     * Detaches the [LayoutNodeWrapper] and its wrapped [LayoutNodeWrapper] from an active
-     * LayoutNode.
-     *
-     * This will be called when the [LayoutNode] associated with this [LayoutNodeWrapper] is
-     * detached from the [Owner].
-     *
-     * It is also called whenever the modifier chain is replaced and the [LayoutNodeWrapper]s are
-     * recreated.
-     */
-    open fun detach() {
-        entities.forEach { it.onDetach() }
-        _isAttached = false
-        onLayerBlockUpdated(layerBlock)
-        // The layer has been removed and we need to invalidate the containing layer. We've lost
-        // which layer contained this one, but all layers in this modifier chain will be invalidated
-        // in onModifierChanged(). Therefore the only possible layer that won't automatically be
-        // invalidated is the parent's layer. We'll invalidate it here:
-        layoutNode.parent?.invalidateLayer()
-    }
-
-    /**
-     * Modifies bounds to be in the parent LayoutNodeWrapper's coordinates, including clipping,
-     * if [clipBounds] is true. If [clipToMinimumTouchTargetSize] is true and the layer clips,
-     * then the clip bounds are extended to allow minimum touch target extended area.
-     */
-    internal fun rectInParent(
-        bounds: MutableRect,
-        clipBounds: Boolean,
-        clipToMinimumTouchTargetSize: Boolean = false
-    ) {
-        val layer = layer
-        if (layer != null) {
-            if (isClipping) {
-                if (clipToMinimumTouchTargetSize) {
-                    val minTouch = minimumTouchTargetSize
-                    val horz = minTouch.width / 2f
-                    val vert = minTouch.height / 2f
-                    bounds.intersect(
-                        -horz, -vert, size.width.toFloat() + horz, size.height.toFloat() + vert
-                    )
-                } else if (clipBounds) {
-                    bounds.intersect(0f, 0f, size.width.toFloat(), size.height.toFloat())
-                }
-                if (bounds.isEmpty) {
-                    return
-                }
-            }
-            layer.mapBounds(bounds, inverse = false)
-        }
-
-        val x = position.x
-        bounds.left += x
-        bounds.right += x
-
-        val y = position.y
-        bounds.top += y
-        bounds.bottom += y
-    }
-
-    /**
-     * Modifies bounds in the parent's coordinates to be in this LayoutNodeWrapper's
-     * coordinates, including clipping, if [clipBounds] is true.
-     */
-    private fun fromParentRect(bounds: MutableRect, clipBounds: Boolean) {
-        val x = position.x
-        bounds.left -= x
-        bounds.right -= x
-
-        val y = position.y
-        bounds.top -= y
-        bounds.bottom -= y
-
-        val layer = layer
-        if (layer != null) {
-            layer.mapBounds(bounds, inverse = true)
-            if (isClipping && clipBounds) {
-                bounds.intersect(0f, 0f, size.width.toFloat(), size.height.toFloat())
-                if (bounds.isEmpty) {
-                    return
-                }
-            }
-        }
-    }
-
-    protected fun withinLayerBounds(pointerPosition: Offset): Boolean {
-        if (!pointerPosition.isFinite) {
-            return false
-        }
-        val layer = layer
-        return layer == null || !isClipping || layer.isInLayer(pointerPosition)
-    }
-
-    /**
-     * Whether a pointer that is relative to the [LayoutNodeWrapper] is in the bounds of this
-     * LayoutNodeWrapper.
-     */
-    protected fun isPointerInBounds(pointerPosition: Offset): Boolean {
-        val x = pointerPosition.x
-        val y = pointerPosition.y
-        return x >= 0f && y >= 0f && x < measuredWidth && y < measuredHeight
-    }
-
-    /**
-     * Invalidates the layer that this wrapper will draw into.
-     */
-    open fun invalidateLayer() {
-        val layer = layer
-        if (layer != null) {
-            layer.invalidate()
-        } else {
-            wrappedBy?.invalidateLayer()
-        }
-    }
-
-    /**
-     * Send a request to bring a portion of this item into view. The portion that has to be
-     * brought into view is specified as a rectangle where the coordinates are in the local
-     * coordinates of that layoutNodeWrapper. This request is sent up the hierarchy to all parents
-     * that have a [RelocationModifier][androidx.compose.ui.layout.RelocationModifier].
-     */
-    open suspend fun propagateRelocationRequest(rect: Rect) {
-        val parent = wrappedBy ?: return
-
-        // Translate this layoutNodeWrapper to the coordinate system of the parent.
-        val boundingBoxInParentCoordinates = parent.localBoundingBoxOf(this, false)
-
-        // Translate the rect to parent coordinates
-        val rectInParentBounds = rect.translate(boundingBoxInParentCoordinates.topLeft)
-
-        parent.propagateRelocationRequest(rectInParentBounds)
-    }
-
-    /**
-     * Called when [LayoutNode.modifier] has changed and all the LayoutNodeWrappers have been
-     * configured.
-     */
-    open fun onModifierChanged() {
-        layer?.invalidate()
-    }
-
-    internal fun findCommonAncestor(other: LayoutNodeWrapper): LayoutNodeWrapper {
-        var ancestor1 = other.layoutNode
-        var ancestor2 = layoutNode
-        if (ancestor1 === ancestor2) {
-            // They are on the same node, but we don't know which is the deeper of the two
-            val tooFar = layoutNode.outerLayoutNodeWrapper
-            var tryMe = this
-            while (tryMe !== tooFar && tryMe !== other) {
-                tryMe = tryMe.wrappedBy!!
-            }
-            if (tryMe === other) {
-                return other
-            }
-            return this
-        }
-
-        while (ancestor1.depth > ancestor2.depth) {
-            ancestor1 = ancestor1.parent!!
-        }
-
-        while (ancestor2.depth > ancestor1.depth) {
-            ancestor2 = ancestor2.parent!!
-        }
-
-        while (ancestor1 !== ancestor2) {
-            val parent1 = ancestor1.parent
-            val parent2 = ancestor2.parent
-            if (parent1 == null || parent2 == null) {
-                throw IllegalArgumentException("layouts are not part of the same hierarchy")
-            }
-            ancestor1 = parent1
-            ancestor2 = parent2
-        }
-
-        return when {
-            ancestor2 === layoutNode -> this
-            ancestor1 === other.layoutNode -> other
-            else -> ancestor1.innerLayoutNodeWrapper
-        }
-    }
-
-    fun shouldSharePointerInputWithSiblings(): Boolean =
-        entities.head(EntityList.PointerInputEntityType)
-            ?.shouldSharePointerInputWithSiblings() == true ||
-            wrapped?.shouldSharePointerInputWithSiblings() == true
-
-    private fun offsetFromEdge(pointerPosition: Offset): Offset {
-        val x = pointerPosition.x
-        val horizontal = maxOf(0f, if (x < 0) -x else x - measuredWidth)
-        val y = pointerPosition.y
-        val vertical = maxOf(0f, if (y < 0) -y else y - measuredHeight)
-
-        return Offset(horizontal, vertical)
-    }
-
-    /**
-     * Returns the additional amount on the horizontal and vertical dimensions that
-     * this extends beyond [width] and [height] on all sides. This takes into account
-     * [minimumTouchTargetSize] and [measuredSize] vs. [width] and [height].
-     */
-    protected fun calculateMinimumTouchTargetPadding(minimumTouchTargetSize: Size): Size {
-        val widthDiff = minimumTouchTargetSize.width - measuredWidth.toFloat()
-        val heightDiff = minimumTouchTargetSize.height - measuredHeight.toFloat()
-        return Size(maxOf(0f, widthDiff / 2f), maxOf(0f, heightDiff / 2f))
-    }
-
-    /**
-     * The distance within the [minimumTouchTargetSize] of [pointerPosition] to the layout
-     * size. If [pointerPosition] isn't within [minimumTouchTargetSize], then
-     * [Float.POSITIVE_INFINITY] is returned.
-     */
-    protected fun distanceInMinimumTouchTarget(
-        pointerPosition: Offset,
-        minimumTouchTargetSize: Size
-    ): Float {
-        if (measuredWidth >= minimumTouchTargetSize.width &&
-            measuredHeight >= minimumTouchTargetSize.height
-        ) {
-            // this layout is big enough that it doesn't qualify for minimum touch targets
-            return Float.POSITIVE_INFINITY
-        }
-
-        val (width, height) = calculateMinimumTouchTargetPadding(minimumTouchTargetSize)
-        val offsetFromEdge = offsetFromEdge(pointerPosition)
-
-        return if ((width > 0f || height > 0f) &&
-            offsetFromEdge.x <= width && offsetFromEdge.y <= height
-        ) {
-            offsetFromEdge.getDistanceSquared()
-        } else {
-            Float.POSITIVE_INFINITY // miss
-        }
-    }
-
-    /**
-     * [LayoutNode.hitTest] and [LayoutNode.hitTestSemantics] are very similar, but the data
-     * used in their implementations are different. This extracts the differences between the
-     * two methods into a single interface.
-     */
-    internal interface HitTestSource<T : LayoutNodeEntity<T, M>, C, M : Modifier> {
-        /**
-         * Returns the [EntityList.EntityType] for the hit test target.
-         */
-        fun entityType(): EntityList.EntityType<T, M>
-
-        /**
-         * Returns the value used to store in [HitTestResult] for the given [LayoutNodeEntity].
-         */
-        fun contentFrom(entity: T): C
-
-        /**
-         * Pointer input hit tests can intercept child hits when enabled. This returns `true`
-         * if the modifier has requested intercepting.
-         */
-        fun interceptOutOfBoundsChildEvents(entity: T): Boolean
-
-        /**
-         * Returns false if the parent layout node has a state that suppresses
-         * hit testing of its children.
-         */
-        fun shouldHitTestChildren(parentLayoutNode: LayoutNode): Boolean
-
-        /**
-         * Calls a hit test on [layoutNode].
-         */
-        fun childHitTest(
-            layoutNode: LayoutNode,
-            pointerPosition: Offset,
-            hitTestResult: HitTestResult<C>,
-            isTouchEvent: Boolean,
-            isInLayer: Boolean
-        )
-    }
-
-    internal companion object {
-        const val ExpectAttachedLayoutCoordinates = "LayoutCoordinate operations are only valid " +
-            "when isAttached is true"
-        const val UnmeasuredError = "Asking for measurement result of unmeasured layout modifier"
-        private val onCommitAffectingLayerParams: (LayoutNodeWrapper) -> Unit = { wrapper ->
-            if (wrapper.isValid) {
-                // wrapper.layerPositionalProperties should always be non-null here, but
-                // we'll just be careful with a null check.
-                val layerPositionalProperties = wrapper.layerPositionalProperties
-                if (layerPositionalProperties == null) {
-                    wrapper.updateLayerParameters()
-                } else {
-                    tmpLayerPositionalProperties.copyFrom(layerPositionalProperties)
-                    wrapper.updateLayerParameters()
-                    if (!tmpLayerPositionalProperties.hasSameValuesAs(layerPositionalProperties)) {
-                        val layoutNode = wrapper.layoutNode
-                        val layoutDelegate = layoutNode.layoutDelegate
-                        if (layoutDelegate.childrenAccessingCoordinatesDuringPlacement > 0) {
-                            if (layoutDelegate.coordinatesAccessedDuringPlacement) {
-                                layoutNode.requestRelayout()
-                            }
-                            layoutDelegate.measurePassDelegate
-                                .notifyChildrenUsingCoordinatesWhilePlacing()
-                        }
-                        layoutNode.owner?.requestOnPositionedCallback(layoutNode)
-                    }
-                }
-            }
-        }
-        private val onCommitAffectingLayer: (LayoutNodeWrapper) -> Unit = { wrapper ->
-            wrapper.layer?.invalidate()
-        }
-        private val graphicsLayerScope = ReusableGraphicsLayerScope()
-        private val tmpLayerPositionalProperties = LayerPositionalProperties()
-
-        // Used for matrix calculations. It should not be used for anything that could lead to
-        // reentrancy.
-        private val tmpMatrix = Matrix()
-
-        /**
-         * Hit testing specifics for pointer input.
-         */
-        val PointerInputSource =
-            object : HitTestSource<PointerInputEntity, PointerInputFilter, PointerInputModifier> {
-                override fun entityType() = EntityList.PointerInputEntityType
-
-                @Suppress("ModifierFactoryReturnType", "ModifierFactoryExtensionFunction")
-                override fun contentFrom(entity: PointerInputEntity) =
-                    entity.modifier.pointerInputFilter
-
-                override fun interceptOutOfBoundsChildEvents(entity: PointerInputEntity) =
-                    entity.modifier.pointerInputFilter.interceptOutOfBoundsChildEvents
-
-                override fun shouldHitTestChildren(parentLayoutNode: LayoutNode) = true
-
-                override fun childHitTest(
-                    layoutNode: LayoutNode,
-                    pointerPosition: Offset,
-                    hitTestResult: HitTestResult<PointerInputFilter>,
-                    isTouchEvent: Boolean,
-                    isInLayer: Boolean
-                ) = layoutNode.hitTest(pointerPosition, hitTestResult, isTouchEvent, isInLayer)
-            }
-
-        /**
-         * Hit testing specifics for semantics.
-         */
-        val SemanticsSource =
-            object : HitTestSource<SemanticsEntity, SemanticsEntity, SemanticsModifier> {
-                override fun entityType() = EntityList.SemanticsEntityType
-
-                override fun contentFrom(entity: SemanticsEntity) = entity
-
-                override fun interceptOutOfBoundsChildEvents(entity: SemanticsEntity) = false
-
-                override fun shouldHitTestChildren(parentLayoutNode: LayoutNode) =
-                    parentLayoutNode.outerSemantics?.collapsedSemanticsConfiguration()
-                        ?.isClearingSemantics != true
-
-                override fun childHitTest(
-                    layoutNode: LayoutNode,
-                    pointerPosition: Offset,
-                    hitTestResult: HitTestResult<SemanticsEntity>,
-                    isTouchEvent: Boolean,
-                    isInLayer: Boolean
-                ) = layoutNode.hitTestSemantics(
-                    pointerPosition,
-                    hitTestResult,
-                    isTouchEvent,
-                    isInLayer
-                )
-            }
-    }
-}
-
-/**
- * These are the components of a layer that changes the position and may lead
- * to an OnGloballyPositionedCallback.
- */
-private class LayerPositionalProperties {
-    private var scaleX: Float = 1f
-    private var scaleY: Float = 1f
-    private var translationX: Float = 0f
-    private var translationY: Float = 0f
-    private var rotationX: Float = 0f
-    private var rotationY: Float = 0f
-    private var rotationZ: Float = 0f
-    private var cameraDistance: Float = DefaultCameraDistance
-    private var transformOrigin: TransformOrigin = TransformOrigin.Center
-
-    fun copyFrom(other: LayerPositionalProperties) {
-        scaleX = other.scaleX
-        scaleY = other.scaleY
-        translationX = other.translationX
-        translationY = other.translationY
-        rotationX = other.rotationX
-        rotationY = other.rotationY
-        rotationZ = other.rotationZ
-        cameraDistance = other.cameraDistance
-        transformOrigin = other.transformOrigin
-    }
-
-    fun copyFrom(scope: GraphicsLayerScope) {
-        scaleX = scope.scaleX
-        scaleY = scope.scaleY
-        translationX = scope.translationX
-        translationY = scope.translationY
-        rotationX = scope.rotationX
-        rotationY = scope.rotationY
-        rotationZ = scope.rotationZ
-        cameraDistance = scope.cameraDistance
-        transformOrigin = scope.transformOrigin
-    }
-
-    fun hasSameValuesAs(other: LayerPositionalProperties): Boolean {
-        return scaleX == other.scaleX &&
-            scaleY == other.scaleY &&
-            translationX == other.translationX &&
-            translationY == other.translationY &&
-            rotationX == other.rotationX &&
-            rotationY == other.rotationY &&
-            rotationZ == other.rotationZ &&
-            cameraDistance == other.cameraDistance &&
-            transformOrigin == other.transformOrigin
-    }
-}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LookaheadDelegate.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LookaheadDelegate.kt
index b1cbed0..23c0d2c 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LookaheadDelegate.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LookaheadDelegate.kt
@@ -32,7 +32,7 @@
 import androidx.compose.ui.unit.LayoutDirection
 
 /**
- * This is the base class for LayoutNodeWrapper and LookaheadDelegate. The common
+ * This is the base class for NodeCoordinator and LookaheadDelegate. The common
  * functionalities between the two are extracted here.
  */
 internal abstract class LookaheadCapablePlaceable : Placeable(), MeasureScope {
@@ -55,7 +55,7 @@
 
     abstract fun calculateAlignmentLine(alignmentLine: AlignmentLine): Int
 
-    // True when the wrapper is running its own placing block to obtain the position
+    // True when the coordinator is running its own placing block to obtain the position
     // in parent, but is not interested in the position of children.
     internal var isShallowPlacing: Boolean = false
     internal abstract val measureResult: MeasureResult
@@ -71,7 +71,7 @@
      */
     internal var isPlacingForAlignment = false
 
-    protected fun LayoutNodeWrapper.invalidateAlignmentLinesFromPositionChange() {
+    protected fun NodeCoordinator.invalidateAlignmentLinesFromPositionChange() {
         if (wrapped?.layoutNode != layoutNode) {
             alignmentLinesOwner.alignmentLines.onAlignmentsChanged()
         } else {
@@ -81,11 +81,11 @@
 }
 
 internal abstract class LookaheadDelegate(
-    val wrapper: LayoutNodeWrapper,
+    val coordinator: NodeCoordinator,
     val lookaheadScope: LookaheadScope
 ) : Measurable, LookaheadCapablePlaceable() {
     override val child: LookaheadCapablePlaceable?
-        get() = wrapper.wrapped?.lookaheadDelegate
+        get() = coordinator.wrapped?.lookaheadDelegate
     override val hasMeasureResult: Boolean
         get() = _measureResult != null
     override var position = IntOffset.Zero
@@ -95,21 +95,21 @@
             "LookaheadDelegate has not been measured yet when measureResult is requested."
         )
     override val layoutDirection: LayoutDirection
-        get() = wrapper.layoutDirection
+        get() = coordinator.layoutDirection
     override val density: Float
-        get() = wrapper.density
+        get() = coordinator.density
     override val fontScale: Float
-        get() = wrapper.fontScale
+        get() = coordinator.fontScale
     override val parent: LookaheadCapablePlaceable?
-        get() = wrapper.wrappedBy?.lookaheadDelegate
+        get() = coordinator.wrappedBy?.lookaheadDelegate
     override val layoutNode: LayoutNode
-        get() = wrapper.layoutNode
+        get() = coordinator.layoutNode
     override val coordinates: LayoutCoordinates
         get() = lookaheadLayoutCoordinates
 
     val lookaheadLayoutCoordinates = LookaheadLayoutCoordinatesImpl(this)
     override val alignmentLinesOwner: AlignmentLinesOwner
-        get() = wrapper.layoutNode.layoutDelegate.lookaheadAlignmentLinesOwner!!
+        get() = coordinator.layoutNode.layoutDelegate.lookaheadAlignmentLinesOwner!!
 
     private var _measureResult: MeasureResult? = null
         set(result) {
@@ -151,7 +151,7 @@
             this.position = position
             layoutNode.layoutDelegate.lookaheadPassDelegate
                 ?.notifyChildrenUsingCoordinatesWhilePlacing()
-            wrapper.invalidateAlignmentLinesFromPositionChange()
+            coordinator.invalidateAlignmentLinesFromPositionChange()
         }
         if (isShallowPlacing) return
         placeChildren()
@@ -160,7 +160,7 @@
     protected open fun placeChildren() {
         PlacementScope.executeWithRtlMirroringValues(
             measureResult.width,
-            wrapper.layoutDirection,
+            coordinator.layoutDirection,
             this
         ) {
             measureResult.placeChildren()
@@ -177,22 +177,22 @@
     }
 
     override val parentData: Any?
-        get() = wrapper.parentData
+        get() = coordinator.parentData
 
     override fun minIntrinsicWidth(height: Int): Int {
-        return wrapper.wrapped!!.lookaheadDelegate!!.minIntrinsicWidth(height)
+        return coordinator.wrapped!!.lookaheadDelegate!!.minIntrinsicWidth(height)
     }
 
     override fun maxIntrinsicWidth(height: Int): Int {
-        return wrapper.wrapped!!.lookaheadDelegate!!.maxIntrinsicWidth(height)
+        return coordinator.wrapped!!.lookaheadDelegate!!.maxIntrinsicWidth(height)
     }
 
     override fun minIntrinsicHeight(width: Int): Int {
-        return wrapper.wrapped!!.lookaheadDelegate!!.minIntrinsicHeight(width)
+        return coordinator.wrapped!!.lookaheadDelegate!!.minIntrinsicHeight(width)
     }
 
     override fun maxIntrinsicHeight(width: Int): Int {
-        return wrapper.wrapped!!.lookaheadDelegate!!.maxIntrinsicHeight(width)
+        return coordinator.wrapped!!.lookaheadDelegate!!.maxIntrinsicHeight(width)
     }
 
     internal fun positionIn(ancestor: LookaheadDelegate): IntOffset {
@@ -200,7 +200,7 @@
         var lookaheadDelegate = this
         while (lookaheadDelegate != ancestor) {
             aggregatedOffset += lookaheadDelegate.position
-            lookaheadDelegate = lookaheadDelegate.wrapper.wrappedBy!!.lookaheadDelegate!!
+            lookaheadDelegate = lookaheadDelegate.coordinator.wrappedBy!!.lookaheadDelegate!!
         }
         return aggregatedOffset
     }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifiedLayoutNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifiedLayoutNode.kt
deleted file mode 100644
index fb16f9a..0000000
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifiedLayoutNode.kt
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package androidx.compose.ui.node
-
-import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.ui.ExperimentalComposeUiApi
-import androidx.compose.ui.graphics.Canvas
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.GraphicsLayerScope
-import androidx.compose.ui.graphics.Paint
-import androidx.compose.ui.graphics.PaintingStyle
-import androidx.compose.ui.layout.AlignmentLine
-import androidx.compose.ui.layout.HorizontalAlignmentLine
-import androidx.compose.ui.layout.IntermediateLayoutModifier
-import androidx.compose.ui.layout.LayoutModifier
-import androidx.compose.ui.layout.LookaheadScope
-import androidx.compose.ui.layout.MeasureResult
-import androidx.compose.ui.layout.Placeable
-import androidx.compose.ui.unit.Constraints
-import androidx.compose.ui.unit.IntOffset
-import androidx.compose.ui.unit.IntSize
-
-@OptIn(ExperimentalComposeUiApi::class)
-internal class ModifiedLayoutNode(
-    override var wrapped: LayoutNodeWrapper,
-    var modifier: LayoutModifier
-) : LayoutNodeWrapper(wrapped.layoutNode) {
-    private var lookAheadTransientLayoutModifier: IntermediateLayoutModifier? =
-        modifier as? IntermediateLayoutModifier
-
-    // This is used by LayoutNode to mark LayoutNodeWrappers that are going to be reused
-    // because they match the modifier instance.
-    var toBeReusedForSameModifier = false
-    override fun onInitialize() {
-        super.onInitialize()
-        wrapped.wrappedBy = this
-    }
-
-    /**
-     * LookaheadDelegate impl for when the [modifier] is any [LayoutModifier] except
-     * [IntermediateLayoutModifier]. This impl will invoke [LayoutModifier.measure] for
-     * the lookahead measurement.
-     */
-    private inner class LookaheadDelegateForLayoutModifier(
-        scope: LookaheadScope
-    ) : LookaheadDelegate(this, scope) {
-        // LookaheadMeasure
-        override fun measure(constraints: Constraints): Placeable =
-            performingMeasure(constraints) {
-                with(modifier) {
-                    measure(
-                        // This allows `measure` calls in the modifier to be redirected to
-                        // calling lookaheadMeasure in wrapped.
-                        wrapped.lookaheadDelegate!!, constraints
-                    )
-                }
-            }
-
-        override fun calculateAlignmentLine(alignmentLine: AlignmentLine): Int {
-            return calculateAlignmentAndPlaceChildAsNeeded(alignmentLine).also {
-                cachedAlignmentLinesMap[alignmentLine] = it
-            }
-        }
-
-        override fun minIntrinsicWidth(height: Int): Int =
-            with(modifierFromState()) {
-                minIntrinsicWidth(wrapped.lookaheadDelegate!!, height)
-            }
-
-        override fun maxIntrinsicWidth(height: Int): Int =
-            with(modifierFromState()) {
-                maxIntrinsicWidth(wrapped.lookaheadDelegate!!, height)
-            }
-
-        override fun minIntrinsicHeight(width: Int): Int =
-            with(modifierFromState()) {
-                minIntrinsicHeight(wrapped.lookaheadDelegate!!, width)
-            }
-
-        override fun maxIntrinsicHeight(width: Int): Int =
-            with(modifierFromState()) {
-                maxIntrinsicHeight(wrapped.lookaheadDelegate!!, width)
-            }
-    }
-
-    /**
-     * LookaheadDelegate impl for when the [modifier] is an
-     * [IntermediateLayoutModifier]. This impl will redirect the measure call to the next
-     * lookahead delegate in the chain, without invoking the measure lambda defined in the modifier.
-     * This is necessary because [IntermediateLayoutModifier] does not participate in lookahead.
-     */
-    private inner class LookaheadDelegateForIntermediateLayoutModifier(
-        scope: LookaheadScope,
-        val intermediateLayoutModifier: IntermediateLayoutModifier
-    ) : LookaheadDelegate(this, scope) {
-        private inner class PassThroughMeasureResult : MeasureResult {
-            override val width: Int
-                get() = wrapped.lookaheadDelegate!!.measureResult.width
-            override val height: Int
-                get() = wrapped.lookaheadDelegate!!.measureResult.height
-            override val alignmentLines: Map<AlignmentLine, Int> = emptyMap()
-
-            override fun placeChildren() {
-                with(PlacementScope) {
-                    wrapped.lookaheadDelegate!!.place(0, 0)
-                }
-            }
-        }
-        private val passThroughMeasureResult = PassThroughMeasureResult()
-
-        // LookaheadMeasure
-        override fun measure(constraints: Constraints): Placeable =
-            with(intermediateLayoutModifier) {
-                performingMeasure(constraints) {
-                    wrapped.lookaheadDelegate!!.run {
-                        measure(constraints)
-                        targetSize = IntSize(measureResult.width, measureResult.height)
-                    }
-                    passThroughMeasureResult
-                }
-            }
-
-        override fun calculateAlignmentLine(alignmentLine: AlignmentLine): Int {
-            return calculateAlignmentAndPlaceChildAsNeeded(alignmentLine).also {
-                cachedAlignmentLinesMap[alignmentLine] = it
-            }
-        }
-    }
-
-    override fun createLookaheadDelegate(scope: LookaheadScope): LookaheadDelegate {
-        return lookAheadTransientLayoutModifier?.let {
-            LookaheadDelegateForIntermediateLayoutModifier(scope, it)
-        } ?: LookaheadDelegateForLayoutModifier(scope)
-    }
-
-    override fun measure(constraints: Constraints): Placeable {
-        performingMeasure(constraints) {
-            with(modifier) {
-                measureResult = measure(wrapped, constraints)
-                this@ModifiedLayoutNode
-            }
-        }
-        onMeasured()
-        return this
-    }
-
-    override fun minIntrinsicWidth(height: Int): Int {
-        return with(modifierFromState()) {
-            minIntrinsicWidth(wrapped, height)
-        }
-    }
-
-    override fun maxIntrinsicWidth(height: Int): Int =
-        with(modifierFromState()) {
-            maxIntrinsicWidth(wrapped, height)
-        }
-
-    override fun minIntrinsicHeight(width: Int): Int =
-        with(modifierFromState()) {
-            minIntrinsicHeight(wrapped, width)
-        }
-
-    override fun maxIntrinsicHeight(width: Int): Int =
-        with(modifierFromState()) {
-            maxIntrinsicHeight(wrapped, width)
-        }
-
-    override fun placeAt(
-        position: IntOffset,
-        zIndex: Float,
-        layerBlock: (GraphicsLayerScope.() -> Unit)?
-    ) {
-        super.placeAt(position, zIndex, layerBlock)
-        // The wrapper only runs their placement block to obtain our position, which allows them
-        // to calculate the offset of an alignment line we have already provided a position for.
-        // No need to place our wrapped as well (we might have actually done this already in
-        // get(line), to obtain the position of the alignment line the wrapper currently needs
-        // our position in order ot know how to offset the value we provided).
-        if (isShallowPlacing) return
-        onPlaced()
-        PlacementScope.executeWithRtlMirroringValues(
-            measuredSize.width,
-            layoutDirection,
-            this
-        ) {
-            measureResult.placeChildren()
-        }
-    }
-
-    private var modifierState: MutableState<LayoutModifier?> = mutableStateOf(null)
-
-    @Suppress("ModifierFactoryExtensionFunction", "ModifierFactoryReturnType")
-    private fun modifierFromState(): LayoutModifier {
-        val currentModifier = modifierState.value ?: modifier
-        modifierState.value = currentModifier
-        return currentModifier
-    }
-
-    override fun onModifierChanged() {
-        super.onModifierChanged()
-        modifierState.value = modifier
-        modifier.let { modifier ->
-            // Creates different [LookaheadDelegate]s based on the type of the modifier.
-            if (modifier is IntermediateLayoutModifier) {
-                lookAheadTransientLayoutModifier = modifier
-                lookaheadDelegate?.let {
-                    updateLookaheadDelegate(
-                        LookaheadDelegateForIntermediateLayoutModifier(it.lookaheadScope, modifier)
-                    )
-                }
-            } else {
-                lookAheadTransientLayoutModifier = null
-                lookaheadDelegate?.let {
-                    updateLookaheadDelegate(
-                        LookaheadDelegateForLayoutModifier(it.lookaheadScope)
-                    )
-                }
-            }
-        }
-    }
-
-    override fun calculateAlignmentLine(alignmentLine: AlignmentLine): Int {
-        return lookaheadDelegate?.getCachedAlignmentLine(alignmentLine)
-            ?: calculateAlignmentAndPlaceChildAsNeeded(alignmentLine)
-    }
-
-    override fun performDraw(canvas: Canvas) {
-        wrapped.draw(canvas)
-        if (layoutNode.requireOwner().showLayoutBounds) {
-            drawBorder(canvas, modifierBoundsPaint)
-        }
-    }
-
-    internal companion object {
-        val modifierBoundsPaint = Paint().also { paint ->
-            paint.color = Color.Blue
-            paint.strokeWidth = 1f
-            paint.style = PaintingStyle.Stroke
-        }
-    }
-}
-
-private fun LookaheadCapablePlaceable.calculateAlignmentAndPlaceChildAsNeeded(
-    alignmentLine: AlignmentLine
-): Int {
-    val child = child
-    check(child != null) {
-        "Child of $this cannot be null when calculating alignment line"
-    }
-    if (measureResult.alignmentLines.containsKey(alignmentLine)) {
-        return measureResult.alignmentLines[alignmentLine] ?: AlignmentLine.Unspecified
-    }
-    val positionInWrapped = child[alignmentLine]
-    if (positionInWrapped == AlignmentLine.Unspecified) {
-        return AlignmentLine.Unspecified
-    }
-    // Place our wrapped to obtain their position inside ourselves.
-    child.isShallowPlacing = true
-    isPlacingForAlignment = true
-    replace()
-    child.isShallowPlacing = false
-    isPlacingForAlignment = false
-    return if (alignmentLine is HorizontalAlignmentLine) {
-        positionInWrapped + child.position.y
-    } else {
-        positionInWrapped + child.position.x
-    }
-}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifierLocalConsumerEntity.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifierLocalConsumerEntity.kt
deleted file mode 100644
index 9916fc2..0000000
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifierLocalConsumerEntity.kt
+++ /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.compose.ui.node
-
-import androidx.compose.runtime.collection.mutableVectorOf
-import androidx.compose.ui.modifier.ModifierLocal
-import androidx.compose.ui.modifier.ModifierLocalConsumer
-import androidx.compose.ui.modifier.ModifierLocalReadScope
-
-internal class ModifierLocalConsumerEntity(
-    var provider: ModifierLocalProviderEntity,
-    val modifier: ModifierLocalConsumer
-) : () -> Unit, OwnerScope, ModifierLocalReadScope {
-    private val modifierLocalsRead = mutableVectorOf<ModifierLocal<*>>()
-    var isAttached = false
-        private set
-
-    override val isValid: Boolean
-        get() = isAttached
-
-    fun attach() {
-        isAttached = true
-        notifyConsumerOfChanges()
-    }
-
-    /**
-     * The attach has been done, but we want to notify changes after the tree is completely applied.
-     */
-    fun attachDelayed() {
-        isAttached = true
-        invalidateConsumer()
-    }
-
-    fun detach() {
-        modifier.onModifierLocalsUpdated(DetachedModifierLocalReadScope)
-        isAttached = false
-    }
-
-    override val <T> ModifierLocal<T>.current: T
-        get() {
-            modifierLocalsRead += this
-            val provider = provider.findModifierLocalProvider(this)
-            return if (provider == null) {
-                defaultFactory()
-            } else {
-                // We need a cast because type information is erased.
-                // When we check for equality of the key it implies that the types are equal too.
-                @Suppress("UNCHECKED_CAST")
-                provider.value as T
-            }
-        }
-
-    fun invalidateConsumersOf(local: ModifierLocal<*>) {
-        if (local in modifierLocalsRead) {
-            // Trigger the value to be read again
-            provider.layoutNode.owner?.registerOnEndApplyChangesListener(this)
-        }
-    }
-
-    fun notifyConsumerOfChanges() {
-        // If the node is not attached, we don't notify the consumers.
-        // Ultimately when the node is attached, this function will be called again.
-        if (!isAttached) return
-
-        modifierLocalsRead.clear()
-        val snapshotObserver = provider.layoutNode.requireOwner().snapshotObserver
-        snapshotObserver.observeReads(this, onReadValuesChanged) {
-            modifier.onModifierLocalsUpdated(this)
-        }
-    }
-
-    /**
-     * Called when the modifiers have changed and we don't know what may have happened, so
-     * the consumer has to be re-run after the tree is configured.
-     */
-    fun invalidateConsumer() {
-        provider.layoutNode.owner?.registerOnEndApplyChangesListener(this)
-    }
-
-    /**
-     * The listener for [UiApplier.onEndChanges]. This is called when we need to trigger
-     * the consumer to update its values.
-     */
-    override fun invoke() {
-        notifyConsumerOfChanges()
-    }
-
-    companion object {
-        val onReadValuesChanged: (ModifierLocalConsumerEntity) -> Unit = { node ->
-            node.notifyConsumerOfChanges()
-        }
-        val DetachedModifierLocalReadScope = object : ModifierLocalReadScope {
-            override val <T> ModifierLocal<T>.current: T
-                get() = defaultFactory()
-        }
-    }
-}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifierLocalProviderEntity.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifierLocalProviderEntity.kt
deleted file mode 100644
index 13c7b59..0000000
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifierLocalProviderEntity.kt
+++ /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.compose.ui.node
-
-import androidx.compose.runtime.collection.mutableVectorOf
-import androidx.compose.ui.modifier.ModifierLocal
-import androidx.compose.ui.modifier.ModifierLocalProvider
-
-internal class ModifierLocalProviderEntity(
-    val layoutNode: LayoutNode,
-    val modifier: ModifierLocalProvider<*>
-) : () -> Unit {
-    /**
-     * The next (wrapped) ModifierLocalProviderEntity on the LayoutNode. This forms the
-     * linked list of providers.
-     */
-    var next: ModifierLocalProviderEntity? = null
-
-    /**
-     * The previous (wrapped by) ModifierLocalProviderEntity on the LayoutNode. This forms
-     * the reverse direction linked list of providers.
-     */
-    var prev: ModifierLocalProviderEntity? = null
-
-    /**
-     * True if the provider is attached to the LayoutNode and the LayoutNode is attached to
-     * the hierarchy.
-     */
-    var isAttached = false
-        private set
-
-    /**
-     * A list of [ModifierLocalConsumerEntity]s that are after (wrapped by) this provider
-     * and may read [modifier]'s value.
-     */
-    val consumers = mutableVectorOf<ModifierLocalConsumerEntity>()
-
-    fun attach() {
-        isAttached = true
-
-        // Invalidate children that read this ModifierLocal
-        invalidateConsumersOf(modifier.key, stopIfProvided = false)
-
-        consumers.forEach { it.attach() }
-    }
-
-    /**
-     * The attach has been done, but we want to notify changes after the tree is completely applied.
-     */
-    fun attachDelayed() {
-        isAttached = true
-        // Invalidate children that read this ModifierLocal
-        layoutNode.owner?.registerOnEndApplyChangesListener(this)
-
-        consumers.forEach { it.attachDelayed() }
-    }
-
-    fun detach() {
-        isAttached = false
-        consumers.forEach { it.detach() }
-
-        // Notify anyone who has read from me that the value has changed
-        invalidateConsumersOf(modifier.key, stopIfProvided = false)
-    }
-
-    /**
-     * Invalidates consumers of [local]. If [stopIfProvided] is `true` and this provides the
-     * a value for [local], then consumers are not invalidated.
-     */
-    private fun invalidateConsumersOf(local: ModifierLocal<*>, stopIfProvided: Boolean) {
-        // If this provides a value for local, we don't have to notify the sub-tree
-        if (stopIfProvided && modifier.key == local) {
-            return
-        }
-        consumers.forEach { it.invalidateConsumersOf(local) }
-        next?.invalidateConsumersOf(local, stopIfProvided = true)
-            ?: layoutNode.forEachChild {
-                it.modifierLocalsHead.invalidateConsumersOf(local, stopIfProvided = true)
-            }
-    }
-
-    /**
-     * Returns the [ModifierLocalProvider] that provides [local] or `null` if there isn't
-     * a provider.
-     */
-    @Suppress("ModifierFactoryExtensionFunction", "ModifierFactoryReturnType")
-    fun findModifierLocalProvider(local: ModifierLocal<*>): ModifierLocalProvider<*>? {
-        if (modifier.key == local) {
-            return modifier
-        }
-        return prev?.findModifierLocalProvider(local)
-            ?: layoutNode.parent?.modifierLocalsTail?.findModifierLocalProvider(local)
-    }
-
-    /**
-     * The listener for [UiApplier.onEndChanges]. This is called when we need to invalidate
-     * all consumers of the modifier.
-     */
-    override fun invoke() {
-        if (isAttached) {
-            invalidateConsumersOf(modifier.key, stopIfProvided = false)
-        }
-    }
-}
\ No newline at end of file
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
new file mode 100644
index 0000000..885c7ad
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifierNodeElement.kt
@@ -0,0 +1,65 @@
+/*
+ * 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.node
+
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.areObjectsOfSameType
+
+@ExperimentalComposeUiApi
+abstract class ModifierNodeElement<N : Modifier.Node>(
+    // it is important to have this `params` here so that they will get included
+    // in equals() and hashCode() calculations. Having it as a single object of a
+    // generic object allows us to have anonymous objects implement ManagedModifier
+    // while still having a reasonable equals implementation.
+    internal val params: Any? = null
+) : Modifier.Element {
+    abstract fun create(): N
+    abstract fun update(node: N): N
+
+    override fun hashCode(): Int {
+        return params.hashCode()
+    }
+
+    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
+    }
+}
+
+// TODO(lmr): make sure this produces reasonable bytecode.
+@Suppress("MissingNullability", "ModifierFactoryExtensionFunction")
+@ExperimentalComposeUiApi
+inline fun <reified T : Modifier.Node> modifierElementOf(
+    params: Any?,
+    crossinline create: () -> T,
+    crossinline update: (T) -> Unit
+): Modifier = object : ModifierNodeElement<T>(params) {
+    override fun create(): T = create()
+    override fun update(node: T): T = node.also(update)
+}
+
+@Suppress("MissingNullability", "ModifierFactoryExtensionFunction")
+@ExperimentalComposeUiApi
+inline fun <reified T : Modifier.Node> modifierElementOf(
+    crossinline create: () -> T,
+): Modifier = object : ModifierNodeElement<T>(null) {
+    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/node/MyersDiff.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MyersDiff.kt
new file mode 100644
index 0000000..d7172cf
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MyersDiff.kt
@@ -0,0 +1,514 @@
+/*
+ * 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.
+ */
+@file:Suppress("NOTHING_TO_INLINE")
+
+package androidx.compose.ui.node
+
+import kotlin.math.abs
+import kotlin.math.min
+
+internal interface DiffCallback {
+    fun areItemsTheSame(oldIndex: Int, newIndex: Int): Boolean
+    fun insert(atIndex: Int, newIndex: Int)
+    fun remove(oldIndex: Int)
+    fun same(oldIndex: Int, newIndex: Int)
+}
+
+// Myers' algorithm uses two lists as axis labels. In DiffUtil's implementation, `x` axis is
+// used for old list and `y` axis is used for new list.
+/**
+ * Calculates the list of update operations that can covert one list into the other one.
+ *
+ *
+ * If your old and new lists are sorted by the same constraint and items never move (swap
+ * positions), you can disable move detection which takes `O(N^2)` time where
+ * N is the number of added, moved, removed items.
+ *
+ * @param cb The callback that acts as a gateway to the backing list data
+ *
+ * @return A LongStack that contains the diagonals which are used by [applyDiff] to update the list
+ */
+private fun calculateDiff(
+    oldSize: Int,
+    newSize: Int,
+    cb: DiffCallback,
+): IntStack {
+    val max = (oldSize + newSize + 1) / 2
+    val diagonals = IntStack(max * 3)
+    // instead of a recursive implementation, we keep our own stack to avoid potential stack
+    // overflow exceptions
+    val stack = IntStack(max * 4)
+    stack.pushRange(0, oldSize, 0, newSize)
+    // allocate forward and backward k-lines. K lines are diagonal lines in the matrix.
+    // (see the paper for details) These arrays lines keep the max reachable position for
+    // each k-line.
+    val forward = CenteredArray(IntArray(max * 2 + 1))
+    val backward = CenteredArray(IntArray(max * 2 + 1))
+    val snake = Snake(IntArray(5))
+
+    while (stack.isNotEmpty()) {
+        val newEnd = stack.pop()
+        val newStart = stack.pop()
+        val oldEnd = stack.pop()
+        val oldStart = stack.pop()
+
+        val found = midPoint(
+            oldStart,
+            oldEnd,
+            newStart,
+            newEnd,
+            cb, forward, backward, snake.data)
+
+        if (found) {
+            // if it has a diagonal, save it
+            if (snake.diagonalSize > 0) {
+                snake.addDiagonalToStack(diagonals)
+            }
+            // add new ranges for left and right
+            // left
+            stack.pushRange(
+                oldStart = oldStart,
+                oldEnd = snake.startX,
+                newStart = newStart,
+                newEnd = snake.startY,
+            )
+
+            // right
+            stack.pushRange(
+                oldStart = snake.endX,
+                oldEnd = oldEnd,
+                newStart = snake.endY,
+                newEnd = newEnd,
+            )
+        }
+    }
+    // sort snakes
+    diagonals.sortDiagonals()
+    // always add one last
+    diagonals.pushDiagonal(oldSize, newSize, 0)
+
+    return diagonals
+}
+
+private fun applyDiff(
+    oldSize: Int,
+    newSize: Int,
+    diagonals: IntStack,
+    callback: DiffCallback,
+) {
+    var posX = oldSize
+    var posY = newSize
+    while (diagonals.isNotEmpty()) {
+        var i = diagonals.pop() // diagonal size
+        val endY = diagonals.pop()
+        val endX = diagonals.pop()
+        while (posX > endX) {
+            posX--
+            callback.remove(posX)
+        }
+        while (posY > endY) {
+            posY--
+            callback.insert(posX, posY)
+        }
+        while (i-- > 0) {
+            posX--
+            posY--
+            callback.same(posX, posY)
+        }
+    }
+    // the last remaining diagonals are just remove/insert until we hit zero
+    while (posX > 0) {
+        posX--
+        callback.remove(posX)
+    }
+    while (posY > 0) {
+        posY--
+        callback.insert(posX, posY)
+    }
+}
+
+internal fun executeDiff(oldSize: Int, newSize: Int, callback: DiffCallback) {
+    val diagonals = calculateDiff(oldSize, newSize, callback)
+    applyDiff(oldSize, newSize, diagonals, callback)
+}
+
+/**
+ * Finds a middle snake in the given range.
+ */
+private fun midPoint(
+    oldStart: Int,
+    oldEnd: Int,
+    newStart: Int,
+    newEnd: Int,
+    cb: DiffCallback,
+    forward: CenteredArray,
+    backward: CenteredArray,
+    snake: IntArray,
+): Boolean {
+    val oldSize = oldEnd - oldStart
+    val newSize = newEnd - newStart
+    if (oldSize < 1 || newSize < 1) {
+        return false
+    }
+    val max = (oldSize + newSize + 1) / 2
+    forward[1] = oldStart
+    backward[1] = oldEnd
+    for (d in 0 until max) {
+        val found = forward(
+            oldStart,
+            oldEnd,
+            newStart,
+            newEnd, cb, forward, backward, d, snake)
+        if (found) {
+            return true
+        }
+        val found2 = backward(
+            oldStart,
+            oldEnd,
+            newStart,
+            newEnd, cb, forward, backward, d, snake)
+        if (found2) {
+            return true
+        }
+    }
+    return false
+}
+
+private fun forward(
+    oldStart: Int,
+    oldEnd: Int,
+    newStart: Int,
+    newEnd: Int,
+    cb: DiffCallback,
+    forward: CenteredArray,
+    backward: CenteredArray,
+    d: Int,
+    snake: IntArray,
+): Boolean {
+    val oldSize = oldEnd - oldStart
+    val newSize = newEnd - newStart
+    val checkForSnake = abs(oldSize - newSize) % 2 == 1
+    val delta = oldSize - newSize
+    var k = -d
+    while (k <= d) {
+        // we either come from d-1, k-1 OR d-1. k+1
+        // as we move in steps of 2, array always holds both current and previous d values
+        // k = x - y and each array value holds the max X, y = x - k
+        val startX: Int
+        val startY: Int
+        var x: Int
+        if ((k == -d) || (k != d) && (forward[k + 1] > forward[k - 1])) {
+            // picking k + 1, incrementing Y (by simply not incrementing X)
+            startX = forward[k + 1]
+            x = startX
+        } else {
+            // picking k - 1, incrementing X
+            startX = forward[k - 1]
+            x = startX + 1
+        }
+        var y: Int = newStart + (x - oldStart) - k
+        startY = if (d == 0 || x != startX) y else y - 1
+        // now find snake size
+        while ((x < oldEnd) && y < newEnd && cb.areItemsTheSame(x, y)) {
+            x++
+            y++
+        }
+        // now we have furthest reaching x, record it
+        forward[k] = x
+        if (checkForSnake) {
+            // see if we did pass over a backwards array
+            // mapping function: delta - k
+            val backwardsK = delta - k
+            // if backwards K is calculated and it passed me, found match
+            if ((backwardsK >= -d + 1 && backwardsK <= d - 1) && backward[backwardsK] <= x) {
+                // match
+                fillSnake(
+                    startX,
+                    startY,
+                    x,
+                    y,
+                    false,
+                    snake,
+                )
+                return true
+            }
+        }
+        k += 2
+    }
+    return false
+}
+
+private fun backward(
+    oldStart: Int,
+    oldEnd: Int,
+    newStart: Int,
+    newEnd: Int,
+    cb: DiffCallback,
+    forward: CenteredArray,
+    backward: CenteredArray,
+    d: Int,
+    snake: IntArray,
+): Boolean {
+    val oldSize = oldEnd - oldStart
+    val newSize = newEnd - newStart
+    val checkForSnake = (oldSize - newSize) % 2 == 0
+    val delta = oldSize - newSize
+    // same as androidx.compose.ui.node.forward but we go backwards from end of the lists to be
+    // beginning this also means we'll try to optimize for minimizing x instead of maximizing it
+    var k = -d
+    while (k <= d) {
+
+        // we either come from d-1, k-1 OR d-1, k+1
+        // as we move in steps of 2, array always holds both current and previous d values
+        // k = x - y and each array value holds the MIN X, y = x - k
+        // when x's are equal, we prioritize deletion over insertion
+        val startX: Int
+        var x: Int
+        if (k == -d || k != d && (backward[k + 1] < backward[k - 1])) {
+            // picking k + 1, decrementing Y (by simply not decrementing X)
+            startX = backward[k + 1]
+            x = startX
+        } else {
+            // picking k - 1, decrementing X
+            startX = backward[k - 1]
+            x = startX - 1
+        }
+        var y = newEnd - (oldEnd - x - k)
+        val startY = if (d == 0 || x != startX) y else y + 1
+        // now find snake size
+        while ((x > oldStart) && y > newStart && cb.areItemsTheSame(x - 1, y - 1)) {
+            x--
+            y--
+        }
+        // now we have furthest point, record it (min X)
+        backward[k] = x
+        if (checkForSnake) {
+            // see if we did pass over a backwards array
+            // mapping function: delta - k
+            val forwardsK = delta - k
+            // if forwards K is calculated and it passed me, found match
+            if (((forwardsK >= -d) && forwardsK <= d) && forward[forwardsK] >= x) {
+                // match
+                // assignment are reverse since we are a reverse snake
+                fillSnake(
+                    x,
+                    y,
+                    startX,
+                    startY,
+                    true,
+                    snake,
+                )
+                return true
+            }
+        }
+        k += 2
+    }
+    return false
+}
+
+/**
+ * Snakes represent a match between two lists. It is optionally prefixed or postfixed with an
+ * add androidx.compose.ui.node.or remove operation. See the Myers' paper for details.
+ */
+@JvmInline
+private value class Snake(val data: IntArray) {
+    /**
+     * Position in the old list
+     */
+    val startX: Int get() = data[0]
+
+    /**
+     * Position in the new list
+     */
+    val startY: Int get() = data[1]
+
+    /**
+     * End position in the old list, exclusive
+     */
+    val endX: Int get() = data[2]
+
+    /**
+     * End position in the new list, exclusive
+     */
+    val endY: Int get() = data[3]
+
+    /**
+     * True if this snake was created in the reverse search, false otherwise.
+     */
+    val reverse: Boolean get() = data[4] != 0
+    val diagonalSize: Int
+        get() = min(endX - startX, endY - startY)
+
+    private val hasAdditionOrRemoval: Boolean
+        get() = endY - startY != endX - startX
+
+    private val isAddition: Boolean
+        get() = endY - startY > endX - startX
+
+    /**
+     * Extract the diagonal of the snake to make reasoning easier for the rest of the
+     * algorithm where we try to produce a path and also find moves.
+     */
+    fun addDiagonalToStack(diagonals: IntStack) {
+        if (hasAdditionOrRemoval) {
+            if (reverse) {
+                // snake edge it at the end
+                diagonals.pushDiagonal(startX, startY, diagonalSize)
+            } else {
+                // snake edge it at the beginning
+                if (isAddition) {
+                    diagonals.pushDiagonal(startX, startY + 1, diagonalSize)
+                } else {
+                    diagonals.pushDiagonal(startX + 1, startY, diagonalSize)
+                }
+            }
+        } else {
+            // we are a pure diagonal
+            diagonals.pushDiagonal(startX, startY, endX - startX)
+        }
+    }
+
+    override fun toString() = "Snake($startX,$startY,$endX,$endY,$reverse)"
+}
+
+internal fun fillSnake(
+    startX: Int,
+    startY: Int,
+    endX: Int,
+    endY: Int,
+    reverse: Boolean,
+    data: IntArray,
+) {
+    data[0] = startX
+    data[1] = startY
+    data[2] = endX
+    data[3] = endY
+    data[4] = if (reverse) 1 else 0
+}
+
+/**
+ * Array wrapper w/ negative index support.
+ * We use this array instead of a regular array so that algorithm is easier to read without
+ * too many offsets when accessing the "k" array in the algorithm.
+ */
+@JvmInline
+private value class CenteredArray(private val data: IntArray) {
+
+    private val mid: Int get() = data.size / 2
+
+    operator fun get(index: Int): Int = data[index + mid]
+
+    operator fun set(index: Int, value: Int) {
+        data[index + mid] = value
+    }
+}
+
+private class IntStack(initialCapacity: Int) {
+    private var stack = IntArray(initialCapacity)
+    private var lastIndex = 0
+
+    fun pushRange(
+        oldStart: Int,
+        oldEnd: Int,
+        newStart: Int,
+        newEnd: Int,
+    ) {
+        val i = lastIndex
+        if (i + 4 >= stack.size) {
+            stack = stack.copyOf(stack.size * 2)
+        }
+        val stack = stack
+        stack[i + 0] = oldStart
+        stack[i + 1] = oldEnd
+        stack[i + 2] = newStart
+        stack[i + 3] = newEnd
+        lastIndex = i + 4
+    }
+
+    fun pushDiagonal(
+        x: Int,
+        y: Int,
+        size: Int,
+    ) {
+        val i = lastIndex
+        if (i + 3 >= stack.size) {
+            stack = stack.copyOf(stack.size * 2)
+        }
+        val stack = stack
+        stack[i + 0] = x + size
+        stack[i + 1] = y + size
+        stack[i + 2] = size
+        lastIndex = i + 3
+    }
+
+    fun pop(): Int = stack[--lastIndex]
+
+    fun isNotEmpty() = lastIndex != 0
+
+    fun sortDiagonals() {
+        // diagonals are made up of 3 elements, so we must ensure that the array size is some
+        // multiple of three, or else it is malformed. If the size is 3, then there is no need to
+        // sort. If it is greater than 3, we pass in the index of the "start" element of the last
+        // diagonal
+        val i = lastIndex
+        check(i % 3 == 0)
+        if (i > 3) {
+            quickSort(0, i - 3, 3)
+        }
+    }
+
+    private fun quickSort(start: Int, end: Int, elSize: Int) {
+        if (start < end) {
+            val i = partition(start, end, elSize)
+            quickSort(start, i - elSize, elSize)
+            quickSort(i + elSize, end, elSize)
+        }
+    }
+
+    private fun partition(start: Int, end: Int, elSize: Int): Int {
+        var i = start - elSize
+        var j = start
+        while (j < end) {
+            if (compareDiagonal(j, end)) {
+                i += elSize
+                swapDiagonal(i, j)
+            }
+            j += elSize
+        }
+        swapDiagonal(i + elSize, end)
+        return i + elSize
+    }
+
+    private fun swapDiagonal(i: Int, j: Int) {
+        val stack = stack
+        stack.swap(i, j)
+        stack.swap(i + 1, j + 1)
+        stack.swap(i + 2, j + 2)
+    }
+
+    private fun compareDiagonal(a: Int, b: Int): Boolean {
+        val stack = stack
+        val a0 = stack[a]
+        val b0 = stack[b]
+        return a0 < b0 || (a0 == b0 && stack[a + 1] <= stack[b + 1])
+    }
+}
+
+private fun IntArray.swap(i: Int, j: Int) {
+    val tmp = this[i]
+    this[i] = this[j]
+    this[j] = tmp
+}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NestedVectorStack.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NestedVectorStack.kt
new file mode 100644
index 0000000..ba3a4c7
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NestedVectorStack.kt
@@ -0,0 +1,57 @@
+/*
+ * 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.node
+
+import androidx.compose.runtime.collection.MutableVector
+import androidx.compose.runtime.collection.mutableVectorOf
+
+internal class NestedVectorStack<T> {
+    private var current: Int = -1
+    private var lastIndex = 0
+    private var indexes = IntArray(16)
+    private val vectors = mutableVectorOf<MutableVector<T>>()
+    private fun pushIndex(value: Int) {
+        if (lastIndex >= indexes.size) {
+            indexes = indexes.copyOf(indexes.size * 2)
+        }
+        indexes[lastIndex++] = value
+    }
+
+    fun isNotEmpty(): Boolean {
+        return current >= 0 && indexes[current] >= 0
+    }
+
+    fun pop(): T {
+        val i = current
+        val index = indexes[i]
+        val vector = vectors[i]
+        if (index > 0) indexes[i]--
+        else if (index == 0) {
+            vectors.removeAt(i)
+            current--
+        }
+        return vector[index]
+    }
+
+    fun push(vector: MutableVector<T>) {
+        if (vector.isNotEmpty()) {
+            vectors.add(vector)
+            pushIndex(vector.size - 1)
+            current++
+        }
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeChain.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeChain.kt
new file mode 100644
index 0000000..aca43ad
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeChain.kt
@@ -0,0 +1,667 @@
+/*
+ * 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.
+ */
+@file:OptIn(ExperimentalComposeUiApi::class)
+
+package androidx.compose.ui.node
+
+import androidx.compose.runtime.collection.MutableVector
+import androidx.compose.runtime.collection.mutableVectorOf
+import androidx.compose.ui.CombinedModifier
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.areObjectsOfSameType
+import androidx.compose.ui.layout.ModifierInfo
+
+private val SentinelHead = object : Modifier.Node() {
+    override fun toString() = "<Head>"
+}
+
+internal class NodeChain(val layoutNode: LayoutNode) {
+    internal val innerCoordinator = InnerNodeCoordinator(layoutNode)
+    internal var outerCoordinator: NodeCoordinator = innerCoordinator
+        private set
+    internal val tail: Modifier.Node = innerCoordinator.tail
+    internal var head: Modifier.Node = tail
+        private set
+    private val isUpdating: Boolean get() = head === SentinelHead
+    private val aggregateChildKindSet: Int get() = head.aggregateChildKindSet
+    private var current: MutableVector<Modifier.Element>? = null
+    private var buffer: MutableVector<Modifier.Element>? = null
+    private var cachedDiffer: Differ? = null
+    private var logger: Logger? = null
+
+    internal fun useLogger(logger: Logger?) {
+        this.logger = logger
+    }
+
+    private fun padChain() {
+        check(head !== SentinelHead)
+        val currentHead = head
+        currentHead.parent = SentinelHead
+        SentinelHead.child = currentHead
+        head = SentinelHead
+    }
+
+    private fun trimChain() {
+        check(head === SentinelHead)
+        head = SentinelHead.child ?: tail
+        head.parent = null
+        SentinelHead.child = null
+        check(head !== SentinelHead)
+    }
+
+    /**
+     * This method will update the node chain based on the provided modifier chain. This method is
+     * responsible for calling all appropriate lifecycles for nodes that are
+     * created/disposed/updated during this call.
+     *
+     * This method will attempt to optimize for the common scenario of the modifier chain being of
+     * equal size and each element being able to be reused from the prior one. In most cases this
+     * is what recomposition will result in, provided modifiers weren't conditionally provided. In
+     * the cases where the modifier is not of equal length to the prior value, or modifiers of
+     * different reuse types ended up in the same position, this method will deopt into a slower
+     * path which will perform a diff on the modifier chain and execute a minimal number of
+     * insertions and deletions.
+     */
+    internal fun updateFrom(m: Modifier) {
+        // If we run the diff and there are no new nodes created, then we don't need to loop through
+        // and run the attach cycle on them. We simply keep track of this during the diff to avoid
+        // this overhead at the end if we can, since it should be fairly common.
+        var attachNeeded = false
+        // If we run the diff and there are no structural changes, we can avoid looping through the
+        // list and updating the coordinators. We simply keep track of this during the diff to avoid
+        // this overhead at the end if we can, since it should be fairly common. Note that this is
+        // slightly different from [attachNeeded] since a node can be updated and return null or a
+        // new instance which is perfectly valid and would require a new attach cycle, however the
+        // coordinator would be identical and so [attachNeeded] would be true but this false
+        var coordinatorSyncNeeded = false
+        // Use the node chain itself as a head/tail temporarily to prevent pruning the linkedlist
+        // to the point where we don't have reference to it. We need to undo this at the end of
+        // this method.
+        padChain()
+        // to avoid allocating vectors every time modifier is set, we have two vectors that we
+        // reuse over time. Since the common case is the modifier chains will be of equal length,
+        // these vectors should be sized appropriately
+        val before = current ?: mutableVectorOf()
+        val after = m.fillVector(buffer ?: mutableVectorOf())
+        if (after.size == before.size) {
+            // assume if the sizes are the same, that we are in a common case of no structural
+            // changes we will attempt an O(n) fast-path diff and exit if a diff is detected, and
+            // do the O(N^2) diff beyond that point
+            val size = before.size
+            // for the linear diff we want to start with the "unpadded" tail
+            var node: Modifier.Node? = tail.parent
+            var i = size - 1
+            var aggregateChildKindSet = 0
+            while (node != null && i >= 0) {
+                val prev = before[i]
+                val next = after[i]
+                when (reuseActionForModifiers(prev, next)) {
+                    ActionReplace -> {
+                        // TODO(lmr): we could avoid running the diff if i = 0, since that would
+                        //  always be simple remove + insert
+                        // structural change!
+                        // back up one for the structural diff algorithm. This should be safe since
+                        // our chain is padded with the EmptyHead/EmptyTail nodes
+                        logger?.linearDiffAborted(i, prev, next, node)
+                        i++
+                        node = node.child
+                        break
+                    }
+                    ActionUpdate -> {
+                        // this is "the same" modifier, but some things have changed so we want to
+                        // reuse the node but also update it
+                        val beforeUpdate = node
+                        node = updateNodeAndReplaceIfNeeded(prev, next, beforeUpdate)
+                        // if the node is new, we need to run attach on it
+                        attachNeeded = attachNeeded || beforeUpdate !== node
+                        logger?.nodeUpdated(i, i, prev, next, beforeUpdate, node)
+                    }
+                    ActionReuse -> {
+                        logger?.nodeReused(i, i, prev, next, node)
+                        // no need to do anything, this is "the same" modifier
+                    }
+                }
+                i--
+                aggregateChildKindSet = aggregateChildKindSet or node.kindSet
+                node.aggregateChildKindSet = aggregateChildKindSet
+                node = node.parent
+            }
+
+            if (i > 0) {
+                check(node != null)
+                attachNeeded = true
+                coordinatorSyncNeeded = true
+                // there must have been a structural change
+                // we only need to diff what is left of the list, so we use `i` as the "beforeSize"
+                // and "afterSize"
+                structuralUpdate(
+                    before,
+                    i,
+                    after,
+                    i,
+                    // its important that the node we pass in here has an accurate
+                    // "aggregateChildMask"
+                    node,
+                )
+            }
+        } else if (before.size == 0) {
+            // common case where we are initializing the chain and the previous size is zero. In
+            // this case we just do all inserts. Since this is so common, we add a fast path here
+            // for this condition.
+            attachNeeded = true
+            coordinatorSyncNeeded = true
+            var i = after.size - 1
+            var aggregateChildKindSet = 0
+            var node = tail
+            while (i >= 0) {
+                val next = after[i]
+                val child = node
+                node = createAndInsertNodeAsParent(next, child)
+                logger?.nodeInserted(0, i, next, child, node)
+                aggregateChildKindSet = aggregateChildKindSet or node.kindSet
+                node.aggregateChildKindSet = aggregateChildKindSet
+                i--
+            }
+        } else {
+            attachNeeded = true
+            coordinatorSyncNeeded = true
+            structuralUpdate(
+                before,
+                before.size,
+                after,
+                after.size,
+                tail,
+            )
+        }
+        current = after
+        // clear the before vector to allow old modifiers to be Garbage Collected
+        buffer = before.also { it.clear() }
+        trimChain()
+
+        if (coordinatorSyncNeeded) {
+            syncCoordinators()
+        }
+        if (attachNeeded && layoutNode.isAttached) {
+            attach()
+        }
+    }
+
+    private fun syncCoordinators() {
+        var coordinator: NodeCoordinator = innerCoordinator
+        var node: Modifier.Node? = tail.parent
+        while (node != null) {
+            if (node.isKind(Nodes.Layout) && node is LayoutModifierNode) {
+                val next = if (node.isAttached) {
+                    val c = node.coordinator as LayoutModifierNodeCoordinator
+                    val prevNode = c.layoutModifierNode
+                    c.layoutModifierNode = node
+                    if (prevNode !== node) c.onLayoutModifierNodeChanged()
+                    c
+                } else {
+                    val c = LayoutModifierNodeCoordinator(layoutNode, node)
+                    node.updateCoordinator(c)
+                    c
+                }
+                coordinator.wrappedBy = next
+                next.wrapped = coordinator
+                coordinator = next
+            } else {
+                node.updateCoordinator(coordinator)
+            }
+            node = node.parent
+        }
+        coordinator.wrappedBy = layoutNode.parent?.innerCoordinator
+        outerCoordinator = coordinator
+    }
+
+    fun attach() {
+        headToTail {
+            if (!it.isAttached) it.attach()
+        }
+    }
+
+    /**
+     * This returns a new List of Modifiers and the coordinates and any extra information
+     * that may be useful. This is used for tooling to retrieve layout modifier and layer
+     * information.
+     */
+    fun getModifierInfo(): List<ModifierInfo> {
+        val current = current ?: return listOf()
+        val infoList = MutableVector<ModifierInfo>(current.size)
+        var i = 0
+        headToTailExclusive { node ->
+            val coordinator = requireNotNull(node.coordinator)
+            infoList += ModifierInfo(current[i++], coordinator, coordinator.layer)
+        }
+        return infoList.asMutableList()
+    }
+
+    internal fun detach() {
+        // NOTE(lmr): Currently this implementation allows for nodes to be
+        // attached/detached/attached. We need to decide if that's what we want. If we
+        // don't, the commented out implementation below it might be better.
+        tailToHead {
+            if (it.isAttached) it.detach()
+        }
+//        tailToHead {
+//            if (it.isAttached) it.detach()
+//            it.child?.parent = null
+//            it.child = null
+//        }
+//        current?.clear()
+    }
+
+    private fun getDiffer(
+        tail: Modifier.Node,
+        before: MutableVector<Modifier.Element>,
+        after: MutableVector<Modifier.Element>,
+    ): Differ {
+        val current = cachedDiffer
+        @Suppress("IfThenToElvis")
+        return if (current == null) {
+            Differ(
+                tail,
+                tail.aggregateChildKindSet,
+                before,
+                after,
+            ).also { cachedDiffer = it }
+        } else {
+            current.also {
+                it.node = tail
+                it.aggregateChildKindSet = tail.aggregateChildKindSet
+                it.before = before
+                it.after = after
+            }
+        }
+    }
+
+    private inner class Differ(
+        var node: Modifier.Node,
+        var aggregateChildKindSet: Int,
+        var before: MutableVector<Modifier.Element>,
+        var after: MutableVector<Modifier.Element>,
+    ) : DiffCallback {
+        override fun areItemsTheSame(oldIndex: Int, newIndex: Int): Boolean {
+            return reuseActionForModifiers(before[oldIndex], after[newIndex]) != ActionReplace
+        }
+
+        override fun insert(atIndex: Int, newIndex: Int) {
+            val child = node
+            node = createAndInsertNodeAsParent(after[newIndex], child)
+            logger?.nodeInserted(atIndex, newIndex, after[newIndex], child, node)
+            aggregateChildKindSet = aggregateChildKindSet or node.kindSet
+            node.aggregateChildKindSet = aggregateChildKindSet
+        }
+
+        override fun remove(oldIndex: Int) {
+            node = node.parent!!
+            logger?.nodeRemoved(oldIndex, before[oldIndex], node)
+            node = disposeAndRemoveNode(node)
+        }
+
+        override fun same(oldIndex: Int, newIndex: Int) {
+            node = node.parent!!
+            val prev = before[oldIndex]
+            val next = after[newIndex]
+            if (prev != next) {
+                val beforeUpdate = node
+                node = updateNodeAndReplaceIfNeeded(prev, next, beforeUpdate)
+                logger?.nodeUpdated(oldIndex, newIndex, prev, next, beforeUpdate, node)
+            } else {
+                logger?.nodeReused(oldIndex, newIndex, prev, next, node)
+            }
+            aggregateChildKindSet = aggregateChildKindSet or node.kindSet
+            node.aggregateChildKindSet = aggregateChildKindSet
+        }
+    }
+
+    internal interface Logger {
+        fun linearDiffAborted(
+            index: Int,
+            prev: Modifier.Element,
+            next: Modifier.Element,
+            node: Modifier.Node
+        )
+
+        fun nodeUpdated(
+            oldIndex: Int,
+            newIndex: Int,
+            prev: Modifier.Element,
+            next: Modifier.Element,
+            before: Modifier.Node,
+            after: Modifier.Node
+        )
+
+        fun nodeReused(
+            oldIndex: Int,
+            newIndex: Int,
+            prev: Modifier.Element,
+            next: Modifier.Element,
+            node: Modifier.Node
+        )
+
+        fun nodeInserted(
+            atIndex: Int,
+            newIndex: Int,
+            element: Modifier.Element,
+            child: Modifier.Node,
+            inserted: Modifier.Node
+        )
+
+        fun nodeRemoved(
+            oldIndex: Int,
+            element: Modifier.Element,
+            node: Modifier.Node
+        )
+    }
+
+    /**
+     * This method utilizes a modified Myers Diff Algorithm which will diff the two modifier chains
+     * and execute a minimal number of insertions/deletions. We make no attempt to execute "moves"
+     * as part of this diff. If a modifier moves that is no different than it being inserted in
+     * the new location and removed in the old location.
+     *
+     * @param tail - The Node that corresponds to the _end_ of the [before] list. This Node is
+     * expected to have an up to date [aggregateChildKindSet].
+     */
+    private fun structuralUpdate(
+        before: MutableVector<Modifier.Element>,
+        beforeSize: Int,
+        after: MutableVector<Modifier.Element>,
+        afterSize: Int,
+        tail: Modifier.Node,
+    ) {
+        executeDiff(beforeSize, afterSize, getDiffer(tail, before, after))
+    }
+
+    /**
+     * This method takes [prev] in the current linked list, and swaps it with [next], ensuring that
+     * all the parent/child relationships are maintained.
+     *
+     * For example:
+     *
+     *      Head... -> parent -> prev -> child -> ...Tail
+     *
+     *  gets transformed into a list of the following shape:
+     *
+     *      Head... -> parent -> next -> child -> ...Tail
+     *
+     * @return This method returns the updated [next] node, for convenience
+     */
+    private fun replaceNode(prev: Modifier.Node, next: Modifier.Node): Modifier.Node {
+        val parent = prev.parent
+        if (parent != null) {
+            next.parent = parent
+            parent.child = next
+            prev.parent = null
+        }
+        val child = prev.child
+        if (child != null) {
+            next.child = child
+            child.parent = next
+            prev.child = null
+        }
+        // NOTE: it is important that during a "replace", we keep the same coordinator as before
+        //  as there is a chance that at the end of the diff we won't iterate through the chain and
+        //  update all of the coordinators assuming there were no structural changes detected
+        next.updateCoordinator(prev.coordinator)
+        return next
+    }
+
+    private fun disposeAndRemoveNode(node: Modifier.Node): Modifier.Node {
+        if (node.isAttached) node.detach()
+        return removeNode(node)
+    }
+
+    /**
+     * This removes [node] from the current linked list.
+     * For example:
+     *
+     *      Head... -> parent -> node -> child -> ...Tail
+     *
+     *  gets transformed into a list of the following shape:
+     *
+     *      Head... -> parent -> child -> ...Tail
+     *
+     *  @return The child of the removed [node]
+     */
+    private fun removeNode(node: Modifier.Node): Modifier.Node {
+        val child = node.child
+        val parent = node.parent
+        if (child != null) {
+            child.parent = parent
+            node.child = null
+        }
+        if (parent != null) {
+            parent.child = child
+            node.parent = null
+        }
+        return child!!
+    }
+
+    private fun createAndInsertNodeAsParent(
+        element: Modifier.Element,
+        child: Modifier.Node,
+    ): Modifier.Node {
+        val node = if (element is ModifierNodeElement<*>) {
+            element.create().also {
+                it.kindSet = calculateNodeKindSetFrom(it)
+            }
+        } else {
+            BackwardsCompatNode(element)
+        }
+        return insertParent(node, child)
+    }
+
+    /**
+     * This inserts [node] as the parent of [child] in the current linked list.
+     * For example:
+     *
+     *      Head... -> child -> ...Tail
+     *
+     *  gets transformed into a list of the following shape:
+     *
+     *      Head... -> node -> child -> ...Tail
+     *
+     *  @return The inserted [node]
+     */
+    private fun insertParent(node: Modifier.Node, child: Modifier.Node): Modifier.Node {
+        val theParent = child.parent
+        if (theParent != null) {
+            theParent.child = node
+            node.parent = theParent
+        }
+        child.parent = node
+        node.child = child
+        return node
+    }
+
+    private fun updateNodeAndReplaceIfNeeded(
+        prev: Modifier.Element,
+        next: Modifier.Element,
+        node: Modifier.Node,
+    ): Modifier.Node {
+        if (prev !is ModifierNodeElement<*> || next !is ModifierNodeElement<*>) {
+            check(node is BackwardsCompatNode)
+            node.element = next
+            return node
+        }
+        val updated = next.updateUnsafe(node)
+        val result = if (updated !== node) {
+            // if a new instance is returned, we want to detach the old one
+            node.detach()
+            replaceNode(node, updated)
+        } else {
+            // the node was updated. we are done.
+            updated
+        }
+        return result
+    }
+
+    // TRAVERSAL
+
+    internal inline fun <reified T> firstFromHead(
+        type: NodeKind<T>,
+        block: (T) -> Boolean
+    ): T? {
+        headToTail(type) {
+            if (block(it)) return it
+        }
+        return null
+    }
+
+    internal inline fun <reified T> headToTail(type: NodeKind<T>, block: (T) -> Unit) {
+        headToTail(type.mask) {
+            if (it is T) block(it)
+        }
+    }
+
+    internal inline fun headToTail(mask: Int, block: (Modifier.Node) -> Unit) {
+        if (aggregateChildKindSet and mask == 0) return
+        headToTail {
+            if (it.kindSet and mask != 0) {
+                block(it)
+            }
+            if (it.aggregateChildKindSet and mask == 0) return
+        }
+    }
+
+    /**
+     * Traverses the linked list from head to tail, running [block] on each Node as it goes. If
+     * [block] returns true, it will stop traversing and return true. If [block] returns false,
+     * it will continue.
+     *
+     * @return Returns true if [block] ever returned true, false otherwise.
+     */
+    internal inline fun headToTail(block: (Modifier.Node) -> Unit) {
+        var node: Modifier.Node? = head
+        while (node != null) {
+            block(node)
+            node = node.child
+        }
+    }
+
+    internal inline fun headToTailExclusive(block: (Modifier.Node) -> Unit) {
+        var node: Modifier.Node? = head
+        while (node != null && node !== tail) {
+            block(node)
+            node = node.child
+        }
+    }
+
+    internal inline fun <reified T> tailToHead(type: NodeKind<T>, block: (T) -> Unit) {
+        tailToHead(type.mask) {
+            if (it is T) block(it)
+        }
+    }
+
+    internal inline fun tailToHead(mask: Int, block: (Modifier.Node) -> Unit) {
+        if (aggregateChildKindSet and mask == 0) return
+        tailToHead {
+            if (it.kindSet and mask != 0) {
+                block(it)
+            }
+        }
+    }
+
+    internal inline fun tailToHead(block: (Modifier.Node) -> Unit) {
+        var node: Modifier.Node? = tail
+        while (node != null) {
+            block(node)
+            node = node.parent
+        }
+    }
+
+    internal inline fun <reified T> tail(type: NodeKind<T>): T? {
+        tailToHead(type) {
+            return it
+        }
+        return null
+    }
+
+    internal inline fun <reified T> head(type: NodeKind<T>): T? {
+        headToTail(type) {
+            return it
+        }
+        return null
+    }
+
+    internal fun has(type: NodeKind<*>): Boolean = aggregateChildKindSet and type.mask != 0
+
+    override fun toString(): String = buildString {
+        append("[")
+        if (head === tail) {
+            append("]")
+            return@buildString
+        }
+        headToTailExclusive {
+            append("$it")
+            if (it.child === tail) {
+                append("]")
+                return@buildString
+            }
+            append(",")
+        }
+    }
+}
+
+private const val ActionReplace = 0
+private const val ActionUpdate = 1
+private const val ActionReuse = 2
+
+/**
+ * Here's the rules for reusing nodes for different modifiers:
+ * 1. if modifiers are equals, we REUSE but NOT UPDATE
+ * 2. if modifiers are same class, we REUSE and UPDATE
+ * 3. else REPLACE (NO REUSE, NO UPDATE)
+ */
+internal fun reuseActionForModifiers(prev: Modifier.Element, next: Modifier.Element): Int {
+    return if (prev == next)
+        ActionReuse
+    else if (areObjectsOfSameType(prev, next))
+        ActionUpdate
+    else
+        ActionReplace
+}
+
+private fun <T : Modifier.Node> ModifierNodeElement<T>.updateUnsafe(
+    node: Modifier.Node
+): Modifier.Node {
+    @Suppress("UNCHECKED_CAST")
+    return update(node as T)
+}
+
+private fun Modifier.fillVector(
+    result: MutableVector<Modifier.Element>
+): MutableVector<Modifier.Element> {
+    val stack = MutableVector<Modifier>(result.size).also { it.add(this) }
+    while (stack.isNotEmpty()) {
+        when (val next = stack.removeAt(stack.size - 1)) {
+            is CombinedModifier -> {
+                stack.add(next.inner)
+                stack.add(next.outer)
+            }
+            is Modifier.Element -> result.add(next)
+            // some other androidx.compose.ui.node.Modifier implementation that we don't know about...
+            else -> next.all {
+                result.add(it)
+                true
+            }
+        }
+    }
+    return result
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeCoordinator.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeCoordinator.kt
new file mode 100644
index 0000000..2d7d547
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeCoordinator.kt
@@ -0,0 +1,1352 @@
+/*
+ * 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.
+ */
+@file:OptIn(ExperimentalComposeUiApi::class)
+
+package androidx.compose.ui.node
+
+import androidx.compose.runtime.snapshots.Snapshot
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.MutableRect
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.geometry.isFinite
+import androidx.compose.ui.geometry.toRect
+import androidx.compose.ui.graphics.Canvas
+import androidx.compose.ui.graphics.DefaultCameraDistance
+import androidx.compose.ui.graphics.GraphicsLayerScope
+import androidx.compose.ui.graphics.Matrix
+import androidx.compose.ui.graphics.Paint
+import androidx.compose.ui.graphics.ReusableGraphicsLayerScope
+import androidx.compose.ui.graphics.TransformOrigin
+import androidx.compose.ui.layout.AlignmentLine
+import androidx.compose.ui.layout.LayoutCoordinates
+import androidx.compose.ui.layout.LookaheadLayoutCoordinatesImpl
+import androidx.compose.ui.layout.LookaheadScope
+import androidx.compose.ui.layout.Measurable
+import androidx.compose.ui.layout.MeasureResult
+import androidx.compose.ui.layout.Placeable
+import androidx.compose.ui.layout.findRootCoordinates
+import androidx.compose.ui.layout.positionInRoot
+import androidx.compose.ui.semantics.outerSemantics
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.IntOffset
+import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.minus
+import androidx.compose.ui.unit.plus
+import androidx.compose.ui.unit.toSize
+
+/**
+ * Measurable and Placeable type that has a position.
+ */
+internal abstract class NodeCoordinator(
+    override val layoutNode: LayoutNode,
+) :
+    LookaheadCapablePlaceable(),
+    Measurable,
+    LayoutCoordinates,
+    OwnerScope,
+    (Canvas) -> Unit {
+
+    abstract val tail: Modifier.Node
+
+    internal var wrapped: NodeCoordinator? = null
+    internal var wrappedBy: NodeCoordinator? = null
+
+    override val layoutDirection: LayoutDirection
+        get() = layoutNode.layoutDirection
+
+    override val density: Float
+        get() = layoutNode.density.density
+
+    override val fontScale: Float
+        get() = layoutNode.density.fontScale
+
+    override val parent: LookaheadCapablePlaceable?
+        get() = wrappedBy
+
+    override val coordinates: LayoutCoordinates
+        get() = this
+    private fun headNode(includeTail: Boolean): Modifier.Node? {
+        return if (layoutNode.outerCoordinator === this) {
+            layoutNode.nodes.head
+        } else if (includeTail) {
+            wrappedBy?.tail?.child
+        } else {
+            wrappedBy?.tail
+        }
+    }
+
+    inline fun visitNodes(mask: Int, includeTail: Boolean, block: (Modifier.Node) -> Unit) {
+        val stopNode = if (includeTail) tail else (tail.parent ?: return)
+        var node: Modifier.Node? = headNode(includeTail)
+        while (node != null) {
+            if (node.aggregateChildKindSet and mask == 0) return
+            if (node.kindSet and mask != 0) block(node)
+            if (node === stopNode) break
+            node = node.child
+        }
+    }
+
+    inline fun <reified T> visitNodes(type: NodeKind<T>, block: (T) -> Unit) {
+        visitNodes(type.mask, type.includeSelfInTraversal) {
+            if (it is T) block(it)
+        }
+    }
+
+    fun hasNode(type: NodeKind<*>): Boolean {
+        return headNode(type.includeSelfInTraversal)?.has(type) == true
+    }
+
+    inline fun <reified T> head(type: NodeKind<T>): T? {
+        visitNodes(type.mask, type.includeSelfInTraversal) { return it as? T }
+        return null
+    }
+
+    fun <T> headUnchecked(type: NodeKind<T>): T? {
+        visitNodes(type.mask, type.includeSelfInTraversal) {
+            @Suppress("UNCHECKED_CAST")
+            return it as T
+        }
+        return null
+    }
+
+    // Size exposed to LayoutCoordinates.
+    final override val size: IntSize get() = measuredSize
+
+    private var isClipping: Boolean = false
+
+    protected var layerBlock: (GraphicsLayerScope.() -> Unit)? = null
+        private set
+    private var layerDensity: Density = layoutNode.density
+    private var layerLayoutDirection: LayoutDirection = layoutNode.layoutDirection
+
+    private var lastLayerAlpha: Float = 0.8f
+    fun isTransparent(): Boolean {
+        if (layer != null && lastLayerAlpha <= 0f) return true
+        return this.wrappedBy?.isTransparent() ?: return false
+    }
+
+    override val alignmentLinesOwner: AlignmentLinesOwner
+        get() = layoutNode.layoutDelegate.alignmentLinesOwner
+
+    override val child: LookaheadCapablePlaceable?
+        get() = wrapped
+
+    override fun replace() {
+        placeAt(position, zIndex, layerBlock)
+    }
+
+    override val hasMeasureResult: Boolean
+        get() = _measureResult != null
+
+    override val isAttached: Boolean
+        get() = tail.isAttached
+
+    private var _measureResult: MeasureResult? = null
+    override var measureResult: MeasureResult
+        get() = _measureResult ?: error(UnmeasuredError)
+        internal set(value) {
+            val old = _measureResult
+            if (value !== old) {
+                _measureResult = value
+                if (old == null || value.width != old.width || value.height != old.height) {
+                    onMeasureResultChanged(value.width, value.height)
+                }
+                // We do not simply compare against old.alignmentLines in case this is a
+                // MutableStateMap and the same instance might be passed.
+                if ((!oldAlignmentLines.isNullOrEmpty() || value.alignmentLines.isNotEmpty()) &&
+                    value.alignmentLines != oldAlignmentLines
+                ) {
+                    alignmentLinesOwner.alignmentLines.onAlignmentsChanged()
+
+                    val oldLines = oldAlignmentLines
+                        ?: (mutableMapOf<AlignmentLine, Int>().also { oldAlignmentLines = it })
+                    oldLines.clear()
+                    oldLines.putAll(value.alignmentLines)
+                }
+            }
+        }
+
+    internal var lookaheadDelegate: LookaheadDelegate? = null
+        private set
+
+    private var oldAlignmentLines: MutableMap<AlignmentLine, Int>? = null
+
+    /**
+     * Creates a new lookaheadDelegate instance when the scope changes. If the provided scope is
+     * null, it means the lookahead root does not exit (or no longer exists), set
+     * the [lookaheadDelegate] to null.
+     */
+    internal fun updateLookaheadScope(scope: LookaheadScope?) {
+        lookaheadDelegate = scope?.let {
+            if (it != lookaheadDelegate?.lookaheadScope) {
+                createLookaheadDelegate(it)
+            } else {
+                lookaheadDelegate
+            }
+        }
+    }
+
+    protected fun updateLookaheadDelegate(lookaheadDelegate: LookaheadDelegate) {
+        this.lookaheadDelegate = lookaheadDelegate
+    }
+
+    abstract fun createLookaheadDelegate(scope: LookaheadScope): LookaheadDelegate
+
+    override val providedAlignmentLines: Set<AlignmentLine>
+        get() {
+            var set: MutableSet<AlignmentLine>? = null
+            var coordinator: NodeCoordinator? = this
+            while (coordinator != null) {
+                val alignmentLines = coordinator._measureResult?.alignmentLines
+                if (alignmentLines?.isNotEmpty() == true) {
+                    if (set == null) {
+                        set = mutableSetOf()
+                    }
+                    set.addAll(alignmentLines.keys)
+                }
+                coordinator = coordinator.wrapped
+            }
+            return set ?: emptySet()
+        }
+
+    /**
+     * Called when the width or height of [measureResult] change. The object instance pointed to
+     * by [measureResult] may or may not have changed.
+     */
+    protected open fun onMeasureResultChanged(width: Int, height: Int) {
+        val layer = layer
+        if (layer != null) {
+            layer.resize(IntSize(width, height))
+        } else {
+            wrappedBy?.invalidateLayer()
+        }
+        layoutNode.owner?.onLayoutChange(layoutNode)
+        measuredSize = IntSize(width, height)
+        visitNodes(Nodes.Draw) {
+            it.onMeasureResultChanged()
+        }
+    }
+
+    override var position: IntOffset = IntOffset.Zero
+        protected set
+
+    var zIndex: Float = 0f
+        protected set
+
+    override val parentData: Any?
+        get() {
+            var data: Any? = null
+            val thisNode = tail
+            with(layoutNode.density) {
+                layoutNode.nodes.tailToHead {
+                    if (it === thisNode) return@tailToHead
+                    if (it.isKind(Nodes.ParentData) && it is ParentDataModifierNode) {
+                        data = with(it) { modifyParentData(data) }
+                    }
+                }
+            }
+            return data
+        }
+
+    final override val parentLayoutCoordinates: LayoutCoordinates?
+        get() {
+            check(isAttached) { ExpectAttachedLayoutCoordinates }
+            return layoutNode.outerCoordinator.wrappedBy
+        }
+
+    final override val parentCoordinates: LayoutCoordinates?
+        get() {
+            check(isAttached) { ExpectAttachedLayoutCoordinates }
+            return wrappedBy
+        }
+
+    private var _rectCache: MutableRect? = null
+    protected val rectCache: MutableRect
+        get() = _rectCache ?: MutableRect(0f, 0f, 0f, 0f).also {
+            _rectCache = it
+        }
+
+    private val snapshotObserver get() = layoutNode.requireOwner().snapshotObserver
+
+    /**
+     * The current layer's positional attributes.
+     */
+    private var layerPositionalProperties: LayerPositionalProperties? = null
+
+    protected inline fun performingMeasure(
+        constraints: Constraints,
+        block: () -> Placeable
+    ): Placeable {
+        measurementConstraints = constraints
+        val result = block()
+        layer?.resize(measuredSize)
+        return result
+    }
+
+    fun onMeasured() {
+        if (hasNode(Nodes.LayoutAware)) {
+            Snapshot.withoutReadObservation {
+                visitNodes(Nodes.LayoutAware) {
+                    it.onRemeasured(measuredSize)
+                }
+            }
+        }
+    }
+
+    /**
+     * An initialization function that is called when the [NodeCoordinator] is initially created,
+     * and also called when the [NodeCoordinator] is re-used.
+     */
+    // TODO(lmr): we should try and get rid of this since it isn't always needed!
+    fun onInitialize() {
+        layer?.invalidate()
+    }
+
+    /**
+     * Places the modified child.
+     */
+    /*@CallSuper*/
+    override fun placeAt(
+        position: IntOffset,
+        zIndex: Float,
+        layerBlock: (GraphicsLayerScope.() -> Unit)?
+    ) {
+        onLayerBlockUpdated(layerBlock)
+        if (this.position != position) {
+            this.position = position
+            layoutNode.layoutDelegate.measurePassDelegate
+                .notifyChildrenUsingCoordinatesWhilePlacing()
+            val layer = layer
+            if (layer != null) {
+                layer.move(position)
+            } else {
+                wrappedBy?.invalidateLayer()
+            }
+            invalidateAlignmentLinesFromPositionChange()
+            layoutNode.owner?.onLayoutChange(layoutNode)
+        }
+        this.zIndex = zIndex
+    }
+
+    /**
+     * Draws the content of the LayoutNode
+     */
+    fun draw(canvas: Canvas) {
+        val layer = layer
+        if (layer != null) {
+            layer.drawLayer(canvas)
+        } else {
+            val x = position.x.toFloat()
+            val y = position.y.toFloat()
+            canvas.translate(x, y)
+            drawContainedDrawModifiers(canvas)
+            canvas.translate(-x, -y)
+        }
+    }
+
+    private fun drawContainedDrawModifiers(canvas: Canvas) {
+        val head = head(Nodes.Draw)
+        if (head == null) {
+            performDraw(canvas)
+        } else {
+            val drawScope = layoutNode.mDrawScope
+            drawScope.draw(canvas, size.toSize(), this, head)
+        }
+    }
+
+    open fun performDraw(canvas: Canvas) {
+        wrapped?.draw(canvas)
+    }
+
+    @OptIn(ExperimentalComposeUiApi::class)
+    fun onPlaced() {
+        val lookahead = lookaheadDelegate
+        if (lookahead != null) {
+            visitNodes(Nodes.LayoutAware) {
+                it.onLookaheadPlaced(lookahead.lookaheadLayoutCoordinates)
+            }
+        }
+        visitNodes(Nodes.LayoutAware) {
+            it.onPlaced(this)
+        }
+    }
+
+    // implementation of draw block passed to the OwnedLayer
+    @Suppress("LiftReturnOrAssignment")
+    override fun invoke(canvas: Canvas) {
+        if (layoutNode.isPlaced) {
+            snapshotObserver.observeReads(this, onCommitAffectingLayer) {
+                drawContainedDrawModifiers(canvas)
+            }
+            lastLayerDrawingWasSkipped = false
+        } else {
+            // The invalidation is requested even for nodes which are not placed. As we are not
+            // going to display them we skip the drawing. It is safe to just draw nothing as the
+            // layer will be invalidated again when the node will be finally placed.
+            lastLayerDrawingWasSkipped = true
+        }
+    }
+
+    fun onLayerBlockUpdated(layerBlock: (GraphicsLayerScope.() -> Unit)?) {
+        val layerInvalidated = this.layerBlock !== layerBlock || layerDensity != layoutNode
+            .density || layerLayoutDirection != layoutNode.layoutDirection
+        this.layerBlock = layerBlock
+        this.layerDensity = layoutNode.density
+        this.layerLayoutDirection = layoutNode.layoutDirection
+        if (isAttached && layerBlock != null) {
+            if (layer == null) {
+                layer = layoutNode.requireOwner().createLayer(
+                    this,
+                    invalidateParentLayer
+                ).apply {
+                    resize(measuredSize)
+                    move(position)
+                }
+                updateLayerParameters()
+                layoutNode.innerLayerCoordinatorIsDirty = true
+                invalidateParentLayer()
+            } else if (layerInvalidated) {
+                updateLayerParameters()
+            }
+        } else {
+            layer?.let {
+                it.destroy()
+                layoutNode.innerLayerCoordinatorIsDirty = true
+                invalidateParentLayer()
+                if (isAttached) {
+                    layoutNode.owner?.onLayoutChange(layoutNode)
+                }
+            }
+            layer = null
+            lastLayerDrawingWasSkipped = false
+        }
+    }
+
+    private fun updateLayerParameters() {
+        val layer = layer
+        if (layer != null) {
+            val layerBlock = requireNotNull(layerBlock)
+            graphicsLayerScope.reset()
+            graphicsLayerScope.graphicsDensity = layoutNode.density
+            snapshotObserver.observeReads(this, onCommitAffectingLayerParams) {
+                layerBlock.invoke(graphicsLayerScope)
+            }
+            val layerPositionalProperties = layerPositionalProperties
+                ?: LayerPositionalProperties().also { layerPositionalProperties = it }
+            layerPositionalProperties.copyFrom(graphicsLayerScope)
+            layer.updateLayerProperties(
+                scaleX = graphicsLayerScope.scaleX,
+                scaleY = graphicsLayerScope.scaleY,
+                alpha = graphicsLayerScope.alpha,
+                translationX = graphicsLayerScope.translationX,
+                translationY = graphicsLayerScope.translationY,
+                shadowElevation = graphicsLayerScope.shadowElevation,
+                ambientShadowColor = graphicsLayerScope.ambientShadowColor,
+                spotShadowColor = graphicsLayerScope.spotShadowColor,
+                rotationX = graphicsLayerScope.rotationX,
+                rotationY = graphicsLayerScope.rotationY,
+                rotationZ = graphicsLayerScope.rotationZ,
+                cameraDistance = graphicsLayerScope.cameraDistance,
+                transformOrigin = graphicsLayerScope.transformOrigin,
+                shape = graphicsLayerScope.shape,
+                clip = graphicsLayerScope.clip,
+                renderEffect = graphicsLayerScope.renderEffect,
+                layoutDirection = layoutNode.layoutDirection,
+                density = layoutNode.density
+            )
+            isClipping = graphicsLayerScope.clip
+        } else {
+            require(layerBlock == null)
+        }
+        lastLayerAlpha = graphicsLayerScope.alpha
+        layoutNode.owner?.onLayoutChange(layoutNode)
+    }
+
+    private val invalidateParentLayer: () -> Unit = {
+        wrappedBy?.invalidateLayer()
+    }
+
+    /**
+     * True when the last drawing of this layer didn't draw the real content as the LayoutNode
+     * containing this layer was not placed by the parent.
+     */
+    internal var lastLayerDrawingWasSkipped = false
+        private set
+
+    var layer: OwnedLayer? = null
+        private set
+
+    override val isValid: Boolean
+        get() = layer != null && isAttached
+
+    val minimumTouchTargetSize: Size
+        get() = with(layerDensity) { layoutNode.viewConfiguration.minimumTouchTargetSize.toSize() }
+
+    /**
+     * Executes a hit test for this [NodeCoordinator].
+     *
+     * @param hitTestSource The hit test specifics for pointer input or semantics
+     * @param pointerPosition The tested pointer position, which is relative to
+     * the [NodeCoordinator].
+     * @param hitTestResult The parent [HitTestResult] that any hit should be added to.
+     * @param isTouchEvent `true` if this is from a touch source. Touch sources allow for
+     * minimum touch target. Semantics hit tests always treat hits as needing minimum touch target.
+     * @param isInLayer `true` if the touch event is in the layer of this and all parents or `false`
+     * if it is outside the layer, but within the minimum touch target of the edge of the layer.
+     * This can only be `false` when [isTouchEvent] is `true` or else a layer miss means the event
+     * will be clipped out.
+     */
+    fun <T : DelegatableNode> hitTest(
+        hitTestSource: HitTestSource<T>,
+        pointerPosition: Offset,
+        hitTestResult: HitTestResult<T>,
+        isTouchEvent: Boolean,
+        isInLayer: Boolean
+    ) {
+        val head = headUnchecked(hitTestSource.entityType())
+        if (!withinLayerBounds(pointerPosition)) {
+            // This missed the clip, but if this layout is too small and this is within the
+            // minimum touch target, we still consider it a hit.
+            if (isTouchEvent) {
+                val distanceFromEdge =
+                    distanceInMinimumTouchTarget(pointerPosition, minimumTouchTargetSize)
+                if (distanceFromEdge.isFinite() &&
+                    hitTestResult.isHitInMinimumTouchTargetBetter(distanceFromEdge, false)
+                ) {
+                    head.hitNear(
+                        hitTestSource,
+                        pointerPosition,
+                        hitTestResult,
+                        isTouchEvent,
+                        false,
+                        distanceFromEdge
+                    )
+                } // else it is a complete miss.
+            }
+        } else if (head == null) {
+            hitTestChild(hitTestSource, pointerPosition, hitTestResult, isTouchEvent, isInLayer)
+        } else if (isPointerInBounds(pointerPosition)) {
+            // A real hit
+            head.hit(
+                hitTestSource,
+                pointerPosition,
+                hitTestResult,
+                isTouchEvent,
+                isInLayer
+            )
+        } else {
+            val distanceFromEdge = if (!isTouchEvent) Float.POSITIVE_INFINITY else {
+                distanceInMinimumTouchTarget(pointerPosition, minimumTouchTargetSize)
+            }
+
+            if (distanceFromEdge.isFinite() &&
+                hitTestResult.isHitInMinimumTouchTargetBetter(distanceFromEdge, isInLayer)
+            ) {
+                // Hit closer than existing handlers, so just record it
+                head.hitNear(
+                    hitTestSource,
+                    pointerPosition,
+                    hitTestResult,
+                    isTouchEvent,
+                    isInLayer,
+                    distanceFromEdge
+                )
+            } else {
+                head.speculativeHit(
+                    hitTestSource,
+                    pointerPosition,
+                    hitTestResult,
+                    isTouchEvent,
+                    isInLayer,
+                    distanceFromEdge
+                )
+            }
+        }
+    }
+
+    /**
+     * The [NodeCoordinator] had a hit in bounds and can record any children in the
+     * [hitTestResult].
+     */
+    private fun <T : DelegatableNode> T?.hit(
+        hitTestSource: HitTestSource<T>,
+        pointerPosition: Offset,
+        hitTestResult: HitTestResult<T>,
+        isTouchEvent: Boolean,
+        isInLayer: Boolean
+    ) {
+        if (this == null) {
+            hitTestChild(hitTestSource, pointerPosition, hitTestResult, isTouchEvent, isInLayer)
+        } else {
+            hitTestResult.hit(this, isInLayer) {
+                nextUncheckedUntil(hitTestSource.entityType(), Nodes.Layout)
+                    .hit(hitTestSource, pointerPosition, hitTestResult, isTouchEvent, isInLayer)
+            }
+        }
+    }
+
+    /**
+     * The [NodeCoordinator] had a hit [distanceFromEdge] from the bounds and it is within
+     * the minimum touch target distance, so it should be recorded as such in the [hitTestResult].
+     */
+    private fun <T : DelegatableNode> T?.hitNear(
+        hitTestSource: HitTestSource<T>,
+        pointerPosition: Offset,
+        hitTestResult: HitTestResult<T>,
+        isTouchEvent: Boolean,
+        isInLayer: Boolean,
+        distanceFromEdge: Float
+    ) {
+        if (this == null) {
+            hitTestChild(hitTestSource, pointerPosition, hitTestResult, isTouchEvent, isInLayer)
+        } else {
+            // Hit closer than existing handlers, so just record it
+            hitTestResult.hitInMinimumTouchTarget(
+                this,
+                distanceFromEdge,
+                isInLayer
+            ) {
+                nextUncheckedUntil(hitTestSource.entityType(), Nodes.Layout).hitNear(
+                    hitTestSource,
+                    pointerPosition,
+                    hitTestResult,
+                    isTouchEvent,
+                    isInLayer,
+                    distanceFromEdge
+                )
+            }
+        }
+    }
+
+    /**
+     * The [NodeCoordinator] had a miss, but it hasn't been clipped out. The child must be
+     * checked to see if it hit.
+     */
+    private fun <T : DelegatableNode> T?.speculativeHit(
+        hitTestSource: HitTestSource<T>,
+        pointerPosition: Offset,
+        hitTestResult: HitTestResult<T>,
+        isTouchEvent: Boolean,
+        isInLayer: Boolean,
+        distanceFromEdge: Float
+    ) {
+        if (this == null) {
+            hitTestChild(hitTestSource, pointerPosition, hitTestResult, isTouchEvent, isInLayer)
+        } else if (hitTestSource.interceptOutOfBoundsChildEvents(this)) {
+            // We only want to replace the existing touch target if there are better
+            // hits in the children
+            hitTestResult.speculativeHit(
+                this,
+                distanceFromEdge,
+                isInLayer
+            ) {
+                nextUncheckedUntil(hitTestSource.entityType(), Nodes.Layout).speculativeHit(
+                    hitTestSource,
+                    pointerPosition,
+                    hitTestResult,
+                    isTouchEvent,
+                    isInLayer,
+                    distanceFromEdge
+                )
+            }
+        } else {
+            nextUncheckedUntil(hitTestSource.entityType(), Nodes.Layout).speculativeHit(
+                hitTestSource,
+                pointerPosition,
+                hitTestResult,
+                isTouchEvent,
+                isInLayer,
+                distanceFromEdge
+            )
+        }
+    }
+
+    /**
+     * Do a [hitTest] on the children of this [NodeCoordinator].
+     */
+    open fun <T : DelegatableNode> hitTestChild(
+        hitTestSource: HitTestSource<T>,
+        pointerPosition: Offset,
+        hitTestResult: HitTestResult<T>,
+        isTouchEvent: Boolean,
+        isInLayer: Boolean
+    ) {
+        // Also, keep looking to see if we also might hit any children.
+        // This avoids checking layer bounds twice as when we call super.hitTest()
+        val wrapped = wrapped
+        if (wrapped != null) {
+            val positionInWrapped = wrapped.fromParentPosition(pointerPosition)
+            wrapped.hitTest(
+                hitTestSource,
+                positionInWrapped,
+                hitTestResult,
+                isTouchEvent,
+                isInLayer
+            )
+        }
+    }
+
+    /**
+     * Returns the bounds of this [NodeCoordinator], including the minimum touch target.
+     */
+    fun touchBoundsInRoot(): Rect {
+        if (!isAttached) {
+            return Rect.Zero
+        }
+
+        val root = findRootCoordinates()
+
+        val bounds = rectCache
+        val padding = calculateMinimumTouchTargetPadding(minimumTouchTargetSize)
+        bounds.left = -padding.width
+        bounds.top = -padding.height
+        bounds.right = measuredWidth + padding.width
+        bounds.bottom = measuredHeight + padding.height
+
+        var coordinator: NodeCoordinator = this
+        while (coordinator !== root) {
+            coordinator.rectInParent(
+                bounds,
+                clipBounds = false,
+                clipToMinimumTouchTargetSize = true
+            )
+            if (bounds.isEmpty) {
+                return Rect.Zero
+            }
+
+            coordinator = coordinator.wrappedBy!!
+        }
+        return bounds.toRect()
+    }
+
+    override fun windowToLocal(relativeToWindow: Offset): Offset {
+        check(isAttached) { ExpectAttachedLayoutCoordinates }
+        val root = findRootCoordinates()
+        val positionInRoot = layoutNode.requireOwner()
+            .calculateLocalPosition(relativeToWindow) - root.positionInRoot()
+        return localPositionOf(root, positionInRoot)
+    }
+
+    override fun localToWindow(relativeToLocal: Offset): Offset {
+        val positionInRoot = localToRoot(relativeToLocal)
+        val owner = layoutNode.requireOwner()
+        return owner.calculatePositionInWindow(positionInRoot)
+    }
+
+    private fun LayoutCoordinates.toCoordinator() =
+        (this as? LookaheadLayoutCoordinatesImpl)?.coordinator ?: this as NodeCoordinator
+
+    override fun localPositionOf(
+        sourceCoordinates: LayoutCoordinates,
+        relativeToSource: Offset
+    ): Offset {
+        val nodeCoordinator = sourceCoordinates.toCoordinator()
+        val commonAncestor = findCommonAncestor(nodeCoordinator)
+
+        var position = relativeToSource
+        var coordinator = nodeCoordinator
+        while (coordinator !== commonAncestor) {
+            position = coordinator.toParentPosition(position)
+            coordinator = coordinator.wrappedBy!!
+        }
+
+        return ancestorToLocal(commonAncestor, position)
+    }
+
+    override fun transformFrom(sourceCoordinates: LayoutCoordinates, matrix: Matrix) {
+        val coordinator = sourceCoordinates.toCoordinator()
+        val commonAncestor = findCommonAncestor(coordinator)
+
+        matrix.reset()
+        // Transform from the source to the common ancestor
+        coordinator.transformToAncestor(commonAncestor, matrix)
+        // Transform from the common ancestor to this
+        transformFromAncestor(commonAncestor, matrix)
+    }
+
+    private fun transformToAncestor(ancestor: NodeCoordinator, matrix: Matrix) {
+        var wrapper = this
+        while (wrapper != ancestor) {
+            wrapper.layer?.transform(matrix)
+            val position = wrapper.position
+            if (position != IntOffset.Zero) {
+                tmpMatrix.reset()
+                tmpMatrix.translate(position.x.toFloat(), position.y.toFloat())
+                matrix.timesAssign(tmpMatrix)
+            }
+            wrapper = wrapper.wrappedBy!!
+        }
+    }
+
+    private fun transformFromAncestor(ancestor: NodeCoordinator, matrix: Matrix) {
+        if (ancestor != this) {
+            wrappedBy!!.transformFromAncestor(ancestor, matrix)
+            if (position != IntOffset.Zero) {
+                tmpMatrix.reset()
+                tmpMatrix.translate(-position.x.toFloat(), -position.y.toFloat())
+                matrix.timesAssign(tmpMatrix)
+            }
+            layer?.inverseTransform(matrix)
+        }
+    }
+
+    override fun localBoundingBoxOf(
+        sourceCoordinates: LayoutCoordinates,
+        clipBounds: Boolean
+    ): Rect {
+        check(isAttached) { ExpectAttachedLayoutCoordinates }
+        check(sourceCoordinates.isAttached) {
+            "LayoutCoordinates $sourceCoordinates is not attached!"
+        }
+        val srcCoordinator = sourceCoordinates.toCoordinator()
+        val commonAncestor = findCommonAncestor(srcCoordinator)
+
+        val bounds = rectCache
+        bounds.left = 0f
+        bounds.top = 0f
+        bounds.right = sourceCoordinates.size.width.toFloat()
+        bounds.bottom = sourceCoordinates.size.height.toFloat()
+
+        var coordinator = srcCoordinator
+        while (coordinator !== commonAncestor) {
+            coordinator.rectInParent(bounds, clipBounds)
+            if (bounds.isEmpty) {
+                return Rect.Zero
+            }
+
+            coordinator = coordinator.wrappedBy!!
+        }
+
+        ancestorToLocal(commonAncestor, bounds, clipBounds)
+        return bounds.toRect()
+    }
+
+    private fun ancestorToLocal(ancestor: NodeCoordinator, offset: Offset): Offset {
+        if (ancestor === this) {
+            return offset
+        }
+        val wrappedBy = wrappedBy
+        if (wrappedBy == null || ancestor == wrappedBy) {
+            return fromParentPosition(offset)
+        }
+        return fromParentPosition(wrappedBy.ancestorToLocal(ancestor, offset))
+    }
+
+    private fun ancestorToLocal(
+        ancestor: NodeCoordinator,
+        rect: MutableRect,
+        clipBounds: Boolean
+    ) {
+        if (ancestor === this) {
+            return
+        }
+        wrappedBy?.ancestorToLocal(ancestor, rect, clipBounds)
+        return fromParentRect(rect, clipBounds)
+    }
+
+    override fun localToRoot(relativeToLocal: Offset): Offset {
+        check(isAttached) { ExpectAttachedLayoutCoordinates }
+        var coordinator: NodeCoordinator? = this
+        var position = relativeToLocal
+        while (coordinator != null) {
+            position = coordinator.toParentPosition(position)
+            coordinator = coordinator.wrappedBy
+        }
+        return position
+    }
+
+    protected inline fun withPositionTranslation(canvas: Canvas, block: (Canvas) -> Unit) {
+        val x = position.x.toFloat()
+        val y = position.y.toFloat()
+        canvas.translate(x, y)
+        block(canvas)
+        canvas.translate(-x, -y)
+    }
+
+    /**
+     * Converts [position] in the local coordinate system to a [Offset] in the
+     * [parentLayoutCoordinates] coordinate system.
+     */
+    open fun toParentPosition(position: Offset): Offset {
+        val layer = layer
+        val targetPosition = layer?.mapOffset(position, inverse = false) ?: position
+        return targetPosition + this.position
+    }
+
+    /**
+     * Converts [position] in the [parentLayoutCoordinates] coordinate system to a [Offset] in the
+     * local coordinate system.
+     */
+    open fun fromParentPosition(position: Offset): Offset {
+        val relativeToPosition = position - this.position
+        val layer = layer
+        return layer?.mapOffset(relativeToPosition, inverse = true)
+            ?: relativeToPosition
+    }
+
+    protected fun drawBorder(canvas: Canvas, paint: Paint) {
+        val rect = Rect(
+            left = 0.5f,
+            top = 0.5f,
+            right = measuredSize.width.toFloat() - 0.5f,
+            bottom = measuredSize.height.toFloat() - 0.5f
+        )
+        canvas.drawRect(rect, paint)
+    }
+
+    /**
+     * Attaches the [NodeCoordinator] and its wrapped [NodeCoordinator] to an active
+     * LayoutNode.
+     *
+     * This will be called when the [LayoutNode] associated with this [NodeCoordinator] is
+     * attached to the [Owner].
+     *
+     * It is also called whenever the modifier chain is replaced and the [NodeCoordinator]s are
+     * recreated.
+     */
+    open fun attach() {
+        onLayerBlockUpdated(layerBlock)
+    }
+
+    /**
+     * Detaches the [NodeCoordinator] and its wrapped [NodeCoordinator] from an active
+     * LayoutNode.
+     *
+     * This will be called when the [LayoutNode] associated with this [NodeCoordinator] is
+     * detached from the [Owner].
+     *
+     * It is also called whenever the modifier chain is replaced and the [NodeCoordinator]s are
+     * recreated.
+     */
+    open fun detach() {
+        onLayerBlockUpdated(layerBlock)
+        // The layer has been removed and we need to invalidate the containing layer. We've lost
+        // which layer contained this one, but all layers in this modifier chain will be invalidated
+        // in onModifierChanged(). Therefore the only possible layer that won't automatically be
+        // invalidated is the parent's layer. We'll invalidate it here:
+        layoutNode.parent?.invalidateLayer()
+    }
+
+    /**
+     * Modifies bounds to be in the parent NodeCoordinator's coordinates, including clipping,
+     * if [clipBounds] is true. If [clipToMinimumTouchTargetSize] is true and the layer clips,
+     * then the clip bounds are extended to allow minimum touch target extended area.
+     */
+    internal fun rectInParent(
+        bounds: MutableRect,
+        clipBounds: Boolean,
+        clipToMinimumTouchTargetSize: Boolean = false
+    ) {
+        val layer = layer
+        if (layer != null) {
+            if (isClipping) {
+                if (clipToMinimumTouchTargetSize) {
+                    val minTouch = minimumTouchTargetSize
+                    val horz = minTouch.width / 2f
+                    val vert = minTouch.height / 2f
+                    bounds.intersect(
+                        -horz, -vert, size.width.toFloat() + horz, size.height.toFloat() + vert
+                    )
+                } else if (clipBounds) {
+                    bounds.intersect(0f, 0f, size.width.toFloat(), size.height.toFloat())
+                }
+                if (bounds.isEmpty) {
+                    return
+                }
+            }
+            layer.mapBounds(bounds, inverse = false)
+        }
+
+        val x = position.x
+        bounds.left += x
+        bounds.right += x
+
+        val y = position.y
+        bounds.top += y
+        bounds.bottom += y
+    }
+
+    /**
+     * Modifies bounds in the parent's coordinates to be in this NodeCoordinator's
+     * coordinates, including clipping, if [clipBounds] is true.
+     */
+    private fun fromParentRect(bounds: MutableRect, clipBounds: Boolean) {
+        val x = position.x
+        bounds.left -= x
+        bounds.right -= x
+
+        val y = position.y
+        bounds.top -= y
+        bounds.bottom -= y
+
+        val layer = layer
+        if (layer != null) {
+            layer.mapBounds(bounds, inverse = true)
+            if (isClipping && clipBounds) {
+                bounds.intersect(0f, 0f, size.width.toFloat(), size.height.toFloat())
+                if (bounds.isEmpty) {
+                    return
+                }
+            }
+        }
+    }
+
+    protected fun withinLayerBounds(pointerPosition: Offset): Boolean {
+        if (!pointerPosition.isFinite) {
+            return false
+        }
+        val layer = layer
+        return layer == null || !isClipping || layer.isInLayer(pointerPosition)
+    }
+
+    /**
+     * Whether a pointer that is relative to the [NodeCoordinator] is in the bounds of this
+     * NodeCoordinator.
+     */
+    protected fun isPointerInBounds(pointerPosition: Offset): Boolean {
+        val x = pointerPosition.x
+        val y = pointerPosition.y
+        return x >= 0f && y >= 0f && x < measuredWidth && y < measuredHeight
+    }
+
+    /**
+     * Invalidates the layer that this coordinator will draw into.
+     */
+    open fun invalidateLayer() {
+        val layer = layer
+        if (layer != null) {
+            layer.invalidate()
+        } else {
+            wrappedBy?.invalidateLayer()
+        }
+    }
+
+    /**
+     * Send a request to bring a portion of this item into view. The portion that has to be
+     * brought into view is specified as a rectangle where the coordinates are in the local
+     * coordinates of that nodeCoordinator. This request is sent up the hierarchy to all parents
+     * that have a [RelocationModifier][androidx.compose.ui.layout.RelocationModifier].
+     */
+    open suspend fun propagateRelocationRequest(rect: Rect) {
+        val parent = wrappedBy ?: return
+
+        // Translate this nodeCoordinator to the coordinate system of the parent.
+        val boundingBoxInParentCoordinates = parent.localBoundingBoxOf(this, false)
+
+        // Translate the rect to parent coordinates
+        val rectInParentBounds = rect.translate(boundingBoxInParentCoordinates.topLeft)
+
+        parent.propagateRelocationRequest(rectInParentBounds)
+    }
+
+    /**
+     * Called when [LayoutNode.modifier] has changed and all the NodeCoordinators have been
+     * configured.
+     */
+    open fun onLayoutModifierNodeChanged() {
+        layer?.invalidate()
+    }
+
+    internal fun findCommonAncestor(other: NodeCoordinator): NodeCoordinator {
+        var ancestor1 = other.layoutNode
+        var ancestor2 = layoutNode
+        if (ancestor1 === ancestor2) {
+            val otherNode = other.tail
+            // They are on the same node, but we don't know which is the deeper of the two
+            tail.visitLocalParents(Nodes.Layout.mask) {
+                if (it === otherNode) return other
+            }
+            return this
+        }
+
+        while (ancestor1.depth > ancestor2.depth) {
+            ancestor1 = ancestor1.parent!!
+        }
+
+        while (ancestor2.depth > ancestor1.depth) {
+            ancestor2 = ancestor2.parent!!
+        }
+
+        while (ancestor1 !== ancestor2) {
+            val parent1 = ancestor1.parent
+            val parent2 = ancestor2.parent
+            if (parent1 == null || parent2 == null) {
+                throw IllegalArgumentException("layouts are not part of the same hierarchy")
+            }
+            ancestor1 = parent1
+            ancestor2 = parent2
+        }
+
+        return when {
+            ancestor2 === layoutNode -> this
+            ancestor1 === other.layoutNode -> other
+            else -> ancestor1.innerCoordinator
+        }
+    }
+
+    fun shouldSharePointerInputWithSiblings(): Boolean {
+        val start = headNode(Nodes.PointerInput.includeSelfInTraversal) ?: return false
+        start.visitLocalChildren(Nodes.PointerInput) {
+            if (it.sharePointerInputWithSiblings()) return true
+        }
+        return false
+    }
+
+    private fun offsetFromEdge(pointerPosition: Offset): Offset {
+        val x = pointerPosition.x
+        val horizontal = maxOf(0f, if (x < 0) -x else x - measuredWidth)
+        val y = pointerPosition.y
+        val vertical = maxOf(0f, if (y < 0) -y else y - measuredHeight)
+
+        return Offset(horizontal, vertical)
+    }
+
+    /**
+     * Returns the additional amount on the horizontal and vertical dimensions that
+     * this extends beyond [width] and [height] on all sides. This takes into account
+     * [minimumTouchTargetSize] and [measuredSize] vs. [width] and [height].
+     */
+    protected fun calculateMinimumTouchTargetPadding(minimumTouchTargetSize: Size): Size {
+        val widthDiff = minimumTouchTargetSize.width - measuredWidth.toFloat()
+        val heightDiff = minimumTouchTargetSize.height - measuredHeight.toFloat()
+        return Size(maxOf(0f, widthDiff / 2f), maxOf(0f, heightDiff / 2f))
+    }
+
+    /**
+     * The distance within the [minimumTouchTargetSize] of [pointerPosition] to the layout
+     * size. If [pointerPosition] isn't within [minimumTouchTargetSize], then
+     * [Float.POSITIVE_INFINITY] is returned.
+     */
+    protected fun distanceInMinimumTouchTarget(
+        pointerPosition: Offset,
+        minimumTouchTargetSize: Size
+    ): Float {
+        if (measuredWidth >= minimumTouchTargetSize.width &&
+            measuredHeight >= minimumTouchTargetSize.height
+        ) {
+            // this layout is big enough that it doesn't qualify for minimum touch targets
+            return Float.POSITIVE_INFINITY
+        }
+
+        val (width, height) = calculateMinimumTouchTargetPadding(minimumTouchTargetSize)
+        val offsetFromEdge = offsetFromEdge(pointerPosition)
+
+        return if ((width > 0f || height > 0f) &&
+            offsetFromEdge.x <= width && offsetFromEdge.y <= height
+        ) {
+            offsetFromEdge.getDistanceSquared()
+        } else {
+            Float.POSITIVE_INFINITY // miss
+        }
+    }
+
+    /**
+     * [LayoutNode.hitTest] and [LayoutNode.hitTestSemantics] are very similar, but the data
+     * used in their implementations are different. This extracts the differences between the
+     * two methods into a single interface.
+     */
+    internal interface HitTestSource<N : DelegatableNode> {
+        /**
+         * Returns the [NodeKind] for the hit test target.
+         */
+        fun entityType(): NodeKind<N>
+
+        /**
+         * Pointer input hit tests can intercept child hits when enabled. This returns `true`
+         * if the modifier has requested intercepting.
+         */
+        fun interceptOutOfBoundsChildEvents(node: N): Boolean
+
+        /**
+         * Returns false if the parent layout node has a state that suppresses
+         * hit testing of its children.
+         */
+        fun shouldHitTestChildren(parentLayoutNode: LayoutNode): Boolean
+
+        /**
+         * Calls a hit test on [layoutNode].
+         */
+        fun childHitTest(
+            layoutNode: LayoutNode,
+            pointerPosition: Offset,
+            hitTestResult: HitTestResult<N>,
+            isTouchEvent: Boolean,
+            isInLayer: Boolean
+        )
+    }
+
+    internal companion object {
+        const val ExpectAttachedLayoutCoordinates = "LayoutCoordinate operations are only valid " +
+            "when isAttached is true"
+        const val UnmeasuredError = "Asking for measurement result of unmeasured layout modifier"
+        private val onCommitAffectingLayerParams: (NodeCoordinator) -> Unit = { coordinator ->
+            if (coordinator.isValid) {
+                // coordinator.layerPositionalProperties should always be non-null here, but
+                // we'll just be careful with a null check.
+                val layerPositionalProperties = coordinator.layerPositionalProperties
+                if (layerPositionalProperties == null) {
+                    coordinator.updateLayerParameters()
+                } else {
+                    tmpLayerPositionalProperties.copyFrom(layerPositionalProperties)
+                    coordinator.updateLayerParameters()
+                    if (!tmpLayerPositionalProperties.hasSameValuesAs(layerPositionalProperties)) {
+                        val layoutNode = coordinator.layoutNode
+                        val layoutDelegate = layoutNode.layoutDelegate
+                        if (layoutDelegate.childrenAccessingCoordinatesDuringPlacement > 0) {
+                            if (layoutDelegate.coordinatesAccessedDuringPlacement) {
+                                layoutNode.requestRelayout()
+                            }
+                            layoutDelegate.measurePassDelegate
+                                .notifyChildrenUsingCoordinatesWhilePlacing()
+                        }
+                        layoutNode.owner?.requestOnPositionedCallback(layoutNode)
+                    }
+                }
+            }
+        }
+        private val onCommitAffectingLayer: (NodeCoordinator) -> Unit = { coordinator ->
+            coordinator.layer?.invalidate()
+        }
+        private val graphicsLayerScope = ReusableGraphicsLayerScope()
+        private val tmpLayerPositionalProperties = LayerPositionalProperties()
+
+        // Used for matrix calculations. It should not be used for anything that could lead to
+        // reentrancy.
+        private val tmpMatrix = Matrix()
+
+        /**
+         * Hit testing specifics for pointer input.
+         */
+        @OptIn(ExperimentalComposeUiApi::class)
+        val PointerInputSource =
+            object : HitTestSource<PointerInputModifierNode> {
+                override fun entityType() = Nodes.PointerInput
+
+                override fun interceptOutOfBoundsChildEvents(node: PointerInputModifierNode) =
+                    node.interceptOutOfBoundsChildEvents()
+
+                override fun shouldHitTestChildren(parentLayoutNode: LayoutNode) = true
+
+                override fun childHitTest(
+                    layoutNode: LayoutNode,
+                    pointerPosition: Offset,
+                    hitTestResult: HitTestResult<PointerInputModifierNode>,
+                    isTouchEvent: Boolean,
+                    isInLayer: Boolean
+                ) = layoutNode.hitTest(pointerPosition, hitTestResult, isTouchEvent, isInLayer)
+            }
+
+        /**
+         * Hit testing specifics for semantics.
+         */
+        val SemanticsSource =
+            object : HitTestSource<SemanticsModifierNode> {
+                override fun entityType() = Nodes.Semantics
+
+                override fun interceptOutOfBoundsChildEvents(node: SemanticsModifierNode) = false
+
+                override fun shouldHitTestChildren(parentLayoutNode: LayoutNode) =
+                    parentLayoutNode.outerSemantics?.collapsedSemanticsConfiguration()
+                        ?.isClearingSemantics != true
+
+                override fun childHitTest(
+                    layoutNode: LayoutNode,
+                    pointerPosition: Offset,
+                    hitTestResult: HitTestResult<SemanticsModifierNode>,
+                    isTouchEvent: Boolean,
+                    isInLayer: Boolean
+                ) = layoutNode.hitTestSemantics(
+                    pointerPosition,
+                    hitTestResult,
+                    isTouchEvent,
+                    isInLayer
+                )
+            }
+    }
+}
+
+/**
+ * These are the components of a layer that changes the position and may lead
+ * to an OnGloballyPositionedCallback.
+ */
+private class LayerPositionalProperties {
+    private var scaleX: Float = 1f
+    private var scaleY: Float = 1f
+    private var translationX: Float = 0f
+    private var translationY: Float = 0f
+    private var rotationX: Float = 0f
+    private var rotationY: Float = 0f
+    private var rotationZ: Float = 0f
+    private var cameraDistance: Float = DefaultCameraDistance
+    private var transformOrigin: TransformOrigin = TransformOrigin.Center
+
+    fun copyFrom(other: LayerPositionalProperties) {
+        scaleX = other.scaleX
+        scaleY = other.scaleY
+        translationX = other.translationX
+        translationY = other.translationY
+        rotationX = other.rotationX
+        rotationY = other.rotationY
+        rotationZ = other.rotationZ
+        cameraDistance = other.cameraDistance
+        transformOrigin = other.transformOrigin
+    }
+
+    fun copyFrom(scope: GraphicsLayerScope) {
+        scaleX = scope.scaleX
+        scaleY = scope.scaleY
+        translationX = scope.translationX
+        translationY = scope.translationY
+        rotationX = scope.rotationX
+        rotationY = scope.rotationY
+        rotationZ = scope.rotationZ
+        cameraDistance = scope.cameraDistance
+        transformOrigin = scope.transformOrigin
+    }
+
+    fun hasSameValuesAs(other: LayerPositionalProperties): Boolean {
+        return scaleX == other.scaleX &&
+            scaleY == other.scaleY &&
+            translationX == other.translationX &&
+            translationY == other.translationY &&
+            rotationX == other.rotationX &&
+            rotationY == other.rotationY &&
+            rotationZ == other.rotationZ &&
+            cameraDistance == other.cameraDistance &&
+            transformOrigin == other.transformOrigin
+    }
+}
+
+private fun <T> DelegatableNode.nextUncheckedUntil(type: NodeKind<T>, stopType: NodeKind<*>): T? {
+    val child = node.child ?: return null
+    if (child.aggregateChildKindSet and type.mask == 0) return null
+    var next: Modifier.Node? = child
+    while (next != null) {
+        val kindSet = next.kindSet
+        if (kindSet and stopType.mask != 0) return null
+        if (kindSet and type.mask != 0) {
+            @Suppress("UNCHECKED_CAST")
+            return next as? T
+        }
+        next = next.child
+    }
+    return null
+}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeKind.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeKind.kt
new file mode 100644
index 0000000..7a0e7b3
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeKind.kt
@@ -0,0 +1,145 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("DEPRECATION")
+
+package androidx.compose.ui.node
+
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.DrawModifier
+import androidx.compose.ui.focus.FocusOrderModifier
+import androidx.compose.ui.input.pointer.PointerInputModifier
+import androidx.compose.ui.layout.IntermediateLayoutModifier
+import androidx.compose.ui.layout.LayoutModifier
+import androidx.compose.ui.layout.LookaheadOnPlacedModifier
+import androidx.compose.ui.layout.OnGloballyPositionedModifier
+import androidx.compose.ui.layout.OnPlacedModifier
+import androidx.compose.ui.layout.OnRemeasuredModifier
+import androidx.compose.ui.layout.ParentDataModifier
+import androidx.compose.ui.modifier.ModifierLocalConsumer
+import androidx.compose.ui.modifier.ModifierLocalNode
+import androidx.compose.ui.modifier.ModifierLocalProvider
+import androidx.compose.ui.semantics.SemanticsModifier
+
+@JvmInline
+internal value class NodeKind<T>(val mask: Int) {
+    infix fun or(other: NodeKind<*>): Int = mask or other.mask
+    infix fun or(other: Int): Int = mask or other
+}
+internal infix fun Int.or(other: NodeKind<*>): Int = this or other.mask
+
+// For a given NodeCoordinator, the "LayoutAware" nodes that it is concerned with should include
+// its own measureNode if the measureNode happens to implement LayoutAware. If the measureNode
+// implements any other node interfaces, such as draw, those should be visited by the coordinator
+// below them.
+@OptIn(ExperimentalComposeUiApi::class)
+internal val NodeKind<*>.includeSelfInTraversal: Boolean get() {
+    return mask and Nodes.LayoutAware.mask != 0
+}
+
+// Note that these don't inherit from Modifier.Node to allow for a single Modifier.Node
+// instance to implement multiple Node interfaces
+
+@OptIn(ExperimentalComposeUiApi::class)
+internal object Nodes {
+    val Layout = NodeKind<LayoutModifierNode>(0b1 shl 0)
+    val Draw = NodeKind<DrawModifierNode>(0b1 shl 1)
+    val Semantics = NodeKind<SemanticsModifierNode>(0b1 shl 2)
+    val PointerInput = NodeKind<PointerInputModifierNode>(0b1 shl 3)
+    val Locals = NodeKind<ModifierLocalNode>(0b1 shl 6)
+    val ParentData = NodeKind<ParentDataModifierNode>(0b1 shl 7)
+    val LayoutAware = NodeKind<LayoutAwareModifierNode>(0b1 shl 8)
+    val GlobalPositionAware = NodeKind<GlobalPositionAwareModifierNode>(0b1 shl 9)
+    val IntermediateMeasure = NodeKind<IntermediateLayoutModifierNode>(0b1 shl 10)
+    // ...
+}
+
+@OptIn(ExperimentalComposeUiApi::class)
+internal fun calculateNodeKindSetFrom(element: Modifier.Element): Int {
+    var mask = 0
+    if (element is LayoutModifier) {
+        mask = mask or Nodes.Layout
+    }
+    if (element is IntermediateLayoutModifier) {
+        mask = mask or Nodes.IntermediateMeasure
+    }
+    if (element is DrawModifier) {
+        mask = mask or Nodes.Draw
+    }
+    if (element is SemanticsModifier) {
+        mask = mask or Nodes.Semantics
+    }
+    if (element is PointerInputModifier) {
+        mask = mask or Nodes.PointerInput
+    }
+    if (
+        element is ModifierLocalConsumer ||
+        element is ModifierLocalProvider<*> ||
+        // Special handling for FocusOrderModifier -- we have to use modifier local
+        // consumers and providers for it.
+        element is FocusOrderModifier
+    ) {
+        mask = mask or Nodes.Locals
+    }
+    if (element is OnGloballyPositionedModifier) {
+        mask = mask or Nodes.GlobalPositionAware
+    }
+    if (element is ParentDataModifier) {
+        mask = mask or Nodes.ParentData
+    }
+    if (
+        element is OnPlacedModifier ||
+        element is OnRemeasuredModifier ||
+        element is LookaheadOnPlacedModifier
+    ) {
+        mask = mask or Nodes.LayoutAware
+    }
+    return mask
+}
+
+@OptIn(ExperimentalComposeUiApi::class)
+internal fun calculateNodeKindSetFrom(node: Modifier.Node): Int {
+    var mask = 0
+    if (node is LayoutModifierNode) {
+        mask = mask or Nodes.Layout
+    }
+    if (node is DrawModifierNode) {
+        mask = mask or Nodes.Draw
+    }
+    if (node is SemanticsModifierNode) {
+        mask = mask or Nodes.Semantics
+    }
+    if (node is PointerInputModifierNode) {
+        mask = mask or Nodes.PointerInput
+    }
+    if (node is ModifierLocalNode) {
+        mask = mask or Nodes.Locals
+    }
+    if (node is ParentDataModifierNode) {
+        mask = mask or Nodes.ParentData
+    }
+    if (node is LayoutAwareModifierNode) {
+        mask = mask or Nodes.LayoutAware
+    }
+    if (node is GlobalPositionAwareModifierNode) {
+        mask = mask or Nodes.GlobalPositionAware
+    }
+    if (node is IntermediateLayoutModifierNode) {
+        mask = mask or Nodes.IntermediateMeasure
+    }
+    return mask
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OnPositionedDispatcher.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OnPositionedDispatcher.kt
index bdbc043c..07b7f50 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OnPositionedDispatcher.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OnPositionedDispatcher.kt
@@ -48,6 +48,8 @@
     }
 
     private fun dispatchHierarchy(layoutNode: LayoutNode) {
+        // TODO(lmr): investigate a non-recursive version of this that leverages
+        //  node traversal
         layoutNode.dispatchOnPositionedCallbacks()
         layoutNode.needsOnPositionedDispatch = false
 
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/Owner.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/Owner.kt
index e8870c9..4b1abd0 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/Owner.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/Owner.kt
@@ -27,6 +27,7 @@
 import androidx.compose.ui.input.InputModeManager
 import androidx.compose.ui.input.key.KeyEvent
 import androidx.compose.ui.input.pointer.PointerIconService
+import androidx.compose.ui.modifier.ModifierLocalManager
 import androidx.compose.ui.platform.AccessibilityManager
 import androidx.compose.ui.platform.ClipboardManager
 import androidx.compose.ui.platform.TextToolbar
@@ -260,6 +261,8 @@
      */
     val snapshotObserver: OwnerSnapshotObserver
 
+    val modifierLocalManager: ModifierLocalManager
+
     /**
      * Registers a call to be made when the [Applier.onEndChanges] is called. [listener]
      * should be called in [onEndApplyChanges] and then removed after being called.
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ParentDataModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ParentDataModifierNode.kt
new file mode 100644
index 0000000..e860b54
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ParentDataModifierNode.kt
@@ -0,0 +1,25 @@
+/*
+ * 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.node
+
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.unit.Density
+
+@ExperimentalComposeUiApi
+interface ParentDataModifierNode : DelegatableNode {
+    fun Density.modifyParentData(parentData: Any?): Any?
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/PointerInputEntity.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/PointerInputEntity.kt
deleted file mode 100644
index 45a96c6..0000000
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/PointerInputEntity.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.compose.ui.node
-
-import androidx.compose.ui.ExperimentalComposeUiApi
-import androidx.compose.ui.input.pointer.PointerInputModifier
-
-internal class PointerInputEntity(
-    layoutNodeWrapper: LayoutNodeWrapper,
-    modifier: PointerInputModifier
-) : LayoutNodeEntity<PointerInputEntity, PointerInputModifier>(layoutNodeWrapper, modifier) {
-
-    override fun onAttach() {
-        super.onAttach()
-        modifier.pointerInputFilter.layoutCoordinates = layoutNodeWrapper
-        modifier.pointerInputFilter.isAttached = true
-    }
-
-    override fun onDetach() {
-        super.onDetach()
-        modifier.pointerInputFilter.isAttached = false
-    }
-
-    @OptIn(ExperimentalComposeUiApi::class)
-    fun shouldSharePointerInputWithSiblings(): Boolean =
-        modifier.pointerInputFilter.shareWithSiblings ||
-            next?.shouldSharePointerInputWithSiblings() ?: false
-}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/PointerInputModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/PointerInputModifierNode.kt
new file mode 100644
index 0000000..8d8ffeb
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/PointerInputModifierNode.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.compose.ui.node
+
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.input.pointer.PointerEvent
+import androidx.compose.ui.input.pointer.PointerEventPass
+import androidx.compose.ui.layout.LayoutCoordinates
+import androidx.compose.ui.unit.IntSize
+
+@ExperimentalComposeUiApi
+interface PointerInputModifierNode : DelegatableNode {
+    fun onPointerEvent(
+        pointerEvent: PointerEvent,
+        pass: PointerEventPass,
+        bounds: IntSize
+    )
+
+    fun onCancelPointerInput()
+    fun interceptOutOfBoundsChildEvents(): Boolean = false
+    fun sharePointerInputWithSiblings(): Boolean = false
+}
+
+@OptIn(ExperimentalComposeUiApi::class)
+internal val PointerInputModifierNode.isAttached: Boolean
+    get() = node.isAttached
+
+@OptIn(ExperimentalComposeUiApi::class)
+internal val PointerInputModifierNode.layoutCoordinates: LayoutCoordinates
+    get() = requireCoordinator(Nodes.PointerInput)
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/SemanticsModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/SemanticsModifierNode.kt
new file mode 100644
index 0000000..86f960e
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/SemanticsModifierNode.kt
@@ -0,0 +1,60 @@
+/*
+ * 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.node
+
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.layout.boundsInRoot
+import androidx.compose.ui.semantics.SemanticsActions
+import androidx.compose.ui.semantics.SemanticsConfiguration
+import androidx.compose.ui.semantics.getOrNull
+
+@ExperimentalComposeUiApi
+interface SemanticsModifierNode : DelegatableNode {
+    val semanticsConfiguration: SemanticsConfiguration
+}
+
+@ExperimentalComposeUiApi
+fun SemanticsModifierNode.invalidateSemantics() = requireOwner().onSemanticsChange()
+
+@ExperimentalComposeUiApi
+fun SemanticsModifierNode.collapsedSemanticsConfiguration(): SemanticsConfiguration {
+    val next = localChild(Nodes.Semantics)
+    if (next == null || semanticsConfiguration.isClearingSemantics) {
+        return semanticsConfiguration
+    }
+
+    val config = semanticsConfiguration.copy()
+    config.collapsePeer(next.collapsedSemanticsConfiguration())
+    return config
+}
+
+@OptIn(ExperimentalComposeUiApi::class)
+internal val SemanticsModifierNode.useMinimumTouchTarget: Boolean
+    get() = semanticsConfiguration.getOrNull(SemanticsActions.OnClick) != null
+
+@OptIn(ExperimentalComposeUiApi::class)
+internal fun SemanticsModifierNode.touchBoundsInRoot(): Rect {
+    if (!node.isAttached) {
+        return Rect.Zero
+    }
+    if (!useMinimumTouchTarget) {
+        return requireCoordinator(Nodes.Semantics).boundsInRoot()
+    }
+
+    return requireCoordinator(Nodes.Semantics).touchBoundsInRoot()
+}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/SimpleEntity.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/SimpleEntity.kt
deleted file mode 100644
index 4c471ff..0000000
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/SimpleEntity.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.compose.ui.node
-
-import androidx.compose.ui.Modifier
-
-/**
- * A [LayoutNodeEntity] that only contains a [Modifier] and no logic
- */
-internal class SimpleEntity<M : Modifier>(
-    layoutNodeWrapper: LayoutNodeWrapper,
-    modifier: M
-) : LayoutNodeEntity<SimpleEntity<M>, M>(layoutNodeWrapper, modifier)
\ No newline at end of file
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsEntity.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsEntity.kt
deleted file mode 100644
index 54e3dfa..0000000
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsEntity.kt
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.compose.ui.semantics
-
-import androidx.compose.ui.geometry.Rect
-import androidx.compose.ui.layout.boundsInRoot
-import androidx.compose.ui.node.EntityList
-import androidx.compose.ui.node.LayoutNodeEntity
-import androidx.compose.ui.node.LayoutNodeWrapper
-
-internal class SemanticsEntity(
-    wrapped: LayoutNodeWrapper,
-    modifier: SemanticsModifier
-) : LayoutNodeEntity<SemanticsEntity, SemanticsModifier>(wrapped, modifier) {
-    val id: Int
-        get() = layoutNode.semanticsId
-
-    private val useMinimumTouchTarget: Boolean
-        get() = modifier.semanticsConfiguration.getOrNull(SemanticsActions.OnClick) != null
-
-    fun collapsedSemanticsConfiguration(): SemanticsConfiguration {
-        val next = next
-        val nextSemantics = if (next == null) {
-            layoutNodeWrapper.wrapped?.nearestSemantics { true }
-        } else {
-            next.nearestSemantics { true }
-        }
-        if (nextSemantics == null || modifier.semanticsConfiguration.isClearingSemantics) {
-            return modifier.semanticsConfiguration
-        }
-
-        val config = modifier.semanticsConfiguration.copy()
-        config.collapsePeer(nextSemantics.collapsedSemanticsConfiguration())
-        return config
-    }
-
-    override fun onDetach() {
-        super.onDetach()
-        layoutNode.owner?.onSemanticsChange()
-    }
-
-    override fun onAttach() {
-        super.onAttach()
-        layoutNode.owner?.onSemanticsChange()
-    }
-
-    override fun toString(): String {
-        return "${super.toString()} semanticsId: $id config: ${modifier.semanticsConfiguration}"
-    }
-
-    fun touchBoundsInRoot(): Rect {
-        if (!isAttached) {
-            return Rect.Zero
-        }
-        if (!useMinimumTouchTarget) {
-            return layoutNodeWrapper.boundsInRoot()
-        }
-
-        return layoutNodeWrapper.touchBoundsInRoot()
-    }
-
-    internal inline fun nearestSemantics(
-        predicate: (SemanticsEntity) -> Boolean
-    ): SemanticsEntity? {
-        var layoutNodeWrapper: LayoutNodeWrapper? = layoutNodeWrapper
-        var next: SemanticsEntity? = this
-        while (layoutNodeWrapper != null) {
-            while (next != null) {
-                if (predicate(next)) {
-                    return next
-                }
-                next = next.next
-            }
-            layoutNodeWrapper = layoutNodeWrapper.wrapped
-            next = layoutNodeWrapper?.entities?.head(EntityList.SemanticsEntityType)
-        }
-        return null
-    }
-}
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 1a45eb5d..8b3d63d 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
@@ -16,6 +16,8 @@
 
 package androidx.compose.ui.semantics
 
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.layout.AlignmentLine
@@ -24,10 +26,15 @@
 import androidx.compose.ui.layout.boundsInWindow
 import androidx.compose.ui.layout.positionInRoot
 import androidx.compose.ui.layout.positionInWindow
-import androidx.compose.ui.node.EntityList
 import androidx.compose.ui.node.LayoutNode
-import androidx.compose.ui.node.LayoutNodeWrapper
+import androidx.compose.ui.node.NodeCoordinator
+import androidx.compose.ui.node.Nodes
 import androidx.compose.ui.node.RootForTest
+import androidx.compose.ui.node.SemanticsModifierNode
+import androidx.compose.ui.node.collapsedSemanticsConfiguration
+import androidx.compose.ui.node.requireCoordinator
+import androidx.compose.ui.node.requireLayoutNode
+import androidx.compose.ui.node.touchBoundsInRoot
 import androidx.compose.ui.platform.ViewConfiguration
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.util.fastForEach
@@ -40,11 +47,12 @@
  * of any other semantics modifiers on the same layout node, and if "mergeDescendants" is
  * specified and enabled, also the "merged" configuration of its subtree.
  */
+@OptIn(ExperimentalComposeUiApi::class)
 class SemanticsNode internal constructor(
     /*
      * This is expected to be the outermost semantics modifier on a layout node.
      */
-    internal val outerSemanticsEntity: SemanticsEntity,
+    internal val outerSemanticsNode: SemanticsModifierNode,
     /**
      * mergingEnabled specifies whether mergeDescendants config has any effect.
      *
@@ -55,7 +63,12 @@
      *
      * mergingEnabled is typically true or false consistently on every node of a SemanticsNode tree.
      */
-    val mergingEnabled: Boolean
+    val mergingEnabled: Boolean,
+
+    /**
+     * The [LayoutNode] that this is associated with.
+     */
+    internal val layoutNode: LayoutNode = outerSemanticsNode.requireLayoutNode()
 ) {
     // We emit fake nodes for several cases. One is to prevent the content description clobbering
     // issue. Another case is  temporary workaround to retrieve default role ordering for Button
@@ -63,7 +76,7 @@
     internal var isFake = false
     private var fakeNodeParent: SemanticsNode? = null
 
-    internal val unmergedConfig = outerSemanticsEntity.collapsedSemanticsConfiguration()
+    internal val unmergedConfig = outerSemanticsNode.collapsedSemanticsConfiguration()
 
     /**
      * The [LayoutInfo] that this is associated with.
@@ -75,11 +88,6 @@
      */
     val root: RootForTest? get() = layoutNode.owner?.rootForTest
 
-    /**
-     * The [LayoutNode] that this is associated with.
-     */
-    internal val layoutNode: LayoutNode = outerSemanticsEntity.layoutNode
-
     val id: Int = layoutNode.semanticsId
 
     // GEOMETRY
@@ -94,9 +102,9 @@
     val touchBoundsInRoot: Rect
         get() {
             val entity = if (unmergedConfig.isMergingSemanticsOfDescendants) {
-                (layoutNode.outerMergingSemantics ?: outerSemanticsEntity)
+                (layoutNode.outerMergingSemantics ?: outerSemanticsNode)
             } else {
-                outerSemanticsEntity
+                outerSemanticsNode
             }
             return entity.touchBoundsInRoot()
         }
@@ -104,7 +112,7 @@
     /**
      * The size of the bounding box for this node, with no clipping applied
      */
-    val size: IntSize get() = findWrapperToGetBounds().size
+    val size: IntSize get() = findCoordinatorToGetBounds().size
 
     /**
      * The bounding box for this node relative to the root of this Compose hierarchy, with
@@ -114,7 +122,7 @@
     val boundsInRoot: Rect
         get() {
             if (!layoutNode.isAttached) return Rect.Zero
-            return findWrapperToGetBounds().boundsInRoot()
+            return findCoordinatorToGetBounds().boundsInRoot()
         }
 
     /**
@@ -124,7 +132,7 @@
     val positionInRoot: Offset
         get() {
             if (!layoutNode.isAttached) return Offset.Zero
-            return findWrapperToGetBounds().positionInRoot()
+            return findCoordinatorToGetBounds().positionInRoot()
         }
 
     /**
@@ -134,7 +142,7 @@
     val boundsInWindow: Rect
         get() {
             if (!layoutNode.isAttached) return Rect.Zero
-            return findWrapperToGetBounds().boundsInWindow()
+            return findCoordinatorToGetBounds().boundsInWindow()
         }
 
     /**
@@ -143,7 +151,7 @@
     val positionInWindow: Offset
         get() {
             if (!layoutNode.isAttached) return Offset.Zero
-            return findWrapperToGetBounds().positionInWindow()
+            return findCoordinatorToGetBounds().positionInWindow()
         }
 
     /**
@@ -151,7 +159,7 @@
      * if the line is not provided.
      */
     fun getAlignmentLinePosition(alignmentLine: AlignmentLine): Int {
-        return findWrapperToGetBounds()[alignmentLine]
+        return findCoordinatorToGetBounds()[alignmentLine]
     }
 
     // CHILDREN
@@ -196,6 +204,7 @@
         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()
 
@@ -339,11 +348,12 @@
      * of use cases it means that accessibility bounds will be equal to the clickable area.
      * Otherwise the outermost semantics will be used to report bounds, size and position.
      */
-    internal fun findWrapperToGetBounds(): LayoutNodeWrapper {
+    internal fun findCoordinatorToGetBounds(): NodeCoordinator {
         return if (unmergedConfig.isMergingSemanticsOfDescendants) {
-            (layoutNode.outerMergingSemantics ?: outerSemanticsEntity).layoutNodeWrapper
+            (layoutNode.outerMergingSemantics ?: outerSemanticsNode)
+                .requireCoordinator(Nodes.Semantics)
         } else {
-            outerSemanticsEntity.layoutNodeWrapper
+            outerSemanticsNode.requireCoordinator(Nodes.Semantics)
         }
     }
 
@@ -379,19 +389,19 @@
         properties: SemanticsPropertyReceiver.() -> Unit
     ): SemanticsNode {
         val fakeNode = SemanticsNode(
-            outerSemanticsEntity = SemanticsEntity(
-                wrapped = LayoutNode(
+            outerSemanticsNode = object : SemanticsModifierNode, Modifier.Node() {
+                override val semanticsConfiguration = SemanticsConfiguration().also {
+                    it.isMergingSemanticsOfDescendants = false
+                    it.isClearingSemantics = false
+                    it.properties()
+                }
+            },
+            mergingEnabled = false,
+            layoutNode = LayoutNode(
                     isVirtual = true,
                     semanticsId =
                         if (role != null) roleFakeNodeId() else contentDescriptionFakeNodeId()
-                ).innerLayoutNodeWrapper,
-                modifier = SemanticsModifierCore(
-                    mergeDescendants = false,
-                    clearAndSetSemantics = false,
-                    properties = properties
-                )
-            ),
-            mergingEnabled = false
+                ),
         )
         fakeNode.isFake = true
         fakeNode.fakeNodeParent = this
@@ -402,30 +412,22 @@
 /**
  * Returns the outermost semantics node on a LayoutNode.
  */
-internal val LayoutNode.outerSemantics: SemanticsEntity?
-    get() = outerLayoutNodeWrapper.nearestSemantics { true }
+@OptIn(ExperimentalComposeUiApi::class)
+internal val LayoutNode.outerSemantics: SemanticsModifierNode?
+    get() = nodes.head(Nodes.Semantics)
 
-internal val LayoutNode.outerMergingSemantics
-    get() = outerLayoutNodeWrapper.nearestSemantics {
-        it.modifier.semanticsConfiguration.isMergingSemanticsOfDescendants
+@OptIn(ExperimentalComposeUiApi::class)
+internal val LayoutNode.outerMergingSemantics: SemanticsModifierNode?
+    get() = nodes.firstFromHead(Nodes.Semantics) {
+        it.semanticsConfiguration.isMergingSemanticsOfDescendants
     }
 
-/**
- * Returns the nearest semantics wrapper starting from a LayoutNodeWrapper.
- */
-internal inline fun LayoutNodeWrapper.nearestSemantics(
-    predicate: (SemanticsEntity) -> Boolean
-): SemanticsEntity? {
-    var wrapper: LayoutNodeWrapper? = this
-    while (wrapper != null && !wrapper.entities.has(EntityList.SemanticsEntityType)) {
-        wrapper = wrapper.wrapped
-    }
-    return wrapper?.entities?.head(EntityList.SemanticsEntityType)?.nearestSemantics(predicate)
-}
-
+@OptIn(ExperimentalComposeUiApi::class)
 private fun LayoutNode.findOneLayerOfSemanticsWrappers(
-    list: MutableList<SemanticsEntity> = mutableListOf()
-): List<SemanticsEntity> {
+    list: MutableList<SemanticsModifierNode> = mutableListOf()
+): List<SemanticsModifierNode> {
+    // TODO(lmr): visitChildren would be great for this but we would lose the zSorted bit...
+    //  i wonder if we can optimize this for the common case of no z-sortedness going on.
     zSortedChildren.forEach { child ->
         val outerSemantics = child.outerSemantics
         if (outerSemantics != null) {
@@ -457,4 +459,4 @@
 
 private val SemanticsNode.role get() = this.unmergedConfig.getOrNull(SemanticsProperties.Role)
 private fun SemanticsNode.contentDescriptionFakeNodeId() = this.id + 2_000_000_000
-private fun SemanticsNode.roleFakeNodeId() = this.id + 1_000_000_000
+private fun SemanticsNode.roleFakeNodeId() = this.id + 1_000_000_000
\ No newline at end of file
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsOwner.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsOwner.kt
index df02bb9..7e32c0b 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsOwner.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsOwner.kt
@@ -16,6 +16,7 @@
 
 package androidx.compose.ui.semantics
 
+import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.node.LayoutNode
 import androidx.compose.ui.util.fastForEach
 
@@ -23,6 +24,7 @@
  * Owns [SemanticsNode] objects and notifies listeners of changes to the
  * semantics tree
  */
+@OptIn(ExperimentalComposeUiApi::class)
 class SemanticsOwner internal constructor(private val rootNode: LayoutNode) {
     /**
      * The root node of the semantics tree.  Does not contain any unmerged data.
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 c8de532..a104d042 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
@@ -16,18 +16,21 @@
 
 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.LayoutNodeWrapper
+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<SemanticsEntity> = mutableListOf()
-): List<SemanticsEntity> {
+    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
@@ -78,10 +81,10 @@
     private val layoutDirection = subtreeRoot.layoutDirection
 
     init {
-        val subtreeRootWrapper = subtreeRoot.innerLayoutNodeWrapper
-        val nodeWrapper = node.findWrapperToGetBounds()
-        location = if (subtreeRootWrapper.isAttached && nodeWrapper.isAttached) {
-            subtreeRootWrapper.localBoundingBoxOf(nodeWrapper)
+        val subtreeRootCoordinator = subtreeRoot.innerCoordinator
+        val coordinator = node.findCoordinatorToGetBounds()
+        location = if (subtreeRootCoordinator.isAttached && coordinator.isAttached) {
+            subtreeRootCoordinator.localBoundingBoxOf(coordinator)
         } else {
             null
         }
@@ -127,14 +130,14 @@
 
         // Find a child of each view with different screen bounds. If we get here, node and
         // other.node must be attached.
-        val view1Bounds = node.findWrapperToGetBounds().boundsInRoot()
-        val view2Bounds = other.node.findWrapperToGetBounds().boundsInRoot()
+        val view1Bounds = node.findCoordinatorToGetBounds().boundsInRoot()
+        val view2Bounds = other.node.findCoordinatorToGetBounds().boundsInRoot()
         val child1 = node.findNodeByPredicateTraversal {
-            val wrapper = it.findWrapperToGetBounds()
+            val wrapper = it.findCoordinatorToGetBounds()
             wrapper.isAttached && view1Bounds != wrapper.boundsInRoot()
         }
         val child2 = other.node.findNodeByPredicateTraversal {
-            val wrapper = it.findWrapperToGetBounds()
+            val wrapper = it.findCoordinatorToGetBounds()
             wrapper.isAttached && view2Bounds != wrapper.boundsInRoot()
         }
         // Compare the children recursively
@@ -177,8 +180,9 @@
 
 /**
  * If this node has semantics, we use the semantics wrapper to get bounds. Otherwise, we use
- * innerLayoutNodeWrapper because it seems the bounds after padding is the effective content.
+ * innerCoordinator because it seems the bounds after padding is the effective content.
  */
-internal fun LayoutNode.findWrapperToGetBounds(): LayoutNodeWrapper {
-    return (outerMergingSemantics ?: outerSemantics)?.layoutNodeWrapper ?: innerLayoutNodeWrapper
+@OptIn(ExperimentalComposeUiApi::class)
+internal fun LayoutNode.findCoordinatorToGetBounds(): NodeCoordinator {
+    return (outerMergingSemantics ?: outerSemantics)?.node?.coordinator ?: innerCoordinator
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/text/TextMeasurerHelper.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/text/TextMeasurerHelper.kt
index b745d89..9d3b1c9 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/text/TextMeasurerHelper.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/text/TextMeasurerHelper.kt
@@ -21,9 +21,6 @@
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.LocalFontFamilyResolver
 import androidx.compose.ui.platform.LocalLayoutDirection
-import androidx.compose.ui.text.font.FontFamily
-import androidx.compose.ui.unit.Density
-import androidx.compose.ui.unit.LayoutDirection
 
 /**
  * This value should reflect the default cache size for TextMeasurer.
@@ -31,28 +28,24 @@
 private val DefaultCacheSize: Int = 8
 
 /**
- * Creates and remembers a [TextMeasurer] that reads default values for optional parameters from
- * CompositionLocals. Returned TextMeasurer also carries an internal [TextLayoutCache] at a given
- * capacity. Provide 0 as capacity to opt-out from internal caching behavior.
+ * Creates and remembers a [TextMeasurer]. All parameters that are required for TextMeasurer except
+ * [cacheSize] are read from CompositionLocals. Created TextMeasurer carries an internal
+ * [TextLayoutCache] with [cacheSize] capacity. Provide 0 for [cacheSize] to opt-out from internal
+ * caching behavior. Moreover, the cache can be disabled at will during measure by passing in
+ * skipCache as true.
  *
- * All given parameters can be overridden during a [TextMeasurer.measure] call except the maximum
- * size of the TextLayoutCache. Instead the cache can be disabled at will during measure by passing
- * in skipCache as true.
- *
- * @param fontFamilyResolver default [FontFamily.Resolver] to be used to load the font given
- * in [SpanStyle]s.
- * @param density default density.
- * @param layoutDirection default layout direction.
- * @param cacheSize Capacity of internal cache inside TextMeasurer.
+ * @param cacheSize Capacity of internal cache inside TextMeasurer. Size unit is the number of
+ * unique text layout inputs that are measured.
  */
 @ExperimentalTextApi
 @Composable
 fun rememberTextMeasurer(
-    fontFamilyResolver: FontFamily.Resolver = LocalFontFamilyResolver.current,
-    density: Density = LocalDensity.current,
-    layoutDirection: LayoutDirection = LocalLayoutDirection.current,
     cacheSize: Int = DefaultCacheSize
 ): TextMeasurer {
+    val fontFamilyResolver = LocalFontFamilyResolver.current
+    val density = LocalDensity.current
+    val layoutDirection = LocalLayoutDirection.current
+
     return remember(fontFamilyResolver, density, layoutDirection, cacheSize) {
         TextMeasurer(fontFamilyResolver, density, layoutDirection, cacheSize)
     }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/ComposeAccessible.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/ComposeAccessible.kt
index 20183e7..53a47e7 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/ComposeAccessible.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/ComposeAccessible.kt
@@ -19,6 +19,8 @@
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.node.requireCoordinator
+import androidx.compose.ui.node.Nodes
 import androidx.compose.ui.semantics.AccessibilityAction
 import androidx.compose.ui.semantics.Role
 import androidx.compose.ui.semantics.SemanticsActions
@@ -317,7 +319,7 @@
         @OptIn(ExperimentalComposeUiApi::class)
         override fun isVisible(): Boolean = with(semanticsNode) {
             !config.contains(SemanticsProperties.InvisibleToUser) &&
-            !outerSemanticsEntity.layoutNodeWrapper.isTransparent()
+            !outerSemanticsNode.requireCoordinator(Nodes.Semantics).isTransparent()
         }
 
         override fun isEnabled(): Boolean =
diff --git a/compose/ui/ui/src/jvmMain/kotlin/androidx/compose/ui/Actual.kt b/compose/ui/ui/src/jvmMain/kotlin/androidx/compose/ui/Actual.kt
new file mode 100644
index 0000000..a5fd3c1
--- /dev/null
+++ b/compose/ui/ui/src/jvmMain/kotlin/androidx/compose/ui/Actual.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.compose.ui
+
+internal actual fun areObjectsOfSameType(a: Any, b: Any): Boolean {
+    return a::class.java === b::class.java
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaBasedOwner.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaBasedOwner.skiko.kt
index b420d49..92c0f40 100644
--- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaBasedOwner.skiko.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaBasedOwner.skiko.kt
@@ -60,6 +60,7 @@
 import androidx.compose.ui.input.pointer.ProcessResult
 import androidx.compose.ui.input.pointer.TestPointerInputEventData
 import androidx.compose.ui.layout.RootMeasurePolicy
+import androidx.compose.ui.modifier.ModifierLocalManager
 import androidx.compose.ui.node.InternalCoreApi
 import androidx.compose.ui.node.LayoutNode
 import androidx.compose.ui.node.LayoutNodeDrawScope
@@ -139,6 +140,8 @@
     override val inputModeManager: InputModeManager
         get() = _inputModeManager
 
+    override val modifierLocalManager: ModifierLocalManager = ModifierLocalManager(this)
+
     // TODO: set/clear _windowInfo.isWindowFocused when the window gains/loses focus.
     private val _windowInfo: WindowInfoImpl = WindowInfoImpl()
     override val windowInfo: WindowInfo
@@ -303,8 +306,8 @@
 
         // Don't use mainOwner.root.width here, as it strictly coerced by [constraints]
         contentSize = IntSize(
-            root.children.maxOfOrNull { it.outerLayoutNodeWrapper.measuredWidth } ?: 0,
-            root.children.maxOfOrNull { it.outerLayoutNodeWrapper.measuredHeight } ?: 0,
+            root.children.maxOfOrNull { it.outerCoordinator.measuredWidth } ?: 0,
+            root.children.maxOfOrNull { it.outerCoordinator.measuredHeight } ?: 0,
         )
     }
 
diff --git a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/focus/FocusManagerTest.kt b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/focus/FocusManagerTest.kt
index dc9d20b..88e33de 100644
--- a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/focus/FocusManagerTest.kt
+++ b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/focus/FocusManagerTest.kt
@@ -22,7 +22,7 @@
 import androidx.compose.ui.focus.FocusStateImpl.Deactivated
 import androidx.compose.ui.focus.FocusStateImpl.DeactivatedParent
 import androidx.compose.ui.focus.FocusStateImpl.Inactive
-import androidx.compose.ui.node.InnerPlaceable
+import androidx.compose.ui.node.InnerNodeCoordinator
 import androidx.compose.ui.node.LayoutNode
 import androidx.compose.ui.node.add
 import com.google.common.truth.Truth.assertThat
@@ -44,8 +44,8 @@
 
     @Before
     fun setup() {
-        val innerPlaceable = InnerPlaceable(LayoutNode())
-        focusModifier.layoutNodeWrapper = innerPlaceable
+        val innerPlaceable = InnerNodeCoordinator(LayoutNode())
+        focusModifier.coordinator = innerPlaceable
     }
 
     @Test
@@ -77,9 +77,9 @@
         if (initialFocusState == ActiveParent || initialFocusState == DeactivatedParent) {
             val childLayoutNode = LayoutNode()
             val child = FocusModifier(Active).apply {
-                layoutNodeWrapper = InnerPlaceable(childLayoutNode)
+                coordinator = InnerNodeCoordinator(childLayoutNode)
             }
-            focusModifier.layoutNodeWrapper!!.layoutNode.add(childLayoutNode)
+            focusModifier.coordinator!!.layoutNode.add(childLayoutNode)
             focusModifier.focusedChild = child
         }
 
@@ -102,9 +102,9 @@
         if (initialFocusState == ActiveParent || initialFocusState == DeactivatedParent) {
             val childLayoutNode = LayoutNode()
             val child = FocusModifier(Active).apply {
-                layoutNodeWrapper = InnerPlaceable(childLayoutNode)
+                coordinator = InnerNodeCoordinator(childLayoutNode)
             }
-            focusModifier.layoutNodeWrapper!!.layoutNode.add(childLayoutNode)
+            focusModifier.coordinator!!.layoutNode.add(childLayoutNode)
             focusModifier.focusedChild = child
         }
 
@@ -130,9 +130,9 @@
         if (initialFocusState == ActiveParent || initialFocusState == DeactivatedParent) {
             val childLayoutNode = LayoutNode()
             val child = FocusModifier(Active).apply {
-                layoutNodeWrapper = InnerPlaceable(childLayoutNode)
+                coordinator = InnerNodeCoordinator(childLayoutNode)
             }
-            focusModifier.layoutNodeWrapper!!.layoutNode.add(childLayoutNode)
+            focusModifier.coordinator!!.layoutNode.add(childLayoutNode)
             focusModifier.focusedChild = child
         }
 
@@ -159,9 +159,9 @@
             focusModifier.focusState = initialFocusState as FocusStateImpl
             val childLayoutNode = LayoutNode()
             val child = FocusModifier(Captured).apply {
-                layoutNodeWrapper = InnerPlaceable(childLayoutNode)
+                coordinator = InnerNodeCoordinator(childLayoutNode)
             }
-            focusModifier.layoutNodeWrapper!!.layoutNode.add(childLayoutNode)
+            focusModifier.coordinator!!.layoutNode.add(childLayoutNode)
             focusModifier.focusedChild = child
 
             // Act.
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 bf026fd..35b87e2 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
@@ -50,6 +50,7 @@
 import androidx.compose.ui.layout.RootMeasurePolicy.measure
 import androidx.compose.ui.layout.layout
 import androidx.compose.ui.layout.positionInRoot
+import androidx.compose.ui.modifier.ModifierLocalManager
 import androidx.compose.ui.platform.AccessibilityManager
 import androidx.compose.ui.platform.ClipboardManager
 import androidx.compose.ui.platform.TextToolbar
@@ -57,7 +58,6 @@
 import androidx.compose.ui.platform.WindowInfo
 import androidx.compose.ui.platform.invertTo
 import androidx.compose.ui.semantics.SemanticsConfiguration
-import androidx.compose.ui.semantics.SemanticsEntity
 import androidx.compose.ui.semantics.SemanticsModifier
 import androidx.compose.ui.text.font.Font
 import androidx.compose.ui.text.font.FontFamily
@@ -84,6 +84,7 @@
 import org.junit.runners.JUnit4
 
 @RunWith(JUnit4::class)
+@OptIn(ExperimentalComposeUiApi::class)
 class LayoutNodeTest {
     // Ensure that attach and detach work properly
     @Test
@@ -702,28 +703,28 @@
         assertFalse(layoutNode.coordinates.isAttached)
     }
 
-    // The LayoutNodeWrapper should be reused when it has been replaced with the same type
+    // The NodeCoordinator should be reused when it has been replaced with the same type
     @Test
-    fun layoutNodeWrapperSameWithReplacementModifier() {
+    fun nodeCoordinatorSameWithReplacementModifier() {
         val layoutNode = LayoutNode()
         val layoutModifier = Modifier.graphicsLayer { }
 
         layoutNode.modifier = layoutModifier
-        val oldLayoutNodeWrapper = layoutNode.outerLayoutNodeWrapper
-        assertFalse(oldLayoutNodeWrapper.isAttached)
+        val oldNodeCoordinator = layoutNode.outerCoordinator
+        assertFalse(oldNodeCoordinator.isAttached)
 
         layoutNode.attach(MockOwner())
-        assertTrue(oldLayoutNodeWrapper.isAttached)
+        assertTrue(oldNodeCoordinator.isAttached)
 
         layoutNode.modifier = Modifier.graphicsLayer { }
-        val newLayoutNodeWrapper = layoutNode.outerLayoutNodeWrapper
-        assertSame(newLayoutNodeWrapper, oldLayoutNodeWrapper)
+        val newNodeCoordinator = layoutNode.outerCoordinator
+        assertSame(newNodeCoordinator, oldNodeCoordinator)
     }
 
-    // The LayoutNodeWrapper should be reused when it has been replaced with the same type,
-    // even with multiple LayoutNodeWrappers for one modifier.
+    // The NodeCoordinator should be reused when it has been replaced with the same type,
+    // even with multiple NodeCoordinators for one modifier.
     @Test
-    fun layoutNodeWrapperSameWithReplacementMultiModifier() {
+    fun nodeCoordinatorSameWithReplacementMultiModifier() {
         class TestModifier : DrawModifier, LayoutModifier {
             override fun ContentDrawScope.draw() {
                 drawContent()
@@ -738,48 +739,48 @@
         val layoutNode = LayoutNode()
 
         layoutNode.modifier = TestModifier()
-        val oldLayoutNodeWrapper = layoutNode.outerLayoutNodeWrapper
-        val oldLayoutNodeWrapper2 = oldLayoutNodeWrapper.wrapped
+        val oldNodeCoordinator = layoutNode.outerCoordinator
+        val oldNodeCoordinator2 = oldNodeCoordinator.wrapped
         layoutNode.modifier = TestModifier()
-        val newLayoutNodeWrapper = layoutNode.outerLayoutNodeWrapper
-        val newLayoutNodeWrapper2 = newLayoutNodeWrapper.wrapped
-        assertSame(newLayoutNodeWrapper, oldLayoutNodeWrapper)
-        assertSame(newLayoutNodeWrapper2, oldLayoutNodeWrapper2)
+        val newNodeCoordinator = layoutNode.outerCoordinator
+        val newNodeCoordinator2 = newNodeCoordinator.wrapped
+        assertSame(newNodeCoordinator, oldNodeCoordinator)
+        assertSame(newNodeCoordinator2, oldNodeCoordinator2)
     }
 
-    // The LayoutNodeWrapper should be detached when it has been replaced.
+    // The NodeCoordinator should be detached when it has been replaced.
     @Test
-    fun layoutNodeWrapperAttachedWhenLayoutNodeAttached() {
+    fun nodeCoordinatorAttachedWhenLayoutNodeAttached() {
         val layoutNode = LayoutNode()
         // 2 modifiers at the start
         val layoutModifier = Modifier.graphicsLayer { }.graphicsLayer { }
 
         layoutNode.modifier = layoutModifier
-        val oldLayoutNodeWrapper = layoutNode.outerLayoutNodeWrapper
-        val oldInnerLayoutNodeWrapper = oldLayoutNodeWrapper.wrapped
-        assertFalse(oldLayoutNodeWrapper.isAttached)
-        assertNotNull(oldInnerLayoutNodeWrapper)
-        assertFalse(oldInnerLayoutNodeWrapper!!.isAttached)
+        val oldNodeCoordinator = layoutNode.outerCoordinator
+        val oldInnerNodeCoordinator = oldNodeCoordinator.wrapped
+        assertFalse(oldNodeCoordinator.isAttached)
+        assertNotNull(oldInnerNodeCoordinator)
+        assertFalse(oldInnerNodeCoordinator!!.isAttached)
 
         layoutNode.attach(MockOwner())
-        assertTrue(oldLayoutNodeWrapper.isAttached)
+        assertTrue(oldNodeCoordinator.isAttached)
 
         // only 1 modifier now, so one should be detached and the other can be reused
         layoutNode.modifier = Modifier.graphicsLayer()
-        val newLayoutNodeWrapper = layoutNode.outerLayoutNodeWrapper
+        val newNodeCoordinator = layoutNode.outerCoordinator
 
         // one can be reused, but we don't care which one
-        val notReused = if (newLayoutNodeWrapper == oldLayoutNodeWrapper) {
-            oldInnerLayoutNodeWrapper
+        val notReused = if (newNodeCoordinator == oldNodeCoordinator) {
+            oldInnerNodeCoordinator
         } else {
-            oldLayoutNodeWrapper
+            oldNodeCoordinator
         }
-        assertTrue(newLayoutNodeWrapper.isAttached)
+        assertTrue(newNodeCoordinator.isAttached)
         assertFalse(notReused.isAttached)
     }
 
     @Test
-    fun layoutNodeWrapperParentLayoutCoordinates() {
+    fun nodeCoordinatorParentLayoutCoordinates() {
         val layoutNode = LayoutNode()
         val layoutNode2 = LayoutNode()
         val layoutModifier = Modifier.graphicsLayer { }
@@ -788,17 +789,17 @@
         layoutNode2.attach(MockOwner())
 
         assertEquals(
-            layoutNode2.innerLayoutNodeWrapper,
-            layoutNode.innerLayoutNodeWrapper.parentLayoutCoordinates
+            layoutNode2.innerCoordinator,
+            layoutNode.innerCoordinator.parentLayoutCoordinates
         )
         assertEquals(
-            layoutNode2.innerLayoutNodeWrapper,
-            layoutNode.outerLayoutNodeWrapper.parentLayoutCoordinates
+            layoutNode2.innerCoordinator,
+            layoutNode.outerCoordinator.parentLayoutCoordinates
         )
     }
 
     @Test
-    fun layoutNodeWrapperParentCoordinates() {
+    fun nodeCoordinatorParentCoordinates() {
         val layoutNode = LayoutNode()
         val layoutNode2 = LayoutNode()
         val layoutModifier = object : LayoutModifier {
@@ -814,20 +815,20 @@
         layoutNode2.insertAt(0, layoutNode)
         layoutNode2.attach(MockOwner())
 
-        val layoutModifierWrapper = layoutNode.outerLayoutNodeWrapper
+        val layoutModifierWrapper = layoutNode.outerCoordinator
 
         assertEquals(
             layoutModifierWrapper,
-            layoutNode.innerLayoutNodeWrapper.parentCoordinates
+            layoutNode.innerCoordinator.parentCoordinates
         )
         assertEquals(
-            layoutNode2.innerLayoutNodeWrapper,
+            layoutNode2.innerCoordinator,
             layoutModifierWrapper.parentCoordinates
         )
     }
 
     @Test
-    fun layoutNodeWrapper_transformFrom_offsets() {
+    fun nodeCoordinator_transformFrom_offsets() {
         val parent = ZeroSizedLayoutNode()
         parent.attach(MockOwner())
         val child = ZeroSizedLayoutNode()
@@ -836,17 +837,17 @@
         child.place(50, 80)
 
         val matrix = Matrix()
-        child.innerLayoutNodeWrapper.transformFrom(parent.innerLayoutNodeWrapper, matrix)
+        child.innerCoordinator.transformFrom(parent.innerCoordinator, matrix)
 
         assertEquals(Offset(-50f, -80f), matrix.map(Offset.Zero))
 
-        parent.innerLayoutNodeWrapper.transformFrom(child.innerLayoutNodeWrapper, matrix)
+        parent.innerCoordinator.transformFrom(child.innerCoordinator, matrix)
 
         assertEquals(Offset(50f, 80f), matrix.map(Offset.Zero))
     }
 
     @Test
-    fun layoutNodeWrapper_transformFrom_translation() {
+    fun nodeCoordinator_transformFrom_translation() {
         val parent = ZeroSizedLayoutNode()
         parent.attach(MockOwner())
         val child = ZeroSizedLayoutNode()
@@ -855,27 +856,27 @@
             translationX = 5f
             translationY = 2f
         }
-        parent.outerLayoutNodeWrapper
-            .measure(listOf(parent.outerLayoutNodeWrapper), Constraints())
-        child.outerLayoutNodeWrapper
-            .measure(listOf(child.outerLayoutNodeWrapper), Constraints())
+        parent.outerCoordinator
+            .measure(listOf(parent.outerCoordinator), Constraints())
+        child.outerCoordinator
+            .measure(listOf(child.outerCoordinator), Constraints())
         parent.place(0, 0)
         child.place(0, 0)
 
         val matrix = Matrix()
-        child.innerLayoutNodeWrapper.transformFrom(parent.innerLayoutNodeWrapper, matrix)
+        child.innerCoordinator.transformFrom(parent.innerCoordinator, matrix)
 
         assertEquals(-5f, matrix.map(Offset.Zero).x, 0.001f)
         assertEquals(-2f, matrix.map(Offset.Zero).y, 0.001f)
 
-        parent.innerLayoutNodeWrapper.transformFrom(child.innerLayoutNodeWrapper, matrix)
+        parent.innerCoordinator.transformFrom(child.innerCoordinator, matrix)
 
         assertEquals(5f, matrix.map(Offset.Zero).x, 0.001f)
         assertEquals(2f, matrix.map(Offset.Zero).y, 0.001f)
     }
 
     @Test
-    fun layoutNodeWrapper_transformFrom_rotation() {
+    fun nodeCoordinator_transformFrom_rotation() {
         val parent = ZeroSizedLayoutNode()
         parent.attach(MockOwner())
         val child = ZeroSizedLayoutNode()
@@ -883,27 +884,27 @@
         child.modifier = Modifier.graphicsLayer {
             rotationZ = 90f
         }
-        parent.outerLayoutNodeWrapper
-            .measure(listOf(parent.outerLayoutNodeWrapper), Constraints())
-        child.outerLayoutNodeWrapper
-            .measure(listOf(child.outerLayoutNodeWrapper), Constraints())
+        parent.outerCoordinator
+            .measure(listOf(parent.outerCoordinator), Constraints())
+        child.outerCoordinator
+            .measure(listOf(child.outerCoordinator), Constraints())
         parent.place(0, 0)
         child.place(0, 0)
 
         val matrix = Matrix()
-        child.innerLayoutNodeWrapper.transformFrom(parent.innerLayoutNodeWrapper, matrix)
+        child.innerCoordinator.transformFrom(parent.innerCoordinator, matrix)
 
         assertEquals(0f, matrix.map(Offset(1f, 0f)).x, 0.001f)
         assertEquals(-1f, matrix.map(Offset(1f, 0f)).y, 0.001f)
 
-        parent.innerLayoutNodeWrapper.transformFrom(child.innerLayoutNodeWrapper, matrix)
+        parent.innerCoordinator.transformFrom(child.innerCoordinator, matrix)
 
         assertEquals(0f, matrix.map(Offset(1f, 0f)).x, 0.001f)
         assertEquals(1f, matrix.map(Offset(1f, 0f)).y, 0.001f)
     }
 
     @Test
-    fun layoutNodeWrapper_transformFrom_scale() {
+    fun nodeCoordinator_transformFrom_scale() {
         val parent = ZeroSizedLayoutNode()
         parent.attach(MockOwner())
         val child = ZeroSizedLayoutNode()
@@ -911,45 +912,45 @@
         child.modifier = Modifier.graphicsLayer {
             scaleX = 0f
         }
-        parent.outerLayoutNodeWrapper
-            .measure(listOf(parent.outerLayoutNodeWrapper), Constraints())
-        child.outerLayoutNodeWrapper
-            .measure(listOf(child.outerLayoutNodeWrapper), Constraints())
+        parent.outerCoordinator
+            .measure(listOf(parent.outerCoordinator), Constraints())
+        child.outerCoordinator
+            .measure(listOf(child.outerCoordinator), Constraints())
         parent.place(0, 0)
         child.place(0, 0)
 
         val matrix = Matrix()
-        child.innerLayoutNodeWrapper.transformFrom(parent.innerLayoutNodeWrapper, matrix)
+        child.innerCoordinator.transformFrom(parent.innerCoordinator, matrix)
 
         // The X coordinate is somewhat nonsensical since it is scaled to 0
         // We've chosen to make it not transform when there's a nonsensical inverse.
         assertEquals(1f, matrix.map(Offset(1f, 1f)).x, 0.001f)
         assertEquals(1f, matrix.map(Offset(1f, 1f)).y, 0.001f)
 
-        parent.innerLayoutNodeWrapper.transformFrom(child.innerLayoutNodeWrapper, matrix)
+        parent.innerCoordinator.transformFrom(child.innerCoordinator, matrix)
 
         // This direction works, so we can expect the normal scaling
         assertEquals(0f, matrix.map(Offset(1f, 1f)).x, 0.001f)
         assertEquals(1f, matrix.map(Offset(1f, 1f)).y, 0.001f)
 
-        child.innerLayoutNodeWrapper.onLayerBlockUpdated {
+        child.innerCoordinator.onLayerBlockUpdated {
             scaleX = 0.5f
             scaleY = 0.25f
         }
 
-        child.innerLayoutNodeWrapper.transformFrom(parent.innerLayoutNodeWrapper, matrix)
+        child.innerCoordinator.transformFrom(parent.innerCoordinator, matrix)
 
         assertEquals(2f, matrix.map(Offset(1f, 1f)).x, 0.001f)
         assertEquals(4f, matrix.map(Offset(1f, 1f)).y, 0.001f)
 
-        parent.innerLayoutNodeWrapper.transformFrom(child.innerLayoutNodeWrapper, matrix)
+        parent.innerCoordinator.transformFrom(child.innerCoordinator, matrix)
 
         assertEquals(0.5f, matrix.map(Offset(1f, 1f)).x, 0.001f)
         assertEquals(0.25f, matrix.map(Offset(1f, 1f)).y, 0.001f)
     }
 
     @Test
-    fun layoutNodeWrapper_transformFrom_siblings() {
+    fun nodeCoordinator_transformFrom_siblings() {
         val parent = ZeroSizedLayoutNode()
         parent.attach(MockOwner())
         val child1 = ZeroSizedLayoutNode()
@@ -966,18 +967,18 @@
             scaleY = 2f
             transformOrigin = TransformOrigin(0f, 0f)
         }
-        parent.outerLayoutNodeWrapper
-            .measure(listOf(parent.outerLayoutNodeWrapper), Constraints())
-        child1.outerLayoutNodeWrapper
-            .measure(listOf(child1.outerLayoutNodeWrapper), Constraints())
-        child2.outerLayoutNodeWrapper
-            .measure(listOf(child2.outerLayoutNodeWrapper), Constraints())
+        parent.outerCoordinator
+            .measure(listOf(parent.outerCoordinator), Constraints())
+        child1.outerCoordinator
+            .measure(listOf(child1.outerCoordinator), Constraints())
+        child2.outerCoordinator
+            .measure(listOf(child2.outerCoordinator), Constraints())
         parent.place(0, 0)
         child1.place(100, 200)
         child2.place(5, 11)
 
         val matrix = Matrix()
-        child2.innerLayoutNodeWrapper.transformFrom(child1.innerLayoutNodeWrapper, matrix)
+        child2.innerCoordinator.transformFrom(child1.innerCoordinator, matrix)
 
         // (20, 36) should be (10, 9) in real coordinates due to scaling
         // Translate to (110, 209) in the parent
@@ -987,14 +988,14 @@
         assertEquals(21f, offset.x, 0.001f)
         assertEquals(99f, offset.y, 0.001f)
 
-        child1.innerLayoutNodeWrapper.transformFrom(child2.innerLayoutNodeWrapper, matrix)
+        child1.innerCoordinator.transformFrom(child2.innerCoordinator, matrix)
         val offset2 = matrix.map(Offset(21f, 99f))
         assertEquals(20f, offset2.x, 0.001f)
         assertEquals(36f, offset2.y, 0.001f)
     }
 
     @Test
-    fun layoutNodeWrapper_transformFrom_cousins() {
+    fun nodeCoordinator_transformFrom_cousins() {
         val parent = ZeroSizedLayoutNode()
         parent.attach(MockOwner())
         val child1 = ZeroSizedLayoutNode()
@@ -1014,12 +1015,12 @@
         grandChild2.place(17, 59)
 
         val matrix = Matrix()
-        grandChild1.innerLayoutNodeWrapper.transformFrom(grandChild2.innerLayoutNodeWrapper, matrix)
+        grandChild1.innerCoordinator.transformFrom(grandChild2.innerCoordinator, matrix)
 
         // (17, 59) + (22, 33) - (10, 11) - (45, 27) = (-16, 54)
         assertEquals(Offset(-16f, 54f), matrix.map(Offset.Zero))
 
-        grandChild2.innerLayoutNodeWrapper.transformFrom(grandChild1.innerLayoutNodeWrapper, matrix)
+        grandChild2.innerCoordinator.transformFrom(grandChild1.innerCoordinator, matrix)
 
         assertEquals(Offset(16f, -54f), matrix.map(Offset.Zero))
     }
@@ -1034,11 +1035,11 @@
             ).apply {
                 attach(MockOwner())
             }
-        val hit = mutableListOf<PointerInputFilter>()
+        val hit = mutableListOf<PointerInputModifierNode>()
 
         layoutNode.hitTest(Offset(0f, 0f), hit)
 
-        assertThat(hit).isEqualTo(listOf(pointerInputFilter))
+        assertThat(hit.toFilters()).isEqualTo(listOf(pointerInputFilter))
     }
 
     @Test
@@ -1052,11 +1053,11 @@
             ).apply {
                 attach(MockOwner())
             }
-        val hit = mutableListOf<PointerInputFilter>()
+        val hit = mutableListOf<PointerInputModifierNode>()
 
         layoutNode.hitTest(Offset(-3f, 3f), hit, true)
 
-        assertThat(hit).isEqualTo(listOf(pointerInputFilter))
+        assertThat(hit.toFilters()).isEqualTo(listOf(pointerInputFilter))
     }
 
     @Test
@@ -1070,11 +1071,11 @@
             ).apply {
                 attach(MockOwner())
             }
-        val hit = mutableListOf<PointerInputFilter>()
+        val hit = mutableListOf<PointerInputModifierNode>()
 
         layoutNode.hitTest(Offset(0f, 3f), hit, true)
 
-        assertThat(hit).isEqualTo(listOf(pointerInputFilter))
+        assertThat(hit.toFilters()).isEqualTo(listOf(pointerInputFilter))
     }
 
     @Test
@@ -1088,11 +1089,11 @@
             ).apply {
                 attach(MockOwner())
             }
-        val hit = mutableListOf<PointerInputFilter>()
+        val hit = mutableListOf<PointerInputModifierNode>()
 
         layoutNode.hitTest(Offset(3f, 0f), hit, true)
 
-        assertThat(hit).isEqualTo(listOf(pointerInputFilter))
+        assertThat(hit.toFilters()).isEqualTo(listOf(pointerInputFilter))
     }
 
     @Test
@@ -1106,11 +1107,11 @@
         )
         outerNode.add(layoutNode)
         layoutNode.onNodePlaced()
-        val hit = mutableListOf<PointerInputFilter>()
+        val hit = mutableListOf<PointerInputModifierNode>()
 
         outerNode.hitTest(Offset(-3f, 3f), hit, true)
 
-        assertThat(hit).isEqualTo(listOf(pointerInputFilter))
+        assertThat(hit.toFilters()).isEqualTo(listOf(pointerInputFilter))
     }
 
     @Test
@@ -1127,11 +1128,11 @@
         )
         outerNode.add(layoutNode)
         layoutNode.onNodePlaced()
-        val hit = mutableListOf<PointerInputFilter>()
+        val hit = mutableListOf<PointerInputModifierNode>()
 
         outerNode.hitTest(Offset(25f, 25f), hit)
 
-        assertThat(hit).isEqualTo(listOf(pointerInputFilter))
+        assertThat(hit.toFilters()).isEqualTo(listOf(pointerInputFilter))
     }
 
     @Test
@@ -1150,11 +1151,11 @@
         )
         outerNode.add(layoutNode)
         layoutNode.onNodePlaced()
-        val hit = mutableListOf<PointerInputFilter>()
+        val hit = mutableListOf<PointerInputModifierNode>()
 
         outerNode.hitTest(Offset(25f, 25f), hit)
 
-        assertThat(hit).isEqualTo(listOf(outerPointerInputFilter, pointerInputFilter))
+        assertThat(hit.toFilters()).isEqualTo(listOf(outerPointerInputFilter, pointerInputFilter))
     }
 
     @Test
@@ -1178,47 +1179,47 @@
         layoutNode1.onNodePlaced()
         layoutNode2.onNodePlaced()
 
-        val hit = mutableListOf<PointerInputFilter>()
+        val hit = mutableListOf<PointerInputModifierNode>()
 
         // Hit closer to layoutNode1
         outerNode.hitTest(Offset(5.1f, 5.5f), hit, true)
 
-        assertThat(hit).isEqualTo(listOf(pointerInputFilter1))
+        assertThat(hit.toFilters()).isEqualTo(listOf(pointerInputFilter1))
 
         hit.clear()
 
         // Hit closer to layoutNode2
         outerNode.hitTest(Offset(5.9f, 5.5f), hit, true)
 
-        assertThat(hit).isEqualTo(listOf(pointerInputFilter2))
+        assertThat(hit.toFilters()).isEqualTo(listOf(pointerInputFilter2))
 
         hit.clear()
 
         // Hit closer to layoutNode1
         outerNode.hitTest(Offset(5.5f, 5.1f), hit, true)
 
-        assertThat(hit).isEqualTo(listOf(pointerInputFilter1))
+        assertThat(hit.toFilters()).isEqualTo(listOf(pointerInputFilter1))
 
         hit.clear()
 
         // Hit closer to layoutNode2
         outerNode.hitTest(Offset(5.5f, 5.9f), hit, true)
 
-        assertThat(hit).isEqualTo(listOf(pointerInputFilter2))
+        assertThat(hit.toFilters()).isEqualTo(listOf(pointerInputFilter2))
 
         hit.clear()
 
         // Hit inside layoutNode1
         outerNode.hitTest(Offset(4.9f, 4.9f), hit, true)
 
-        assertThat(hit).isEqualTo(listOf(pointerInputFilter1))
+        assertThat(hit.toFilters()).isEqualTo(listOf(pointerInputFilter1))
 
         hit.clear()
 
         // Hit inside layoutNode2
         outerNode.hitTest(Offset(6.1f, 6.1f), hit, true)
 
-        assertThat(hit).isEqualTo(listOf(pointerInputFilter2))
+        assertThat(hit.toFilters()).isEqualTo(listOf(pointerInputFilter2))
     }
 
     /**
@@ -1281,19 +1282,19 @@
         layoutNode2.onNodePlaced()
         layoutNode3.onNodePlaced()
 
-        val hit = mutableListOf<PointerInputFilter>()
+        val hit = mutableListOf<PointerInputModifierNode>()
 
         // Hit outside of layoutNode2, but near layoutNode1
         outerNode.hitTest(Offset(10.1f, 10.1f), hit, true)
 
-        assertThat(hit).isEqualTo(listOf(pointerInputFilter2, pointerInputFilter1))
+        assertThat(hit.toFilters()).isEqualTo(listOf(pointerInputFilter2, pointerInputFilter1))
 
         hit.clear()
 
         // Hit closer to layoutNode3
         outerNode.hitTest(Offset(11.9f, 11.9f), hit, true)
 
-        assertThat(hit).isEqualTo(listOf(pointerInputFilter3))
+        assertThat(hit.toFilters()).isEqualTo(listOf(pointerInputFilter3))
     }
 
     @Test
@@ -1316,19 +1317,19 @@
         layoutNode1.onNodePlaced()
         layoutNode2.onNodePlaced()
 
-        val hit = mutableListOf<PointerInputFilter>()
+        val hit = mutableListOf<PointerInputModifierNode>()
 
         // Hit layoutNode1
         outerNode.hitTest(Offset(3.95f, 3.95f), hit, true)
 
-        assertThat(hit).isEqualTo(listOf(pointerInputFilter1))
+        assertThat(hit.toFilters()).isEqualTo(listOf(pointerInputFilter1))
 
         hit.clear()
 
         // Hit layoutNode2
         outerNode.hitTest(Offset(4.05f, 4.05f), hit, true)
 
-        assertThat(hit).isEqualTo(listOf(pointerInputFilter2))
+        assertThat(hit.toFilters()).isEqualTo(listOf(pointerInputFilter2))
     }
 
     @Test
@@ -1345,12 +1346,12 @@
             ).apply {
                 attach(MockOwner())
             }
-        val hit = HitTestResult<SemanticsEntity>()
+        val hit = HitTestResult<SemanticsModifierNode>()
 
         layoutNode.hitTestSemantics(Offset(-3f, 3f), hit)
 
         assertThat(hit).hasSize(1)
-        assertThat(hit[0].modifier).isEqualTo(semanticsModifier)
+//        assertThat(hit[0].modifier).isEqualTo(semanticsModifier)
     }
 
     @Test
@@ -1363,25 +1364,27 @@
         val layoutNode = LayoutNode(0, 0, 1, 1, semanticsModifier, DpSize(48.dp, 48.dp))
         outerNode.add(layoutNode)
         layoutNode.onNodePlaced()
-        val hit = HitTestResult<SemanticsEntity>()
+        val hit = HitTestResult<SemanticsModifierNode>()
 
         layoutNode.hitTestSemantics(Offset(-3f, 3f), hit)
 
         assertThat(hit).hasSize(1)
-        assertThat(hit[0].modifier).isEqualTo(semanticsModifier)
+        assertThat(hit[0].toModifier()).isEqualTo(semanticsModifier)
     }
 
     @Test
     fun hitTestSemantics_pointerInMinimumTouchTarget_closestHit() {
         val semanticsConfiguration = SemanticsConfiguration()
-        val semanticsModifier1 = object : SemanticsModifier {
+        val semanticsModifier1 = object : SemanticsModifierNode, Modifier.Node() {
             override val semanticsConfiguration: SemanticsConfiguration = semanticsConfiguration
         }
-        val semanticsModifier2 = object : SemanticsModifier {
+        val semanticsModifier2 = object : SemanticsModifierNode, Modifier.Node() {
             override val semanticsConfiguration: SemanticsConfiguration = semanticsConfiguration
         }
-        val layoutNode1 = LayoutNode(0, 0, 5, 5, semanticsModifier1, DpSize(48.dp, 48.dp))
-        val layoutNode2 = LayoutNode(6, 6, 11, 11, semanticsModifier2, DpSize(48.dp, 48.dp))
+        val semanticsModifierElement1 = modifierElementOf(null, { semanticsModifier1 }, { })
+        val semanticsModifierElement2 = modifierElementOf(null, { 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()) }
         outerNode.add(layoutNode1)
         outerNode.add(layoutNode2)
@@ -1389,46 +1392,46 @@
         layoutNode2.onNodePlaced()
 
         // Hit closer to layoutNode1
-        val hit1 = HitTestResult<SemanticsEntity>()
+        val hit1 = HitTestResult<SemanticsModifierNode>()
         outerNode.hitTestSemantics(Offset(5.1f, 5.5f), hit1, true)
 
         assertThat(hit1).hasSize(1)
-        assertThat(hit1[0].modifier).isEqualTo(semanticsModifier1)
+        assertThat(hit1[0]).isEqualTo(semanticsModifier1)
 
         // Hit closer to layoutNode2
-        val hit2 = HitTestResult<SemanticsEntity>()
+        val hit2 = HitTestResult<SemanticsModifierNode>()
         outerNode.hitTestSemantics(Offset(5.9f, 5.5f), hit2, true)
 
         assertThat(hit2).hasSize(1)
-        assertThat(hit2[0].modifier).isEqualTo(semanticsModifier2)
+        assertThat(hit2[0]).isEqualTo(semanticsModifier2)
 
         // Hit closer to layoutNode1
-        val hit3 = HitTestResult<SemanticsEntity>()
+        val hit3 = HitTestResult<SemanticsModifierNode>()
         outerNode.hitTestSemantics(Offset(5.5f, 5.1f), hit3, true)
 
         assertThat(hit3).hasSize(1)
-        assertThat(hit3[0].modifier).isEqualTo(semanticsModifier1)
+        assertThat(hit3[0]).isEqualTo(semanticsModifier1)
 
         // Hit closer to layoutNode2
-        val hit4 = HitTestResult<SemanticsEntity>()
+        val hit4 = HitTestResult<SemanticsModifierNode>()
         outerNode.hitTestSemantics(Offset(5.5f, 5.9f), hit4, true)
 
         assertThat(hit4).hasSize(1)
-        assertThat(hit4[0].modifier).isEqualTo(semanticsModifier2)
+        assertThat(hit4[0]).isEqualTo(semanticsModifier2)
 
         // Hit inside layoutNode1
-        val hit5 = HitTestResult<SemanticsEntity>()
+        val hit5 = HitTestResult<SemanticsModifierNode>()
         outerNode.hitTestSemantics(Offset(4.9f, 4.9f), hit5, true)
 
         assertThat(hit5).hasSize(1)
-        assertThat(hit5[0].modifier).isEqualTo(semanticsModifier1)
+        assertThat(hit5[0]).isEqualTo(semanticsModifier1)
 
         // Hit inside layoutNode2
-        val hit6 = HitTestResult<SemanticsEntity>()
+        val hit6 = HitTestResult<SemanticsModifierNode>()
         outerNode.hitTestSemantics(Offset(6.1f, 6.1f), hit6, true)
 
         assertThat(hit6).hasSize(1)
-        assertThat(hit6[0].modifier).isEqualTo(semanticsModifier2)
+        assertThat(hit6[0]).isEqualTo(semanticsModifier2)
     }
 
     @Test
@@ -1449,18 +1452,18 @@
         layoutNode2.onNodePlaced()
 
         // Hit layoutNode1
-        val hit1 = HitTestResult<SemanticsEntity>()
+        val hit1 = HitTestResult<SemanticsModifierNode>()
         outerNode.hitTestSemantics(Offset(3.95f, 3.95f), hit1, true)
 
         assertThat(hit1).hasSize(1)
-        assertThat(hit1[0].modifier).isEqualTo(semanticsModifier1)
+        assertThat(hit1[0].toModifier()).isEqualTo(semanticsModifier1)
 
         // Hit layoutNode2
-        val hit2 = HitTestResult<SemanticsEntity>()
+        val hit2 = HitTestResult<SemanticsModifierNode>()
         outerNode.hitTestSemantics(Offset(4.05f, 4.05f), hit2, true)
 
         assertThat(hit2).hasSize(1)
-        assertThat(hit2[0].modifier).isEqualTo(semanticsModifier2)
+        assertThat(hit2[0].toModifier()).isEqualTo(semanticsModifier2)
     }
 
     @Test
@@ -1473,7 +1476,7 @@
             ).apply {
                 attach(MockOwner())
             }
-        val hit = mutableListOf<PointerInputFilter>()
+        val hit = mutableListOf<PointerInputModifierNode>()
 
         layoutNode.hitTest(Offset(-1f, -1f), hit)
         layoutNode.hitTest(Offset(0f, -1f), hit)
@@ -1501,7 +1504,7 @@
             ).apply {
                 attach(MockOwner())
             }
-        val hit = mutableListOf<PointerInputFilter>()
+        val hit = mutableListOf<PointerInputModifierNode>()
 
         layoutNode.hitTest(Offset(-3f, -5f), hit)
         layoutNode.hitTest(Offset(0f, -5f), hit)
@@ -1576,7 +1579,7 @@
             else -> throw IllegalStateException()
         }
 
-        val hit = mutableListOf<PointerInputFilter>()
+        val hit = mutableListOf<PointerInputModifierNode>()
 
         // Act.
 
@@ -1586,7 +1589,7 @@
 
         when (numberOfChildrenHit) {
             3 ->
-                assertThat(hit)
+                assertThat(hit.toFilters())
                     .isEqualTo(
                         listOf(
                             parentPointerInputFilter,
@@ -1595,7 +1598,7 @@
                         )
                     )
             2 ->
-                assertThat(hit)
+                assertThat(hit.toFilters())
                     .isEqualTo(
                         listOf(
                             parentPointerInputFilter,
@@ -1603,7 +1606,7 @@
                         )
                     )
             1 ->
-                assertThat(hit)
+                assertThat(hit.toFilters())
                     .isEqualTo(
                         listOf(
                             parentPointerInputFilter
@@ -1666,8 +1669,8 @@
         val offset1 = Offset(25f, 25f)
         val offset2 = Offset(75f, 75f)
 
-        val hit1 = mutableListOf<PointerInputFilter>()
-        val hit2 = mutableListOf<PointerInputFilter>()
+        val hit1 = mutableListOf<PointerInputModifierNode>()
+        val hit2 = mutableListOf<PointerInputModifierNode>()
 
         // Act
 
@@ -1676,8 +1679,8 @@
 
         // Assert
 
-        assertThat(hit1).isEqualTo(listOf(childPointerInputFilter1))
-        assertThat(hit2).isEqualTo(listOf(childPointerInputFilter2))
+        assertThat(hit1.toFilters()).isEqualTo(listOf(childPointerInputFilter1))
+        assertThat(hit2.toFilters()).isEqualTo(listOf(childPointerInputFilter2))
     }
 
     /**
@@ -1747,17 +1750,17 @@
         val offset2 = Offset(75f, 75f)
         val offset3 = Offset(125f, 125f)
 
-        val hit1 = mutableListOf<PointerInputFilter>()
-        val hit2 = mutableListOf<PointerInputFilter>()
-        val hit3 = mutableListOf<PointerInputFilter>()
+        val hit1 = mutableListOf<PointerInputModifierNode>()
+        val hit2 = mutableListOf<PointerInputModifierNode>()
+        val hit3 = mutableListOf<PointerInputModifierNode>()
 
         parentLayoutNode.hitTest(offset1, hit1)
         parentLayoutNode.hitTest(offset2, hit2)
         parentLayoutNode.hitTest(offset3, hit3)
 
-        assertThat(hit1).isEqualTo(listOf(childPointerInputFilter1))
-        assertThat(hit2).isEqualTo(listOf(childPointerInputFilter2))
-        assertThat(hit3).isEqualTo(listOf(childPointerInputFilter3))
+        assertThat(hit1.toFilters()).isEqualTo(listOf(childPointerInputFilter1))
+        assertThat(hit2.toFilters()).isEqualTo(listOf(childPointerInputFilter2))
+        assertThat(hit3.toFilters()).isEqualTo(listOf(childPointerInputFilter3))
     }
 
     /**
@@ -1811,9 +1814,9 @@
         val offset2 = Offset(50f, 75f)
         val offset3 = Offset(50f, 125f)
 
-        val hit1 = mutableListOf<PointerInputFilter>()
-        val hit2 = mutableListOf<PointerInputFilter>()
-        val hit3 = mutableListOf<PointerInputFilter>()
+        val hit1 = mutableListOf<PointerInputModifierNode>()
+        val hit2 = mutableListOf<PointerInputModifierNode>()
+        val hit3 = mutableListOf<PointerInputModifierNode>()
 
         // Act
 
@@ -1823,9 +1826,9 @@
 
         // Assert
 
-        assertThat(hit1).isEqualTo(listOf(childPointerInputFilter1))
-        assertThat(hit2).isEqualTo(listOf(childPointerInputFilter2))
-        assertThat(hit3).isEqualTo(listOf(childPointerInputFilter1))
+        assertThat(hit1.toFilters()).isEqualTo(listOf(childPointerInputFilter1))
+        assertThat(hit2.toFilters()).isEqualTo(listOf(childPointerInputFilter2))
+        assertThat(hit3.toFilters()).isEqualTo(listOf(childPointerInputFilter1))
     }
 
     /**
@@ -1875,9 +1878,9 @@
         val offset2 = Offset(75f, 50f)
         val offset3 = Offset(125f, 50f)
 
-        val hit1 = mutableListOf<PointerInputFilter>()
-        val hit2 = mutableListOf<PointerInputFilter>()
-        val hit3 = mutableListOf<PointerInputFilter>()
+        val hit1 = mutableListOf<PointerInputModifierNode>()
+        val hit2 = mutableListOf<PointerInputModifierNode>()
+        val hit3 = mutableListOf<PointerInputModifierNode>()
 
         // Act
 
@@ -1887,9 +1890,9 @@
 
         // Assert
 
-        assertThat(hit1).isEqualTo(listOf(childPointerInputFilter1))
-        assertThat(hit2).isEqualTo(listOf(childPointerInputFilter2))
-        assertThat(hit3).isEqualTo(listOf(childPointerInputFilter1))
+        assertThat(hit1.toFilters()).isEqualTo(listOf(childPointerInputFilter1))
+        assertThat(hit2.toFilters()).isEqualTo(listOf(childPointerInputFilter2))
+        assertThat(hit3.toFilters()).isEqualTo(listOf(childPointerInputFilter1))
     }
 
     /**
@@ -1989,32 +1992,32 @@
                 Offset(4f, 3f)
             )
 
-        val hit = mutableListOf<PointerInputFilter>()
+        val hit = mutableListOf<PointerInputModifierNode>()
 
         // Act and Assert
 
         offsetsThatHit1.forEach {
             hit.clear()
             parentLayoutNode.hitTest(it, hit)
-            assertThat(hit).isEqualTo(listOf(pointerInputFilter1))
+            assertThat(hit.toFilters()).isEqualTo(listOf(pointerInputFilter1))
         }
 
         offsetsThatHit2.forEach {
             hit.clear()
             parentLayoutNode.hitTest(it, hit)
-            assertThat(hit).isEqualTo(listOf(pointerInputFilter2))
+            assertThat(hit.toFilters()).isEqualTo(listOf(pointerInputFilter2))
         }
 
         offsetsThatHit3.forEach {
             hit.clear()
             parentLayoutNode.hitTest(it, hit)
-            assertThat(hit).isEqualTo(listOf(pointerInputFilter3))
+            assertThat(hit.toFilters()).isEqualTo(listOf(pointerInputFilter3))
         }
 
         offsetsThatHit4.forEach {
             hit.clear()
             parentLayoutNode.hitTest(it, hit)
-            assertThat(hit).isEqualTo(listOf(pointerInputFilter4))
+            assertThat(hit.toFilters()).isEqualTo(listOf(pointerInputFilter4))
         }
     }
 
@@ -2045,7 +2048,7 @@
 
         val offset1 = Offset(50f, 75f)
 
-        val hit = mutableListOf<PointerInputFilter>()
+        val hit = mutableListOf<PointerInputModifierNode>()
 
         // Act.
 
@@ -2053,7 +2056,7 @@
 
         // Assert.
 
-        assertThat(hit).isEqualTo(
+        assertThat(hit.toFilters()).isEqualTo(
             listOf(
                 pointerInputFilter1,
                 pointerInputFilter2,
@@ -2092,7 +2095,7 @@
         layoutNode1.onNodePlaced()
         val offset1 = Offset(499f, 499f)
 
-        val hit = mutableListOf<PointerInputFilter>()
+        val hit = mutableListOf<PointerInputModifierNode>()
 
         // Act.
 
@@ -2100,7 +2103,7 @@
 
         // Assert.
 
-        assertThat(hit).isEqualTo(listOf(pointerInputFilter))
+        assertThat(hit.toFilters()).isEqualTo(listOf(pointerInputFilter))
     }
 
     @Test
@@ -2151,7 +2154,7 @@
 
         val offset1 = Offset(499f, 499f)
 
-        val hit = mutableListOf<PointerInputFilter>()
+        val hit = mutableListOf<PointerInputModifierNode>()
 
         // Act.
 
@@ -2159,7 +2162,7 @@
 
         // Assert.
 
-        assertThat(hit).isEqualTo(
+        assertThat(hit.toFilters()).isEqualTo(
             listOf(
                 pointerInputFilter3,
                 pointerInputFilter4,
@@ -2198,7 +2201,7 @@
 
         val offset = Offset(50f, 50f)
 
-        val hit = mutableListOf<PointerInputFilter>()
+        val hit = mutableListOf<PointerInputModifierNode>()
 
         // Act.
 
@@ -2206,7 +2209,7 @@
 
         // Assert.
 
-        assertThat(hit).isEqualTo(listOf(pointerInputFilter2))
+        assertThat(hit.toFilters()).isEqualTo(listOf(pointerInputFilter2))
     }
 
     @Test
@@ -2225,7 +2228,7 @@
 
         val offset = Offset.Zero
 
-        val hit = mutableListOf<PointerInputFilter>()
+        val hit = mutableListOf<PointerInputModifierNode>()
 
         // Act.
 
@@ -2233,7 +2236,7 @@
 
         // Assert.
 
-        assertThat(hit).isEmpty()
+        assertThat(hit.toFilters()).isEmpty()
     }
 
     @Test
@@ -2272,7 +2275,7 @@
         parent.remeasure()
         parent.replace()
 
-        val hit = mutableListOf<PointerInputFilter>()
+        val hit = mutableListOf<PointerInputModifierNode>()
 
         // Act.
 
@@ -2280,7 +2283,7 @@
 
         // Assert.
 
-        assertThat(hit).isEqualTo(listOf(pointerInputFilter1))
+        assertThat(hit.toFilters()).isEqualTo(listOf(pointerInputFilter1))
     }
 
     @Test
@@ -2324,23 +2327,29 @@
         val root = LayoutNode()
         root.modifier = modifier1.then(modifier2)
 
-        val wrapper1 = root.outerLayoutNodeWrapper
-        val wrapper2 = root.outerLayoutNodeWrapper.wrapped
+        val wrapper1 = root.outerCoordinator
+        val wrapper2 = root.outerCoordinator.wrapped
 
-        assertEquals(modifier1, (wrapper1 as ModifiedLayoutNode).modifier)
-        assertEquals(modifier2, (wrapper2 as ModifiedLayoutNode).modifier)
-
-        root.modifier = modifier2.then(modifier1)
-
-        assertEquals(wrapper2, root.outerLayoutNodeWrapper)
-        assertEquals(wrapper1, root.outerLayoutNodeWrapper.wrapped)
         assertEquals(
             modifier1,
-            (root.outerLayoutNodeWrapper.wrapped as ModifiedLayoutNode).modifier
+            (wrapper1 as LayoutModifierNodeCoordinator).layoutModifierNode.toModifier()
         )
         assertEquals(
             modifier2,
-            (root.outerLayoutNodeWrapper as ModifiedLayoutNode).modifier
+            (wrapper2 as LayoutModifierNodeCoordinator).layoutModifierNode.toModifier()
+        )
+
+        root.modifier = modifier2.then(modifier1)
+
+        assertEquals(
+            modifier1,
+            (root.outerCoordinator.wrapped as LayoutModifierNodeCoordinator)
+                .layoutModifierNode
+                .toModifier()
+        )
+        assertEquals(
+            modifier2,
+            (root.outerCoordinator as LayoutModifierNodeCoordinator).layoutModifierNode.toModifier()
         )
     }
 
@@ -2349,7 +2358,7 @@
         val node = LayoutNode(20, 20, 100, 100)
         val owner = MockOwner()
         node.attach(owner)
-        node.innerLayoutNodeWrapper.measureResult = object : MeasureResult {
+        node.innerCoordinator.measureResult = object : MeasureResult {
             override val width = 50
             override val height = 50
             override val alignmentLines: Map<AlignmentLine, Int> get() = mapOf()
@@ -2366,13 +2375,13 @@
         val owner = MockOwner()
         node.attach(owner)
         assertEquals(0, owner.layoutChangeCount)
-        node.innerLayoutNodeWrapper.onLayerBlockUpdated { scaleX = 0.5f }
+        node.innerCoordinator.onLayerBlockUpdated { scaleX = 0.5f }
         assertEquals(1, owner.layoutChangeCount)
         repeat(2) {
-            node.innerLayoutNodeWrapper.onLayerBlockUpdated { scaleX = 1f }
+            node.innerCoordinator.onLayerBlockUpdated { scaleX = 1f }
         }
         assertEquals(2, owner.layoutChangeCount)
-        node.innerLayoutNodeWrapper.onLayerBlockUpdated(null)
+        node.innerCoordinator.onLayerBlockUpdated(null)
         assertEquals(3, owner.layoutChangeCount)
     }
 
@@ -2399,13 +2408,13 @@
         val owner = MockOwner()
         node.attach(owner)
         node.modifier = a
-        assertEquals(3, node.getModifierInfo().size)
+        assertEquals(2, node.getModifierInfo().size)
         node.modifier = b
-        assertEquals(3, node.getModifierInfo().size)
+        assertEquals(2, node.getModifierInfo().size)
     }
 
     @Test
-    fun layoutNodeWrapper_alpha() {
+    fun nodeCoordinator_alpha() {
         val root = LayoutNode().apply { this.modifier = Modifier.drawBehind {} }
         val layoutNode1 = LayoutNode().apply {
             this.modifier = Modifier.graphicsLayer { }.graphicsLayer { }.drawBehind {}
@@ -2418,17 +2427,17 @@
         root.attach(owner)
 
         // provide alpha to the graphics layer
-        layoutNode1.outerLayoutNodeWrapper.wrapped!!.onLayerBlockUpdated {
+        layoutNode1.outerCoordinator.wrapped!!.onLayerBlockUpdated {
             alpha = 0f
         }
-        layoutNode1.outerLayoutNodeWrapper.wrapped!!.wrapped!!.onLayerBlockUpdated {
+        layoutNode1.outerCoordinator.wrapped!!.wrapped!!.onLayerBlockUpdated {
             alpha = 0.5f
         }
 
-        assertFalse(layoutNode1.outerLayoutNodeWrapper.isTransparent())
-        assertTrue(layoutNode1.innerLayoutNodeWrapper.isTransparent())
-        assertTrue(layoutNode2.outerLayoutNodeWrapper.isTransparent())
-        assertTrue(layoutNode2.innerLayoutNodeWrapper.isTransparent())
+        assertFalse(layoutNode1.outerCoordinator.isTransparent())
+        assertTrue(layoutNode1.innerCoordinator.isTransparent())
+        assertTrue(layoutNode2.outerCoordinator.isTransparent())
+        assertTrue(layoutNode2.innerCoordinator.isTransparent())
     }
 
     private fun createSimpleLayout(): Triple<LayoutNode, LayoutNode, LayoutNode> {
@@ -2512,6 +2521,7 @@
         get() = LayoutDirection.Ltr
     override var showLayoutBounds: Boolean = false
     override val snapshotObserver = OwnerSnapshotObserver { it.invoke() }
+    override val modifierLocalManager: ModifierLocalManager = ModifierLocalManager(this)
 
     override fun onRequestMeasure(
         layoutNode: LayoutNode,
@@ -2670,12 +2680,13 @@
     override val sharedDrawScope = LayoutNodeDrawScope()
 }
 
+@OptIn(ExperimentalComposeUiApi::class)
 private fun LayoutNode.hitTest(
     pointerPosition: Offset,
-    hitPointerInputFilters: MutableList<PointerInputFilter>,
+    hitPointerInputFilters: MutableList<PointerInputModifierNode>,
     isTouchEvent: Boolean = false
 ) {
-    val hitTestResult = HitTestResult<PointerInputFilter>()
+    val hitTestResult = HitTestResult<PointerInputModifierNode>()
     hitTest(pointerPosition, hitTestResult, isTouchEvent)
     hitPointerInputFilters.addAll(hitTestResult)
 }
@@ -2702,10 +2713,10 @@
     attach(MockOwner())
     markMeasurePending()
     remeasure(Constraints())
-    var wrapper: LayoutNodeWrapper? = outerLayoutNodeWrapper
+    var wrapper: NodeCoordinator? = outerCoordinator
     while (wrapper != null) {
-        wrapper.measureResult = innerLayoutNodeWrapper.measureResult
-        wrapper = (wrapper as? LayoutNodeWrapper)?.wrapped
+        wrapper.measureResult = innerCoordinator.measureResult
+        wrapper = (wrapper as? NodeCoordinator)?.wrapped
     }
     place(x, y)
     detach()
@@ -2727,3 +2738,27 @@
     override val interceptOutOfBoundsChildEvents: Boolean
         get() = interceptChildEvents
 }
+
+// This returns the corresponding modifier that produced the PointerInputNode. This is only
+// possible for PointerInputNodes that are BackwardsCompatNodes and once we refactor the
+// pointerInput modifier to use Modifier.Nodes directly, the tests that use this should be rewritten
+@OptIn(ExperimentalComposeUiApi::class)
+fun PointerInputModifierNode.toFilter(): PointerInputFilter {
+    val node = this as? BackwardsCompatNode
+        ?: error("Incorrectly assumed PointerInputNode was a BackwardsCompatNode")
+    val modifier = node.element as? PointerInputModifier
+        ?: error("Incorrectly assumed Modifier.Element was a PointerInputModifier")
+    return modifier.pointerInputFilter
+}
+@OptIn(ExperimentalComposeUiApi::class)
+fun List<PointerInputModifierNode>.toFilters(): List<PointerInputFilter> = map { it.toFilter() }
+
+// This returns the corresponding modifier that produced the Node. This is only possible for
+// Nodes that are BackwardsCompatNodes and once we refactor semantics / pointer input to use
+// Modifier.Nodes directly, the tests that use this should be rewritten
+@OptIn(ExperimentalComposeUiApi::class)
+fun DelegatableNode.toModifier(): Modifier.Element {
+    val node = node as? BackwardsCompatNode
+        ?: error("Incorrectly assumed Modifier.Node was a BackwardsCompatNode")
+    return node.element
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/node/ModifierLocalConsumerEntityTest.kt b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/node/ModifierLocalConsumerEntityTest.kt
index c7301e1..0358c58 100644
--- a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/node/ModifierLocalConsumerEntityTest.kt
+++ b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/node/ModifierLocalConsumerEntityTest.kt
@@ -32,6 +32,7 @@
 import androidx.compose.ui.input.InputModeManager
 import androidx.compose.ui.input.key.KeyEvent
 import androidx.compose.ui.input.pointer.PointerIconService
+import androidx.compose.ui.modifier.ModifierLocalManager
 import androidx.compose.ui.modifier.modifierLocalConsumer
 import androidx.compose.ui.modifier.modifierLocalOf
 import androidx.compose.ui.modifier.modifierLocalProvider
@@ -279,9 +280,9 @@
 
     private fun changeModifier(modifier: Modifier) {
         with(layoutNode) {
-            if (isAttached) { forEachLayoutNodeWrapper { it.detach() } }
+            if (isAttached) { forEachNodeCoordinator { it.detach() } }
             this.modifier = modifier
-            if (isAttached) { forEachLayoutNodeWrapper { it.attach() } }
+            if (isAttached) { forEachNodeCoordinator { it.attach() } }
             owner?.onEndApplyChanges()
         }
     }
@@ -292,6 +293,9 @@
         @OptIn(InternalCoreApi::class)
         override var showLayoutBounds: Boolean = false
         override val snapshotObserver: OwnerSnapshotObserver = OwnerSnapshotObserver { it.invoke() }
+
+        override val modifierLocalManager: ModifierLocalManager = ModifierLocalManager(this)
+
         override fun registerOnEndApplyChangesListener(listener: () -> Unit) {
             listeners += listener
         }
@@ -311,8 +315,8 @@
             affectsLookahead: Boolean,
             forceRequest: Boolean
         ) {}
-        override fun onAttach(node: LayoutNode) = node.forEachLayoutNodeWrapper { it.attach() }
-        override fun onDetach(node: LayoutNode) = node.forEachLayoutNodeWrapper { it.detach() }
+        override fun onAttach(node: LayoutNode) = node.forEachNodeCoordinator { it.attach() }
+        override fun onDetach(node: LayoutNode) = node.forEachNodeCoordinator { it.detach() }
 
         override val root: LayoutNode
             get() = TODO("Not yet implemented")
@@ -396,10 +400,10 @@
     }
 }
 
-private fun LayoutNode.forEachLayoutNodeWrapper(action: (LayoutNodeWrapper) -> Unit) {
-    var layoutNodeWrapper: LayoutNodeWrapper? = outerLayoutNodeWrapper
-    while (layoutNodeWrapper != null) {
-        action.invoke(layoutNodeWrapper)
-        layoutNodeWrapper = layoutNodeWrapper.wrapped
+private fun LayoutNode.forEachNodeCoordinator(action: (NodeCoordinator) -> Unit) {
+    var coordinator: NodeCoordinator? = outerCoordinator
+    while (coordinator != null) {
+        action.invoke(coordinator)
+        coordinator = coordinator.wrapped
     }
 }
diff --git a/core/core-google-shortcuts/build.gradle b/core/core-google-shortcuts/build.gradle
index d1da793..751c880 100644
--- a/core/core-google-shortcuts/build.gradle
+++ b/core/core-google-shortcuts/build.gradle
@@ -39,8 +39,8 @@
 
     implementation "com.google.android.gms:play-services-appindex:16.1.0"
     implementation("com.google.crypto.tink:tink-android:1.5.0")
-    implementation projectOrArtifact(":appsearch:appsearch")
-    implementation projectOrArtifact(":appsearch:appsearch-builtin-types")
+    implementation "androidx.appsearch:appsearch:1.1.0-alpha01"
+    implementation "androidx.appsearch:appsearch-builtin-types:1.1.0-alpha01"
 
     androidTestImplementation(libs.testExtJunit)
     androidTestImplementation(libs.testCore)
diff --git a/core/core-i18n/src/androidTest/java/androidx/core/i18n/CheckTheJavaApisTest.java b/core/core-i18n/src/androidTest/java/androidx/core/i18n/CheckTheJavaApisTest.java
index eae3b96..782cd06 100644
--- a/core/core-i18n/src/androidTest/java/androidx/core/i18n/CheckTheJavaApisTest.java
+++ b/core/core-i18n/src/androidTest/java/androidx/core/i18n/CheckTheJavaApisTest.java
@@ -36,6 +36,9 @@
 import androidx.test.filters.SmallTest;
 import androidx.test.platform.app.InstrumentationRegistry;
 
+import org.junit.After;
+import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -49,6 +52,7 @@
  */
 @RunWith(AndroidJUnit4.class)
 public class CheckTheJavaApisTest {
+    private static TimeZone sSavedTimeZone;
     private final Context mAppContext =
             InstrumentationRegistry.getInstrumentation().getTargetContext();
     private final Locale mLocale = Locale.GERMANY;
@@ -59,6 +63,26 @@
         mCal.set(Calendar.MILLISECOND, 123);
     }
 
+    @BeforeClass
+    public static void beforeClass() {
+        sSavedTimeZone = TimeZone.getDefault();
+    }
+
+    @Before
+    public void beforeTest() {
+        // Some of the test check that the functionality honors the default timezone.
+        // So we make sure it is set to something we control.
+        TimeZone tzLosAngeles = TimeZone.getTimeZone("America/Los_Angeles");
+        TimeZone.setDefault(tzLosAngeles);
+    }
+
+    @After
+    public void afterTest() {
+        if (sSavedTimeZone != null) {
+            TimeZone.setDefault(sSavedTimeZone);
+        }
+    }
+
     @Test @SmallTest
     public void testSkeletonOptions() {
         final DateTimeFormatterSkeletonOptions.Builder builder =
diff --git a/core/core-i18n/src/androidTest/java/androidx/core/i18n/DateTimeFormatterTest.kt b/core/core-i18n/src/androidTest/java/androidx/core/i18n/DateTimeFormatterTest.kt
index bb07378..cb0ccc9 100644
--- a/core/core-i18n/src/androidTest/java/androidx/core/i18n/DateTimeFormatterTest.kt
+++ b/core/core-i18n/src/androidTest/java/androidx/core/i18n/DateTimeFormatterTest.kt
@@ -25,8 +25,10 @@
 import androidx.test.filters.SdkSuppress
 import androidx.test.filters.SmallTest
 import androidx.test.platform.app.InstrumentationRegistry
-import kotlin.test.assertFailsWith
+import org.junit.After
 import org.junit.Assert.assertEquals
+import org.junit.Before
+import org.junit.BeforeClass
 import org.junit.Test
 import org.junit.runner.RunWith
 import java.util.Calendar
@@ -34,6 +36,7 @@
 import java.util.GregorianCalendar
 import java.util.Locale
 import java.util.TimeZone
+import kotlin.test.assertFailsWith
 import androidx.core.i18n.DateTimeFormatterSkeletonOptions as SkeletonOptions
 
 /** Must execute on an Android device. */
@@ -48,6 +51,13 @@
         private const val AVAILABLE_ICU4J = Build.VERSION_CODES.N
         private const val AVAILABLE_HC_U_EXT = Build.VERSION_CODES.S
         private const val AVAILABLE_PERIOD_B = Build.VERSION_CODES.Q
+
+        private var sSavedTimeZone: TimeZone? = null
+
+        @BeforeClass
+        fun beforeClass() {
+            sSavedTimeZone = TimeZone.getDefault()
+        }
     }
 
     /** Starting with Android N ICU4J is public API. */
@@ -60,18 +70,31 @@
     private val logTag = this::class.qualifiedName
     private val appContext = InstrumentationRegistry.getInstrumentation().targetContext
 
-    private val testCalendar = GregorianCalendar(
-        2021, Calendar.SEPTEMBER, 19, // Date
-        21, 42, 12 // Time
-    )
+    private val defaultTimeZone = TimeZone.getTimeZone("America/Los_Angeles")
+    private val testCalendar = GregorianCalendar(defaultTimeZone)
 
     init {
-        testCalendar.timeInMillis = testCalendar.timeInMillis + 345
+        // Sept 19, 2021, 21:42:12.345
+        testCalendar.timeInMillis = 1632112932345L
     }
 
     private val testDate = testCalendar.time
     private val testMillis = testCalendar.timeInMillis
 
+    @Before
+    fun beforeTest() {
+        // Some of the test check that the functionality honors the default timezone.
+        // So we make sure it is set to something we control.
+        TimeZone.setDefault(defaultTimeZone)
+    }
+
+    @After
+    fun afterTest() {
+        if (sSavedTimeZone != null) {
+            TimeZone.setDefault(sSavedTimeZone)
+        }
+    }
+
     @Test @SmallTest
     fun test() {
         val locale = Locale.US
@@ -408,6 +431,39 @@
     }
 
     @Test @SmallTest
+    // Making sure the APIs honor the default timezone
+    fun testDefaultTimeZone() {
+        val options = SkeletonOptions.Builder()
+            .setHour(SkeletonOptions.Hour.NUMERIC)
+            .setMinute(SkeletonOptions.Minute.NUMERIC)
+            .setTimezone(SkeletonOptions.Timezone.LONG)
+            .build()
+        val locale = Locale.US
+
+        // Honor the current default timezone
+        val expPDT = "9:42 PM Pacific Daylight Time"
+        // Test Calendar, Date, and milliseconds
+        assertEquals(expPDT, DateTimeFormatter(appContext, options, locale).format(testCalendar))
+        assertEquals(expPDT, DateTimeFormatter(appContext, options, locale).format(testDate))
+        assertEquals(expPDT, DateTimeFormatter(appContext, options, locale).format(testMillis))
+
+        // Change the default timezone.
+        TimeZone.setDefault(TimeZone.getTimeZone("America/Denver"))
+        val expMDT = "10:42 PM Mountain Daylight Time"
+        // The calendar object already has a time zone of its own, captured at creation time.
+        // So not matching the default changed after is the expected behavior.
+        // BUT!
+        // Below N there is no ICU, so we fallback to `java.text.DateFormat`.
+        // Which can't format a Calendar, only Date and Number (millisecond, epoch time)
+        // So the time zone info is lost below N. It is the best we can do.
+        val expCal = if (isIcuAvailable) expPDT else expMDT
+        assertEquals(expCal, DateTimeFormatter(appContext, options, locale).format(testCalendar))
+        assertEquals(expMDT, DateTimeFormatter(appContext, options, locale).format(testDate))
+        assertEquals(expMDT, DateTimeFormatter(appContext, options, locale).format(testMillis))
+        // The default timezone is restored in @Before, no need to change it back
+    }
+
+    @Test @SmallTest
     fun testEmptySkeleton() {
         val options = SkeletonOptions.fromString("")
         assertEquals("",
diff --git a/core/core-remoteviews/api/1.0.0-beta03.txt b/core/core-remoteviews/api/1.0.0-beta03.txt
new file mode 100644
index 0000000..58dee29
--- /dev/null
+++ b/core/core-remoteviews/api/1.0.0-beta03.txt
@@ -0,0 +1,294 @@
+// Signature format: 4.0
+package androidx.core.widget {
+
+  public final class AppWidgetManagerCompat {
+    method public static android.widget.RemoteViews createExactSizeAppWidget(android.appwidget.AppWidgetManager appWidgetManager, int appWidgetId, kotlin.jvm.functions.Function1<? super androidx.core.util.SizeFCompat,? extends android.widget.RemoteViews> factory);
+    method public static android.widget.RemoteViews createResponsiveSizeAppWidget(android.appwidget.AppWidgetManager appWidgetManager, int appWidgetId, java.util.Collection<androidx.core.util.SizeFCompat> dpSizes, kotlin.jvm.functions.Function1<? super androidx.core.util.SizeFCompat,? extends android.widget.RemoteViews> factory);
+    method public static void updateAppWidget(android.appwidget.AppWidgetManager, int appWidgetId, kotlin.jvm.functions.Function1<? super androidx.core.util.SizeFCompat,? extends android.widget.RemoteViews> factory);
+    method public static void updateAppWidget(android.appwidget.AppWidgetManager, int appWidgetId, java.util.Collection<androidx.core.util.SizeFCompat> dpSizes, kotlin.jvm.functions.Function1<? super androidx.core.util.SizeFCompat,? extends android.widget.RemoteViews> factory);
+  }
+
+  public final class RemoteViewsCompat {
+    method public static void setChronometerBase(android.widget.RemoteViews, @IdRes int viewId, long base);
+    method public static void setChronometerFormat(android.widget.RemoteViews, @IdRes int viewId, String? format);
+    method @RequiresApi(31) public static void setCompoundButtonDrawable(android.widget.RemoteViews, @IdRes int viewId, @DrawableRes int resId);
+    method @RequiresApi(31) public static void setCompoundButtonIcon(android.widget.RemoteViews, @IdRes int viewId, android.graphics.drawable.Icon? icon);
+    method @RequiresApi(31) public static void setCompoundButtonTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? tintMode);
+    method @RequiresApi(31) public static void setCompoundButtonTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setCompoundButtonTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNight, android.content.res.ColorStateList? night);
+    method @RequiresApi(31) public static void setCompoundButtonTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setCompoundButtonTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setFrameLayoutForegroundGravity(android.widget.RemoteViews, @IdRes int viewId, int foregroundGravity);
+    method public static void setFrameLayoutMeasureAllChildren(android.widget.RemoteViews, @IdRes int viewId, boolean measureAll);
+    method @RequiresApi(31) public static void setGridLayoutAlignmentMode(android.widget.RemoteViews, @IdRes int viewId, int alignmentMode);
+    method @RequiresApi(31) public static void setGridLayoutColumnCount(android.widget.RemoteViews, @IdRes int viewId, int columnCount);
+    method @RequiresApi(31) public static void setGridLayoutRowCount(android.widget.RemoteViews, @IdRes int viewId, int rowCount);
+    method @RequiresApi(31) public static void setGridViewColumnWidth(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setGridViewColumnWidthDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int columnWidth);
+    method @RequiresApi(31) public static void setGridViewColumnWidthDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int columnWidth);
+    method @RequiresApi(31) public static void setGridViewGravity(android.widget.RemoteViews, @IdRes int viewId, int gravity);
+    method @RequiresApi(31) public static void setGridViewHorizontalSpacing(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setGridViewHorizontalSpacingDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setGridViewHorizontalSpacingDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setGridViewNumColumns(android.widget.RemoteViews, @IdRes int viewId, int numColumns);
+    method @RequiresApi(31) public static void setGridViewStretchMode(android.widget.RemoteViews, @IdRes int viewId, int stretchMode);
+    method @RequiresApi(31) public static void setGridViewVerticalSpacing(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setGridViewVerticalSpacingDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setGridViewVerticalSpacingDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setImageViewAdjustViewBounds(android.widget.RemoteViews, @IdRes int viewId, boolean adjustViewBounds);
+    method public static void setImageViewColorFilter(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int color);
+    method @RequiresApi(31) public static void setImageViewColorFilter(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int notNight, @ColorInt int night);
+    method @RequiresApi(31) public static void setImageViewColorFilterAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setImageViewColorFilterResource(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method public static void setImageViewImageAlpha(android.widget.RemoteViews, @IdRes int viewId, int alpha);
+    method public static void setImageViewImageLevel(android.widget.RemoteViews, @IdRes int viewId, int level);
+    method @RequiresApi(31) public static void setImageViewImageTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? blendMode);
+    method @RequiresApi(31) public static void setImageViewImageTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setImageViewImageTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNightTint, android.content.res.ColorStateList? nightTint);
+    method @RequiresApi(31) public static void setImageViewImageTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setImageViewImageTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setImageViewMaxHeight(android.widget.RemoteViews, @IdRes int viewId, @Px int maxHeight);
+    method @RequiresApi(31) public static void setImageViewMaxHeight(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setImageViewMaxHeightDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setImageViewMaxHeightDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setImageViewMaxWidth(android.widget.RemoteViews, @IdRes int viewId, @Px int maxWidth);
+    method @RequiresApi(31) public static void setImageViewMaxWidth(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setImageViewMaxWidthDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setImageViewMaxWidthDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setLinearLayoutBaselineAligned(android.widget.RemoteViews, @IdRes int viewId, boolean baselineAligned);
+    method public static void setLinearLayoutBaselineAlignedChildIndex(android.widget.RemoteViews, @IdRes int viewId, int i);
+    method public static void setLinearLayoutGravity(android.widget.RemoteViews, @IdRes int viewId, int gravity);
+    method public static void setLinearLayoutHorizontalGravity(android.widget.RemoteViews, @IdRes int viewId, int horizontalGravity);
+    method public static void setLinearLayoutMeasureWithLargestChildEnabled(android.widget.RemoteViews, @IdRes int viewId, boolean enabled);
+    method public static void setLinearLayoutVerticalGravity(android.widget.RemoteViews, @IdRes int viewId, int verticalGravity);
+    method public static void setLinearLayoutWeightSum(android.widget.RemoteViews, @IdRes int viewId, float weightSum);
+    method public static void setProgressBarIndeterminate(android.widget.RemoteViews, @IdRes int viewId, boolean indeterminate);
+    method @RequiresApi(31) public static void setProgressBarIndeterminateTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? blendMode);
+    method @RequiresApi(31) public static void setProgressBarIndeterminateTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setProgressBarIndeterminateTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNightTint, android.content.res.ColorStateList? nightTint);
+    method @RequiresApi(31) public static void setProgressBarIndeterminateTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setProgressBarIndeterminateTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setProgressBarMax(android.widget.RemoteViews, @IdRes int viewId, int max);
+    method @RequiresApi(26) public static void setProgressBarMin(android.widget.RemoteViews, @IdRes int viewId, int min);
+    method public static void setProgressBarProgress(android.widget.RemoteViews, @IdRes int viewId, int progress);
+    method @RequiresApi(31) public static void setProgressBarProgressBackgroundTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? blendMode);
+    method @RequiresApi(31) public static void setProgressBarProgressBackgroundTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setProgressBarProgressBackgroundTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNightTint, android.content.res.ColorStateList? nightTint);
+    method @RequiresApi(31) public static void setProgressBarProgressBackgroundTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setProgressBarProgressBackgroundTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setProgressBarProgressTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? blendMode);
+    method @RequiresApi(31) public static void setProgressBarProgressTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setProgressBarProgressTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNightTint, android.content.res.ColorStateList? nightTint);
+    method @RequiresApi(31) public static void setProgressBarProgressTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setProgressBarProgressTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setProgressBarSecondaryProgress(android.widget.RemoteViews, @IdRes int viewId, int secondaryProgress);
+    method @RequiresApi(31) public static void setProgressBarSecondaryProgressTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? blendMode);
+    method @RequiresApi(31) public static void setProgressBarSecondaryProgressTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setProgressBarSecondaryProgressTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNightTint, android.content.res.ColorStateList? nightTint);
+    method @RequiresApi(31) public static void setProgressBarSecondaryProgressTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setProgressBarSecondaryProgressTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setProgressBarStateDescription(android.widget.RemoteViews, @IdRes int viewId, CharSequence? stateDescription);
+    method @RequiresApi(31) public static void setProgressBarStateDescription(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setProgressBarStateDescriptionAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setRelativeLayoutGravity(android.widget.RemoteViews, @IdRes int viewId, int gravity);
+    method public static void setRelativeLayoutHorizontalGravity(android.widget.RemoteViews, @IdRes int viewId, int horizontalGravity);
+    method public static void setRelativeLayoutIgnoreGravity(android.widget.RemoteViews, @IdRes int viewId, @IdRes int childViewId);
+    method public static void setRelativeLayoutVerticalGravity(android.widget.RemoteViews, @IdRes int viewId, int verticalGravity);
+    method public static void setRemoteAdapter(android.content.Context context, android.widget.RemoteViews remoteViews, int appWidgetId, @IdRes int viewId, androidx.core.widget.RemoteViewsCompat.RemoteCollectionItems items);
+    method @RequiresApi(31) public static void setSwitchMinWidth(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setSwitchMinWidthDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setSwitchMinWidthDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setSwitchPadding(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setSwitchPaddingDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setSwitchPaddingDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setSwitchShowText(android.widget.RemoteViews, @IdRes int viewId, boolean showText);
+    method @RequiresApi(31) public static void setSwitchSplitTrack(android.widget.RemoteViews, @IdRes int viewId, boolean splitTrack);
+    method @RequiresApi(31) public static void setSwitchTextOff(android.widget.RemoteViews, @IdRes int viewId, CharSequence? textOff);
+    method @RequiresApi(31) public static void setSwitchTextOff(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setSwitchTextOffAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setSwitchTextOn(android.widget.RemoteViews, @IdRes int viewId, CharSequence? textOn);
+    method @RequiresApi(31) public static void setSwitchTextOn(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setSwitchTextOnAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setSwitchThumbIcon(android.widget.RemoteViews, @IdRes int viewId, android.graphics.drawable.Icon? icon);
+    method @RequiresApi(31) public static void setSwitchThumbIcon(android.widget.RemoteViews, @IdRes int viewId, android.graphics.drawable.Icon? notNight, android.graphics.drawable.Icon? night);
+    method @RequiresApi(31) public static void setSwitchThumbResource(android.widget.RemoteViews, @IdRes int viewId, @DrawableRes int resId);
+    method @RequiresApi(31) public static void setSwitchThumbTextPadding(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setSwitchThumbTextPaddingDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setSwitchThumbTextPaddingDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setSwitchThumbTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? blendMode);
+    method @RequiresApi(31) public static void setSwitchThumbTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setSwitchThumbTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNight, android.content.res.ColorStateList? night);
+    method @RequiresApi(31) public static void setSwitchThumbTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setSwitchThumbTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setSwitchTrackIcon(android.widget.RemoteViews, @IdRes int viewId, android.graphics.drawable.Icon? icon);
+    method @RequiresApi(31) public static void setSwitchTrackIcon(android.widget.RemoteViews, @IdRes int viewId, android.graphics.drawable.Icon? notNight, android.graphics.drawable.Icon? night);
+    method @RequiresApi(31) public static void setSwitchTrackResource(android.widget.RemoteViews, @IdRes int viewId, @DrawableRes int resId);
+    method @RequiresApi(31) public static void setSwitchTrackTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? blendMode);
+    method @RequiresApi(31) public static void setSwitchTrackTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setSwitchTrackTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNight, android.content.res.ColorStateList? night);
+    method @RequiresApi(31) public static void setSwitchTrackTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setSwitchTrackTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(17) public static void setTextClockFormat12Hour(android.widget.RemoteViews, @IdRes int viewId, CharSequence? format);
+    method @RequiresApi(31) public static void setTextClockFormat12Hour(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setTextClockFormat12HourAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(17) public static void setTextClockFormat24Hour(android.widget.RemoteViews, @IdRes int viewId, CharSequence? format);
+    method @RequiresApi(31) public static void setTextClockFormat24Hour(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setTextClockFormat24HourAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(17) public static void setTextClockTimeZone(android.widget.RemoteViews, @IdRes int viewId, String? timeZone);
+    method @RequiresApi(31) public static void setTextViewAllCaps(android.widget.RemoteViews, @IdRes int viewId, boolean allCaps);
+    method public static void setTextViewAutoLinkMask(android.widget.RemoteViews, @IdRes int viewId, int mask);
+    method @RequiresApi(16) public static void setTextViewCompoundDrawablePadding(android.widget.RemoteViews, @IdRes int viewId, @Px int pad);
+    method @RequiresApi(31) public static void setTextViewCompoundDrawablePadding(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setTextViewCompoundDrawablePaddingDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setTextViewCompoundDrawablePaddingDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewEms(android.widget.RemoteViews, @IdRes int viewId, int ems);
+    method public static void setTextViewError(android.widget.RemoteViews, @IdRes int viewId, CharSequence? error);
+    method @RequiresApi(31) public static void setTextViewError(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setTextViewErrorAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(21) public static void setTextViewFontFeatureSettings(android.widget.RemoteViews, @IdRes int viewId, String fontFeatureSettings);
+    method @RequiresApi(31) public static void setTextViewGravity(android.widget.RemoteViews, @IdRes int viewId, int gravity);
+    method public static void setTextViewHeight(android.widget.RemoteViews, @IdRes int viewId, @Px int pixels);
+    method @RequiresApi(31) public static void setTextViewHeight(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setTextViewHeightDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setTextViewHeightDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewHighlightColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int color);
+    method @RequiresApi(31) public static void setTextViewHighlightColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int notNight, @ColorInt int night);
+    method @RequiresApi(31) public static void setTextViewHighlightColorAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setTextViewHighlightColorResource(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method public static void setTextViewHint(android.widget.RemoteViews, @IdRes int viewId, CharSequence? hint);
+    method public static void setTextViewHint(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setTextViewHintAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewHintTextColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int color);
+    method @RequiresApi(31) public static void setTextViewHintTextColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int notNight, @ColorInt int night);
+    method @RequiresApi(31) public static void setTextViewHintTextColorAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setTextViewHintTextColorResource(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setTextViewJustificationMode(android.widget.RemoteViews, @IdRes int viewId, int justificationMode);
+    method @RequiresApi(21) public static void setTextViewLetterSpacing(android.widget.RemoteViews, @IdRes int viewId, float letterSpacing);
+    method @RequiresApi(31) public static void setTextViewLineHeight(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setTextViewLineHeightDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setTextViewLineHeightDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewLines(android.widget.RemoteViews, @IdRes int viewId, int lines);
+    method public static void setTextViewLinkTextColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int color);
+    method @RequiresApi(31) public static void setTextViewLinkTextColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int notNight, @ColorInt int night);
+    method @RequiresApi(31) public static void setTextViewLinkTextColorAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setTextViewLinkTextColorResource(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method public static void setTextViewLinksClickable(android.widget.RemoteViews, @IdRes int viewId, boolean whether);
+    method public static void setTextViewMaxEms(android.widget.RemoteViews, @IdRes int viewId, int maxems);
+    method public static void setTextViewMaxHeight(android.widget.RemoteViews, @IdRes int viewId, @Px int maxHeight);
+    method @RequiresApi(31) public static void setTextViewMaxHeight(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setTextViewMaxHeightDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setTextViewMaxHeightDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewMaxLines(android.widget.RemoteViews, @IdRes int viewId, int maxLines);
+    method public static void setTextViewMaxWidth(android.widget.RemoteViews, @IdRes int viewId, @Px int maxWidth);
+    method @RequiresApi(31) public static void setTextViewMaxWidth(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setTextViewMaxWidthDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setTextViewMaxWidthDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewMinEms(android.widget.RemoteViews, @IdRes int viewId, int minems);
+    method public static void setTextViewMinHeight(android.widget.RemoteViews, @IdRes int viewId, @Px int minHeight);
+    method @RequiresApi(31) public static void setTextViewMinHeight(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setTextViewMinHeightDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setTextViewMinHeightDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewMinLines(android.widget.RemoteViews, @IdRes int viewId, int minLines);
+    method public static void setTextViewMinWidth(android.widget.RemoteViews, @IdRes int viewId, @Px int minWidth);
+    method @RequiresApi(31) public static void setTextViewMinWidth(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setTextViewMinWidthDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setTextViewMinWidthDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewPaintFlags(android.widget.RemoteViews, @IdRes int viewId, int flags);
+    method public static void setTextViewSelectAllOnFocus(android.widget.RemoteViews, @IdRes int viewId, boolean selectAllOnFocus);
+    method public static void setTextViewSingleLine(android.widget.RemoteViews, @IdRes int viewId, boolean singleLine);
+    method public static void setTextViewText(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setTextViewTextAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewTextColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int color);
+    method @RequiresApi(31) public static void setTextViewTextColor(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList colors);
+    method @RequiresApi(31) public static void setTextViewTextColor(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList notNight, android.content.res.ColorStateList night);
+    method @RequiresApi(31) public static void setTextViewTextColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int notNight, @ColorInt int night);
+    method @RequiresApi(31) public static void setTextViewTextColorAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setTextViewTextColorResource(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method public static void setTextViewTextScaleX(android.widget.RemoteViews, @IdRes int viewId, float size);
+    method @RequiresApi(31) public static void setTextViewTextSizeDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setTextViewTextSizeDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewWidth(android.widget.RemoteViews, @IdRes int viewId, @Px int pixels);
+    method @RequiresApi(31) public static void setTextViewWidth(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setTextViewWidthDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setTextViewWidthDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setViewAlpha(android.widget.RemoteViews, @IdRes int viewId, float alpha);
+    method public static void setViewBackgroundColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int color);
+    method @RequiresApi(31) public static void setViewBackgroundColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int notNight, @ColorInt int night);
+    method @RequiresApi(31) public static void setViewBackgroundColorAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setViewBackgroundColorResource(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method public static void setViewBackgroundResource(android.widget.RemoteViews, @IdRes int viewId, @DrawableRes int resId);
+    method @RequiresApi(31) public static void setViewBackgroundTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? blendMode);
+    method @RequiresApi(31) public static void setViewBackgroundTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setViewBackgroundTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNightTint, android.content.res.ColorStateList? nightTint);
+    method @RequiresApi(31) public static void setViewBackgroundTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setViewBackgroundTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setViewClipToOutline(android.widget.RemoteViews, @IdRes int viewId, boolean clipToOutline);
+    method public static void setViewContentDescription(android.widget.RemoteViews, @IdRes int viewId, CharSequence? contentDescription);
+    method @RequiresApi(31) public static void setViewContentDescription(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setViewContentDescriptionAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setViewElevationDimen(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setViewElevationDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setViewElevationDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(24) public static void setViewEnabled(android.widget.RemoteViews, @IdRes int viewId, boolean enabled);
+    method @RequiresApi(31) public static void setViewFocusable(android.widget.RemoteViews, @IdRes int viewId, boolean focusable);
+    method @RequiresApi(31) public static void setViewFocusable(android.widget.RemoteViews, @IdRes int viewId, int focusable);
+    method @RequiresApi(31) public static void setViewFocusableInTouchMode(android.widget.RemoteViews, @IdRes int viewId, boolean focusableInTouchMode);
+    method @RequiresApi(31) public static void setViewFocusedByDefault(android.widget.RemoteViews, @IdRes int viewId, boolean isFocusedByDefault);
+    method @RequiresApi(31) public static void setViewForegroundTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? blendMode);
+    method @RequiresApi(31) public static void setViewForegroundTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setViewForegroundTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNightTint, android.content.res.ColorStateList? nightTint);
+    method @RequiresApi(31) public static void setViewForegroundTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setViewForegroundTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(17) public static void setViewLayoutDirection(android.widget.RemoteViews, @IdRes int viewId, int layoutDirection);
+    method @RequiresApi(24) public static void setViewMinimumHeight(android.widget.RemoteViews, @IdRes int viewId, @Px int minHeight);
+    method @RequiresApi(31) public static void setViewMinimumHeight(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setViewMinimumHeightDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setViewMinimumHeightDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setViewMinimumWidth(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setViewMinimumWidthDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setViewMinimumWidthDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setViewPivotX(android.widget.RemoteViews, @IdRes int viewId, float pivotX);
+    method @RequiresApi(31) public static void setViewPivotY(android.widget.RemoteViews, @IdRes int viewId, float pivotY);
+    method @RequiresApi(31) public static void setViewRotation(android.widget.RemoteViews, @IdRes int viewId, float rotation);
+    method @RequiresApi(31) public static void setViewRotationX(android.widget.RemoteViews, @IdRes int viewId, float rotationX);
+    method @RequiresApi(31) public static void setViewRotationY(android.widget.RemoteViews, @IdRes int viewId, float rotationY);
+    method @RequiresApi(31) public static void setViewScaleX(android.widget.RemoteViews, @IdRes int viewId, float scaleX);
+    method @RequiresApi(31) public static void setViewScaleY(android.widget.RemoteViews, @IdRes int viewId, float scaleY);
+    method @RequiresApi(31) public static void setViewScrollIndicators(android.widget.RemoteViews, @IdRes int viewId, int scrollIndicators);
+    method @RequiresApi(30) public static void setViewStateDescription(android.widget.RemoteViews, @IdRes int viewId, CharSequence? stateDescription);
+    method @RequiresApi(31) public static void setViewStateDescription(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setViewStateDescriptionAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(16) public static void setViewStubInflatedId(android.widget.RemoteViews, @IdRes int viewId, int inflatedId);
+    method @RequiresApi(16) public static void setViewStubLayoutResource(android.widget.RemoteViews, @IdRes int viewId, @LayoutRes int layoutResource);
+    method @RequiresApi(31) public static void setViewTranslationXDimen(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setViewTranslationXDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setViewTranslationXDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setViewTranslationYDimen(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setViewTranslationYDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setViewTranslationYDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setViewTranslationZDimen(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setViewTranslationZDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setViewTranslationZDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    field public static final androidx.core.widget.RemoteViewsCompat INSTANCE;
+  }
+
+  public static final class RemoteViewsCompat.RemoteCollectionItems {
+    method public int getItemCount();
+    method public long getItemId(int position);
+    method public android.widget.RemoteViews getItemView(int position);
+    method public int getViewTypeCount();
+    method public boolean hasStableIds();
+    property public final int itemCount;
+    property public final int viewTypeCount;
+  }
+
+  public static final class RemoteViewsCompat.RemoteCollectionItems.Builder {
+    ctor public RemoteViewsCompat.RemoteCollectionItems.Builder();
+    method public androidx.core.widget.RemoteViewsCompat.RemoteCollectionItems.Builder addItem(long id, android.widget.RemoteViews view);
+    method public androidx.core.widget.RemoteViewsCompat.RemoteCollectionItems build();
+    method public androidx.core.widget.RemoteViewsCompat.RemoteCollectionItems.Builder setHasStableIds(boolean hasStableIds);
+    method public androidx.core.widget.RemoteViewsCompat.RemoteCollectionItems.Builder setViewTypeCount(int viewTypeCount);
+  }
+
+}
+
diff --git a/core/core-remoteviews/api/public_plus_experimental_1.0.0-beta03.txt b/core/core-remoteviews/api/public_plus_experimental_1.0.0-beta03.txt
new file mode 100644
index 0000000..58dee29
--- /dev/null
+++ b/core/core-remoteviews/api/public_plus_experimental_1.0.0-beta03.txt
@@ -0,0 +1,294 @@
+// Signature format: 4.0
+package androidx.core.widget {
+
+  public final class AppWidgetManagerCompat {
+    method public static android.widget.RemoteViews createExactSizeAppWidget(android.appwidget.AppWidgetManager appWidgetManager, int appWidgetId, kotlin.jvm.functions.Function1<? super androidx.core.util.SizeFCompat,? extends android.widget.RemoteViews> factory);
+    method public static android.widget.RemoteViews createResponsiveSizeAppWidget(android.appwidget.AppWidgetManager appWidgetManager, int appWidgetId, java.util.Collection<androidx.core.util.SizeFCompat> dpSizes, kotlin.jvm.functions.Function1<? super androidx.core.util.SizeFCompat,? extends android.widget.RemoteViews> factory);
+    method public static void updateAppWidget(android.appwidget.AppWidgetManager, int appWidgetId, kotlin.jvm.functions.Function1<? super androidx.core.util.SizeFCompat,? extends android.widget.RemoteViews> factory);
+    method public static void updateAppWidget(android.appwidget.AppWidgetManager, int appWidgetId, java.util.Collection<androidx.core.util.SizeFCompat> dpSizes, kotlin.jvm.functions.Function1<? super androidx.core.util.SizeFCompat,? extends android.widget.RemoteViews> factory);
+  }
+
+  public final class RemoteViewsCompat {
+    method public static void setChronometerBase(android.widget.RemoteViews, @IdRes int viewId, long base);
+    method public static void setChronometerFormat(android.widget.RemoteViews, @IdRes int viewId, String? format);
+    method @RequiresApi(31) public static void setCompoundButtonDrawable(android.widget.RemoteViews, @IdRes int viewId, @DrawableRes int resId);
+    method @RequiresApi(31) public static void setCompoundButtonIcon(android.widget.RemoteViews, @IdRes int viewId, android.graphics.drawable.Icon? icon);
+    method @RequiresApi(31) public static void setCompoundButtonTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? tintMode);
+    method @RequiresApi(31) public static void setCompoundButtonTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setCompoundButtonTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNight, android.content.res.ColorStateList? night);
+    method @RequiresApi(31) public static void setCompoundButtonTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setCompoundButtonTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setFrameLayoutForegroundGravity(android.widget.RemoteViews, @IdRes int viewId, int foregroundGravity);
+    method public static void setFrameLayoutMeasureAllChildren(android.widget.RemoteViews, @IdRes int viewId, boolean measureAll);
+    method @RequiresApi(31) public static void setGridLayoutAlignmentMode(android.widget.RemoteViews, @IdRes int viewId, int alignmentMode);
+    method @RequiresApi(31) public static void setGridLayoutColumnCount(android.widget.RemoteViews, @IdRes int viewId, int columnCount);
+    method @RequiresApi(31) public static void setGridLayoutRowCount(android.widget.RemoteViews, @IdRes int viewId, int rowCount);
+    method @RequiresApi(31) public static void setGridViewColumnWidth(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setGridViewColumnWidthDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int columnWidth);
+    method @RequiresApi(31) public static void setGridViewColumnWidthDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int columnWidth);
+    method @RequiresApi(31) public static void setGridViewGravity(android.widget.RemoteViews, @IdRes int viewId, int gravity);
+    method @RequiresApi(31) public static void setGridViewHorizontalSpacing(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setGridViewHorizontalSpacingDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setGridViewHorizontalSpacingDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setGridViewNumColumns(android.widget.RemoteViews, @IdRes int viewId, int numColumns);
+    method @RequiresApi(31) public static void setGridViewStretchMode(android.widget.RemoteViews, @IdRes int viewId, int stretchMode);
+    method @RequiresApi(31) public static void setGridViewVerticalSpacing(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setGridViewVerticalSpacingDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setGridViewVerticalSpacingDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setImageViewAdjustViewBounds(android.widget.RemoteViews, @IdRes int viewId, boolean adjustViewBounds);
+    method public static void setImageViewColorFilter(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int color);
+    method @RequiresApi(31) public static void setImageViewColorFilter(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int notNight, @ColorInt int night);
+    method @RequiresApi(31) public static void setImageViewColorFilterAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setImageViewColorFilterResource(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method public static void setImageViewImageAlpha(android.widget.RemoteViews, @IdRes int viewId, int alpha);
+    method public static void setImageViewImageLevel(android.widget.RemoteViews, @IdRes int viewId, int level);
+    method @RequiresApi(31) public static void setImageViewImageTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? blendMode);
+    method @RequiresApi(31) public static void setImageViewImageTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setImageViewImageTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNightTint, android.content.res.ColorStateList? nightTint);
+    method @RequiresApi(31) public static void setImageViewImageTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setImageViewImageTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setImageViewMaxHeight(android.widget.RemoteViews, @IdRes int viewId, @Px int maxHeight);
+    method @RequiresApi(31) public static void setImageViewMaxHeight(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setImageViewMaxHeightDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setImageViewMaxHeightDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setImageViewMaxWidth(android.widget.RemoteViews, @IdRes int viewId, @Px int maxWidth);
+    method @RequiresApi(31) public static void setImageViewMaxWidth(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setImageViewMaxWidthDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setImageViewMaxWidthDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setLinearLayoutBaselineAligned(android.widget.RemoteViews, @IdRes int viewId, boolean baselineAligned);
+    method public static void setLinearLayoutBaselineAlignedChildIndex(android.widget.RemoteViews, @IdRes int viewId, int i);
+    method public static void setLinearLayoutGravity(android.widget.RemoteViews, @IdRes int viewId, int gravity);
+    method public static void setLinearLayoutHorizontalGravity(android.widget.RemoteViews, @IdRes int viewId, int horizontalGravity);
+    method public static void setLinearLayoutMeasureWithLargestChildEnabled(android.widget.RemoteViews, @IdRes int viewId, boolean enabled);
+    method public static void setLinearLayoutVerticalGravity(android.widget.RemoteViews, @IdRes int viewId, int verticalGravity);
+    method public static void setLinearLayoutWeightSum(android.widget.RemoteViews, @IdRes int viewId, float weightSum);
+    method public static void setProgressBarIndeterminate(android.widget.RemoteViews, @IdRes int viewId, boolean indeterminate);
+    method @RequiresApi(31) public static void setProgressBarIndeterminateTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? blendMode);
+    method @RequiresApi(31) public static void setProgressBarIndeterminateTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setProgressBarIndeterminateTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNightTint, android.content.res.ColorStateList? nightTint);
+    method @RequiresApi(31) public static void setProgressBarIndeterminateTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setProgressBarIndeterminateTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setProgressBarMax(android.widget.RemoteViews, @IdRes int viewId, int max);
+    method @RequiresApi(26) public static void setProgressBarMin(android.widget.RemoteViews, @IdRes int viewId, int min);
+    method public static void setProgressBarProgress(android.widget.RemoteViews, @IdRes int viewId, int progress);
+    method @RequiresApi(31) public static void setProgressBarProgressBackgroundTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? blendMode);
+    method @RequiresApi(31) public static void setProgressBarProgressBackgroundTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setProgressBarProgressBackgroundTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNightTint, android.content.res.ColorStateList? nightTint);
+    method @RequiresApi(31) public static void setProgressBarProgressBackgroundTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setProgressBarProgressBackgroundTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setProgressBarProgressTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? blendMode);
+    method @RequiresApi(31) public static void setProgressBarProgressTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setProgressBarProgressTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNightTint, android.content.res.ColorStateList? nightTint);
+    method @RequiresApi(31) public static void setProgressBarProgressTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setProgressBarProgressTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setProgressBarSecondaryProgress(android.widget.RemoteViews, @IdRes int viewId, int secondaryProgress);
+    method @RequiresApi(31) public static void setProgressBarSecondaryProgressTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? blendMode);
+    method @RequiresApi(31) public static void setProgressBarSecondaryProgressTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setProgressBarSecondaryProgressTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNightTint, android.content.res.ColorStateList? nightTint);
+    method @RequiresApi(31) public static void setProgressBarSecondaryProgressTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setProgressBarSecondaryProgressTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setProgressBarStateDescription(android.widget.RemoteViews, @IdRes int viewId, CharSequence? stateDescription);
+    method @RequiresApi(31) public static void setProgressBarStateDescription(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setProgressBarStateDescriptionAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setRelativeLayoutGravity(android.widget.RemoteViews, @IdRes int viewId, int gravity);
+    method public static void setRelativeLayoutHorizontalGravity(android.widget.RemoteViews, @IdRes int viewId, int horizontalGravity);
+    method public static void setRelativeLayoutIgnoreGravity(android.widget.RemoteViews, @IdRes int viewId, @IdRes int childViewId);
+    method public static void setRelativeLayoutVerticalGravity(android.widget.RemoteViews, @IdRes int viewId, int verticalGravity);
+    method public static void setRemoteAdapter(android.content.Context context, android.widget.RemoteViews remoteViews, int appWidgetId, @IdRes int viewId, androidx.core.widget.RemoteViewsCompat.RemoteCollectionItems items);
+    method @RequiresApi(31) public static void setSwitchMinWidth(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setSwitchMinWidthDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setSwitchMinWidthDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setSwitchPadding(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setSwitchPaddingDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setSwitchPaddingDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setSwitchShowText(android.widget.RemoteViews, @IdRes int viewId, boolean showText);
+    method @RequiresApi(31) public static void setSwitchSplitTrack(android.widget.RemoteViews, @IdRes int viewId, boolean splitTrack);
+    method @RequiresApi(31) public static void setSwitchTextOff(android.widget.RemoteViews, @IdRes int viewId, CharSequence? textOff);
+    method @RequiresApi(31) public static void setSwitchTextOff(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setSwitchTextOffAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setSwitchTextOn(android.widget.RemoteViews, @IdRes int viewId, CharSequence? textOn);
+    method @RequiresApi(31) public static void setSwitchTextOn(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setSwitchTextOnAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setSwitchThumbIcon(android.widget.RemoteViews, @IdRes int viewId, android.graphics.drawable.Icon? icon);
+    method @RequiresApi(31) public static void setSwitchThumbIcon(android.widget.RemoteViews, @IdRes int viewId, android.graphics.drawable.Icon? notNight, android.graphics.drawable.Icon? night);
+    method @RequiresApi(31) public static void setSwitchThumbResource(android.widget.RemoteViews, @IdRes int viewId, @DrawableRes int resId);
+    method @RequiresApi(31) public static void setSwitchThumbTextPadding(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setSwitchThumbTextPaddingDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setSwitchThumbTextPaddingDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setSwitchThumbTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? blendMode);
+    method @RequiresApi(31) public static void setSwitchThumbTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setSwitchThumbTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNight, android.content.res.ColorStateList? night);
+    method @RequiresApi(31) public static void setSwitchThumbTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setSwitchThumbTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setSwitchTrackIcon(android.widget.RemoteViews, @IdRes int viewId, android.graphics.drawable.Icon? icon);
+    method @RequiresApi(31) public static void setSwitchTrackIcon(android.widget.RemoteViews, @IdRes int viewId, android.graphics.drawable.Icon? notNight, android.graphics.drawable.Icon? night);
+    method @RequiresApi(31) public static void setSwitchTrackResource(android.widget.RemoteViews, @IdRes int viewId, @DrawableRes int resId);
+    method @RequiresApi(31) public static void setSwitchTrackTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? blendMode);
+    method @RequiresApi(31) public static void setSwitchTrackTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setSwitchTrackTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNight, android.content.res.ColorStateList? night);
+    method @RequiresApi(31) public static void setSwitchTrackTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setSwitchTrackTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(17) public static void setTextClockFormat12Hour(android.widget.RemoteViews, @IdRes int viewId, CharSequence? format);
+    method @RequiresApi(31) public static void setTextClockFormat12Hour(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setTextClockFormat12HourAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(17) public static void setTextClockFormat24Hour(android.widget.RemoteViews, @IdRes int viewId, CharSequence? format);
+    method @RequiresApi(31) public static void setTextClockFormat24Hour(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setTextClockFormat24HourAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(17) public static void setTextClockTimeZone(android.widget.RemoteViews, @IdRes int viewId, String? timeZone);
+    method @RequiresApi(31) public static void setTextViewAllCaps(android.widget.RemoteViews, @IdRes int viewId, boolean allCaps);
+    method public static void setTextViewAutoLinkMask(android.widget.RemoteViews, @IdRes int viewId, int mask);
+    method @RequiresApi(16) public static void setTextViewCompoundDrawablePadding(android.widget.RemoteViews, @IdRes int viewId, @Px int pad);
+    method @RequiresApi(31) public static void setTextViewCompoundDrawablePadding(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setTextViewCompoundDrawablePaddingDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setTextViewCompoundDrawablePaddingDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewEms(android.widget.RemoteViews, @IdRes int viewId, int ems);
+    method public static void setTextViewError(android.widget.RemoteViews, @IdRes int viewId, CharSequence? error);
+    method @RequiresApi(31) public static void setTextViewError(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setTextViewErrorAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(21) public static void setTextViewFontFeatureSettings(android.widget.RemoteViews, @IdRes int viewId, String fontFeatureSettings);
+    method @RequiresApi(31) public static void setTextViewGravity(android.widget.RemoteViews, @IdRes int viewId, int gravity);
+    method public static void setTextViewHeight(android.widget.RemoteViews, @IdRes int viewId, @Px int pixels);
+    method @RequiresApi(31) public static void setTextViewHeight(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setTextViewHeightDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setTextViewHeightDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewHighlightColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int color);
+    method @RequiresApi(31) public static void setTextViewHighlightColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int notNight, @ColorInt int night);
+    method @RequiresApi(31) public static void setTextViewHighlightColorAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setTextViewHighlightColorResource(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method public static void setTextViewHint(android.widget.RemoteViews, @IdRes int viewId, CharSequence? hint);
+    method public static void setTextViewHint(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setTextViewHintAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewHintTextColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int color);
+    method @RequiresApi(31) public static void setTextViewHintTextColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int notNight, @ColorInt int night);
+    method @RequiresApi(31) public static void setTextViewHintTextColorAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setTextViewHintTextColorResource(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setTextViewJustificationMode(android.widget.RemoteViews, @IdRes int viewId, int justificationMode);
+    method @RequiresApi(21) public static void setTextViewLetterSpacing(android.widget.RemoteViews, @IdRes int viewId, float letterSpacing);
+    method @RequiresApi(31) public static void setTextViewLineHeight(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setTextViewLineHeightDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setTextViewLineHeightDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewLines(android.widget.RemoteViews, @IdRes int viewId, int lines);
+    method public static void setTextViewLinkTextColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int color);
+    method @RequiresApi(31) public static void setTextViewLinkTextColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int notNight, @ColorInt int night);
+    method @RequiresApi(31) public static void setTextViewLinkTextColorAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setTextViewLinkTextColorResource(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method public static void setTextViewLinksClickable(android.widget.RemoteViews, @IdRes int viewId, boolean whether);
+    method public static void setTextViewMaxEms(android.widget.RemoteViews, @IdRes int viewId, int maxems);
+    method public static void setTextViewMaxHeight(android.widget.RemoteViews, @IdRes int viewId, @Px int maxHeight);
+    method @RequiresApi(31) public static void setTextViewMaxHeight(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setTextViewMaxHeightDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setTextViewMaxHeightDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewMaxLines(android.widget.RemoteViews, @IdRes int viewId, int maxLines);
+    method public static void setTextViewMaxWidth(android.widget.RemoteViews, @IdRes int viewId, @Px int maxWidth);
+    method @RequiresApi(31) public static void setTextViewMaxWidth(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setTextViewMaxWidthDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setTextViewMaxWidthDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewMinEms(android.widget.RemoteViews, @IdRes int viewId, int minems);
+    method public static void setTextViewMinHeight(android.widget.RemoteViews, @IdRes int viewId, @Px int minHeight);
+    method @RequiresApi(31) public static void setTextViewMinHeight(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setTextViewMinHeightDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setTextViewMinHeightDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewMinLines(android.widget.RemoteViews, @IdRes int viewId, int minLines);
+    method public static void setTextViewMinWidth(android.widget.RemoteViews, @IdRes int viewId, @Px int minWidth);
+    method @RequiresApi(31) public static void setTextViewMinWidth(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setTextViewMinWidthDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setTextViewMinWidthDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewPaintFlags(android.widget.RemoteViews, @IdRes int viewId, int flags);
+    method public static void setTextViewSelectAllOnFocus(android.widget.RemoteViews, @IdRes int viewId, boolean selectAllOnFocus);
+    method public static void setTextViewSingleLine(android.widget.RemoteViews, @IdRes int viewId, boolean singleLine);
+    method public static void setTextViewText(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setTextViewTextAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewTextColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int color);
+    method @RequiresApi(31) public static void setTextViewTextColor(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList colors);
+    method @RequiresApi(31) public static void setTextViewTextColor(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList notNight, android.content.res.ColorStateList night);
+    method @RequiresApi(31) public static void setTextViewTextColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int notNight, @ColorInt int night);
+    method @RequiresApi(31) public static void setTextViewTextColorAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setTextViewTextColorResource(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method public static void setTextViewTextScaleX(android.widget.RemoteViews, @IdRes int viewId, float size);
+    method @RequiresApi(31) public static void setTextViewTextSizeDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setTextViewTextSizeDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewWidth(android.widget.RemoteViews, @IdRes int viewId, @Px int pixels);
+    method @RequiresApi(31) public static void setTextViewWidth(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setTextViewWidthDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setTextViewWidthDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setViewAlpha(android.widget.RemoteViews, @IdRes int viewId, float alpha);
+    method public static void setViewBackgroundColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int color);
+    method @RequiresApi(31) public static void setViewBackgroundColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int notNight, @ColorInt int night);
+    method @RequiresApi(31) public static void setViewBackgroundColorAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setViewBackgroundColorResource(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method public static void setViewBackgroundResource(android.widget.RemoteViews, @IdRes int viewId, @DrawableRes int resId);
+    method @RequiresApi(31) public static void setViewBackgroundTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? blendMode);
+    method @RequiresApi(31) public static void setViewBackgroundTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setViewBackgroundTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNightTint, android.content.res.ColorStateList? nightTint);
+    method @RequiresApi(31) public static void setViewBackgroundTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setViewBackgroundTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setViewClipToOutline(android.widget.RemoteViews, @IdRes int viewId, boolean clipToOutline);
+    method public static void setViewContentDescription(android.widget.RemoteViews, @IdRes int viewId, CharSequence? contentDescription);
+    method @RequiresApi(31) public static void setViewContentDescription(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setViewContentDescriptionAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setViewElevationDimen(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setViewElevationDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setViewElevationDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(24) public static void setViewEnabled(android.widget.RemoteViews, @IdRes int viewId, boolean enabled);
+    method @RequiresApi(31) public static void setViewFocusable(android.widget.RemoteViews, @IdRes int viewId, boolean focusable);
+    method @RequiresApi(31) public static void setViewFocusable(android.widget.RemoteViews, @IdRes int viewId, int focusable);
+    method @RequiresApi(31) public static void setViewFocusableInTouchMode(android.widget.RemoteViews, @IdRes int viewId, boolean focusableInTouchMode);
+    method @RequiresApi(31) public static void setViewFocusedByDefault(android.widget.RemoteViews, @IdRes int viewId, boolean isFocusedByDefault);
+    method @RequiresApi(31) public static void setViewForegroundTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? blendMode);
+    method @RequiresApi(31) public static void setViewForegroundTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setViewForegroundTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNightTint, android.content.res.ColorStateList? nightTint);
+    method @RequiresApi(31) public static void setViewForegroundTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setViewForegroundTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(17) public static void setViewLayoutDirection(android.widget.RemoteViews, @IdRes int viewId, int layoutDirection);
+    method @RequiresApi(24) public static void setViewMinimumHeight(android.widget.RemoteViews, @IdRes int viewId, @Px int minHeight);
+    method @RequiresApi(31) public static void setViewMinimumHeight(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setViewMinimumHeightDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setViewMinimumHeightDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setViewMinimumWidth(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setViewMinimumWidthDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setViewMinimumWidthDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setViewPivotX(android.widget.RemoteViews, @IdRes int viewId, float pivotX);
+    method @RequiresApi(31) public static void setViewPivotY(android.widget.RemoteViews, @IdRes int viewId, float pivotY);
+    method @RequiresApi(31) public static void setViewRotation(android.widget.RemoteViews, @IdRes int viewId, float rotation);
+    method @RequiresApi(31) public static void setViewRotationX(android.widget.RemoteViews, @IdRes int viewId, float rotationX);
+    method @RequiresApi(31) public static void setViewRotationY(android.widget.RemoteViews, @IdRes int viewId, float rotationY);
+    method @RequiresApi(31) public static void setViewScaleX(android.widget.RemoteViews, @IdRes int viewId, float scaleX);
+    method @RequiresApi(31) public static void setViewScaleY(android.widget.RemoteViews, @IdRes int viewId, float scaleY);
+    method @RequiresApi(31) public static void setViewScrollIndicators(android.widget.RemoteViews, @IdRes int viewId, int scrollIndicators);
+    method @RequiresApi(30) public static void setViewStateDescription(android.widget.RemoteViews, @IdRes int viewId, CharSequence? stateDescription);
+    method @RequiresApi(31) public static void setViewStateDescription(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setViewStateDescriptionAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(16) public static void setViewStubInflatedId(android.widget.RemoteViews, @IdRes int viewId, int inflatedId);
+    method @RequiresApi(16) public static void setViewStubLayoutResource(android.widget.RemoteViews, @IdRes int viewId, @LayoutRes int layoutResource);
+    method @RequiresApi(31) public static void setViewTranslationXDimen(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setViewTranslationXDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setViewTranslationXDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setViewTranslationYDimen(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setViewTranslationYDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setViewTranslationYDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setViewTranslationZDimen(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setViewTranslationZDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setViewTranslationZDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    field public static final androidx.core.widget.RemoteViewsCompat INSTANCE;
+  }
+
+  public static final class RemoteViewsCompat.RemoteCollectionItems {
+    method public int getItemCount();
+    method public long getItemId(int position);
+    method public android.widget.RemoteViews getItemView(int position);
+    method public int getViewTypeCount();
+    method public boolean hasStableIds();
+    property public final int itemCount;
+    property public final int viewTypeCount;
+  }
+
+  public static final class RemoteViewsCompat.RemoteCollectionItems.Builder {
+    ctor public RemoteViewsCompat.RemoteCollectionItems.Builder();
+    method public androidx.core.widget.RemoteViewsCompat.RemoteCollectionItems.Builder addItem(long id, android.widget.RemoteViews view);
+    method public androidx.core.widget.RemoteViewsCompat.RemoteCollectionItems build();
+    method public androidx.core.widget.RemoteViewsCompat.RemoteCollectionItems.Builder setHasStableIds(boolean hasStableIds);
+    method public androidx.core.widget.RemoteViewsCompat.RemoteCollectionItems.Builder setViewTypeCount(int viewTypeCount);
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/core/core-remoteviews/api/res-1.0.0-beta03.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to core/core-remoteviews/api/res-1.0.0-beta03.txt
diff --git a/core/core-remoteviews/api/restricted_1.0.0-beta03.txt b/core/core-remoteviews/api/restricted_1.0.0-beta03.txt
new file mode 100644
index 0000000..479f021
--- /dev/null
+++ b/core/core-remoteviews/api/restricted_1.0.0-beta03.txt
@@ -0,0 +1,298 @@
+// Signature format: 4.0
+package androidx.core.widget {
+
+  public final class AppWidgetManagerCompat {
+    method public static android.widget.RemoteViews createExactSizeAppWidget(android.appwidget.AppWidgetManager appWidgetManager, int appWidgetId, kotlin.jvm.functions.Function1<? super androidx.core.util.SizeFCompat,? extends android.widget.RemoteViews> factory);
+    method public static android.widget.RemoteViews createResponsiveSizeAppWidget(android.appwidget.AppWidgetManager appWidgetManager, int appWidgetId, java.util.Collection<androidx.core.util.SizeFCompat> dpSizes, kotlin.jvm.functions.Function1<? super androidx.core.util.SizeFCompat,? extends android.widget.RemoteViews> factory);
+    method public static void updateAppWidget(android.appwidget.AppWidgetManager, int appWidgetId, kotlin.jvm.functions.Function1<? super androidx.core.util.SizeFCompat,? extends android.widget.RemoteViews> factory);
+    method public static void updateAppWidget(android.appwidget.AppWidgetManager, int appWidgetId, java.util.Collection<androidx.core.util.SizeFCompat> dpSizes, kotlin.jvm.functions.Function1<? super androidx.core.util.SizeFCompat,? extends android.widget.RemoteViews> factory);
+  }
+
+  public final class RemoteViewsCompat {
+    method public static void setChronometerBase(android.widget.RemoteViews, @IdRes int viewId, long base);
+    method public static void setChronometerFormat(android.widget.RemoteViews, @IdRes int viewId, String? format);
+    method @RequiresApi(31) public static void setCompoundButtonDrawable(android.widget.RemoteViews, @IdRes int viewId, @DrawableRes int resId);
+    method @RequiresApi(31) public static void setCompoundButtonIcon(android.widget.RemoteViews, @IdRes int viewId, android.graphics.drawable.Icon? icon);
+    method @RequiresApi(31) public static void setCompoundButtonTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? tintMode);
+    method @RequiresApi(31) public static void setCompoundButtonTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setCompoundButtonTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNight, android.content.res.ColorStateList? night);
+    method @RequiresApi(31) public static void setCompoundButtonTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setCompoundButtonTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setFrameLayoutForegroundGravity(android.widget.RemoteViews, @IdRes int viewId, int foregroundGravity);
+    method public static void setFrameLayoutMeasureAllChildren(android.widget.RemoteViews, @IdRes int viewId, boolean measureAll);
+    method @RequiresApi(31) public static void setGridLayoutAlignmentMode(android.widget.RemoteViews, @IdRes int viewId, int alignmentMode);
+    method @RequiresApi(31) public static void setGridLayoutColumnCount(android.widget.RemoteViews, @IdRes int viewId, int columnCount);
+    method @RequiresApi(31) public static void setGridLayoutRowCount(android.widget.RemoteViews, @IdRes int viewId, int rowCount);
+    method @RequiresApi(31) public static void setGridViewColumnWidth(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setGridViewColumnWidthDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int columnWidth);
+    method @RequiresApi(31) public static void setGridViewColumnWidthDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int columnWidth);
+    method @RequiresApi(31) public static void setGridViewGravity(android.widget.RemoteViews, @IdRes int viewId, int gravity);
+    method @RequiresApi(31) public static void setGridViewHorizontalSpacing(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setGridViewHorizontalSpacingDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setGridViewHorizontalSpacingDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setGridViewNumColumns(android.widget.RemoteViews, @IdRes int viewId, int numColumns);
+    method @RequiresApi(31) public static void setGridViewStretchMode(android.widget.RemoteViews, @IdRes int viewId, int stretchMode);
+    method @RequiresApi(31) public static void setGridViewVerticalSpacing(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setGridViewVerticalSpacingDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setGridViewVerticalSpacingDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setImageViewAdjustViewBounds(android.widget.RemoteViews, @IdRes int viewId, boolean adjustViewBounds);
+    method public static void setImageViewColorFilter(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int color);
+    method @RequiresApi(31) public static void setImageViewColorFilter(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int notNight, @ColorInt int night);
+    method @RequiresApi(31) public static void setImageViewColorFilterAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setImageViewColorFilterResource(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method public static void setImageViewImageAlpha(android.widget.RemoteViews, @IdRes int viewId, int alpha);
+    method public static void setImageViewImageLevel(android.widget.RemoteViews, @IdRes int viewId, int level);
+    method @RequiresApi(31) public static void setImageViewImageTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? blendMode);
+    method @RequiresApi(31) public static void setImageViewImageTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setImageViewImageTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNightTint, android.content.res.ColorStateList? nightTint);
+    method @RequiresApi(31) public static void setImageViewImageTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setImageViewImageTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setImageViewMaxHeight(android.widget.RemoteViews, @IdRes int viewId, @Px int maxHeight);
+    method @RequiresApi(31) public static void setImageViewMaxHeight(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setImageViewMaxHeightDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setImageViewMaxHeightDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setImageViewMaxWidth(android.widget.RemoteViews, @IdRes int viewId, @Px int maxWidth);
+    method @RequiresApi(31) public static void setImageViewMaxWidth(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setImageViewMaxWidthDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setImageViewMaxWidthDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setLinearLayoutBaselineAligned(android.widget.RemoteViews, @IdRes int viewId, boolean baselineAligned);
+    method public static void setLinearLayoutBaselineAlignedChildIndex(android.widget.RemoteViews, @IdRes int viewId, int i);
+    method public static void setLinearLayoutGravity(android.widget.RemoteViews, @IdRes int viewId, int gravity);
+    method public static void setLinearLayoutHorizontalGravity(android.widget.RemoteViews, @IdRes int viewId, int horizontalGravity);
+    method public static void setLinearLayoutMeasureWithLargestChildEnabled(android.widget.RemoteViews, @IdRes int viewId, boolean enabled);
+    method public static void setLinearLayoutVerticalGravity(android.widget.RemoteViews, @IdRes int viewId, int verticalGravity);
+    method public static void setLinearLayoutWeightSum(android.widget.RemoteViews, @IdRes int viewId, float weightSum);
+    method public static void setProgressBarIndeterminate(android.widget.RemoteViews, @IdRes int viewId, boolean indeterminate);
+    method @RequiresApi(31) public static void setProgressBarIndeterminateTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? blendMode);
+    method @RequiresApi(31) public static void setProgressBarIndeterminateTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setProgressBarIndeterminateTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNightTint, android.content.res.ColorStateList? nightTint);
+    method @RequiresApi(31) public static void setProgressBarIndeterminateTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setProgressBarIndeterminateTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setProgressBarMax(android.widget.RemoteViews, @IdRes int viewId, int max);
+    method @RequiresApi(26) public static void setProgressBarMin(android.widget.RemoteViews, @IdRes int viewId, int min);
+    method public static void setProgressBarProgress(android.widget.RemoteViews, @IdRes int viewId, int progress);
+    method @RequiresApi(31) public static void setProgressBarProgressBackgroundTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? blendMode);
+    method @RequiresApi(31) public static void setProgressBarProgressBackgroundTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setProgressBarProgressBackgroundTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNightTint, android.content.res.ColorStateList? nightTint);
+    method @RequiresApi(31) public static void setProgressBarProgressBackgroundTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setProgressBarProgressBackgroundTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setProgressBarProgressTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? blendMode);
+    method @RequiresApi(31) public static void setProgressBarProgressTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setProgressBarProgressTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNightTint, android.content.res.ColorStateList? nightTint);
+    method @RequiresApi(31) public static void setProgressBarProgressTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setProgressBarProgressTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setProgressBarSecondaryProgress(android.widget.RemoteViews, @IdRes int viewId, int secondaryProgress);
+    method @RequiresApi(31) public static void setProgressBarSecondaryProgressTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? blendMode);
+    method @RequiresApi(31) public static void setProgressBarSecondaryProgressTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setProgressBarSecondaryProgressTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNightTint, android.content.res.ColorStateList? nightTint);
+    method @RequiresApi(31) public static void setProgressBarSecondaryProgressTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setProgressBarSecondaryProgressTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setProgressBarStateDescription(android.widget.RemoteViews, @IdRes int viewId, CharSequence? stateDescription);
+    method @RequiresApi(31) public static void setProgressBarStateDescription(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setProgressBarStateDescriptionAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setRelativeLayoutGravity(android.widget.RemoteViews, @IdRes int viewId, int gravity);
+    method public static void setRelativeLayoutHorizontalGravity(android.widget.RemoteViews, @IdRes int viewId, int horizontalGravity);
+    method public static void setRelativeLayoutIgnoreGravity(android.widget.RemoteViews, @IdRes int viewId, @IdRes int childViewId);
+    method public static void setRelativeLayoutVerticalGravity(android.widget.RemoteViews, @IdRes int viewId, int verticalGravity);
+    method public static void setRemoteAdapter(android.content.Context context, android.widget.RemoteViews remoteViews, int appWidgetId, @IdRes int viewId, androidx.core.widget.RemoteViewsCompat.RemoteCollectionItems items);
+    method @RequiresApi(31) public static void setSwitchMinWidth(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setSwitchMinWidthDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setSwitchMinWidthDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setSwitchPadding(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setSwitchPaddingDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setSwitchPaddingDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setSwitchShowText(android.widget.RemoteViews, @IdRes int viewId, boolean showText);
+    method @RequiresApi(31) public static void setSwitchSplitTrack(android.widget.RemoteViews, @IdRes int viewId, boolean splitTrack);
+    method @RequiresApi(31) public static void setSwitchTextOff(android.widget.RemoteViews, @IdRes int viewId, CharSequence? textOff);
+    method @RequiresApi(31) public static void setSwitchTextOff(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setSwitchTextOffAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setSwitchTextOn(android.widget.RemoteViews, @IdRes int viewId, CharSequence? textOn);
+    method @RequiresApi(31) public static void setSwitchTextOn(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setSwitchTextOnAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setSwitchThumbIcon(android.widget.RemoteViews, @IdRes int viewId, android.graphics.drawable.Icon? icon);
+    method @RequiresApi(31) public static void setSwitchThumbIcon(android.widget.RemoteViews, @IdRes int viewId, android.graphics.drawable.Icon? notNight, android.graphics.drawable.Icon? night);
+    method @RequiresApi(31) public static void setSwitchThumbResource(android.widget.RemoteViews, @IdRes int viewId, @DrawableRes int resId);
+    method @RequiresApi(31) public static void setSwitchThumbTextPadding(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setSwitchThumbTextPaddingDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setSwitchThumbTextPaddingDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setSwitchThumbTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? blendMode);
+    method @RequiresApi(31) public static void setSwitchThumbTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setSwitchThumbTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNight, android.content.res.ColorStateList? night);
+    method @RequiresApi(31) public static void setSwitchThumbTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setSwitchThumbTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setSwitchTrackIcon(android.widget.RemoteViews, @IdRes int viewId, android.graphics.drawable.Icon? icon);
+    method @RequiresApi(31) public static void setSwitchTrackIcon(android.widget.RemoteViews, @IdRes int viewId, android.graphics.drawable.Icon? notNight, android.graphics.drawable.Icon? night);
+    method @RequiresApi(31) public static void setSwitchTrackResource(android.widget.RemoteViews, @IdRes int viewId, @DrawableRes int resId);
+    method @RequiresApi(31) public static void setSwitchTrackTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? blendMode);
+    method @RequiresApi(31) public static void setSwitchTrackTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setSwitchTrackTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNight, android.content.res.ColorStateList? night);
+    method @RequiresApi(31) public static void setSwitchTrackTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setSwitchTrackTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(17) public static void setTextClockFormat12Hour(android.widget.RemoteViews, @IdRes int viewId, CharSequence? format);
+    method @RequiresApi(31) public static void setTextClockFormat12Hour(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setTextClockFormat12HourAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(17) public static void setTextClockFormat24Hour(android.widget.RemoteViews, @IdRes int viewId, CharSequence? format);
+    method @RequiresApi(31) public static void setTextClockFormat24Hour(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setTextClockFormat24HourAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(17) public static void setTextClockTimeZone(android.widget.RemoteViews, @IdRes int viewId, String? timeZone);
+    method @RequiresApi(31) public static void setTextViewAllCaps(android.widget.RemoteViews, @IdRes int viewId, boolean allCaps);
+    method public static void setTextViewAutoLinkMask(android.widget.RemoteViews, @IdRes int viewId, int mask);
+    method @RequiresApi(16) public static void setTextViewCompoundDrawablePadding(android.widget.RemoteViews, @IdRes int viewId, @Px int pad);
+    method @RequiresApi(31) public static void setTextViewCompoundDrawablePadding(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setTextViewCompoundDrawablePaddingDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setTextViewCompoundDrawablePaddingDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewEms(android.widget.RemoteViews, @IdRes int viewId, int ems);
+    method public static void setTextViewError(android.widget.RemoteViews, @IdRes int viewId, CharSequence? error);
+    method @RequiresApi(31) public static void setTextViewError(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setTextViewErrorAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(21) public static void setTextViewFontFeatureSettings(android.widget.RemoteViews, @IdRes int viewId, String fontFeatureSettings);
+    method @RequiresApi(31) public static void setTextViewGravity(android.widget.RemoteViews, @IdRes int viewId, int gravity);
+    method public static void setTextViewHeight(android.widget.RemoteViews, @IdRes int viewId, @Px int pixels);
+    method @RequiresApi(31) public static void setTextViewHeight(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setTextViewHeightDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setTextViewHeightDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewHighlightColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int color);
+    method @RequiresApi(31) public static void setTextViewHighlightColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int notNight, @ColorInt int night);
+    method @RequiresApi(31) public static void setTextViewHighlightColorAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setTextViewHighlightColorResource(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method public static void setTextViewHint(android.widget.RemoteViews, @IdRes int viewId, CharSequence? hint);
+    method public static void setTextViewHint(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setTextViewHintAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewHintTextColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int color);
+    method @RequiresApi(31) public static void setTextViewHintTextColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int notNight, @ColorInt int night);
+    method @RequiresApi(31) public static void setTextViewHintTextColorAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setTextViewHintTextColorResource(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setTextViewJustificationMode(android.widget.RemoteViews, @IdRes int viewId, int justificationMode);
+    method @RequiresApi(21) public static void setTextViewLetterSpacing(android.widget.RemoteViews, @IdRes int viewId, float letterSpacing);
+    method @RequiresApi(31) public static void setTextViewLineHeight(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setTextViewLineHeightDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setTextViewLineHeightDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewLines(android.widget.RemoteViews, @IdRes int viewId, int lines);
+    method public static void setTextViewLinkTextColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int color);
+    method @RequiresApi(31) public static void setTextViewLinkTextColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int notNight, @ColorInt int night);
+    method @RequiresApi(31) public static void setTextViewLinkTextColorAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setTextViewLinkTextColorResource(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method public static void setTextViewLinksClickable(android.widget.RemoteViews, @IdRes int viewId, boolean whether);
+    method public static void setTextViewMaxEms(android.widget.RemoteViews, @IdRes int viewId, int maxems);
+    method public static void setTextViewMaxHeight(android.widget.RemoteViews, @IdRes int viewId, @Px int maxHeight);
+    method @RequiresApi(31) public static void setTextViewMaxHeight(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setTextViewMaxHeightDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setTextViewMaxHeightDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewMaxLines(android.widget.RemoteViews, @IdRes int viewId, int maxLines);
+    method public static void setTextViewMaxWidth(android.widget.RemoteViews, @IdRes int viewId, @Px int maxWidth);
+    method @RequiresApi(31) public static void setTextViewMaxWidth(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setTextViewMaxWidthDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setTextViewMaxWidthDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewMinEms(android.widget.RemoteViews, @IdRes int viewId, int minems);
+    method public static void setTextViewMinHeight(android.widget.RemoteViews, @IdRes int viewId, @Px int minHeight);
+    method @RequiresApi(31) public static void setTextViewMinHeight(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setTextViewMinHeightDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setTextViewMinHeightDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewMinLines(android.widget.RemoteViews, @IdRes int viewId, int minLines);
+    method public static void setTextViewMinWidth(android.widget.RemoteViews, @IdRes int viewId, @Px int minWidth);
+    method @RequiresApi(31) public static void setTextViewMinWidth(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setTextViewMinWidthDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setTextViewMinWidthDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewPaintFlags(android.widget.RemoteViews, @IdRes int viewId, int flags);
+    method public static void setTextViewSelectAllOnFocus(android.widget.RemoteViews, @IdRes int viewId, boolean selectAllOnFocus);
+    method public static void setTextViewSingleLine(android.widget.RemoteViews, @IdRes int viewId, boolean singleLine);
+    method public static void setTextViewText(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setTextViewTextAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewTextColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int color);
+    method @RequiresApi(31) public static void setTextViewTextColor(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList colors);
+    method @RequiresApi(31) public static void setTextViewTextColor(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList notNight, android.content.res.ColorStateList night);
+    method @RequiresApi(31) public static void setTextViewTextColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int notNight, @ColorInt int night);
+    method @RequiresApi(31) public static void setTextViewTextColorAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setTextViewTextColorResource(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method public static void setTextViewTextScaleX(android.widget.RemoteViews, @IdRes int viewId, float size);
+    method @RequiresApi(31) public static void setTextViewTextSizeDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setTextViewTextSizeDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setTextViewWidth(android.widget.RemoteViews, @IdRes int viewId, @Px int pixels);
+    method @RequiresApi(31) public static void setTextViewWidth(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setTextViewWidthDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setTextViewWidthDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setViewAlpha(android.widget.RemoteViews, @IdRes int viewId, float alpha);
+    method public static void setViewBackgroundColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int color);
+    method @RequiresApi(31) public static void setViewBackgroundColor(android.widget.RemoteViews, @IdRes int viewId, @ColorInt int notNight, @ColorInt int night);
+    method @RequiresApi(31) public static void setViewBackgroundColorAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method public static void setViewBackgroundColorResource(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method public static void setViewBackgroundResource(android.widget.RemoteViews, @IdRes int viewId, @DrawableRes int resId);
+    method @RequiresApi(31) public static void setViewBackgroundTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? blendMode);
+    method @RequiresApi(31) public static void setViewBackgroundTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setViewBackgroundTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNightTint, android.content.res.ColorStateList? nightTint);
+    method @RequiresApi(31) public static void setViewBackgroundTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setViewBackgroundTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setViewClipToOutline(android.widget.RemoteViews, @IdRes int viewId, boolean clipToOutline);
+    method public static void setViewContentDescription(android.widget.RemoteViews, @IdRes int viewId, CharSequence? contentDescription);
+    method @RequiresApi(31) public static void setViewContentDescription(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setViewContentDescriptionAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setViewElevationDimen(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setViewElevationDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setViewElevationDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(24) public static void setViewEnabled(android.widget.RemoteViews, @IdRes int viewId, boolean enabled);
+    method @RequiresApi(31) public static void setViewFocusable(android.widget.RemoteViews, @IdRes int viewId, boolean focusable);
+    method @RequiresApi(31) public static void setViewFocusable(android.widget.RemoteViews, @IdRes int viewId, int focusable);
+    method @RequiresApi(31) public static void setViewFocusableInTouchMode(android.widget.RemoteViews, @IdRes int viewId, boolean focusableInTouchMode);
+    method @RequiresApi(31) public static void setViewFocusedByDefault(android.widget.RemoteViews, @IdRes int viewId, boolean isFocusedByDefault);
+    method @RequiresApi(31) public static void setViewForegroundTintBlendMode(android.widget.RemoteViews, @IdRes int viewId, android.graphics.BlendMode? blendMode);
+    method @RequiresApi(31) public static void setViewForegroundTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? tint);
+    method @RequiresApi(31) public static void setViewForegroundTintList(android.widget.RemoteViews, @IdRes int viewId, android.content.res.ColorStateList? notNightTint, android.content.res.ColorStateList? nightTint);
+    method @RequiresApi(31) public static void setViewForegroundTintList(android.widget.RemoteViews, @IdRes int viewId, @ColorRes int resId);
+    method @RequiresApi(31) public static void setViewForegroundTintListAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(17) public static void setViewLayoutDirection(android.widget.RemoteViews, @IdRes int viewId, int layoutDirection);
+    method @RequiresApi(24) public static void setViewMinimumHeight(android.widget.RemoteViews, @IdRes int viewId, @Px int minHeight);
+    method @RequiresApi(31) public static void setViewMinimumHeight(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setViewMinimumHeightDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setViewMinimumHeightDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setViewMinimumWidth(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setViewMinimumWidthDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setViewMinimumWidthDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setViewPivotX(android.widget.RemoteViews, @IdRes int viewId, float pivotX);
+    method @RequiresApi(31) public static void setViewPivotY(android.widget.RemoteViews, @IdRes int viewId, float pivotY);
+    method @RequiresApi(31) public static void setViewRotation(android.widget.RemoteViews, @IdRes int viewId, float rotation);
+    method @RequiresApi(31) public static void setViewRotationX(android.widget.RemoteViews, @IdRes int viewId, float rotationX);
+    method @RequiresApi(31) public static void setViewRotationY(android.widget.RemoteViews, @IdRes int viewId, float rotationY);
+    method @RequiresApi(31) public static void setViewScaleX(android.widget.RemoteViews, @IdRes int viewId, float scaleX);
+    method @RequiresApi(31) public static void setViewScaleY(android.widget.RemoteViews, @IdRes int viewId, float scaleY);
+    method @RequiresApi(31) public static void setViewScrollIndicators(android.widget.RemoteViews, @IdRes int viewId, int scrollIndicators);
+    method @RequiresApi(30) public static void setViewStateDescription(android.widget.RemoteViews, @IdRes int viewId, CharSequence? stateDescription);
+    method @RequiresApi(31) public static void setViewStateDescription(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
+    method @RequiresApi(31) public static void setViewStateDescriptionAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(16) public static void setViewStubInflatedId(android.widget.RemoteViews, @IdRes int viewId, int inflatedId);
+    method @RequiresApi(16) public static void setViewStubLayoutResource(android.widget.RemoteViews, @IdRes int viewId, @LayoutRes int layoutResource);
+    method @RequiresApi(31) public static void setViewTranslationXDimen(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setViewTranslationXDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setViewTranslationXDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setViewTranslationYDimen(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setViewTranslationYDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setViewTranslationYDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    method @RequiresApi(31) public static void setViewTranslationZDimen(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
+    method @RequiresApi(31) public static void setViewTranslationZDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
+    method @RequiresApi(31) public static void setViewTranslationZDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+    field public static final androidx.core.widget.RemoteViewsCompat INSTANCE;
+  }
+
+  public static final class RemoteViewsCompat.RemoteCollectionItems {
+    method public int getItemCount();
+    method public long getItemId(int position);
+    method public android.widget.RemoteViews getItemView(int position);
+    method public int getViewTypeCount();
+    method public boolean hasStableIds();
+    property public final int itemCount;
+    property public final int viewTypeCount;
+  }
+
+  public static final class RemoteViewsCompat.RemoteCollectionItems.Builder {
+    ctor public RemoteViewsCompat.RemoteCollectionItems.Builder();
+    method public androidx.core.widget.RemoteViewsCompat.RemoteCollectionItems.Builder addItem(long id, android.widget.RemoteViews view);
+    method public androidx.core.widget.RemoteViewsCompat.RemoteCollectionItems build();
+    method public androidx.core.widget.RemoteViewsCompat.RemoteCollectionItems.Builder setHasStableIds(boolean hasStableIds);
+    method public androidx.core.widget.RemoteViewsCompat.RemoteCollectionItems.Builder setViewTypeCount(int viewTypeCount);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class RemoteViewsCompatService extends android.widget.RemoteViewsService {
+    method public android.widget.RemoteViewsService.RemoteViewsFactory onGetViewFactory(android.content.Intent intent);
+  }
+
+}
+
diff --git a/core/core/build.gradle b/core/core/build.gradle
index 68e9534..a7333ab 100644
--- a/core/core/build.gradle
+++ b/core/core/build.gradle
@@ -13,7 +13,7 @@
     }
 
     api("androidx.annotation:annotation:1.2.0")
-    api("androidx.annotation:annotation-experimental:1.1.0")
+    api(project(":annotation:annotation-experimental"))
     api("androidx.lifecycle:lifecycle-runtime:2.3.1")
     api("androidx.versionedparcelable:versionedparcelable:1.1.1")
     implementation("androidx.collection:collection:1.0.0")
diff --git a/core/core/src/androidTest/AndroidManifest.xml b/core/core/src/androidTest/AndroidManifest.xml
index 08d31cd..41caed87 100644
--- a/core/core/src/androidTest/AndroidManifest.xml
+++ b/core/core/src/androidTest/AndroidManifest.xml
@@ -166,6 +166,7 @@
     <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_BACKGROUND_LOCATION" />
     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
 
     <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
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 ea6b724..41382a3 100644
--- a/core/core/src/androidTest/java/androidx/core/app/NotificationCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/app/NotificationCompatTest.java
@@ -305,6 +305,20 @@
         }
     }
 
+    @SdkSuppress(minSdkVersion = 24)
+    @Test
+    public void testSetChronometerCountDown() {
+        NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext, "channelId");
+        builder.setUsesChronometer(true);
+
+        assertTrue(builder.mUseChronometer);
+
+        builder.setChronometerCountDown(true);
+        Notification n = builder.build();
+
+        assertEquals(Boolean.TRUE, n.extras.get(NotificationCompat.EXTRA_CHRONOMETER_COUNT_DOWN));
+    }
+
     @Test
     public void testOnlyAlertOnce() {
         NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext);
diff --git a/core/core/src/androidTest/java/androidx/core/content/PermissionCheckerTest.java b/core/core/src/androidTest/java/androidx/core/content/PermissionCheckerTest.java
index 1c9e24e..38c1daa 100644
--- a/core/core/src/androidTest/java/androidx/core/content/PermissionCheckerTest.java
+++ b/core/core/src/androidTest/java/androidx/core/content/PermissionCheckerTest.java
@@ -23,6 +23,7 @@
 
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.FlakyTest;
 import androidx.test.filters.SmallTest;
 
 import org.junit.Before;
@@ -42,6 +43,7 @@
         mContext = ApplicationProvider.getApplicationContext();
     }
 
+    @FlakyTest(bugId = 242739867)
     @Test
     public void testCheckPermission() throws Exception {
         assertEquals(PermissionChecker.PERMISSION_DENIED, PermissionChecker.checkSelfPermission(
diff --git a/core/core/src/androidTest/java/androidx/core/location/LocationManagerCompatTest.java b/core/core/src/androidTest/java/androidx/core/location/LocationManagerCompatTest.java
index baa23f5..150aa7b 100644
--- a/core/core/src/androidTest/java/androidx/core/location/LocationManagerCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/location/LocationManagerCompatTest.java
@@ -36,6 +36,7 @@
 import androidx.core.os.CancellationSignal;
 import androidx.core.os.ExecutorCompat;
 import androidx.test.core.app.ApplicationProvider;
+import androidx.test.filters.FlakyTest;
 import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 
@@ -148,6 +149,7 @@
         assertTrue(LocationManagerCompat.getGnssYearOfHardware(mLocationManager) >= 0);
     }
 
+    @FlakyTest(bugId = 241572276)
     @SdkSuppress(minSdkVersion = 24)
     @Test
     public void testRegisterGnssMeasurementsCallback_handler() {
diff --git a/core/core/src/androidTest/java/androidx/core/os/ProcessCompatTest.java b/core/core/src/androidTest/java/androidx/core/os/ProcessCompatTest.java
index 744b2e1..fb94e30 100644
--- a/core/core/src/androidTest/java/androidx/core/os/ProcessCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/os/ProcessCompatTest.java
@@ -21,11 +21,13 @@
 
 import android.os.Process;
 
+import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 
 import org.junit.Test;
 
 @SmallTest
+@SdkSuppress(minSdkVersion = 16)
 public class ProcessCompatTest {
 
     @Test
diff --git a/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java b/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java
index eabdbee..c058668 100644
--- a/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java
+++ b/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java
@@ -79,9 +79,10 @@
      * There are three categories of actions:
      * <ul>
      * <li><strong>Standard actions</strong> - These are actions that are reported and
-     * handled by the standard UI widgets in the platform. For each standard action
-     * there is a static constant defined in this class, e.g. {@link #ACTION_FOCUS}.
-     * These actions will have {@code null} labels.
+     * handled by the standard UI widgets in the platform. Each standard action is associated with
+     * a resource id, e.g. {@link android.R.id#accessibilityActionScrollUp}. Note that actions were
+     * formerly associated with static constants defined in this class, e.g.
+     * {@link #ACTION_FOCUS}. These actions will have {@code null} labels.
      * </li>
      * <li><strong>Custom actions action</strong> - These are actions that are reported
      * and handled by custom widgets. i.e. ones that are not part of the UI toolkit. For
diff --git a/core/settings.gradle b/core/settings.gradle
index ffa5f61..634a426 100644
--- a/core/settings.gradle
+++ b/core/settings.gradle
@@ -16,6 +16,7 @@
         if (name == ":internal-testutils-fonts") return true
         if (name == ":internal-testutils-runtime") return true
         if (name == ":internal-testutils-truth") return true
+        if (name.startsWith(":annotation:annotation-experimental")) return true
         if (name == ":annotation:annotation-sampled") return true
         if (name == ":test:screenshot:screenshot") return true
         if (name == ":test:screenshot:screenshot-proto") return true
diff --git a/core/uwb/OWNERS b/core/uwb/OWNERS
index 7a8f4aa..0463bcd 100644
--- a/core/uwb/OWNERS
+++ b/core/uwb/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 1185312
 asalo@google.com
 rpius@google.com
 zning@google.com
diff --git a/datastore/datastore-core-okio/build.gradle b/datastore/datastore-core-okio/build.gradle
index 43441a2..a0ab55e 100644
--- a/datastore/datastore-core-okio/build.gradle
+++ b/datastore/datastore-core-okio/build.gradle
@@ -16,12 +16,9 @@
 
 
 import androidx.build.KmpPlatformsKt
-import androidx.build.Publish
 import androidx.build.LibraryType
-import androidx.build.RunApiTasks
 import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
 import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
-import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile
 
 plugins {
     id("AndroidXPlugin")
@@ -38,6 +35,10 @@
     ios()
 
     sourceSets {
+        all {
+            languageSettings.optIn("kotlin.RequiresOptIn")
+        }
+
         commonMain {
             dependencies {
                 api(project(":datastore:datastore-core"))
@@ -80,21 +81,19 @@
                 }
             }
         }
-        all {
-            languageSettings.optIn("kotlin.RequiresOptIn")
-        }
-    }
 
-    targets.forEach {target ->
-        if (target.platformType == KotlinPlatformType.native) {
-            target.compilations["main"].defaultSourceSet {
-                dependsOn(sourceSets["nativeMain"])
+        targets.withType(KotlinNativeTarget).configureEach {
+            binaries.all {
+                binaryOptions["memoryModel"] = "experimental"
             }
         }
-    }
-    targets.withType(KotlinNativeTarget).configureEach {
-        binaries.all {
-            binaryOptions["memoryModel"] = "experimental"
+
+        targets.all { target ->
+            if (target.platformType == KotlinPlatformType.native) {
+                target.compilations["main"].defaultSourceSet {
+                    dependsOn(nativeMain)
+                }
+            }
         }
     }
 }
@@ -106,10 +105,3 @@
     inceptionYear = "2020"
     description = "Android DataStore Core Okio- contains APIs to use datastore-core in multiplatform via okio"
 }
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinNativeCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/datastore/datastore-core/build.gradle b/datastore/datastore-core/build.gradle
index 07be1ab..2c61d9d 100644
--- a/datastore/datastore-core/build.gradle
+++ b/datastore/datastore-core/build.gradle
@@ -14,13 +14,12 @@
  * limitations under the License.
  */
 
+
 import androidx.build.KmpPlatformsKt
 import androidx.build.LibraryType
-import androidx.build.Publish
 import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
 import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
 
-
 plugins {
     id("AndroidXPlugin")
 }
@@ -36,6 +35,10 @@
     ios()
 
     sourceSets {
+        all {
+            languageSettings.optIn("kotlin.RequiresOptIn")
+        }
+
         commonMain {
             dependencies {
                 api(libs.kotlinStdlib)
@@ -81,22 +84,18 @@
             }
         }
 
-
-        all {
-            languageSettings.optIn("kotlin.RequiresOptIn")
-        }
         targets.withType(KotlinNativeTarget).configureEach {
             binaries.all {
                 binaryOptions["memoryModel"] = "experimental"
             }
         }
-        targets.forEach {target ->
+        targets.all { target ->
             if (target.platformType == KotlinPlatformType.native) {
                 target.compilations["main"].defaultSourceSet {
-                    dependsOn(sourceSets["nativeMain"])
+                    dependsOn(nativeMain)
                 }
                 target.compilations["test"].defaultSourceSet {
-                    dependsOn(sourceSets["nativeTest"])
+                    dependsOn(nativeTest)
                 }
             }
         }
diff --git a/datastore/datastore-multiprocess/src/androidTest/AndroidManifest.xml b/datastore/datastore-multiprocess/src/androidTest/AndroidManifest.xml
index 6b9bbc2..8d722f2 100644
--- a/datastore/datastore-multiprocess/src/androidTest/AndroidManifest.xml
+++ b/datastore/datastore-multiprocess/src/androidTest/AndroidManifest.xml
@@ -43,6 +43,11 @@
             android:exported="false"
             android:process=":InterleavedUpdateDataWithReadService" />
         <service
+            android:name="androidx.datastore.multiprocess.MultiProcessDataStoreMultiProcessTest$FailedUpdateDataService"
+            android:enabled="true"
+            android:exported="false"
+            android:process=":FailedUpdateDataService" />
+        <service
             android:name="androidx.datastore.multiprocess.MultiProcessDataStoreMultiProcessTest$CancelledUpdateDataService"
             android:enabled="true"
             android:exported="false"
diff --git a/datastore/datastore-multiprocess/src/androidTest/java/androidx/datastore/multiprocess/MultiProcessDataStoreMultiProcessTest.kt b/datastore/datastore-multiprocess/src/androidTest/java/androidx/datastore/multiprocess/MultiProcessDataStoreMultiProcessTest.kt
index f7fbb83..31de4e8 100644
--- a/datastore/datastore-multiprocess/src/androidTest/java/androidx/datastore/multiprocess/MultiProcessDataStoreMultiProcessTest.kt
+++ b/datastore/datastore-multiprocess/src/androidTest/java/androidx/datastore/multiprocess/MultiProcessDataStoreMultiProcessTest.kt
@@ -22,6 +22,7 @@
 import androidx.datastore.core.Serializer
 import androidx.datastore.multiprocess.handlers.NoOpCorruptionHandler
 import androidx.test.core.app.ApplicationProvider
+import androidx.test.filters.FlakyTest
 import androidx.testing.TestMessageProto.FooProto
 import com.google.common.truth.Truth.assertThat
 import com.google.protobuf.ExtensionRegistryLite
@@ -264,6 +265,7 @@
         }
     }
 
+    @FlakyTest(bugId = 242765757)
     @Test
     fun testInterleavedUpdateDataWithLocalRead() = runTest(UnconfinedTestDispatcher()) {
         val testData: Bundle = createDataStoreBundle(testFile.absolutePath)
@@ -342,7 +344,7 @@
         val dataStore: MultiProcessDataStore<FooProto> =
             createDataStore(testData, dataStoreScope)
         val connection: BlockingServiceConnection =
-            setUpService(mainContext, CancelledUpdateDataService::class.java, testData)
+            setUpService(mainContext, FailedUpdateDataService::class.java, testData)
 
         val blockWrite = CompletableDeferred<Unit>()
         val waitForWrite = CompletableDeferred<Unit>()
@@ -372,7 +374,7 @@
         assertThat(dataStore.data.first()).isEqualTo(FOO_WITH_TEXT)
     }
 
-    class CancelledUpdateDataService(
+    class FailedUpdateDataService(
         private val scope: TestScope = TestScope(UnconfinedTestDispatcher() + Job())
     ) : DirectTestService() {
         override fun beforeTest(testData: Bundle) {
@@ -421,6 +423,23 @@
         assertThat(dataStore.data.first()).isEqualTo(FOO_WITH_TEXT)
     }
 
+    // A duplicate from CancelledUpdateDataService to make sure Android framework would create a
+    // new process for this test. Otherwise the test would hang infinitely because the tests bind
+    // to an existing service created by the previous test.
+    class CancelledUpdateDataService(
+        private val scope: TestScope = TestScope(UnconfinedTestDispatcher() + Job())
+    ) : DirectTestService() {
+        override fun beforeTest(testData: Bundle) {
+            store = createDataStore(testData, scope)
+        }
+
+        override fun runTest() = runBlocking<Unit> {
+            store.updateData {
+                it.let { WRITE_TEXT(it) }
+            }
+        }
+    }
+
     @Test
     fun testReadUpdateCorrupt() = runTest {
         FileOutputStream(testFile).use {
diff --git a/datastore/datastore-multiprocess/src/androidTest/java/androidx/datastore/multiprocess/MultiProcessDataStoreTest.kt b/datastore/datastore-multiprocess/src/androidTest/java/androidx/datastore/multiprocess/MultiProcessDataStoreTest.kt
index 666863e..8199310 100644
--- a/datastore/datastore-multiprocess/src/androidTest/java/androidx/datastore/multiprocess/MultiProcessDataStoreTest.kt
+++ b/datastore/datastore-multiprocess/src/androidTest/java/androidx/datastore/multiprocess/MultiProcessDataStoreTest.kt
@@ -21,6 +21,7 @@
 import androidx.datastore.core.DataStore
 import androidx.datastore.core.Serializer
 import androidx.datastore.multiprocess.handlers.NoOpCorruptionHandler
+import androidx.test.filters.FlakyTest
 import androidx.test.filters.LargeTest
 import androidx.testutils.assertThrows
 import com.google.common.truth.Truth.assertThat
@@ -394,6 +395,7 @@
         assertThat(store.data.first()).isEqualTo(1)
     }
 
+    @FlakyTest(bugId = 242765370)
     @Test
     fun testInitTaskFailsFirstTimeDueToReadFail() = runTest {
         store = newDataStore(initTasksList = listOf { api -> api.updateData { 1 } })
diff --git a/datastore/datastore-preferences-core/build.gradle b/datastore/datastore-preferences-core/build.gradle
index 0ccd76c..f26b3c1 100644
--- a/datastore/datastore-preferences-core/build.gradle
+++ b/datastore/datastore-preferences-core/build.gradle
@@ -14,10 +14,10 @@
  * limitations under the License.
  */
 
+
 import androidx.build.BundleInsideHelper
 import androidx.build.KmpPlatformsKt
 import androidx.build.LibraryType
-import androidx.build.Publish
 import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
 import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
 
@@ -37,6 +37,10 @@
     ios()
 
     sourceSets {
+        all {
+            languageSettings.optIn("kotlin.RequiresOptIn")
+        }
+
         commonMain {
             dependencies {
                 api(libs.kotlinStdlib)
@@ -86,21 +90,18 @@
             }
         }
 
-        all {
-            languageSettings.optIn("kotlin.RequiresOptIn")
-        }
         targets.withType(KotlinNativeTarget).configureEach {
             binaries.all {
                 binaryOptions["memoryModel"] = "experimental"
             }
         }
-        targets.forEach {target ->
+        targets.all { target ->
             if (target.platformType == KotlinPlatformType.native) {
                 target.compilations["main"].defaultSourceSet {
-                    dependsOn(sourceSets["nativeMain"])
+                    dependsOn(nativeMain)
                 }
                 target.compilations["test"].defaultSourceSet {
-                    dependsOn(sourceSets["nativeTest"])
+                    dependsOn(nativeTest)
                 }
             }
         }
diff --git a/datastore/datastore-preferences-core/src/jvmMain/kotlin/androidx/datastore/preferences/core/PreferencesSerializer.kt b/datastore/datastore-preferences-core/src/jvmMain/kotlin/androidx/datastore/preferences/core/PreferencesSerializer.kt
index 2418e46..f92d0c8 100644
--- a/datastore/datastore-preferences-core/src/jvmMain/kotlin/androidx/datastore/preferences/core/PreferencesSerializer.kt
+++ b/datastore/datastore-preferences-core/src/jvmMain/kotlin/androidx/datastore/preferences/core/PreferencesSerializer.kt
@@ -30,9 +30,6 @@
 
 /**
  * Proto based serializer for Preferences.
- *
- * TODO(b/156533452): this is a temporary implementation to allow for development. This will be
- * replaced before launching.
  */
 internal object PreferencesSerializer : OkioSerializer<Preferences> {
     val fileExtension = "preferences_pb"
diff --git a/development/offlinifyDocs/offlinify_dackka_docs.py b/development/offlinifyDocs/offlinify_dackka_docs.py
new file mode 100644
index 0000000..a042fd6
--- /dev/null
+++ b/development/offlinifyDocs/offlinify_dackka_docs.py
@@ -0,0 +1,260 @@
+#!/usr/bin/python3
+
+from argparse import ArgumentParser
+import os
+from pathlib import Path
+from re import search
+from shutil import copyfile, rmtree
+from sys import exit
+
+"""
+Script which takes in Dackka docs and produces offline docs with CSS and relative links.
+Run `python3 offlinify_dackka_docs.py --help` for argument descriptions.
+"""
+
+SCRIPT_PATH = Path(__file__).parent.absolute()
+REL_PATH_TO_DOCS = '../../../../out/androidx/docs-tip-of-tree/build'
+DEFAULT_INPUT  = os.path.abspath(os.path.join(SCRIPT_PATH, REL_PATH_TO_DOCS, 'dackkaDocs'))
+DEFAULT_OUTPUT = os.path.abspath(os.path.join(SCRIPT_PATH, REL_PATH_TO_DOCS, 'offlineDackkaDocs'))
+REL_PATH_TO_LIBRARIES = 'reference/kotlin/androidx'
+STYLE_FILENAME = 'style.css'
+CSS_SOURCE_PATH = os.path.join(SCRIPT_PATH, STYLE_FILENAME)
+PUBLISHED_DOCS_URL = 'https://developer.android.com'
+INDEX_PAGES = ['classes.html', 'packages.html']
+
+"""
+Check environment and args, then create offline docs.
+"""
+def main():
+  check_env()
+
+  args = parse_args()
+  input_path = check_input_path(args.input)
+  output_path = check_output_path(args.output)
+  library = check_library(args.library, input_path, output_path)
+
+  process_input(input_path, output_path, library)
+
+"""
+Error early if any system setup is missing.
+"""
+def check_env():
+  try:
+    from bs4 import BeautifulSoup
+  except ModuleNotFoundError:
+    print('ERROR: This script requires beatifulsoup module `bs4` to run.')
+    print('Please install with pip or another package manager.')
+    exit(-1)
+
+"""
+Parses script args.
+"""
+def parse_args():
+  parser = ArgumentParser(
+    description='Converts Dackka docs to an offline version by adding CSS, fixing links, and ' \
+        'removing book.yaml templating.'
+  )
+  parser.add_argument(
+    '--input', required=False,
+    help='Path to generated Dackka docs. This directory is expected to contain a `reference` ' \
+         f'subdirectory. If no path is provided, {DEFAULT_INPUT} is used by default.')
+  parser.add_argument(
+    '--output', required=False,
+    help='Path to store output offline docs. If a directory already exists at this path, it will' \
+          f' be deleted. If no path is provided, {DEFAULT_OUTPUT} is used by default.'
+  )
+  parser.add_argument(
+    '--library', required=False,
+    help='Specific androidx library to convert docs for. Docs for this library are expected to be' \
+          f' in a subdirectory of `{REL_PATH_TO_LIBRARIES}` within the input path. '\
+          'If no library is provided, docs for all libraries are converted to offline mode.'
+  )
+  return parser.parse_args()
+
+"""
+Verify the provided input arg is a valid directory.
+"""
+def check_input_path(path):
+  if path is None:
+    if not os.path.exists(DEFAULT_INPUT):
+      print(f'ERROR: Default input path `{DEFAULT_INPUT}` does not exist. Generate docs by running')
+      print('    ./gradlew dackkaDocs')
+      exit(-1)
+    return DEFAULT_INPUT
+
+  path = os.path.normpath(path)
+  if not os.path.exists(path):
+    print(f'ERROR: Provided input path `{path}` does not exist.')
+    exit(-1)
+
+  if not os.path.isdir(path):
+    print(f'ERROR: Provided input path `{path} does not point to a directory.')
+    exit(-1)
+
+  return path
+
+"""
+Verifies the output arg by creating a directory at the path, removing existing directory if needed.
+"""
+def check_output_path(path):
+  if path is None:
+    path = DEFAULT_OUTPUT
+
+  if os.path.exists(path):
+    if os.path.isdir(path):
+      print(f'Removing existing directory at output path {path}')
+      rmtree(path)
+    else:
+      print(f'ERROR: output path {path} exists but is not a directory.')
+      exit(-1)
+
+  os.makedirs(path)
+  return path
+
+"""
+Verify the library arg by ensuring the input docs directory exists and making output directories.
+"""
+def check_library(library, input_path, output_path):
+  if library is None:
+    return None
+
+  rel_library_path = os.path.join(REL_PATH_TO_LIBRARIES, library)
+  input_library_path = os.path.join(input_path, rel_library_path)
+
+  if not os.path.exists(input_library_path):
+    print(f'ERROR: Docs directory for library {library} could not be found at')
+    print(f'    {input_library_path}')
+    exit(-1)
+
+  os.makedirs(os.path.join(output_path, rel_library_path))
+
+  return rel_library_path
+
+"""
+Fixes all HTML files in the input directory (or just the pages for the library if a specific one is
+provided) and puts the new pages in the output directory.
+"""
+def process_input(input_path, output_path, library):
+  css_path = os.path.join(output_path, STYLE_FILENAME)
+  copyfile(CSS_SOURCE_PATH, css_path)
+
+  # Go through just the subdirectory for the specific library, or for the entire input directory.
+  path_to_walk = os.path.join(input_path, library) if library is not None else input_path
+  for root, dirs, files in os.walk(path_to_walk):
+    rel_root = os.path.relpath(root, start=input_path)
+    output_root = os.path.join(output_path, rel_root)
+
+    for name in dirs:
+      os.mkdir(os.path.join(output_root, name))
+
+    for name in files:
+      _, ext = os.path.splitext(name)
+      input_file_path = os.path.join(root, name)
+      output_file_path = os.path.join(output_root, name)
+      rel_css_path = os.path.relpath(css_path, start=output_root)
+      if ext == '.html':
+        fix_html_file(input_file_path, input_path, output_file_path, rel_css_path, library, False)
+
+  if library is not None:
+    # In addition to the library pages, copy over package and class index pages.
+    base_output_dir = os.path.join(output_path, REL_PATH_TO_LIBRARIES)
+    rel_css_path = os.path.relpath(css_path, start = base_output_dir)
+    for file in INDEX_PAGES:
+      input_file_path = os.path.join(input_path, REL_PATH_TO_LIBRARIES, file)
+      if os.path.exists(input_file_path):
+        output_file_path = os.path.join(base_output_dir, file)
+        fix_html_file(input_file_path, input_path, output_file_path, rel_css_path, library, True)
+
+"""
+Performs all fixes to the input HTML file and saves the resulting HTML at the output path.
+"""
+def fix_html_file(file_path, root_input_path, output_file_path, css_path, library, index_page):
+  from bs4 import BeautifulSoup
+
+  with open(file_path, 'r') as f:
+    parsed = BeautifulSoup(f, 'html.parser')
+
+  if index_page:
+    filter_index(parsed, library)
+
+  remove_book_template_strings(parsed)
+  add_css(parsed, css_path)
+  fix_links(parsed, file_path, root_input_path, library)
+
+  with open(output_file_path, 'w') as f:
+    f.write(str(parsed))
+
+"""
+Removes template strings containing book.yaml information for DAC.
+"""
+def remove_book_template_strings(page):
+  # page.find_all wasn't working here because the template strings are not within HTML tags.
+  for element in page.head.contents:
+    if search('{%.*%}', element.text):
+      element.extract()
+
+"""
+Replace any CSS links with a correct link.
+"""
+def add_css(page, relative_css):
+  for tag in page.find_all('link', rel='stylesheet'):
+    tag.extract()
+
+  new_tag = page.new_tag('link', rel='stylesheet', href=relative_css)
+  page.head.append(new_tag)
+
+"""
+Convert links to other pages in the generated docs into relative paths to work offline.
+If docs are being converted for just one library, links for docs outside the library are converted
+to a link to the published version.
+"""
+def fix_links(page, page_path, root_input_path, library):
+  for a_tag in page.find_all('a'):
+    original_path = a_tag.get('href')
+    if original_path is None:
+      continue
+    if not original_path.startswith('/'):
+      continue
+    lstrip_original_path = original_path.lstrip('/')
+
+    if page_should_be_linked(lstrip_original_path, library):
+      abs_path = os.path.join(root_input_path, lstrip_original_path)
+      abs_dir = os.path.dirname(abs_path)
+      # Make sure the link will work -- this uses the directory because the basename of the path
+      # might end with something like `Class.html#function`
+      if os.path.exists(abs_dir):
+        rel_path = os.path.relpath(abs_path, start=os.path.dirname(page_path))
+        a_tag['href'] = rel_path
+        continue
+
+    # The link isn't in this library or doesn't exist locally, use the published page.
+    a_tag['href'] = PUBLISHED_DOCS_URL + original_path
+
+"""
+Determines whether to link to the local version of the page at path.
+"""
+def page_should_be_linked(path, library):
+  # All library docs are generated, so all pages are linked.
+  if library is None:
+    return True
+
+  # The index pages are the only ones outside of the library dir that will exist.
+  if os.path.basename(path) in INDEX_PAGES:
+    return True
+
+  # Check if the page is in the library dir.
+  common_path = os.path.commonpath([library, path])
+  return common_path == library
+
+"""
+For the class and package index pages, removes all rows which link outside the library.
+"""
+def filter_index(page, library):
+  for row in page.find_all('tr'):
+    link = row.a.get('href')
+    common_path = os.path.commonpath([link.lstrip('/'), library])
+    if link is not None and common_path != library:
+      row.extract()
+
+if __name__ == '__main__':
+  main()
diff --git a/development/offlinifyDocs/testData/input/reference/kotlin/androidx/classes.html b/development/offlinifyDocs/testData/input/reference/kotlin/androidx/classes.html
new file mode 100644
index 0000000..b4f40c7
--- /dev/null
+++ b/development/offlinifyDocs/testData/input/reference/kotlin/androidx/classes.html
@@ -0,0 +1,38 @@
+<html devsite="true">
+  <head>
+    <title>Class Index</title>
+{% setvar book_path %}/reference/kotlin/androidx/_book.yaml{% endsetvar %}
+{% include "_shared/_reference-head-tags.html" %}
+  </head>
+  <body>
+    <h1>Class Index</h1>
+    <p>These are all the API classes. See all <a href="/reference/kotlin/androidx/packages.html">API packages</a>.</p>
+    <div class="jd-letterlist"><a href="#letter_M">M</a>  <a href="#letter_O">O</a>  </div>
+    <h2 id="letter_M">M</h2>
+    <div class="devsite-table-wrapper">
+      <table class="responsive">
+        <tbody>
+          <tr>
+            <td width="40%"><code><a href="/reference/kotlin/androidx/library/MainPage.html">MainPage</a></code></td>
+            <td><p>Description.</p></td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+    <h2 id="letter_O">O</h2>
+    <div class="devsite-table-wrapper">
+      <table class="responsive">
+        <tbody>
+          <tr>
+            <td width="40%"><code><a href="/reference/kotlin/androidx/other/OtherLibraryPage.html">OtherLibraryPage</a></code></td>
+            <td><p>Description.</p></td>
+          </tr>
+          <tr>
+            <td width="40%"><code><a href="/reference/kotlin/androidx/library/OtherPage.html">OtherPage</a></code></td>
+            <td><p>Description.</p></td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+  </body>
+</html>
diff --git a/development/offlinifyDocs/testData/input/reference/kotlin/androidx/library/MainPage.html b/development/offlinifyDocs/testData/input/reference/kotlin/androidx/library/MainPage.html
new file mode 100644
index 0000000..661d9db
--- /dev/null
+++ b/development/offlinifyDocs/testData/input/reference/kotlin/androidx/library/MainPage.html
@@ -0,0 +1,15 @@
+<html devsite="true">
+  <head>
+    <title>MainPage</title>
+{% setvar book_path %}/reference/kotlin/androidx/_book.yaml{% endsetvar %}
+{% include "_shared/_reference-head-tags.html" %}
+  </head>
+  <body>
+    <h1>MainPage</h1>
+    <p>
+      <a href="/reference/kotlin/androidx/library/OtherPage.html">Page in same library</a>,
+      <a href="/reference/kotlin/androidx/other/OtherLibraryPage.html">Page in different library</a>,
+      <a href="https://developer.android.com/reference/java/util/Map.html">Page on DAC</a>
+    </p>
+  </body>
+</html>
diff --git a/development/offlinifyDocs/testData/input/reference/kotlin/androidx/library/OtherPage.html b/development/offlinifyDocs/testData/input/reference/kotlin/androidx/library/OtherPage.html
new file mode 100644
index 0000000..a6edd0c
--- /dev/null
+++ b/development/offlinifyDocs/testData/input/reference/kotlin/androidx/library/OtherPage.html
@@ -0,0 +1,10 @@
+<html devsite="true">
+  <head>
+    <title>OtherPage</title>
+{% setvar book_path %}/reference/kotlin/androidx/_book.yaml{% endsetvar %}
+{% include "_shared/_reference-head-tags.html" %}
+  </head>
+  <body>
+    <h1>OtherPage</h1>
+  </body>
+</html>
diff --git a/development/offlinifyDocs/testData/input/reference/kotlin/androidx/library/package-summary.html b/development/offlinifyDocs/testData/input/reference/kotlin/androidx/library/package-summary.html
new file mode 100644
index 0000000..f2dd72b
--- /dev/null
+++ b/development/offlinifyDocs/testData/input/reference/kotlin/androidx/library/package-summary.html
@@ -0,0 +1,10 @@
+<html devsite="true">
+  <head>
+    <title>Package Summary</title>
+{% setvar book_path %}/reference/kotlin/androidx/_book.yaml{% endsetvar %}
+{% include "_shared/_reference-head-tags.html" %}
+  </head>
+  <body>
+    <h1>Package Summary</h1>
+  </body>
+</html>
diff --git a/development/offlinifyDocs/testData/input/reference/kotlin/androidx/other/OtherLibraryPage.html b/development/offlinifyDocs/testData/input/reference/kotlin/androidx/other/OtherLibraryPage.html
new file mode 100644
index 0000000..98eebd4
--- /dev/null
+++ b/development/offlinifyDocs/testData/input/reference/kotlin/androidx/other/OtherLibraryPage.html
@@ -0,0 +1,10 @@
+<html devsite="true">
+  <head>
+    <title>OtherLibraryPage</title>
+{% setvar book_path %}/reference/kotlin/androidx/_book.yaml{% endsetvar %}
+{% include "_shared/_reference-head-tags.html" %}
+  </head>
+  <body>
+    <h1>OtherLibraryPage</h1>
+  </body>
+</html>
diff --git a/development/offlinifyDocs/testData/input/reference/kotlin/androidx/other/package-summary.html b/development/offlinifyDocs/testData/input/reference/kotlin/androidx/other/package-summary.html
new file mode 100644
index 0000000..f2dd72b
--- /dev/null
+++ b/development/offlinifyDocs/testData/input/reference/kotlin/androidx/other/package-summary.html
@@ -0,0 +1,10 @@
+<html devsite="true">
+  <head>
+    <title>Package Summary</title>
+{% setvar book_path %}/reference/kotlin/androidx/_book.yaml{% endsetvar %}
+{% include "_shared/_reference-head-tags.html" %}
+  </head>
+  <body>
+    <h1>Package Summary</h1>
+  </body>
+</html>
diff --git a/development/offlinifyDocs/testData/input/reference/kotlin/androidx/packages.html b/development/offlinifyDocs/testData/input/reference/kotlin/androidx/packages.html
new file mode 100644
index 0000000..1b7b4f0
--- /dev/null
+++ b/development/offlinifyDocs/testData/input/reference/kotlin/androidx/packages.html
@@ -0,0 +1,25 @@
+<html devsite="true">
+  <head>
+    <title>Package Index</title>
+{% setvar book_path %}/reference/kotlin/androidx/_book.yaml{% endsetvar %}
+{% include "_shared/_reference-head-tags.html" %}
+  </head>
+  <body>
+    <h1>Package Index</h1>
+    <p>These are all the API packages. See all <a href="/reference/kotlin/androidx/classes.html">API classes</a>.</p>
+    <div class="devsite-table-wrapper">
+      <table class="responsive">
+        <tbody>
+          <tr>
+            <td width="40%"><code><a href="/reference/kotlin/androidx/library/package-summary.html">androidx.library</a></code></td>
+            <td></td>
+          </tr>
+          <tr>
+            <td width="40%"><code><a href="/reference/kotlin/androidx/other/package-summary.html">androidx.other</a></code></td>
+            <td></td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+  </body>
+</html>
diff --git a/development/offlinifyDocs/testData/outputAllLibs/reference/kotlin/androidx/classes.html b/development/offlinifyDocs/testData/outputAllLibs/reference/kotlin/androidx/classes.html
new file mode 100644
index 0000000..fb9263f
--- /dev/null
+++ b/development/offlinifyDocs/testData/outputAllLibs/reference/kotlin/androidx/classes.html
@@ -0,0 +1,35 @@
+<html devsite="true">
+<head>
+<title>Class Index</title><link href="../../../style.css" rel="stylesheet"/></head>
+<body>
+<h1>Class Index</h1>
+<p>These are all the API classes. See all <a href="packages.html">API packages</a>.</p>
+<div class="jd-letterlist"><a href="#letter_M">M</a>  <a href="#letter_O">O</a>  </div>
+<h2 id="letter_M">M</h2>
+<div class="devsite-table-wrapper">
+<table class="responsive">
+<tbody>
+<tr>
+<td width="40%"><code><a href="library/MainPage.html">MainPage</a></code></td>
+<td><p>Description.</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<h2 id="letter_O">O</h2>
+<div class="devsite-table-wrapper">
+<table class="responsive">
+<tbody>
+<tr>
+<td width="40%"><code><a href="other/OtherLibraryPage.html">OtherLibraryPage</a></code></td>
+<td><p>Description.</p></td>
+</tr>
+<tr>
+<td width="40%"><code><a href="library/OtherPage.html">OtherPage</a></code></td>
+<td><p>Description.</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</body>
+</html>
diff --git a/development/offlinifyDocs/testData/outputAllLibs/reference/kotlin/androidx/library/MainPage.html b/development/offlinifyDocs/testData/outputAllLibs/reference/kotlin/androidx/library/MainPage.html
new file mode 100644
index 0000000..f0a8f65
--- /dev/null
+++ b/development/offlinifyDocs/testData/outputAllLibs/reference/kotlin/androidx/library/MainPage.html
@@ -0,0 +1,12 @@
+<html devsite="true">
+<head>
+<title>MainPage</title><link href="../../../../style.css" rel="stylesheet"/></head>
+<body>
+<h1>MainPage</h1>
+<p>
+<a href="OtherPage.html">Page in same library</a>,
+      <a href="../other/OtherLibraryPage.html">Page in different library</a>,
+      <a href="https://developer.android.com/reference/java/util/Map.html">Page on DAC</a>
+</p>
+</body>
+</html>
diff --git a/development/offlinifyDocs/testData/outputAllLibs/reference/kotlin/androidx/library/OtherPage.html b/development/offlinifyDocs/testData/outputAllLibs/reference/kotlin/androidx/library/OtherPage.html
new file mode 100644
index 0000000..edf49f4
--- /dev/null
+++ b/development/offlinifyDocs/testData/outputAllLibs/reference/kotlin/androidx/library/OtherPage.html
@@ -0,0 +1,7 @@
+<html devsite="true">
+<head>
+<title>OtherPage</title><link href="../../../../style.css" rel="stylesheet"/></head>
+<body>
+<h1>OtherPage</h1>
+</body>
+</html>
diff --git a/development/offlinifyDocs/testData/outputAllLibs/reference/kotlin/androidx/library/package-summary.html b/development/offlinifyDocs/testData/outputAllLibs/reference/kotlin/androidx/library/package-summary.html
new file mode 100644
index 0000000..b9e1b6b
--- /dev/null
+++ b/development/offlinifyDocs/testData/outputAllLibs/reference/kotlin/androidx/library/package-summary.html
@@ -0,0 +1,7 @@
+<html devsite="true">
+<head>
+<title>Package Summary</title><link href="../../../../style.css" rel="stylesheet"/></head>
+<body>
+<h1>Package Summary</h1>
+</body>
+</html>
diff --git a/development/offlinifyDocs/testData/outputAllLibs/reference/kotlin/androidx/other/OtherLibraryPage.html b/development/offlinifyDocs/testData/outputAllLibs/reference/kotlin/androidx/other/OtherLibraryPage.html
new file mode 100644
index 0000000..4f20502
--- /dev/null
+++ b/development/offlinifyDocs/testData/outputAllLibs/reference/kotlin/androidx/other/OtherLibraryPage.html
@@ -0,0 +1,7 @@
+<html devsite="true">
+<head>
+<title>OtherLibraryPage</title><link href="../../../../style.css" rel="stylesheet"/></head>
+<body>
+<h1>OtherLibraryPage</h1>
+</body>
+</html>
diff --git a/development/offlinifyDocs/testData/outputAllLibs/reference/kotlin/androidx/other/package-summary.html b/development/offlinifyDocs/testData/outputAllLibs/reference/kotlin/androidx/other/package-summary.html
new file mode 100644
index 0000000..b9e1b6b
--- /dev/null
+++ b/development/offlinifyDocs/testData/outputAllLibs/reference/kotlin/androidx/other/package-summary.html
@@ -0,0 +1,7 @@
+<html devsite="true">
+<head>
+<title>Package Summary</title><link href="../../../../style.css" rel="stylesheet"/></head>
+<body>
+<h1>Package Summary</h1>
+</body>
+</html>
diff --git a/development/offlinifyDocs/testData/outputAllLibs/reference/kotlin/androidx/packages.html b/development/offlinifyDocs/testData/outputAllLibs/reference/kotlin/androidx/packages.html
new file mode 100644
index 0000000..993cef2
--- /dev/null
+++ b/development/offlinifyDocs/testData/outputAllLibs/reference/kotlin/androidx/packages.html
@@ -0,0 +1,22 @@
+<html devsite="true">
+<head>
+<title>Package Index</title><link href="../../../style.css" rel="stylesheet"/></head>
+<body>
+<h1>Package Index</h1>
+<p>These are all the API packages. See all <a href="classes.html">API classes</a>.</p>
+<div class="devsite-table-wrapper">
+<table class="responsive">
+<tbody>
+<tr>
+<td width="40%"><code><a href="library/package-summary.html">androidx.library</a></code></td>
+<td></td>
+</tr>
+<tr>
+<td width="40%"><code><a href="other/package-summary.html">androidx.other</a></code></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+</div>
+</body>
+</html>
diff --git a/development/offlinifyDocs/testData/outputOneLib/reference/kotlin/androidx/classes.html b/development/offlinifyDocs/testData/outputOneLib/reference/kotlin/androidx/classes.html
new file mode 100644
index 0000000..0183ffc
--- /dev/null
+++ b/development/offlinifyDocs/testData/outputOneLib/reference/kotlin/androidx/classes.html
@@ -0,0 +1,32 @@
+<html devsite="true">
+<head>
+<title>Class Index</title><link href="../../../style.css" rel="stylesheet"/></head>
+<body>
+<h1>Class Index</h1>
+<p>These are all the API classes. See all <a href="packages.html">API packages</a>.</p>
+<div class="jd-letterlist"><a href="#letter_M">M</a>  <a href="#letter_O">O</a>  </div>
+<h2 id="letter_M">M</h2>
+<div class="devsite-table-wrapper">
+<table class="responsive">
+<tbody>
+<tr>
+<td width="40%"><code><a href="library/MainPage.html">MainPage</a></code></td>
+<td><p>Description.</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<h2 id="letter_O">O</h2>
+<div class="devsite-table-wrapper">
+<table class="responsive">
+<tbody>
+
+<tr>
+<td width="40%"><code><a href="library/OtherPage.html">OtherPage</a></code></td>
+<td><p>Description.</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</body>
+</html>
diff --git a/development/offlinifyDocs/testData/outputOneLib/reference/kotlin/androidx/library/MainPage.html b/development/offlinifyDocs/testData/outputOneLib/reference/kotlin/androidx/library/MainPage.html
new file mode 100644
index 0000000..96a70bc
--- /dev/null
+++ b/development/offlinifyDocs/testData/outputOneLib/reference/kotlin/androidx/library/MainPage.html
@@ -0,0 +1,12 @@
+<html devsite="true">
+<head>
+<title>MainPage</title><link href="../../../../style.css" rel="stylesheet"/></head>
+<body>
+<h1>MainPage</h1>
+<p>
+<a href="OtherPage.html">Page in same library</a>,
+      <a href="https://developer.android.com/reference/kotlin/androidx/other/OtherLibraryPage.html">Page in different library</a>,
+      <a href="https://developer.android.com/reference/java/util/Map.html">Page on DAC</a>
+</p>
+</body>
+</html>
diff --git a/development/offlinifyDocs/testData/outputOneLib/reference/kotlin/androidx/library/OtherPage.html b/development/offlinifyDocs/testData/outputOneLib/reference/kotlin/androidx/library/OtherPage.html
new file mode 100644
index 0000000..edf49f4
--- /dev/null
+++ b/development/offlinifyDocs/testData/outputOneLib/reference/kotlin/androidx/library/OtherPage.html
@@ -0,0 +1,7 @@
+<html devsite="true">
+<head>
+<title>OtherPage</title><link href="../../../../style.css" rel="stylesheet"/></head>
+<body>
+<h1>OtherPage</h1>
+</body>
+</html>
diff --git a/development/offlinifyDocs/testData/outputOneLib/reference/kotlin/androidx/library/package-summary.html b/development/offlinifyDocs/testData/outputOneLib/reference/kotlin/androidx/library/package-summary.html
new file mode 100644
index 0000000..b9e1b6b
--- /dev/null
+++ b/development/offlinifyDocs/testData/outputOneLib/reference/kotlin/androidx/library/package-summary.html
@@ -0,0 +1,7 @@
+<html devsite="true">
+<head>
+<title>Package Summary</title><link href="../../../../style.css" rel="stylesheet"/></head>
+<body>
+<h1>Package Summary</h1>
+</body>
+</html>
diff --git a/development/offlinifyDocs/testData/outputOneLib/reference/kotlin/androidx/packages.html b/development/offlinifyDocs/testData/outputOneLib/reference/kotlin/androidx/packages.html
new file mode 100644
index 0000000..f43c6b0
--- /dev/null
+++ b/development/offlinifyDocs/testData/outputOneLib/reference/kotlin/androidx/packages.html
@@ -0,0 +1,19 @@
+<html devsite="true">
+<head>
+<title>Package Index</title><link href="../../../style.css" rel="stylesheet"/></head>
+<body>
+<h1>Package Index</h1>
+<p>These are all the API packages. See all <a href="classes.html">API classes</a>.</p>
+<div class="devsite-table-wrapper">
+<table class="responsive">
+<tbody>
+<tr>
+<td width="40%"><code><a href="library/package-summary.html">androidx.library</a></code></td>
+<td></td>
+</tr>
+
+</tbody>
+</table>
+</div>
+</body>
+</html>
diff --git a/development/offlinifyDocs/test_offlinify_dackka_docs.py b/development/offlinifyDocs/test_offlinify_dackka_docs.py
new file mode 100644
index 0000000..c6695dd
--- /dev/null
+++ b/development/offlinifyDocs/test_offlinify_dackka_docs.py
@@ -0,0 +1,63 @@
+#!/usr/bin/python3
+
+from filecmp import cmp, dircmp
+from offlinify_dackka_docs import check_library, process_input, STYLE_FILENAME
+import os
+from pathlib import Path
+from shutil import rmtree
+import unittest
+
+TEST_PATH = os.path.join(Path(__file__).parent.absolute(), 'testData')
+OUTPUT_PATH = os.path.join(TEST_PATH, 'temp')
+
+class TestOfflinifyDackkaDocs(unittest.TestCase):
+  def setUp(self):
+    os.mkdir(OUTPUT_PATH)
+
+  def tearDown(self):
+    rmtree(OUTPUT_PATH)
+
+  """
+  Verify that the directories have the same subdirectories and files.
+  """
+  def check_dirs(self, actual, expected):
+    css_path = os.path.join(actual, STYLE_FILENAME)
+    self.assertTrue(os.path.exists(css_path))
+
+    dcmp = dircmp(actual, expected, hide=[STYLE_FILENAME, '.DS_Store'])
+    self.check_dircmp(dcmp)
+
+  """
+  Recursively process the dircmp result to test the directories and files are equal.
+  """
+  def check_dircmp(self, dcmp):
+    # Make sure there's nothing in one dir and not the other
+    self.assertEqual(dcmp.left_only, [])
+    self.assertEqual(dcmp.right_only, [])
+
+    # dircmp checks that the same files exist, not that there contents are equal--verify that here
+    for file in dcmp.common_files:
+      left_path = os.path.join(dcmp.left, file)
+      right_path = os.path.join(dcmp.right, file)
+      self.assertTrue(cmp(left_path, right_path, shallow=False))
+
+    for sub, sub_dcmp in dcmp.subdirs.items():
+      self.check_dircmp(sub_dcmp)
+
+  def test_all_libraries(self):
+    input_path = os.path.join(TEST_PATH, 'input')
+    process_input(input_path, OUTPUT_PATH, None)
+
+    expected_output_path = os.path.join(TEST_PATH, 'outputAllLibs')
+    self.check_dirs(OUTPUT_PATH, expected_output_path)
+
+  def test_one_library(self):
+    input_path = os.path.join(TEST_PATH, 'input')
+    library = check_library('library', input_path, OUTPUT_PATH)
+    process_input(input_path, OUTPUT_PATH, library)
+
+    expected_output_path = os.path.join(TEST_PATH, 'outputOneLib')
+    self.check_dirs(OUTPUT_PATH, expected_output_path)
+
+if __name__ == '__main__':
+  unittest.main()
diff --git a/docs-public/build.gradle b/docs-public/build.gradle
index 1799d05..554c61a 100644
--- a/docs-public/build.gradle
+++ b/docs-public/build.gradle
@@ -8,16 +8,16 @@
 }
 
 dependencies {
-    docs("androidx.activity:activity:1.6.0-alpha05")
-    docs("androidx.activity:activity-compose:1.6.0-alpha05")
-    samples("androidx.activity:activity-compose-samples:1.6.0-alpha03")
-    docs("androidx.activity:activity-ktx:1.6.0-alpha05")
+    docs("androidx.activity:activity:1.6.0-beta01")
+    docs("androidx.activity:activity-compose:1.6.0-beta01")
+    samples("androidx.activity:activity-compose-samples:1.6.0-beta01")
+    docs("androidx.activity:activity-ktx:1.6.0-beta01")
     docs("androidx.ads:ads-identifier:1.0.0-alpha04")
     docs("androidx.ads:ads-identifier-provider:1.0.0-alpha04")
-    docs("androidx.annotation:annotation:1.5.0-alpha01")
-    docs("androidx.annotation:annotation-experimental:1.3.0-alpha01")
-    docs("androidx.appcompat:appcompat:1.6.0-alpha05")
-    docs("androidx.appcompat:appcompat-resources:1.6.0-alpha05")
+    docs("androidx.annotation:annotation:1.5.0-alpha02")
+    docs("androidx.annotation:annotation-experimental:1.3.0-beta01")
+    docs("androidx.appcompat:appcompat:1.6.0-beta01")
+    docs("androidx.appcompat:appcompat-resources:1.6.0-beta01")
     docs("androidx.appsearch:appsearch:1.1.0-alpha01")
     docs("androidx.appsearch:appsearch-ktx:1.1.0-alpha01")
     docs("androidx.appsearch:appsearch-local-storage:1.1.0-alpha01")
@@ -51,69 +51,71 @@
     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.3.0-alpha02")
-    docs("androidx.compose.animation:animation-core:1.3.0-alpha02")
-    docs("androidx.compose.animation:animation-graphics:1.3.0-alpha02")
-    samples("androidx.compose.animation:animation-samples:1.3.0-alpha02")
-    samples("androidx.compose.animation:animation-core-samples:1.3.0-alpha02")
-    samples("androidx.compose.animation:animation-graphics-samples:1.3.0-alpha02")
-    docs("androidx.compose.foundation:foundation:1.3.0-alpha02")
-    docs("androidx.compose.foundation:foundation-layout:1.3.0-alpha02")
-    samples("androidx.compose.foundation:foundation-layout-samples:1.3.0-alpha02")
-    samples("androidx.compose.foundation:foundation-samples:1.3.0-alpha02")
-    docs("androidx.compose.material3:material3:1.0.0-alpha15")
-    samples("androidx.compose.material3:material3-samples:1.0.0-alpha15")
-    docs("androidx.compose.material3:material3-window-size-class:1.0.0-alpha15")
-    samples("androidx.compose.material3:material3-window-size-class-samples:1.0.0-alpha15")
-    docs("androidx.compose.material:material:1.3.0-alpha02")
-    docs("androidx.compose.material:material-icons-core:1.3.0-alpha02")
-    samples("androidx.compose.material:material-icons-core-samples:1.3.0-alpha02")
-    docs("androidx.compose.material:material-ripple:1.3.0-alpha02")
-    samples("androidx.compose.material:material-samples:1.3.0-alpha02")
-    docs("androidx.compose.runtime:runtime:1.3.0-alpha02")
-    docs("androidx.compose.runtime:runtime-livedata:1.3.0-alpha02")
-    samples("androidx.compose.runtime:runtime-livedata-samples:1.3.0-alpha02")
-    docs("androidx.compose.runtime:runtime-rxjava2:1.3.0-alpha02")
-    samples("androidx.compose.runtime:runtime-rxjava2-samples:1.3.0-alpha02")
-    docs("androidx.compose.runtime:runtime-rxjava3:1.3.0-alpha02")
-    samples("androidx.compose.runtime:runtime-rxjava3-samples:1.3.0-alpha02")
-    docs("androidx.compose.runtime:runtime-saveable:1.3.0-alpha02")
-    samples("androidx.compose.runtime:runtime-saveable-samples:1.3.0-alpha02")
-    samples("androidx.compose.runtime:runtime-samples:1.3.0-alpha02")
-    docs("androidx.compose.ui:ui:1.3.0-alpha02")
-    docs("androidx.compose.ui:ui-geometry:1.3.0-alpha02")
-    docs("androidx.compose.ui:ui-graphics:1.3.0-alpha02")
-    samples("androidx.compose.ui:ui-graphics-samples:1.3.0-alpha02")
-    docs("androidx.compose.ui:ui-test:1.3.0-alpha02")
-    docs("androidx.compose.ui:ui-test-junit4:1.3.0-alpha02")
-    samples("androidx.compose.ui:ui-test-samples:1.3.0-alpha02")
-    docs("androidx.compose.ui:ui-text:1.3.0-alpha02")
-    docs("androidx.compose.ui:ui-text-google-fonts:1.3.0-alpha02")
-    samples("androidx.compose.ui:ui-text-samples:1.3.0-alpha02")
-    docs("androidx.compose.ui:ui-tooling:1.3.0-alpha02")
-    docs("androidx.compose.ui:ui-tooling-data:1.3.0-alpha02")
-    docs("androidx.compose.ui:ui-tooling-preview:1.3.0-alpha02")
-    docs("androidx.compose.ui:ui-unit:1.3.0-alpha02")
-    samples("androidx.compose.ui:ui-unit-samples:1.3.0-alpha02")
-    docs("androidx.compose.ui:ui-util:1.3.0-alpha02")
-    docs("androidx.compose.ui:ui-viewbinding:1.3.0-alpha02")
-    samples("androidx.compose.ui:ui-viewbinding-samples:1.3.0-alpha02")
-    samples("androidx.compose.ui:ui-samples:1.3.0-alpha02")
+    docs("androidx.compose.animation:animation:1.3.0-beta01")
+    docs("androidx.compose.animation:animation-core:1.3.0-beta01")
+    docs("androidx.compose.animation:animation-graphics:1.3.0-beta01")
+    samples("androidx.compose.animation:animation-samples:1.3.0-beta01")
+    samples("androidx.compose.animation:animation-core-samples:1.3.0-beta01")
+    samples("androidx.compose.animation:animation-graphics-samples:1.3.0-beta01")
+    docs("androidx.compose.foundation:foundation:1.3.0-beta01")
+    docs("androidx.compose.foundation:foundation-layout:1.3.0-beta01")
+    samples("androidx.compose.foundation:foundation-layout-samples:1.3.0-beta01")
+    samples("androidx.compose.foundation:foundation-samples:1.3.0-beta01")
+    docs("androidx.compose.material3:material3:1.0.0-beta01")
+    samples("androidx.compose.material3:material3-samples:1.0.0-beta01")
+    docs("androidx.compose.material3:material3-window-size-class:1.0.0-beta01")
+    samples("androidx.compose.material3:material3-window-size-class-samples:1.0.0-beta01")
+    docs("androidx.compose.material:material:1.3.0-beta01")
+    docs("androidx.compose.material:material-icons-core:1.3.0-beta01")
+    samples("androidx.compose.material:material-icons-core-samples:1.3.0-beta01")
+    docs("androidx.compose.material:material-ripple:1.3.0-beta01")
+    samples("androidx.compose.material:material-samples:1.3.0-beta01")
+    docs("androidx.compose.runtime:runtime:1.3.0-beta01")
+    docs("androidx.compose.runtime:runtime-livedata:1.3.0-beta01")
+    samples("androidx.compose.runtime:runtime-livedata-samples:1.3.0-beta01")
+    docs("androidx.compose.runtime:runtime-rxjava2:1.3.0-beta01")
+    samples("androidx.compose.runtime:runtime-rxjava2-samples:1.3.0-beta01")
+    docs("androidx.compose.runtime:runtime-rxjava3:1.3.0-beta01")
+    samples("androidx.compose.runtime:runtime-rxjava3-samples:1.3.0-beta01")
+    docs("androidx.compose.runtime:runtime-saveable:1.3.0-beta01")
+    samples("androidx.compose.runtime:runtime-saveable-samples:1.3.0-beta01")
+    samples("androidx.compose.runtime:runtime-samples:1.3.0-beta01")
+    docs("androidx.compose.runtime:runtime-tracing:1.0.0-alpha01")
+    docs("androidx.compose.ui:ui:1.3.0-beta01")
+    docs("androidx.compose.ui:ui-geometry:1.3.0-beta01")
+    docs("androidx.compose.ui:ui-graphics:1.3.0-beta01")
+    samples("androidx.compose.ui:ui-graphics-samples:1.3.0-beta01")
+    docs("androidx.compose.ui:ui-test:1.3.0-beta01")
+    docs("androidx.compose.ui:ui-test-junit4:1.3.0-beta01")
+    samples("androidx.compose.ui:ui-test-samples:1.3.0-beta01")
+    docs("androidx.compose.ui:ui-text:1.3.0-beta01")
+    docs("androidx.compose.ui:ui-text-google-fonts:1.3.0-beta01")
+    samples("androidx.compose.ui:ui-text-samples:1.3.0-beta01")
+    docs("androidx.compose.ui:ui-tooling:1.3.0-beta01")
+    docs("androidx.compose.ui:ui-tooling-data:1.3.0-beta01")
+    docs("androidx.compose.ui:ui-tooling-preview:1.3.0-beta01")
+    docs("androidx.compose.ui:ui-unit:1.3.0-beta01")
+    samples("androidx.compose.ui:ui-unit-samples:1.3.0-beta01")
+    docs("androidx.compose.ui:ui-util:1.3.0-beta01")
+    docs("androidx.compose.ui:ui-viewbinding:1.3.0-beta01")
+    samples("androidx.compose.ui:ui-viewbinding-samples:1.3.0-beta01")
+    samples("androidx.compose.ui:ui-samples:1.3.0-beta01")
     docs("androidx.concurrent:concurrent-futures:1.1.0")
     docs("androidx.concurrent:concurrent-futures-ktx:1.1.0")
     docs("androidx.contentpager:contentpager:1.0.0")
     docs("androidx.coordinatorlayout:coordinatorlayout:1.2.0")
-    docs("androidx.core.uwb:uwb:1.0.0-alpha02")
+    docs("androidx.core.uwb:uwb:1.0.0-alpha03")
+    docs("androidx.core.uwb:uwb-rxjava3:1.0.0-alpha03")
     docs("androidx.core:core-google-shortcuts:1.1.0-alpha02")
-    docs("androidx.core:core-performance:1.0.0-alpha02")
-    samples("androidx.core:core-performance-samples:1.0.0-alpha02")
-    docs("androidx.core:core-remoteviews:1.0.0-beta01")
-    docs("androidx.core:core-role:1.1.0-rc01")
-    docs("androidx.core:core-animation:1.0.0-beta01")
-    docs("androidx.core:core-animation-testing:1.0.0-alpha02")
-    docs("androidx.core:core:1.9.0-alpha05")
-    docs("androidx.core:core-ktx:1.9.0-alpha05")
-    docs("androidx.core:core-splashscreen:1.0.0")
+    docs("androidx.core:core-performance:1.0.0-alpha03")
+    samples("androidx.core:core-performance-samples:1.0.0-alpha03")
+    docs("androidx.core:core-remoteviews:1.0.0-beta02")
+    docs("androidx.core:core-role:1.2.0-alpha01")
+    docs("androidx.core:core-animation:1.0.0-beta02")
+    docs("androidx.core:core-animation-testing:1.0.0-beta01")
+    docs("androidx.core:core:1.9.0-rc01")
+    docs("androidx.core:core-ktx:1.9.0-rc01")
+    docs("androidx.core:core-splashscreen:1.1.0-alpha01")
     docs("androidx.cursoradapter:cursoradapter:1.0.0")
     docs("androidx.customview:customview:1.2.0-alpha01")
     docs("androidx.customview:customview-poolingcontainer:1.0.0-rc01")
@@ -130,10 +132,10 @@
     docs("androidx.drawerlayout:drawerlayout:1.1.1")
     docs("androidx.dynamicanimation:dynamicanimation:1.1.0-alpha02")
     docs("androidx.dynamicanimation:dynamicanimation-ktx:1.0.0-alpha03")
-    docs("androidx.emoji2:emoji2:1.2.0-rc01")
-    docs("androidx.emoji2:emoji2-bundled:1.2.0-rc01")
-    docs("androidx.emoji2:emoji2-views:1.2.0-rc01")
-    docs("androidx.emoji2:emoji2-views-helper:1.2.0-rc01")
+    docs("androidx.emoji2:emoji2:1.2.0")
+    docs("androidx.emoji2:emoji2-bundled:1.2.0")
+    docs("androidx.emoji2:emoji2-views:1.2.0")
+    docs("androidx.emoji2:emoji2-views-helper:1.2.0")
     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")
@@ -143,10 +145,12 @@
     docs("androidx.fragment:fragment:1.6.0-alpha01")
     docs("androidx.fragment:fragment-ktx:1.6.0-alpha01")
     docs("androidx.fragment:fragment-testing:1.6.0-alpha01")
-    docs("androidx.glance:glance:1.0.0-alpha03")
-    docs("androidx.glance:glance-appwidget:1.0.0-alpha03")
+    docs("androidx.glance:glance:1.0.0-alpha04")
+    docs("androidx.glance:glance-appwidget:1.0.0-alpha04")
+    docs("androidx.glance:glance-appwidget-preview:1.0.0-alpha04")
     docs("androidx.glance:glance-appwidget-proto:1.0.0-alpha03")
-    docs("androidx.glance:glance-wear-tiles:1.0.0-alpha03")
+    docs("androidx.glance:glance-preview:1.0.0-alpha04")
+    docs("androidx.glance:glance-wear-tiles:1.0.0-alpha04")
     docs("androidx.gridlayout:gridlayout:1.0.0")
     docs("androidx.health:health-connect-client:1.0.0-alpha03")
     samples("androidx.health:health-connect-client-samples:1.0.0-alpha03")
@@ -159,6 +163,7 @@
     docs("androidx.hilt:hilt-navigation-fragment:1.0.0-beta01")
     docs("androidx.hilt:hilt-work:1.0.0-beta01")
     docs("androidx.interpolator:interpolator:1.0.0")
+    docs("androidx.javascriptengine:javascriptengine:1.0.0-alpha01")
     docs("androidx.leanback:leanback:1.2.0-alpha02")
     docs("androidx.leanback:leanback-grid:1.0.0-alpha01")
     docs("androidx.leanback:leanback-paging:1.1.0-alpha09")
@@ -208,17 +213,17 @@
     docs("androidx.navigation:navigation-testing:2.5.1")
     docs("androidx.navigation:navigation-ui:2.5.1")
     docs("androidx.navigation:navigation-ui-ktx:2.5.1")
-    docs("androidx.paging:paging-common:3.2.0-alpha01")
-    docs("androidx.paging:paging-common-ktx:3.2.0-alpha01")
-    docs("androidx.paging:paging-compose:1.0.0-alpha15")
+    docs("androidx.paging:paging-common:3.2.0-alpha02")
+    docs("androidx.paging:paging-common-ktx:3.2.0-alpha02")
+    docs("androidx.paging:paging-compose:1.0.0-alpha16")
     samples("androidx.paging:paging-compose-samples:3.0.0-alpha08")
-    docs("androidx.paging:paging-guava:3.2.0-alpha01")
-    docs("androidx.paging:paging-runtime:3.2.0-alpha01")
-    docs("androidx.paging:paging-runtime-ktx:3.2.0-alpha01")
-    docs("androidx.paging:paging-rxjava2:3.2.0-alpha01")
-    docs("androidx.paging:paging-rxjava2-ktx:3.2.0-alpha01")
-    docs("androidx.paging:paging-rxjava3:3.2.0-alpha01")
-    samples("androidx.paging:paging-samples:3.2.0-alpha01")
+    docs("androidx.paging:paging-guava:3.2.0-alpha02")
+    docs("androidx.paging:paging-runtime:3.2.0-alpha02")
+    docs("androidx.paging:paging-runtime-ktx:3.2.0-alpha02")
+    docs("androidx.paging:paging-rxjava2:3.2.0-alpha02")
+    docs("androidx.paging:paging-rxjava2-ktx:3.2.0-alpha02")
+    docs("androidx.paging:paging-rxjava3:3.2.0-alpha02")
+    samples("androidx.paging:paging-samples:3.2.0-alpha02")
     docs("androidx.palette:palette:1.0.0")
     docs("androidx.palette:palette-ktx:1.0.0")
     docs("androidx.percentlayout:percentlayout:1.0.1")
@@ -227,7 +232,7 @@
     docs("androidx.print:print:1.1.0-beta01")
     docs("androidx.profileinstaller:profileinstaller:1.2.0-rc01")
     docs("androidx.recommendation:recommendation:1.0.0")
-    docs("androidx.recyclerview:recyclerview:1.3.0-beta01")
+    docs("androidx.recyclerview:recyclerview:1.3.0-beta02")
     docs("androidx.recyclerview:recyclerview-selection:2.0.0-alpha01")
     docs("androidx.remotecallback:remotecallback:1.0.0-alpha02")
     docs("androidx.resourceinspection:resourceinspection-annotation:1.0.1")
@@ -257,9 +262,9 @@
     docs("androidx.slice:slice-core:1.1.0-alpha02")
     docs("androidx.slice:slice-view:1.1.0-alpha02")
     docs("androidx.slidingpanelayout:slidingpanelayout:1.2.0")
-    docs("androidx.sqlite:sqlite:2.3.0-alpha03")
-    docs("androidx.sqlite:sqlite-framework:2.3.0-alpha03")
-    docs("androidx.sqlite:sqlite-ktx:2.3.0-alpha03")
+    docs("androidx.sqlite:sqlite:2.3.0-alpha04")
+    docs("androidx.sqlite:sqlite-framework:2.3.0-alpha04")
+    docs("androidx.sqlite:sqlite-ktx:2.3.0-alpha04")
     docs("androidx.startup:startup-runtime:1.2.0-alpha01")
     docs("androidx.swiperefreshlayout:swiperefreshlayout:1.2.0-alpha01")
     docs("androidx.textclassifier:textclassifier:1.0.0-alpha04")
@@ -276,33 +281,33 @@
     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.1.0-alpha02")
-    samples("androidx.wear.compose:compose-foundation-samples:1.1.0-alpha02")
-    docs("androidx.wear.compose:compose-material:1.1.0-alpha02")
-    samples("androidx.wear.compose:compose-material-samples:1.1.0-alpha02")
-    docs("androidx.wear.compose:compose-navigation:1.1.0-alpha02")
-    samples("androidx.wear.compose:compose-navigation-samples:1.1.0-alpha02")
-    docs("androidx.wear.tiles:tiles:1.1.0-beta01")
-    docs("androidx.wear.tiles:tiles-material:1.1.0-beta01")
-    docs("androidx.wear.tiles:tiles-proto:1.1.0-beta01")
-    docs("androidx.wear.tiles:tiles-renderer:1.1.0-beta01")
-    docs("androidx.wear.tiles:tiles-testing:1.1.0-beta01")
-    docs("androidx.wear.watchface:watchface:1.1.0")
-    docs("androidx.wear.watchface:watchface-client:1.1.0")
-    docs("androidx.wear.watchface:watchface-client-guava:1.1.0")
-    docs("androidx.wear.watchface:watchface-complications:1.1.0")
-    docs("androidx.wear.watchface:watchface-complications-data:1.1.0")
-    docs("androidx.wear.watchface:watchface-complications-data-source:1.1.0")
-    docs("androidx.wear.watchface:watchface-complications-data-source-ktx:1.1.0")
-    samples("androidx.wear.watchface:watchface-complications-permission-dialogs-sample:1.1.0")
-    docs("androidx.wear.watchface:watchface-complications-rendering:1.1.0")
-    docs("androidx.wear.watchface:watchface-data:1.1.0")
-    docs("androidx.wear.watchface:watchface-editor:1.1.0")
-    docs("androidx.wear.watchface:watchface-editor-guava:1.1.0")
-    samples("androidx.wear.watchface:watchface-editor-samples:1.1.0")
-    docs("androidx.wear.watchface:watchface-guava:1.1.0")
-    samples("androidx.wear.watchface:watchface-samples:1.1.0")
-    docs("androidx.wear.watchface:watchface-style:1.1.0")
+    docs("androidx.wear.compose:compose-foundation:1.1.0-alpha03")
+    samples("androidx.wear.compose:compose-foundation-samples:1.1.0-alpha03")
+    docs("androidx.wear.compose:compose-material:1.1.0-alpha03")
+    samples("androidx.wear.compose:compose-material-samples:1.1.0-alpha03")
+    docs("androidx.wear.compose:compose-navigation:1.1.0-alpha03")
+    samples("androidx.wear.compose:compose-navigation-samples:1.1.0-alpha03")
+    docs("androidx.wear.tiles:tiles:1.1.0-rc01")
+    docs("androidx.wear.tiles:tiles-material:1.1.0-rc01")
+    docs("androidx.wear.tiles:tiles-proto:1.1.0-rc01")
+    docs("androidx.wear.tiles:tiles-renderer:1.1.0-rc01")
+    docs("androidx.wear.tiles:tiles-testing:1.1.0-rc01")
+    docs("androidx.wear.watchface:watchface:1.2.0-alpha01")
+    docs("androidx.wear.watchface:watchface-client:1.2.0-alpha01")
+    docs("androidx.wear.watchface:watchface-client-guava:1.2.0-alpha01")
+    docs("androidx.wear.watchface:watchface-complications:1.2.0-alpha01")
+    docs("androidx.wear.watchface:watchface-complications-data:1.2.0-alpha01")
+    docs("androidx.wear.watchface:watchface-complications-data-source:1.2.0-alpha01")
+    docs("androidx.wear.watchface:watchface-complications-data-source-ktx:1.2.0-alpha01")
+    samples("androidx.wear.watchface:watchface-complications-permission-dialogs-sample:1.2.0-alpha01")
+    docs("androidx.wear.watchface:watchface-complications-rendering:1.2.0-alpha01")
+    docs("androidx.wear.watchface:watchface-data:1.2.0-alpha01")
+    docs("androidx.wear.watchface:watchface-editor:1.2.0-alpha01")
+    docs("androidx.wear.watchface:watchface-editor-guava:1.2.0-alpha01")
+    samples("androidx.wear.watchface:watchface-editor-samples:1.2.0-alpha01")
+    docs("androidx.wear.watchface:watchface-guava:1.2.0-alpha01")
+    samples("androidx.wear.watchface:watchface-samples:1.2.0-alpha01")
+    docs("androidx.wear.watchface:watchface-style:1.2.0-alpha01")
     docs("androidx.wear:wear:1.3.0-alpha02")
     stubs(fileTree(dir: "../wear/wear_stubs/", include: ["com.google.android.wearable-stubs.jar"]))
     docs("androidx.wear:wear-ongoing:1.1.0-alpha01")
@@ -311,7 +316,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.5.0-beta01")
+    docs("androidx.webkit:webkit:1.5.0-rc01")
     docs("androidx.window:window:1.1.0-alpha03")
     stubs(fileTree(dir: "../window/stubs/", include: ["window-sidecar-release-0.1.0-alpha01.aar"]))
     stubs("androidx.window:window-extensions:1.0.0-alpha01")
@@ -319,11 +324,11 @@
     docs("androidx.window:window-rxjava2:1.1.0-alpha03")
     docs("androidx.window:window-rxjava3:1.1.0-alpha03")
     docs("androidx.window:window-testing:1.1.0-alpha03")
-    docs("androidx.work:work-gcm:2.8.0-alpha02")
-    docs("androidx.work:work-multiprocess:2.8.0-alpha02")
-    docs("androidx.work:work-runtime:2.8.0-alpha02")
-    docs("androidx.work:work-runtime-ktx:2.8.0-alpha02")
-    docs("androidx.work:work-rxjava2:2.8.0-alpha02")
-    docs("androidx.work:work-rxjava3:2.8.0-alpha02")
-    docs("androidx.work:work-testing:2.8.0-alpha02")
+    docs("androidx.work:work-gcm:2.8.0-alpha03")
+    docs("androidx.work:work-multiprocess:2.8.0-alpha03")
+    docs("androidx.work:work-runtime:2.8.0-alpha03")
+    docs("androidx.work:work-runtime-ktx:2.8.0-alpha03")
+    docs("androidx.work:work-rxjava2:2.8.0-alpha03")
+    docs("androidx.work:work-rxjava3:2.8.0-alpha03")
+    docs("androidx.work:work-testing:2.8.0-alpha03")
 }
diff --git a/docs-tip-of-tree/build.gradle b/docs-tip-of-tree/build.gradle
index 582f65c..6c27d77 100644
--- a/docs-tip-of-tree/build.gradle
+++ b/docs-tip-of-tree/build.gradle
@@ -158,8 +158,8 @@
     docs(project(":glance:glance-wear-tiles"))
     docs(project(":graphics:graphics-core"))
     docs(project(":gridlayout:gridlayout"))
-    docs(project(":health:health-connect-client"))
-    samples(project(":health:health-connect-client-samples"))
+    docs(project(":health:connect:connect-client"))
+    samples(project(":health:connect:connect-client-samples"))
     docs(project(":health:health-services-client"))
     docs(project(":heifwriter:heifwriter"))
     docs(project(":hilt:hilt-common"))
@@ -235,6 +235,8 @@
     docs(project(":preference:preference"))
     docs(project(":preference:preference-ktx"))
     docs(project(":print:print"))
+    docs(project(":privacysandbox:sdkruntime:sdkruntime-client"))
+    docs(project(":privacysandbox:sdkruntime:sdkruntime-core"))
     docs(project(":privacysandbox:tools:tools"))
     docs(project(":privacysandbox:tools:tools-apicompiler"))
     docs(project(":privacysandbox:tools:tools-apigenerator"))
diff --git a/docs/api_guidelines.md b/docs/api_guidelines.md
deleted file mode 100644
index 8fb85d5..0000000
--- a/docs/api_guidelines.md
+++ /dev/null
@@ -1,2417 +0,0 @@
-# Library API guidelines
-
-[TOC]
-
-## Introduction {#introduction}
-
-This guide is an addendum to
-s.android.com/api-guidelines,
-which covers standard and practices for designing platform APIs.
-
-All platform API design guidelines also apply to Jetpack libraries, with any
-additional guidelines or exceptions noted in this document. Jetpack libraries
-also follow
-[explicit API mode](https://kotlinlang.org/docs/reference/whatsnew14.html#explicit-api-mode-for-library-authors)
-for Kotlin libraries.
-
-## Modules {#module}
-
-### Packaging and naming {#module-naming}
-
-Java packages within Jetpack follow the format `androidx.<feature-name>`. All
-classes within a feature's artifact must reside within this package, and may
-further subdivide into `androidx.<feature-name>.<layer>` using standard Android
-layers (app, widget, etc.) or layers specific to the feature.
-
-Maven specifications use the groupId format `androidx.<feature-name>` and
-artifactId format `<feature-name>` to match the Java package. For example,
-`androidx.core.role` uses the Maven spec `androidx.core:role`.
-
-Sub-features that can be separated into their own artifact are recommended to
-use the following formats:
-
--   Java package: `androidx.<feature-name>.<sub-feature>.<layer>`
--   Maven groupId: `androidx.<feature-name>`
--   Maven artifactId: `<feature-name>-<sub-feature>`
-
-Gradle project names and directories follow the Maven spec format, substituting
-the project name separator `:` or directory separator `/` for the Maven
-separators `.` or `:`. For example, `androidx.core:core-role` would use project
-name `:core:core-role` and directory `/core/core-role`.
-
-New modules in androidx can be created using the
-[project creator script](#module-creation).
-
-NOTE Modules for OEM-implemented shared libraries (also known as extensions or
-sidecars) that ship on-device and are referenced via the `<uses-library>` tag
-should follow the naming convention `com.android.extensions.<feature-name>` to
-avoid placing `androidx`-packaged code in the platform's boot classpath.
-
-#### Project directory structure {#module-structure}
-
-Libraries developed in AndroidX follow a consistent project naming and directory
-structure.
-
-Library groups should organize their projects into directories and project names
-(in brackets) as:
-
-```
-<feature-name>/
-  <feature-name>-<sub-feature>/ [<feature-name>:<feature-name>-<sub-feature>]
-    samples/ [<feature-name>:<feature-name>-<sub-feature>-samples]
-  integration-tests/
-    testapp/ [<feature-name>:testapp]
-    testlib/ [<feature-name>:testlib]
-```
-
-For example, the `navigation` library group's directory structure is:
-
-```
-navigation/
-  navigation-benchmark/ [navigation:navigation-benchmark]
-  ...
-  navigation-ui/ [navigation:navigation-ui]
-  navigation-ui-ktx/ [navigation:navigation-ui-ktx]
-  integration-tests/
-    testapp/ [navigation:integration-tests:testapp]
-```
-
-#### Project creator script {#module-creation}
-
-Note: The terms *project*, *module*, and *library* are often used
-interchangeably within AndroidX, with project being the technical term used by
-Gradle to describe a build target, e.g. a library that maps to a single AAR.
-
-New projects can be created using our
-[project creation script](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:development/project-creator/?q=project-creator&ss=androidx%2Fplatform%2Fframeworks%2Fsupport)
-available in our repo.
-
-It will create a new project with the proper structure and configuration based
-on your project needs!
-
-To use it:
-
-```sh
-cd ~/androidx-main/frameworks/support && \
-cd development/project-creator && \
-./create_project.py androidx.foo foo-bar
-```
-
-If you are creating an unpublished module such as an integration test app with \
-the project creator script, it may not make sense to follow the same naming \
-conventions as published libraries. In this situation it is safe to comment out
-\
-the `artifact_id` validation from the script or rename the module after it has \
-been created.
-
-If you see an error message `No module named 'toml'` try the following steps.
-
-*   Install necessary tools if they are not already installed
-    *   (Linux) `sudo apt-get install virtualenv python3-venv`
-    *   (Mac) `pip3 install virtualenv`
-*   Create a virtual environment with `virtualenv androidx_project_creator` (you
-    can choose another name for your virtualenv if you wish).
-*   Install the `toml` library in your virtual env with
-    `androidx_project_creator/bin/pip3 install toml`
-*   Run the project creator script from your virtual env with
-    `androidx_project_creator/bin/python3
-    ../../development/project-creator/create_project.py androidx.foo foo-bar`
-*   Delete your virtual env with `rm -rf ./androidx-project_creator`
-    *   virtualenv will automatically .gitignore itself, but you may want to to
-        remove it anyway.
-
-#### Common sub-feature names {#module-naming-subfeature}
-
-*   `-testing` for an artifact intended to be used while testing usages of your
-    library, e.g. `androidx.room:room-testing`
-*   `-core` for a low-level artifact that *may* contain public APIs but is
-    primarily intended for use by other libraries in the group
-*   `-ktx` for an Kotlin artifact that exposes idiomatic Kotlin APIs as an
-    extension to a Java-only library (see
-    [additional -ktx guidance](#module-ktx))
-*   `-samples` for sample code which can be inlined in documentation (see
-    [Sample code in Kotlin modules](#sample-code-in-kotlin-modules)
-*   `-<third-party>` for an artifact that integrates an optional third-party API
-    surface, e.g. `-proto` or `-rxjava2`. Note that a major version is included
-    in the sub-feature name for third-party API surfaces where the major version
-    indicates binary compatibility (only needed for post-1.x).
-
-Artifacts **should not** use `-impl` or `-base` to indicate that a library is an
-implementation detail shared within the group. Instead, use `-core`.
-
-#### Splitting existing modules
-
-Existing modules *should not* be split into smaller modules; doing so creates
-the potential for class duplication issues when a developer depends on a new
-sub-module alongside the older top-level module. Consider the following
-scenario:
-
-*   `androidx.library:1.0.0`
-    *   contains class `androidx.library.A`
-    *   contains class `androidx.library.util.B`
-
-This module is split, moving `androidx.library.util.B` to a new module:
-
-*   `androidx.library:1.1.0`
-    *   contains class `androidx.library.A`
-    *   depends on `androidx.library.util:1.1.0`
-*   `androidx.library.util:1.1.0`
-    *   contains class `androidx.library.util.B`
-
-A developer writes an app that depends directly on `androidx.library.util:1.1.0`
-and also transitively pulls in `androidx.library:1.0.0`. Their app will no
-longer compile due to class duplication of `androidx.library.util.B`.
-
-While it is possible for the developer to fix this by manually specifying a
-dependency on `androidx.library:1.1.0`, there is no easy way for the developer
-to discover this solution from the class duplication error raised at compile
-time.
-
-Same-version groups are a special case for this rule. Existing modules that are
-already in a same-version group may be split into sub-modules provided that (a)
-the sub-modules are also in the same-version group and (b) the full API surface
-of the existing module is preserved through transitive dependencies, e.g. the
-sub-modules are added as dependencies of the existing module.
-
-#### Same-version (atomic) groups {#modules-atomic}
-
-Library groups are encouraged to opt-in to a same-version policy whereby all
-libraries in the group use the same version and express exact-match dependencies
-on libraries within the group. Such groups must increment the version of every
-library at the same time and release all libraries at the same time.
-
-Atomic groups are specified in
-[libraryversions.toml](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:libraryversions.toml):
-
-```
-// Non-atomic library group
-APPCOMPAT = { group = "androidx.appcompat" }
-// Atomic library group
-APPSEARCH = { group = "androidx.appsearch", atomicGroupVersion = "versions.APPSEARCH" }
-```
-
-Libraries within an atomic group should not specify a version in their
-`build.gradle`:
-
-```groovy
-androidx {
-    name = 'AppSearch'
-    publish = Publish.SNAPSHOT_AND_RELEASE
-    mavenGroup = LibraryGroups.APPSEARCH
-    inceptionYear = '2019'
-    description = 'Provides local and centralized app indexing'
-}
-```
-
-The benefits of using an atomic group are:
-
--   Easier for developers to understand dependency versioning
--   `@RestrictTo(LIBRARY_GROUP)` APIs are treated as private APIs and not
-    tracked for binary compatibility
--   `@RequiresOptIn` APIs defined within the group may be used without any
-    restrictions between libraries in the group
-
-Potential drawbacks include:
-
--   All libraries within the group must be versioned identically at head
--   All libraries within the group must release at the same time
-
-#### Early-stage development {#modules-atomic-alpha}
-
-There is one exception to the same-version policy: newly-added libraries within
-an atomic group may be "quarantined" from other libraries to allow for rapid
-iteration until they are API-stable.
-
-A quarantined library must stay within the `1.0.0-alphaXX` cycle until it is
-ready to conform to the same-version policy. While in quarantime, a library is
-treated at though it is in a separate group from its nomical same-version group:
-
--   Must stay in `1.0.0-alphaXX`, e.g. same-version policy is not enforced
--   May use `project` or pinned version dependencies, e.g. strict-match
-    dependencies are not enforced
--   May release on a separate cadence from other libraries within group
--   Must not reference restricted `LIBRARY-GROUP`-scoped APIs
-
-When the library would like to leave quarantine, it must wait for its atomic
-group to be within a `beta` cycle and then match the version. It is okay for a
-library in this situation to skip versions, e.g. move directly from
-`1.0.0-alpha02` to `2.1.3-beta06`.
-
-### Choosing a `minSdkVersion` {#module-minsdkversion}
-
-The recommended minimum SDK version for new Jetpack libraries is currently
-**19** (Android 4.4, KitKat). This SDK was chosen to represent 99% of active
-devices based on Play Store check-ins (see Android Studio
-[distribution metadata](https://dl.google.com/android/studio/metadata/distributions.json)
-for current statistics). This maximizes potential users for external developers
-while minimizing the amount of overhead necessary to support legacy versions.
-
-However, if no explicit minimum SDK version is specified for a library, the
-default is **14** (Android 4.0, Ice Cream Sandwich).
-
-Note that a library **must not** depend on another library with a higher
-`minSdkVersion` that its own, so it may be necessary for a new library to match
-its dependent libraries' `minSdkVersion`.
-
-Individual modules may choose a higher minimum SDK version for business or
-technical reasons. This is common for device-specific modules such as Auto or
-Wear.
-
-Individual classes or methods may be annotated with the
-[@RequiresApi](https://developer.android.com/reference/android/annotation/RequiresApi.html)
-annotation to indicate divergence from the overall module's minimum SDK version.
-Note that this pattern is *not recommended* because it leads to confusion for
-external developers and should be considered a last-resort when backporting
-behavior is not feasible.
-
-### Kotlin extension `-ktx` libraries {#module-ktx}
-
-New libraries should prefer Kotlin sources with built-in Java compatibility via
-`@JvmName` and other affordances of the Kotlin language; however, existing Java
-sourced libraries may benefit from extending their API surface with
-Kotlin-friendly APIs in a `-ktx` library.
-
-A Kotlin extension library **may only** provide extensions for a single base
-library's API surface and its name **must** match the base library exactly. For
-example, `work:work-ktx` may only provide extensions for APIs exposed by
-`work:work`.
-
-Additionally, an extension library **must** specify an `api`-type dependency on
-the base library and **must** be versioned and released identically to the base
-library.
-
-Kotlin extension libraries *should not* expose new functionality; they should
-only provide Kotlin-friendly versions of existing Java-facing functionality.
-
-## Platform compatibility API patterns {#platform-compatibility-apis}
-
-NOTE For all library APIs that wrap or provide parity with platform APIs,
-*parity with the platform APIs overrides API guidelines*. For example, if the
-platform API being wrapped has incorrect `Executor` and `Callback` ordering
-according to the API Guidelines, the corresponding library API should have the
-exact same (incorrect) ordering.
-
-### Static shims (ex. [ViewCompat](https://developer.android.com/reference/android/support/v4/view/ViewCompat.html)) {#static-shim}
-
-When to use?
-
-*   Platform class exists at module's `minSdkVersion`
-*   Compatibility implementation does not need to store additional metadata
-
-Implementation requirements
-
-*   Class name **must** be `<PlatformClass>Compat`
-*   Package name **must** be `androidx.<feature>.<platform.package>`
-*   Superclass **must** be `Object`
-*   Class **must** be non-instantiable, i.e. constructor is private no-op
-*   Static fields and static methods **must** match match signatures with
-    `<PlatformClass>`
-    *   Static fields that can be inlined, ex. integer constants, **must not**
-        be shimmed
-*   Public method names **must** match platform method names
-*   Public methods **must** be static and take `<PlatformClass>` as first
-    parameter (except in the case of static methods on the platform class, as
-    shown below)
-*   Implementation *may* delegate to `<PlatformClass>` methods when available
-
-#### Sample {#static-shim-sample}
-
-The following sample provides static helper methods for the platform class
-`android.os.Process`.
-
-```java
-/**
- * Helper for accessing features in {@link Process}.
- */
-public final class ProcessCompat {
-    private ProcessCompat() {
-        // This class is non-instantiable.
-    }
-
-    /**
-     * [Docs should match platform docs.]
-     *
-     * Compatibility behavior:
-     * <ul>
-     * <li>SDK 24 and above, this method matches platform behavior.
-     * <li>SDK 16 through 23, this method is a best-effort to match platform behavior, but may
-     * default to returning {@code true} if an accurate result is not available.
-     * <li>SDK 15 and below, this method always returns {@code true} as application UIDs and
-     * isolated processes did not exist yet.
-     * </ul>
-     *
-     * @param [match platform docs]
-     * @return [match platform docs], or a value based on platform-specific fallback behavior
-     */
-    public static boolean isApplicationUid(int uid) {
-        if (Build.VERSION.SDK_INT >= 24) {
-            return Api24Impl.isApplicationUid(uid);
-        } else if (Build.VERSION.SDK_INT >= 17) {
-            return Api17Impl.isApplicationUid(uid);
-        } else if (Build.VERSION.SDK_INT == 16) {
-            return Api16Impl.isApplicationUid(uid);
-        } else {
-            return true;
-        }
-    }
-
-    @RequiresApi(24)
-    static class Api24Impl {
-        static boolean isApplicationUid(int uid) {
-            // In N, the method was made public on android.os.Process.
-            return Process.isApplicationUid(uid);
-        }
-    }
-
-    @RequiresApi(17)
-    static class Api17Impl {
-        private static Method sMethod_isAppMethod;
-        private static boolean sResolved;
-
-        static boolean isApplicationUid(int uid) {
-            // In JELLY_BEAN_MR2, the equivalent isApp(int) hidden method moved to public class
-            // android.os.UserHandle.
-            try {
-                if (!sResolved) {
-                    sResolved = true;
-                    sMethod_isAppMethod = UserHandle.class.getDeclaredMethod("isApp",int.class);
-                }
-                if (sMethod_isAppMethod != null) {
-                    return (Boolean) sMethod_isAppMethod.invoke(null, uid);
-                }
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-            return true;
-        }
-    }
-
-    ...
-}
-```
-
-### Wrapper (ex. [AccessibilityNodeInfoCompat](https://developer.android.com/reference/android/support/v4/view/accessibility/AccessibilityNodeInfoCompat.html)) {#wrapper}
-
-When to use?
-
-*   Platform class may not exist at module's `minSdkVersion`
-*   Compatibility implementation may need to store additional metadata
-*   Needs to integrate with platform APIs as return value or method argument
-*   **Note:** Should be avoided when possible, as using wrapper classes makes it
-    very difficult to deprecate classes and migrate source code when the
-    `minSdkVersion` is raised
-
-#### Sample {#wrapper-sample}
-
-The following sample wraps a hypothetical platform class `ModemInfo` that was
-added to the platform SDK in API level 23:
-
-```java
-public final class ModemInfoCompat {
-  // Only guaranteed to be non-null on SDK_INT >= 23. Note that referencing the
-  // class itself directly is fine -- only references to class members need to
-  // be pushed into static inner classes.
-  private final ModemInfo wrappedObj;
-
-  /**
-   * [Copy platform docs for matching constructor.]
-   */
-  public ModemInfoCompat() {
-    if (SDK_INT >= 23) {
-      wrappedObj = Api23Impl.create();
-    } else {
-      wrappedObj = null;
-    }
-    ...
-  }
-
-  @RequiresApi(23)
-  private ModemInfoCompat(@NonNull ModemInfo obj) {
-    mWrapped = obj;
-  }
-
-  /**
-   * Provides a backward-compatible wrapper for {@link ModemInfo}.
-   * <p>
-   * This method is not supported on devices running SDK < 23 since the platform
-   * class will not be available.
-   *
-   * @param info platform class to wrap
-   * @return wrapped class, or {@code null} if parameter is {@code null}
-   */
-  @RequiresApi(23)
-  @NonNull
-  public static ModemInfoCompat toModemInfoCompat(@NonNull ModemInfo info) {
-    return new ModemInfoCompat(obj);
-  }
-
-  /**
-   * Provides the {@link ModemInfo} represented by this object.
-   * <p>
-   * This method is not supported on devices running SDK < 23 since the platform
-   * class will not be available.
-   *
-   * @return platform class object
-   * @see ModemInfoCompat#toModemInfoCompat(ModemInfo)
-   */
-  @RequiresApi(23)
-  @NonNull
-  public ModemInfo toModemInfo() {
-    return mWrapped;
-  }
-
-  /**
-   * [Docs should match platform docs.]
-   *
-   * Compatibility behavior:
-   * <ul>
-   * <li>API level 23 and above, this method matches platform behavior.
-   * <li>API level 18 through 22, this method ...
-   * <li>API level 17 and earlier, this method always returns false.
-   * </ul>
-   *
-   * @return [match platform docs], or platform-specific fallback behavior
-   */
-  public boolean isLteSupported() {
-    if (SDK_INT >= 23) {
-      return Api23Impl.isLteSupported(mWrapped);
-    } else if (SDK_INT >= 18) {
-      // Smart fallback behavior based on earlier APIs.
-      ...
-    }
-    // Default behavior.
-    return false;
-  }
-
-  // All references to class members -- including the constructor -- must be
-  // made on an inner class to avoid soft-verification errors that slow class
-  // loading and prevent optimization.
-  @RequiresApi(23)
-  private static class Api23Impl {
-    @DoNotInline
-    @NonNull
-    static ModemInfo create() {
-      return new ModemInfo();
-    }
-
-    @DoNotInline
-    static boolean isLteSupported(ModemInfo obj) {
-      return obj.isLteSupported();
-    }
-  }
-}
-```
-
-Note that libraries written in Java should express conversion to and from the
-platform class differently than Kotlin classes. For Java classes, conversion
-from the platform class to the wrapper should be expressed as a `static` method,
-while conversion from the wrapper to the platform class should be a method on
-the wrapper object:
-
-```java
-@NonNull
-public static ModemInfoCompat toModemInfoCompat(@NonNull ModemInfo info);
-
-@NonNull
-public ModemInfo toModemInfo();
-```
-
-In cases where the primary library is written in Java and has an accompanying
-`-ktx` Kotlin extensions library, the following conversion should be provided as
-an extension function:
-
-```kotlin
-fun ModemInfo.toModemInfoCompat() : ModemInfoCompat
-```
-
-Whereas in cases where the primary library is written in Kotlin, the conversion
-should be provided as an extension factory:
-
-```kotlin
-class ModemInfoCompat {
-  fun toModemInfo() : ModemInfo
-
-  companion object {
-    @JvmStatic
-    @JvmName("toModemInfoCompat")
-    fun ModemInfo.toModemInfoCompat() : ModemInfoCompat
-  }
-}
-```
-
-#### API guidelines {#wrapper-api-guidelines}
-
-##### Naming {#wrapper-naming}
-
-*   Class name **must** be `<PlatformClass>Compat`
-*   Package name **must** be `androidx.core.<platform.package>`
-*   Superclass **must not** be `<PlatformClass>`
-
-##### Construction {#wrapper-construction}
-
-*   Class *may* have public constructor(s) to provide parity with public
-    `PlatformClass` constructors
-    *   Constructor used to wrap `PlatformClass` **must not** be public
-*   Class **must** implement a static `PlatformClassCompat
-    toPlatformClassCompat(PlatformClass)` method to wrap `PlatformClass` on
-    supported SDK levels
-    *   If class does not exist at module's `minSdkVersion`, method must be
-        annotated with `@RequiresApi(<sdk>)` for SDK version where class was
-        introduced
-
-#### Implementation {#wrapper-implementation}
-
-*   Class **must** implement a `PlatformClass toPlatformClass()` method to
-    unwrap `PlatformClass` on supported SDK levels
-    *   If class does not exist at module's `minSdkVersion`, method must be
-        annotated with `@RequiresApi(<sdk>)` for SDK version where class was
-        introduced
-*   Implementation *may* delegate to `PlatformClass` methods when available (see
-    below note for caveats)
-*   To avoid runtime class verification issues, all operations that interact
-    with the internal structure of `PlatformClass` must be implemented in inner
-    classes targeted to the SDK level at which the operation was added.
-    *   See the [sample](#wrapper-sample) for an example of interacting with a
-        method that was added in SDK level 23.
-
-### Safe super. invocation {#safe-super-calls}
-
-When to use?
-
-*   When invoking `method.superMethodIntroducedSinceMinSdk()`
-
-Implementation requirements
-
-*   Class must be a *non-static* **inner class** (captures `this` pointer)
-*   Class may not be exposed in public API
-
-This should only be used when calling `super` methods that will not verify (such
-as when overriding a new method to provide back compat).
-
-Super calls is not available in a `static` context in Java. It can however be
-called from an inner class.
-
-#### Sample {#safe-super-calls-sample}
-
-```java
-class AppCompatTextView : TextView {
-
-  @Nullable
-  SuperCaller mSuperCaller = null;
-
-  @Override
-  int getPropertyFromApi99() {
-  if (Build.VERSION.SDK_INT > 99) {
-    getSuperCaller().getPropertyFromApi99)();
-  }
-
-  @NonNull
-  @RequiresApi(99)
-  SuperCaller getSuperCaller() {
-    if (mSuperCaller == null) {
-      mSuperCaller = new SuperCaller();
-    }
-    return mSuperCaller;
-  }
-
-  @RequiresApi(99)
-  class SuperCaller {
-    int getPropertyFromApi99() {
-      return AppCompatTextView.super.getPropertyFromApi99();
-    }
-  }
-}
-```
-
-### Standalone (ex. [ArraySet](https://developer.android.com/reference/android/support/v4/util/ArraySet.html), [Fragment](https://developer.android.com/reference/android/support/v4/app/Fragment.html)) {#standalone}
-
-When to use?
-
-*   Platform class may exist at module's `minSdkVersion`
-*   Does not need to integrate with platform APIs
-*   Does not need to coexist with platform class, ex. no potential `import`
-    collision due to both compatibility and platform classes being referenced
-    within the same source file
-
-Implementation requirements
-
-*   Class name **must** be `<PlatformClass>`
-*   Package name **must** be `androidx.<platform.package>`
-*   Superclass **must not** be `<PlatformClass>`
-*   Class **must not** expose `PlatformClass` in public API
-    *   In exceptional cases, a *released* standalone class may add conversion
-        between itself and the equivalent platform class; however, *new* classes
-        that support conversion should follow the [Wrapper](#wrapper)
-        guidelines. In these cases, use a `toPlatform<PlatformClass>` and
-        `static toCompat<PlatformClass>` method naming convention.
-*   Implementation *may* delegate to `PlatformClass` methods when available
-
-### Standalone JAR library (no Android dependencies) {#standalone-jar-library-no-android-dependencies}
-
-When to use
-
-*   General purpose library with minimal interaction with Android types
-    *   or when abstraction around types can be used (e.g. Room's SQLite
-        wrapper)
-*   Lib used in parts of app with minimal Android dependencies
-    *   ex. Repository, ViewModel
-*   When Android dependency can sit on top of common library
-*   Clear separation between android dependent and independent parts of your
-    library
-*   Clear that future integration with android dependencies can be layered
-    separately
-
-**Examples:**
-
-The **Paging Library** pages data from DataSources (such as DB content from Room
-or network content from Retrofit) into PagedLists, so they can be presented in a
-RecyclerView. Since the included Adapter receives a PagedList, and there are no
-other Android dependencies, Paging is split into two parts - a no-android
-library (paging-common) with the majority of the paging code, and an android
-library (paging-runtime) with just the code to present a PagedList in a
-RecyclerView Adapter. This way, tests of Repositories and their components can
-be tested in host-side tests.
-
-**Room** loads SQLite data on Android, but provides an abstraction for those
-that want to use a different SQL implementation on device. This abstraction, and
-the fact that Room generates code dynamically, means that Room interfaces can be
-used in host-side tests (though actual DB code should be tested on device, since
-DB impls may be significantly different on host).
-
-## Implementing compatibility {#compat}
-
-### Referencing new APIs {#compat-newapi}
-
-Generally, methods on extension library classes should be available to all
-devices above the library's `minSdkVersion`.
-
-#### Checking device SDK version {#compat-sdk}
-
-The most common way of delegating to platform or backport implementations is to
-compare the device's `Build.VERSION.SDK_INT` field to a known-good SDK version;
-for example, the SDK in which a method first appeared or in which a critical bug
-was first fixed.
-
-Non-reflective calls to new APIs gated on `SDK_INT` **must** be made from
-version-specific static inner classes to avoid verification errors that
-negatively affect run-time performance. For more information, see Chromium's
-guide to
-[Class Verification Failures](https://chromium.googlesource.com/chromium/src/+/HEAD/build/android/docs/class_verification_failures.md).
-
-Methods in implementation-specific classes **must** be paired with the
-`@DoNotInline` annotation to prevent them from being inlined.
-
-```java {.good}
-public static void saveAttributeDataForStyleable(@NonNull View view, ...) {
-  if (Build.VERSION.SDK_INT >= 29) {
-    Api29Impl.saveAttributeDataForStyleable(view, ...);
-  }
-}
-
-@RequiresApi(29)
-private static class Api29Impl {
-  @DoNotInline
-  static void saveAttributeDataForStyleable(@NonNull View view, ...) {
-    view.saveAttributeDataForStyleable(...);
-  }
-}
-```
-
-Alternatively, in Kotlin sources:
-
-```kotlin {.good}
-@RequiresApi(29)
-private object Api29Impl {
-  @JvmStatic
-  @DoNotInline
-  fun saveAttributeDataForStyleable(view: View, ...) { ... }
-}
-```
-
-When developing against pre-release SDKs where the `SDK_INT` has not been
-finalized, SDK checks **must** use `BuildCompat.isAtLeastX()` methods.
-
-```java {.good}
-@NonNull
-public static List<Window> getAllWindows() {
-  if (BuildCompat.isAtLeastR()) {
-    return ApiRImpl.getAllWindows();
-  }
-  return Collections.emptyList();
-}
-```
-
-#### Device-specific issues {#compat-oem}
-
-Library code may work around device- or manufacturer-specific issues -- issues
-not present in AOSP builds of Android -- *only* if a corresponding CTS test
-and/or CDD policy is added to the next revision of the Android platform. Doing
-so ensures that such issues can be detected and fixed by OEMs.
-
-#### Handling `minSdkVersion` disparity {#compat-minsdk}
-
-Methods that only need to be accessible on newer devices, including
-`to<PlatformClass>()` methods, may be annotated with `@RequiresApi(<sdk>)` to
-indicate they will fail to link on older SDKs. This annotation is enforced at
-build time by Lint.
-
-#### Handling `targetSdkVersion` behavior changes {#compat-targetsdk}
-
-To preserve application functionality, device behavior at a given API level may
-change based on an application's `targetSdkVersion`. For example, if an app with
-`targetSdkVersion` set to API level 22 runs on a device with API level 29, all
-required permissions will be granted at installation time and the run-time
-permissions framework will emulate earlier device behavior.
-
-Libraries do not have control over the app's `targetSdkVersion` and -- in rare
-cases -- may need to handle variations in platform behavior. Refer to the
-following pages for version-specific behavior changes:
-
-*   API level 29:
-    [Android Q behavior changes: apps targeting Q](https://developer.android.com/preview/behavior-changes-q)
-*   API level 28:
-    [Behavior changes: apps targeting API level 28+](https://developer.android.com/about/versions/pie/android-9.0-changes-28)
-*   API level 26:
-    [Changes for apps targeting Android 8.0](https://developer.android.com/about/versions/oreo/android-8.0-changes#o-apps)
-*   API level 24:
-    [Changes for apps targeting Android 7.0](https://developer.android.com/about/versions/nougat/android-7.0-changes#n-apps)
-*   API level 21:
-    [Android 5.0 Behavior Changes](https://developer.android.com/about/versions/android-5.0-changes)
-*   API level 19:
-    [Android 4.4 APIs](https://developer.android.com/about/versions/android-4.4)
-
-#### Working around Lint issues {#compat-lint}
-
-In rare cases, Lint may fail to interpret API usages and yield a `NewApi` error
-and require the use of `@TargetApi` or `@SuppressLint('NewApi')` annotations.
-Both of these annotations are strongly discouraged and may only be used
-temporarily. They **must never** be used in a stable release. Any usage of these
-annotation **must** be associated with an active bug, and the usage must be
-removed when the bug is resolved.
-
-### Delegating to API-specific implementations {#delegating-to-api-specific-implementations}
-
-#### SDK-dependent reflection
-
-Starting in API level 28, the platform restricts which
-[non-SDK interfaces](https://developer.android.com/distribute/best-practices/develop/restrictions-non-sdk-interfaces)
-can be accessed via reflection by apps and libraries. As a general rule, you
-will **not** be able to use reflection to access hidden APIs on devices with
-`SDK_INT` greater than `Build.VERSION_CODES.P` (28).
-
-On earlier devices, reflection on hidden platform APIs is allowed **only** when
-an alternative public platform API exists in a later revision of the Android
-SDK. For example, the following implementation is allowed:
-
-```java
-public AccessibilityDelegate getAccessibilityDelegate(View v) {
-    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
-        // Retrieve the delegate using a public API.
-        return v.getAccessibilityDelegate();
-    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
-        // Retrieve the delegate by reflecting on a private field. If the
-        // field does not exist or cannot be accessed, this will no-op.
-        if (sAccessibilityDelegateField == null) {
-            try {
-                sAccessibilityDelegateField = View.class
-                        .getDeclaredField("mAccessibilityDelegate");
-                sAccessibilityDelegateField.setAccessible(true);
-            } catch (Throwable t) {
-                sAccessibilityDelegateCheckFailed = true;
-                return null;
-            }
-        }
-        try {
-            Object o = sAccessibilityDelegateField.get(v);
-            if (o instanceof View.AccessibilityDelegate) {
-                return (View.AccessibilityDelegate) o;
-            }
-            return null;
-        } catch (Throwable t) {
-            sAccessibilityDelegateCheckFailed = true;
-            return null;
-        }
-    } else {
-        // There is no way to retrieve the delegate, even via reflection.
-        return null;
-    }
-```
-
-Calls to public APIs added in pre-release revisions *must* be gated using
-`BuildCompat`:
-
-```java
-if (BuildCompat.isAtLeastQ()) {
-   // call new API added in Q
-} else if (Build.SDK_INT.VERSION >= Build.VERSION_CODES.SOME_RELEASE) {
-   // make a best-effort using APIs that we expect to be available
-} else {
-   // no-op or best-effort given no information
-}
-```
-
-### Inter-process communication {#inter-process-communication}
-
-Protocols and data structures used for IPC must support interoperability between
-different versions of libraries and should be treated similarly to public API.
-
-#### Data structures
-
-**Do not** use `Parcelable` for any class that may be used for IPC or otherwise
-exposed as public API. The wire format used by `Parcelable` does not provide any
-compatibility guarantees and will result in crashes if fields are added or
-removed between library versions.
-
-**Do not** design your own serialization mechanism or wire format for disk
-storage or inter-process communication. Preserving and verifying compatibility
-is difficult and error-prone.
-
-Developers **should** use protocol buffers for most cases. See
-[Protobuf](#dependencies-protobuf) for more information on using protocol
-buffers in your library. **Do** use protocol buffers if your data structure is
-complex and likely to change over time. If your data includes `FileDescriptor`s,
-`Binder`s, or other platform-defined `Parcelable` data structures, they will
-need to be stored alongside the protobuf bytes in a `Bundle`.
-
-Developers **may** use `Bundle` in simple cases that require sending `Binder`s,
-`FileDescriptor`s, or platform `Parcelable`s across IPC
-([example](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:core/core/src/main/java/androidx/core/graphics/drawable/IconCompat.java;l=820)).
-Note that `Bundle` has several caveats:
-
--   When running on Android S and below, accessing *any* entry in a `Bundle`
-    will result in the platform attempting to deserialize *every* entry. This
-    has been fixed in Android T and later with "lazy" bundles, but developers
-    should be careful when accessing `Bundle` on earlier platforms. If a single
-    entry cannot be loaded -- for example if a developer added a custom
-    `Parcelable` that doesn't exist in the receiver's classpath -- an exception
-    will be thrown when accessing *any* entry.
--   On all platforms, library code that receives `Bundle`s data from outside the
-    process **must** read the data defensively. See previous note regarding
-    additional concerns for Android S and below.
--   On all platforms, library code that sends `Bundle`s outside the process
-    *should* discourage clients from passing custom `Parcelable`s.
--   `Bundle` provides no versioning and Jetpack provides no affordances for
-    tracking the keys or value types associated with a `Bundle`. Library owners
-    are responsible for providing their own system for guaranteeing wire format
-    compatibility between versions.
-
-Developers **may** use `VersionedParcelable` in cases where they are already
-using the library and understand its limitations.
-
-In all cases, **do not** expose your serialization mechanism in your API
-surface.
-
-NOTE We are currently investigating the suitability of Square's
-[`wire` library](https://github.com/square/wire) for handling protocol buffers
-in Android libraries. If adopted, it will replace `proto` library dependencies.
-Libraries that expose their serialization mechanism in their API surface *will
-not be able to migrate*.
-
-#### Communication protocols
-
-Any communication prototcol, handshake, etc. must maintain compatibility
-consistent with SemVer guidelines. Consider how your protocol will handle
-addition and removal of operations or constants, compatibility-breaking changes,
-and other modifications without crashing either the host or client process.
-
-## Deprecation and removal
-
-While SemVer's binary compatibility guarantees restrict the types of changes
-that may be made within a library revision and make it difficult to remove an
-API, there are many other ways to influence how developers interact with your
-library.
-
-### Deprecation (`@deprecated`)
-
-Deprecation lets a developer know that they should stop using an API or class.
-All deprecations must be marked with a `@Deprecated` Java annotation as well as
-a `@deprecated <migration-docs>` docs annotation explaining how the developer
-should migrate away from the API.
-
-Deprecation is an non-breaking API change that must occur in a **major** or
-**minor** release.
-
-APIs that are added during a pre-release cycle and marked as `@Deprecated`
-within the same cycle, e.g. added in `alpha01` and deprecated in `alpha06`,
-[must be removed](versioning.md#beta-checklist) before moving to `beta01`.
-
-### Soft removal (@removed)
-
-Soft removal preserves binary compatibility while preventing source code from
-compiling against an API. It is a *source-breaking change* and not recommended.
-
-Soft removals **must** do the following:
-
-*   Mark the API as deprecated for at least one stable release prior to removal.
-*   Mark the API with a `@RestrictTo(LIBRARY)` Java annotation as well as a
-    `@removed <reason>` docs annotation explaining why the API was removed.
-*   Maintain binary compatibility, as the API may still be called by existing
-    dependent libraries.
-*   Maintain behavioral compatibility and existing tests.
-
-This is a disruptive change and should be avoided when possible.
-
-Soft removal is a source-breaking API change that must occur in a **major** or
-**minor** release.
-
-### Hard removal
-
-Hard removal entails removing the entire implementation of an API that was
-exposed in a public release. Prior to removal, an API must be marked as
-`@deprecated` for a full **minor** version (`alpha`->`beta`->`rc`->stable),
-prior to being hard removed.
-
-This is a disruptive change and should be avoided when possible.
-
-Hard removal is a binary-breaking API change that must occur in a **major**
-release.
-
-### For entire artifacts
-
-We do not typically deprecate or remove entire artifacts; however, it may be
-useful in cases where we want to halt development and focus elsewhere or
-strongly discourage developers from using a library.
-
-Halting development, either because of staffing or prioritization issues, leaves
-the door open for future bug fixes or continued development. This quite simply
-means we stop releasing updates but retain the source in our tree.
-
-Deprecating an artifact provides developers with a migration path and strongly
-encourages them -- through Lint warnings -- to migrate elsewhere. This is
-accomplished by adding a `@Deprecated` and `@deprecated` (with migration
-comment) annotation pair to *every* class and interface in the artifact.
-
-To deprecate an entire artifact:
-
-1.  Mark every top-level API (class, interface, extension function, etc.) in the
-    artifact as `@Deprecated` and update the API files
-    ([example CL](https://android-review.googlesource.com/c/platform/frameworks/support/+/1938773))
-1.  Schedule a release of the artifact as a new minor version. When you populate
-    the release notes, explain that the entire artifact has been deprecated.
-    Include the reason for deprecation and the migration strategy.
-1.  After the artifact has been released, remove the artifact from the source
-    tree, versions file, and tip-of-tree docs configuration
-    ([example CL](https://android-review.googlesource.com/c/platform/frameworks/support/+/2061731/))
-
-The fully-deprecated artifact will be released as a deprecation release -- it
-will ship normally with accompanying release notes indicating the reason for
-deprecation and migration strategy, and it will be the last version of the
-artifact that ships. It will ship as a new minor stable release. For example, if
-`1.0.0` was the last stable release, then the deprecation release will be
-`1.1.0`. This is so Android Studio users will get a suggestion to update to a
-new stable version, which will contain the `@deprecated` annotations.
-
-After an artifact has been released as fully-deprecated, it can be removed from
-the source tree.
-
-## Resources {#resources}
-
-Generally, follow the official Android guidelines for
-[app resources](https://developer.android.com/guide/topics/resources/providing-resources).
-Special guidelines for library resources are noted below.
-
-### Defining new resources
-
-Libraries may define new value and attribute resources using the standard
-application directory structure used by Android Gradle Plugin:
-
-```
-src/main/res/
-  values/
-    attrs.xml   Theme attributes and styleables
-    dimens.xml  Dimensional values
-    public.xml  Public resource definitions
-    ...
-```
-
-However, some libraries may still be using non-standard, legacy directory
-structures such as `res-public` for their public resource declarations or a
-top-level `res` directory and accompanying custom source set in `build.gradle`.
-These libraries will eventually be migrated to follow standard guidelines.
-
-#### Naming conventions
-
-Libraries follow the Android platform's resource naming conventions, which use
-`camelCase` for attributes and `underline_delimited` for values. For example,
-`R.attr.fontProviderPackage` and `R.dimen.material_blue_grey_900`.
-
-#### Attribute formats
-
-At build time, attribute definitions are pooled globally across all libraries
-used in an application, which means attribute `format`s *must* be identical for
-a given `name` to avoid a conflict.
-
-Within Jetpack, new attribute names *must* be globally unique. Libraries *may*
-reference existing public attributes from their dependencies. See below for more
-information on public attributes.
-
-When adding a new attribute, the format should be defined *once* in an `<attr
-/>` element in the definitions block at the top of `src/main/res/attrs.xml`.
-Subsequent references in `<declare-styleable>` elements *must* not include a
-`format`:
-
-`src/main/res/attrs.xml`
-
-```xml
-<resources>
-  <attr name="fontProviderPackage" format="string" />
-
-  <declare-styleable name="FontFamily">
-      <attr name="fontProviderPackage" />
-  </declare-styleable>
-</resources>
-```
-
-### Public resources
-
-Library resources are private by default, which means developers are discouraged
-from referencing any defined attributes or values from XML or code; however,
-library resources may be declared public to make them available to developers.
-
-Public library resources are considered API surface and are thus subject to the
-same API consistency and documentation requirements as Java APIs.
-
-Libraries will typically only expose theme attributes, ex. `<attr />` elements,
-as public API so that developers can set and retrieve the values stored in
-styles and themes. Exposing values -- such as `<dimen />` and `<string />` -- or
-images -- such as drawable XML and PNGs -- locks the current state of those
-elements as public API that cannot be changed without a major version bump. That
-means changing a publicly-visible icon would be considered a breaking change.
-
-#### Documentation
-
-All public resource definitions should be documented, including top-level
-definitions and re-uses inside `<styleable>` elements:
-
-`src/main/res/attrs.xml`
-
-```xml
-<resources>
-  <!-- String specifying the application package for a Font Provider. -->
-  <attr name="fontProviderPackage" format="string" />
-
-  <!-- Attributes that are read when parsing a <fontfamily> tag. -->
-  <declare-styleable name="FontFamily">
-      <!-- The package for the Font Provider to be used for the request. This is
-           used to verify the identity of the provider. -->
-      <attr name="fontProviderPackage" />
-  </declare-styleable>
-</resources>
-```
-
-`src/main/res/colors.xml`
-
-```xml
-<resources>
-  <!-- Color for Material Blue-Grey 900. -->
-  <color name="material_blue_grey_900">#ff263238</color>
-</resources>
-```
-
-#### Public declaration
-
-Resources are declared public by providing a separate `<public />` element with
-a matching type:
-
-`src/main/res/public.xml`
-
-```xml
-<resources>
-  <public name="fontProviderPackage" type="attr" />
-  <public name="material_blue_grey_900" type="color" />
-</resources>
-```
-
-#### More information
-
-See also the official Android Gradle Plugin documentation for
-[Private Resources](https://developer.android.com/studio/projects/android-library#PrivateResources).
-
-### Manifest entries (`AndroidManifest.xml`) {#resources-manifest}
-
-#### Metadata tags (`<meta-data>`) {#resources-manifest-metadata}
-
-Developers **must not** add `<application>`-level `<meta-data>` tags to library
-manifests or advise developers to add such tags to their application manifests.
-Doing so may *inadvertently cause denial-of-service attacks against other apps*.
-
-Assume a library adds a single item of meta-data at the application level. When
-an app uses the library, that meta-data will be merged into the resulting app's
-application entry via manifest merger.
-
-If another app attempts to obtain a list of all activities associated with the
-primary app, that list will contain multiple copies of the `ApplicationInfo`,
-each of which in turn contains a copy of the library's meta-data. As a result,
-one `<metadata>` tag may become hundreds of KB on the binder call to obtain the
-list -- resulting in apps hitting transaction too large exceptions and crashing.
-
-```xml {.bad}
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="androidx.librarypackage">
-  <application>
-    <meta-data
-        android:name="keyName"
-        android:value="@string/value" />
-  </application>
-</manifest>
-```
-
-Instead, developers may consider adding `<metadata>` nested inside of
-placeholder `<service>` tags.
-
-```xml {.good}
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="androidx.librarypackage">
-  <application>
-    <service
-        android:name="androidx.librarypackage.MetadataHolderService"
-        android:enabled="false"
-        android:exported="false">
-      <meta-data
-          android:name="androidx.librarypackage.MetadataHolderService.KEY_NAME"
-          android:resource="@string/value" />
-    </service>
-  </application>
-```
-
-```java {.good}
-package androidx.libraryname.featurename;
-
-/**
- * A placeholder service to avoid adding application-level metadata. The service
- * is only used to expose metadata defined in the library's manifest. It is
- * never invoked.
- */
-public final class MetadataHolderService {
-  private MetadataHolderService() {}
-
-  @Override
-  public IBinder onBind(Intent intent) {
-    throw new UnsupportedOperationException();
-  }
-}
-```
-
-## Dependencies {#dependencies}
-
-Artifacts may depend on other artifacts within AndroidX as well as sanctioned
-third-party libraries.
-
-### Versioned artifacts {#dependencies-versioned}
-
-One of the most difficult aspects of independently-versioned releases is
-maintaining compatibility with public artifacts. In a mono repo such as Google's
-repository or Android Git at master revision, it's easy for an artifact to
-accidentally gain a dependency on a feature that may not be released on the same
-schedule.
-
--   Project `project(":core:core")` uses the tip-of-tree sources for the
-    `androidx.core:core` library and requires that they be loaded in the
-    workspace.
--   Playground `projectOrArtifact(":core:core")` is used for
-    [Playground](playground.md) projects and will use tip-of-tree sources, if
-    present in the workspace, or `SNAPSHOT` prebuilt artifacts from
-    [androidx.dev](http://androidx.dev) otherwise.
--   Explicit `"androidx.core:core:1.4.0"` uses the prebuilt AAR and requires
-    that it be checked in to the `prebuilts/androidx/internal` local Maven
-    repository.
-
-Libraries should prefer explicit dependencies with the lowest possible versions
-that include the APIs or behaviors required by the library, using project or
-Playground specs only in cases where tip-of-tree APIs or behaviors are required.
-
-#### Pre-release dependencies {#dependencies-pre-release}
-
-Pre-release suffixes **must** propagate up the dependency tree. For example, if
-your artifact has API-type dependencies on pre-release artifacts, ex.
-`1.1.0-alpha01`, then your artifact must also carry the `alpha` suffix. If you
-only have implementation-type dependencies, your artifact may carry either the
-`alpha` or `beta` suffix.
-
-Note: This does not apply to test dependencies: suffixes of test dependencies do
-*not* carry over to your artifact.
-
-#### Pinned versions {#dependencies-prebuilt}
-
-To avoid issues with dependency versioning, consider pinning your artifact's
-dependencies to the oldest version (available via local `maven_repo` or Google
-Maven) that satisfies the artifact's API requirements. This will ensure that the
-artifact's release schedule is not accidentally tied to that of another artifact
-and will allow developers to use older libraries if desired.
-
-```
-dependencies {
-   api("androidx.collection:collection:1.0.0")
-   ...
-}
-```
-
-Artifacts should be built and tested against both pinned and tip-of-tree
-versions of their dependencies to ensure behavioral compatibility.
-
-#### Tip-of-tree versions {#dependencies-project}
-
-Below is an example of a non-pinned dependency. It ties the artifact's release
-schedule to that of the dependency artifact, because the dependency will need to
-be released at the same time.
-
-```
-dependencies {
-   api(project(":collection"))
-   ...
-}
-```
-
-### Non-public APIs {#dependencies-non-public-apis}
-
-Artifacts may depend on non-public (e.g. `@hide`) APIs exposed within their own
-artifact or another artifact in the same `groupId`; however, cross-artifact
-usages are subject to binary compatibility guarantees and
-`@RestrictTo(Scope.LIBRARY_GROUP)` APIs must be tracked like public APIs.
-
-```
-Dependency versioning policies are enforced at build time in the createArchive task. This task will ensure that pre-release version suffixes are propagated appropriately.
-
-Cross-artifact API usage policies are enforced by the checkApi and checkApiRelease tasks (see Life of a release).
-```
-
-### Third-party libraries {#dependencies-3p}
-
-Artifacts may depend on libraries developed outside of AndroidX; however, they
-must conform to the following guidelines:
-
-*   Prebuilt **must** be checked into Android Git with both Maven and Make
-    artifacts
-    *   `prebuilts/maven_repo` is recommended if this dependency is only
-        intended for use with AndroidX artifacts, otherwise please use
-        `external`
-*   Prebuilt directory **must** contains an `OWNERS` file identifying one or
-    more individual owners (e.g. NOT a group alias)
-*   Library **must** be approved by legal
-
-Please see Jetpack's [open-source policy page](open_source.md) for more details
-on using third-party libraries.
-
-### Types of dependencies {#dependencies-types}
-
-AndroidX allows dependencies to be specified as `api` or `implementation` with a
-"pinned" Maven spec (ex. `androidx.core:core:1.0.0`) or a "tip-of-tree" project
-spec (ex. `project(":core:core")`).
-
-Projects used in Playground, the experimental GitHub workflow, should use a
-"recent" project or artifact spec (ex. `projectOrArtifact(":core:core")`) which
-will default to tip-of-tree when used outside of the Playground workflow or a
-pinned `SNAPSHOT` artifact otherwise.
-
-Regardless of which dependency spec is used, all projects are built against
-tip-of-tree dependencies in CI to prevent regressions and enforce Jetpack's
-compatible-at-head policy.
-
-#### `api` versus `implementation` {#dependencies-api-vs-impl}
-
-`api`-type dependencies will appear in clients' auto-complete as though they had
-added the dependency directly to their project, and Studio will run any lint
-checks bundled with `api`-type dependencies.
-
-Dependencies whose APIs are exposed in a library's API surface **must** be
-included as `api`-type. For example, if your library's API surface includes
-`AccessibilityNodeInfoCompat` then you will use an `api`-type dependency on the
-`androidx.core:core` library.
-
-NOTE Libraries that provide client-facing lint checks, including
-`annotation-experimental`, **must** be included as `api`-type to ensure that
-lint checks are run in the clients' dependent projects.
-
-`implementation`-type dependencies will be included in the classpath, but will
-not be made available at design time (ex. in auto-complete) unless the client
-explicitly adds them.
-
-### System health {#dependencies-health}
-
-Generally, Jetpack libraries should avoid dependencies that negatively impact
-developers without providing substantial benefit. Libraries should consider the
-system health implications of their dependencies, including:
-
--   Large dependencies where only a small portion is needed (e.g. APK bloat)
--   Dependencies that slow down build times through annotation processing or
-    compiler overhead
-
-#### Kotlin {#dependencies-kotlin}
-
-Kotlin is *strongly recommended* for new libraries; however, it's important to
-consider its size impact on clients. Currently, the Kotlin stdlib adds a minimum
-of 40kB post-optimization. It may not make sense to use Kotlin for a library
-that targets Java-only clients or space-constrained (ex. Android Go) clients.
-
-Existing Java-based libraries are *strongly discouraged* from using Kotlin,
-primarily because our documentation system does not currently provide a
-Java-facing version of Kotlin API reference docs. Java-based libraries *may*
-migrate to Kotlin, but they must consider the docs usability and size impacts on
-existing Java-only and space-constrained clients.
-
-#### Kotlin coroutines {#dependencies-coroutines}
-
-Kotlin's coroutine library adds around 100kB post-shrinking. New libraries that
-are written in Kotlin should prefer coroutines over `ListenableFuture`, but
-existing libraries must consider the size impact on their clients. See
-[Asynchronous work with return values](#async-return) for more details on using
-Kotlin coroutines in Jetpack libraries.
-
-#### Guava {#dependencies-guava}
-
-The full Guava library is very large and *must not* be used. Libraries that
-would like to depend on Guava's `ListenableFuture` may instead depend on the
-standalone `com.google.guava:listenablefuture` artifact. See
-[Asynchronous work with return values](#async-return) for more details on using
-`ListenableFuture` in Jetpack libraries.
-
-#### Java 8 {#dependencies-java8}
-
-Libraries that take a dependency on a library targeting Java 8 must *also*
-target Java 8, which will incur a ~5% build performance (as of 8/2019) hit for
-clients. New libraries targeting Java 8 may use Java 8 dependencies.
-
-The default language level for `androidx` libraries is Java 8, and we encourage
-libraries to stay on Java 8. However, if you have a business need to target Java
-7, you can specify Java 7 in your `build.gradle` as follows:
-
-```groovy
-android {
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
-}
-```
-
-#### Protobuf {#dependencies-protobuf}
-
-[Protocol buffers](https://developers.google.com/protocol-buffers) provide a
-language- and platform-neutral mechanism for serializing structured data. The
-implementation enables developers to maintain protocol compatibility across
-library versions, meaning that two clients can communicate regardless of the
-library versions included in their APKs.
-
-The Protobuf library itself, however, does not guarantee ABI compatibility
-across minor versions and a specific version **must** be bundled with a library
-to avoid conflict with other dependencies used by the developer.
-
-Additionally, the Java API surface generated by the Protobuf compiler is not
-guaranteed to be stable and **must not** be exposed to developers. Library
-owners should wrap the generated API surface with well-documented public APIs
-that follow an appropriate language-specific paradigm for constructing data
-classes, e.g. the Java `Builder` pattern.
-
-### Open-source compatibility {#dependencies-aosp}
-
-Jetpack's [open-source](open_source.md) principle requires that libraries
-consider the open-source compatibility implications of their dependencies,
-including:
-
--   Closed-source or proprietary libraries or services that may not be available
-    on AOSP devices
--   Dependencies that may prevent developers from effectively isolating their
-    tests from third-party libraries or services
-
-Primary artifacts, e.g. `workmanager`, **must not** depend on closed-source
-components including libraries and hard-coded references to packages,
-permissions, or IPC mechanisms that may only be fulfilled by closed-source
-components.
-
-Optional artifacts, e.g. `workmanager-gcm`, *may* depend on closed-source
-components or configure a primary artifact to be backed by a closed-source
-component via service discovery or initialization.
-
-Some examples of safely depending on closed-source components include:
-
--   WorkManager's GCM Network Manager integration, which uses
-    [manifest metadata](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:work/workmanager-gcm/src/main/AndroidManifest.xml)
-    for service discovery and provides an optional artifact exposing the
-    service.
--   Ads Identifier's Play Services integration, which provides a default backend
-    and uses
-    [`Intent` handling](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-master-dev:ads/ads-identifier-provider/src/main/java/androidx/ads/identifier/provider/AdvertisingIdProviderManager.java;l=108)
-    as a service discovery mechanism for Play Services.
--   Downloadable Fonts integration with Play Services, which plugs in via a
-    [`ContentProvider`](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:core/core/src/androidTest/java/androidx/core/provider/MockFontProvider.java)
-    as a service discovery mechanism with developer-specified
-    [signature verification](https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts#adding-certificates)
-    for additional security.
-
-Note that in all cases, the developer is not *required* to use GCM or Play
-Services and may instead use another compatible service implementing the same
-publicly-defined protocols.
-
-## More API guidelines {#more-api-guidelines}
-
-### Annotations {#annotation}
-
-#### Annotation processors {#annotation-processor}
-
-Annotation processors should opt-in to incremental annotation processing to
-avoid triggering a full recompilation on every client source code change. See
-Gradle's
-[Incremental annotation processing](https://docs.gradle.org/current/userguide/java_plugin.html#sec:incremental_annotation_processing)
-documentation for information on how to opt-in.
-
-### `@RequiresOptIn` APIs {#experimental-api}
-
-Jetpack libraries may choose to annotate API surfaces as unstable using either
-Kotlin's
-[`@RequiresOptIn` meta-annotation](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-requires-opt-in/)
-for APIs written in Kotlin or Jetpack's
-[`@RequiresOptIn` meta-annotation](https://developer.android.com/reference/kotlin/androidx/annotation/RequiresOptIn)
-for APIs written in Java.
-
-> `@RequiresOptIn` at-a-glance:
->
-> *   Use for unstable API surfaces
-> *   Can be called by anyone
-> *   Documented in public documentation
-> *   Does not maintain compatibility
-
-For either annotation, API surfaces marked as opt-in are considered alpha and
-will be excluded from API compatibility guarantees. Due to the lack of
-compatibility guarantees, stable libraries *must never* call experimental APIs
-exposed by other libraries outside of their
-[same-version group](#same-version-atomic-groups) and *may not* use the `@OptIn`
-annotation except in the following cases:
-
-*   A library within a same-version group *may* call an experimental API exposed
-    by another library **within its same-version group**. In this case, API
-    compatibility guarantees are covered under the same-version group policies
-    and the library *may* use the `@OptIn` annotation to prevent propagation of
-    the experimental property. **Library owners must exercise care to ensure
-    that post-alpha APIs backed by experimental APIs actually meet the release
-    criteria for post-alpha APIs.**
-*   An `alpha` library may use experimental APIs from outside its same-version
-    group. These usages must be removed when the library moves to `beta`.
-
-NOTE JetBrains's own usage of `@RequiresOptIn` in Kotlin language libraries
-varies and may indicate binary instability, functional instability, or simply
-that an API is really difficult to use. Jetpack libraries should treat instances
-of `@RequiresOptIn` in JetBrains libraries as indicating **binary instability**
-and avoid using them outside of `alpha`; however, teams are welcome to obtain
-written assurance from JetBrains regarding binary stability of specific APIs.
-`@RequiresOptIn` APIs that are guaranteed to remain binary compatible *may* be
-used in `beta`, but usages must be removed when the library moves to `rc`.
-
-#### When to mark an API surface as experimental
-
-*Do not* use `@RequiresOptIn` for a stable API surface that is difficult to use.
-It is not a substitute for a properly-designed API surface.
-
-*Do not* use `@RequiresOptIn` for an API surface that is unreliable or unstable
-because it is missing tests. It is not a substitute for a properly-tested API
-surface, and all APIs -- including those in `alpha` -- are expected to be
-functionally stable.
-
-*Do not* use `@RequiresOptIn` for an internal-facing API surface. Use either the
-appropriate language visibility (ex. `private` or `internal`) or `@RestrictTo`.
-
-*Do not* use `@RequiresOptIn` for an API that you expect library developers to
-call. Experimental APIs do not maintain binary compatibility guarantees, and you
-will put external clients in a difficult situation.
-
-*Do* use `@RequiresOptIn` for API surfaces that must be publicly available and
-documented but need the flexibility to stay in `alpha` (and break compatibility)
-during the rest of the library's `beta`, `rc`, or stable cycles.
-
-#### How to mark an API surface as experimental
-
-All libraries using `@RequiresOptIn` annotations *must* depend on the
-`androidx.annotation:annotation-experimental` artifact regardless of whether
-they are using the `androidx` or Kotlin annotation. This artifact provides Lint
-enforcement of experimental usage restrictions for Kotlin callers as well as
-Java (which the Kotlin annotation doesn't handle on its own, since it's a Kotlin
-compiler feature). Libraries *may* include the dependency as `api`-type to make
-`@OptIn` available to Java clients; however, this will also unnecessarily expose
-the `@RequiresOptIn` annotation.
-
-```java
-dependencies {
-    implementation(project(":annotation:annotation-experimental"))
-}
-```
-
-See Kotlin's
-[opt-in requirements documentation](https://kotlinlang.org/docs/reference/opt-in-requirements.html)
-for general usage information. If you are writing experimental Java APIs, you
-will use the Jetpack
-[`@RequiresOptIn` annotation](https://developer.android.com/reference/kotlin/androidx/annotation/RequiresOptIn)
-rather than the Kotlin compiler's annotation.
-
-#### How to transition an API out of experimental
-
-When an API surface is ready to transition out of experimental, the annotation
-may only be removed during an alpha pre-release stage. Removing the experimental
-marker from an API is equivalent to adding the API to the current API surface.
-
-When transitioning an entire feature surface out of experimental, you *should*
-remove the definition for the associated experimental marker annotation.
-
-When making any change to the experimental API surface, you *must* run
-`./gradlew updateApi` prior to uploading your change.
-
-NOTE Experimental marker annotation *are themselves* experimental, meaning that
-it's considered binary compatible to refactor or remove an experimental marker
-annotation.
-
-### `@RestrictTo` APIs {#restricted-api}
-
-Jetpack's library tooling supports hiding Java-visible (ex. `public` and
-`protected`) APIs from developers using a combination of the `@RestrictTo`
-source annotation, and the `@hide` docs annotation (`@suppress` in Kotlin).
-These annotations **must** be paired together when used, and are validated as
-part of presubmit checks for Java code.
-
-> `@RestrictTo` at-a-glance:
->
-> *   Use for internal-facing API surfaces
-> *   Can be called within the specified `Scope`
-> *   Does not appear in public documentation
-> *   Does not maintain compatibility in most scopes
-
-While restricted APIs do not appear in documentation and Android Studio will
-warn against calling them, hiding an API does *not* provide strong guarantees
-about usage:
-
-*   There are no runtime restrictions on calling hidden APIs
-*   Android Studio will not warn if hidden APIs are called using reflection
-*   Hidden APIs will still show in Android Studio's auto-complete
-
-#### When to use `@hide` {#restricted-api-usage}
-
-In other cases, avoid using `@hide` / `@suppress`. These annotations indicates
-that developers should not call an API that is *technically* public from a Java
-visibility perspective. Hiding APIs is often a sign of a poorly-abstracted API
-surface, and priority should be given to creating public, maintainable APIs and
-using Java visibility modifiers.
-
-*Do not* use `@hide`/`@suppress` to bypass API tracking and review for
-production APIs; instead, rely on API+1 and API Council review to ensure APIs
-are reviewed on a timely basis.
-
-*Do not* use `@hide`/`@suppress` for implementation detail APIs that are used
-between libraries and could reasonably be made public.
-
-*Do* use `@hide`/`@suppress` paired with `@RestrictTo(LIBRARY)` for
-implementation detail APIs used within a single library (but prefer Java
-language `private` or `default` visibility).
-
-#### `RestrictTo.Scope` and inter- versus intra-library API surfaces {#private-api-types}
-
-To maintain binary compatibility between different versions of libraries,
-restricted API surfaces that are used between libraries within Jetpack
-(inter-library APIs) must follow the same Semantic Versioning rules as public
-APIs. Inter-library APIs should be annotated with the
-`@RestrictTo(LIBRARY_GROUP)` source annotation and `@hide` docs annotation.
-
-Restricted API surfaces used within a single library (intra-library APIs), on
-the other hand, may be added or removed without any compatibility
-considerations. It is safe to assume that developers *never* call these APIs,
-even though it is technically feasible. Intra-library APIs should be annotated
-with the `@RestrictTo(LIBRARY)` source annotation and `@hide` docs annotation.
-
-In all cases, correctness and compatibility tracking are handled by AndroidX's
-build system and lint checks.
-
-The following table shows the visibility of a hypothetical API within Maven
-coordinate `androidx.concurrent:concurrent` when annotated with a variety of
-scopes:
-
-<table>
-    <tr>
-        <td><code>RestrictTo.Scope</code></td>
-        <td>Visibility by Maven coordinate</td>
-        <td>Versioning</td>
-        <td>Note</td>
-    </tr>
-    <tr>
-        <td><code>LIBRARY</code></td>
-        <td><code>androidx.concurrent:concurrent</code></td>
-        <td>No compatibility guarantees (same as private)</td>
-        <td></td>
-    </tr>
-    <tr>
-        <td><code>LIBRARY_GROUP</code></td>
-        <td><code>androidx.concurrent:*</code></td>
-        <td>Semantic versioning (including deprecation)</td>
-        <td></td>
-    </tr>
-    <tr>
-        <td><code>LIBRARY_GROUP_PREFIX</code></td>
-        <td><code>androidx.*:*</code></td>
-        <td>Semantic versioning (including deprecation)</td>
-        <td></td>
-    </tr>
-    <tr>
-        <td><code>TEST</code></td>
-        <td><code>*</code></td>
-        <td>No compatibility guarantees (same as private)</td>
-        <td>Not recommended. Prefer language visibility, e.g. `internal` or package-private.</td>
-    </tr>
-</table>
-
-#### `@IntDef` `@StringDef` and `@LongDef` and visibility
-
-All `@IntDef`, `@StringDef`, and `@LongDef` will be stripped from resulting
-artifacts to avoid issues where compiler inlining constants removes information
-as to which `@IntDef` defined the value of `1`. The annotations are extracted
-and packaged separately to be read by Android Studio and lint which enforces the
-types in application code.
-
-*   Libraries *must* `@hide` all `@IntDef`, `@StringDef`, and `@LongDef`
-    declarations.
-*   Libraries *must* expose constants used to define the `@IntDef` etc at the
-    same Java visibility as the hidden `@IntDef`
-*   Libraries *must* use `@RestrictTo` to create a warning when the type is used
-    incorrectly.
-
-Here is a complete example of an `@IntDef`
-
-```java
-// constants match Java visibility of ExifStreamType
-// code outside this module interacting with ExifStreamType uses these constants
-public static final int STREAM_TYPE_FULL_IMAGE_DATA = 1;
-public static final int STREAM_TYPE_EXIF_DATA_ONLY = 2;
-
-/** @hide */
-@RestrictTo(RestrictTo.Scope.LIBRARY) // Don't export ExifStreamType outside module
-@Retention(RetentionPolicy.SOURCE)
-@IntDef({
-  STREAM_TYPE_FULL_IMAGE_DATA,
-  STREAM_TYPE_EXIF_DATA_ONLY,
-})
-public @interface ExifStreamType {}
-```
-
-Java visibilty should be set as appropriate for the code in question (`private`,
-`package` or `public`) and is unrelated to hiding.
-
-For more, read the section in
-[Android API Council Guidelines](https://android.googlesource.com/platform/developers/docs/+/refs/heads/master/api-guidelines/index.md#no-public-typedefs)
-
-### Constructors {#constructors}
-
-#### View constructors {#view-constructors}
-
-The four-arg View constructor -- `View(Context, AttributeSet, int, int)` -- was
-added in SDK 21 and allows a developer to pass in an explicit default style
-resource rather than relying on a theme attribute to resolve the default style
-resource. Because this API was added in SDK 21, care must be taken to ensure
-that it is not called through any < SDK 21 code path.
-
-Views *may* implement a four-arg constructor in one of the following ways:
-
-1.  Do not implement.
-1.  Implement and annotate with `@RequiresApi(21)`. This means the three-arg
-    constructor **must not** call into the four-arg constructor.
-
-### Asynchronous work {#async}
-
-#### With return values {#async-return}
-
-###### Kotlin
-
-Traditionally, asynchronous work on Android that results in an output value
-would use a callback; however, better alternatives exist for libraries.
-
-Kotlin libraries should consider
-[coroutines](https://kotlinlang.org/docs/reference/coroutines-overview.html) and
-`suspend` functions for APIs according to the following rules, but please refer
-to the guidance on [allowable dependencies](#dependencies-coroutines) before
-adding a new dependency on coroutines.
-
-Kotlin suspend fun vs blocking       | Behavior
------------------------------------- | --------------------------
-blocking function with @WorkerThread | API is blocking
-suspend                              | API is async (e.g. Future)
-
-In general, do not introduce a suspend function entirely to switch threads for
-blocking calls. To do so correctly requires that we allow the developer to
-configure the Dispatcher. As there is already a coroutines-based API for
-changing dispatchers (withContext) that the caller may use to switch threads, it
-is unecessary API overhead to provide a duplicate mechanism. In addition, it
-unecessary limits callers to coroutine contexts.
-
-```kotlin
-// DO expose blocking calls as blocking calls
-@WorkerThread
-fun blockingCall()
-
-// DON'T wrap in suspend functions (only to switch threads)
-suspend fun blockingCallWrappedInSuspend(
-  dispatcher: CoroutineDispatcher = Dispatchers.Default
-) = withContext(dispatcher) { /* ... */ }
-
-// DO expose async calls as suspend funs
-suspend fun asyncCall(): ReturnValue
-
-// DON'T expose async calls as a callback-based API (for the main API)
-fun asyncCall(executor: Executor, callback: (ReturnValue) -> Unit)
-```
-
-###### Java
-
-Java libraries should prefer `ListenableFuture` and the
-[`CallbackToFutureAdapter`](https://developer.android.com/reference/androidx/concurrent/futures/CallbackToFutureAdapter)
-implementation provided by the `androidx.concurrent:concurrent-futures` library.
-Functions and methods that return `ListenableFuture` should be suffixed by,
-`Async` to reserve the shorter, unmodified name for a `suspend` method or
-extension function in Kotlin that returns the value normally in accordance with
-structured concurrency.
-
-Libraries **must not** use `java.util.concurrent.CompletableFuture`, as it has a
-large API surface that permits arbitrary mutation of the future's value and has
-error-prone defaults.
-
-See the [Dependencies](#dependencies) section for more information on using
-Kotlin coroutines and Guava in your library.
-
-#### Cancellation
-
-Libraries that expose APIs for performing asynchronous work should support
-cancellation. There are *very few* cases where it is not feasible to support
-cancellation.
-
-Libraries that use `ListenableFuture` must be careful to follow the exact
-specification of
-[`Future.cancel(boolean mayInterruptIfRunning)`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html?is-external=true#cancel-boolean-)
-behavior.
-
-```java {.bad}
-@Override
-public boolean cancel(boolean mayInterruptIfRunning) {
-    // Does not support cancellation.
-    return false;
-}
-```
-
-```java {.bad}
-@Override
-public boolean cancel(boolean mayInterruptIfRunning) {
-    // Aggressively does not support cancellation.
-    throw new UnsupportedOperationException();
-}
-```
-
-```java {.good}
-@Override
-public boolean cancel(boolean mayInterruptIfRunning) {
-    // Pseudocode that ignores threading but follows the spec.
-    if (mCompleted
-            || mCancelled
-            || mRunning && !mayInterruptIfRunning) {
-        return false;
-    }
-    mCancelled = true;
-    return true;
-}
-```
-
-#### Avoid `synchronized` methods
-
-Whenever multiple threads are interacting with shared (mutable) references those
-reads and writes must be synchronized in some way. However synchronized blocks
-make your code thread-safe at the expense of concurrent execution. Any time
-execution enters a synchronized block or method any other thread trying to enter
-a synchronized block on the same object has to wait; even if in practice the
-operations are unrelated (e.g. they interact with different fields). This can
-dramatically reduce the benefit of trying to write multi-threaded code in the
-first place.
-
-Locking with synchronized is a heavyweight form of ensuring ordering between
-threads, and there are a number of common APIs and patterns that you can use
-that are more lightweight, depending on your use case:
-
-*   Compute a value once and make it available to all threads
-*   Update Set and Map data structures across threads
-*   Allow a group of threads to process a stream of data concurrently
-*   Provide instances of a non-thread-safe type to multiple threads
-*   Update a value from multiple threads atomically
-*   Maintain granular control of your concurrency invariants
-
-### Kotlin-specific guidelines {#kotlin}
-
-#### Nullability from Java (new APIs)
-
-All new Java APIs should be annotated either `@Nullable` or `@NonNull` for all
-reference parameters and reference return types.
-
-```java
-    @Nullable
-    public Object someNewApi(@NonNull Thing arg1, @Nullable List<WhatsIt> arg2) {
-        if(/** something **/) {
-            return someObject;
-        } else {
-            return null;
-    }
-```
-
-#### Nullability from Java (existing APIs)
-
-Adding `@Nullable` or `@NonNull` annotations to existing APIs to document their
-existing nullability is OK. This is a source breaking change for Kotlin
-consumers, and you should ensure that it's noted in the release notes and try to
-minimize the frequency of these updates in releases.
-
-Changing the nullability of an API is a breaking change.
-
-#### Extending APIs that expose types without nullability annotations
-
-[Platform types](https://kotlinlang.org/docs/java-interop.html#null-safety-and-platform-types)
-are exposed by Java types that do not have a `@Nullable` or `@NonNull`
-annotation. In Kotlin they are indicated with the `!` suffix.
-
-When interacting with an Android platform API that exposes APIs with unknown
-nullability follow these rules:
-
-1.  If wrapping the type in a new API, define and handle `@Nullable` or
-    `@NonNull` in the library. Treat types with unknown nullability passed into
-    or return from Android as `@Nullable` in the library.
-2.  If extending an existing API (e.g. `@Override`), pass through the existing
-    types with unknown nullability and annotate each with
-    `@SuppressLint("UnknownNullness")`
-
-In Kotlin, a type with unknown nullability is exposed as a "platform type"
-(indicated with a `!` suffix) which has unknown nullability in the type checker,
-and may bypass type checking leading to runtime errors. When possible, do not
-directly expose types with unknown nullability in new public APIs.
-
-#### Extending `@RecentlyNonNull` and `@RecentlyNullable` APIs
-
-Platform APIs are annotated in the platform SDK artifacts with fake annotations
-`@RecentlyNonNull` and `@RecentlyNullable` to avoid breaking builds when we
-annotated platform APIs with nullability. These annotations cause warnings
-instead of build failures. The `RecentlyNonNull` and `RecentlyNullable`
-annotations are added by Metalava and do not appear in platform code.
-
-When extending an API that is annotated `@RecentlyNonNull`, you should annotate
-the override with `@NonNull`, and the same for `@RecentlyNullable` and
-`@Nullable`.
-
-For example `SpannableStringBuilder.append` is annotated `RecentlyNonNull` and
-an override should look like:
-
-```java
-    @NonNull
-    @Override
-    public SpannableStringBuilder append(@SuppressLint("UnknownNullness") CharSequence text) {
-        super.append(text);
-        return this;
-    }
-```
-
-#### Data classes {#kotlin-data}
-
-Kotlin `data` classes provide a convenient way to define simple container
-objects, where Kotlin will generate `equals()` and `hashCode()` for you.
-However, they are not designed to preserve API/binary compatibility when members
-are added. This is due to other methods which are generated for you -
-[destructuring declarations](https://kotlinlang.org/docs/reference/multi-declarations.html),
-and [copying](https://kotlinlang.org/docs/reference/data-classes.html#copying).
-
-Example data class as tracked by metalava:
-
-<pre>
-  public final class TargetAnimation {
-    ctor public TargetAnimation(float target, androidx.animation.AnimationBuilder animation);
-    <b>method public float component1();</b>
-    <b>method public androidx.animation.AnimationBuilder component2();</b>
-    <b>method public androidx.animation.TargetAnimation copy(float target, androidx.animation.AnimationBuilder animation);</b>
-    method public androidx.animation.AnimationBuilder getAnimation();
-    method public float getTarget();
-  }
-</pre>
-
-Because members are exposed as numbered components for destructuring, you can
-only safely add members at the end of the member list. As `copy` is generated
-with every member name in order as well, you'll also have to manually
-re-implement any old `copy` variants as items are added. If these constraints
-are acceptable, data classes may still be useful to you.
-
-As a result, Kotlin `data` classes are *strongly discouraged* in library APIs.
-Instead, follow best-practices for Java data classes including implementing
-`equals`, `hashCode`, and `toString`.
-
-See Jake Wharton's article on
-[Public API challenges in Kotlin](https://jakewharton.com/public-api-challenges-in-kotlin/)
-for more details.
-
-#### Exhaustive `when` and `sealed class`/`enum class` {#exhaustive-when}
-
-A key feature of Kotlin's `sealed class` and `enum class` declarations is that
-they permit the use of **exhaustive `when` expressions.** For example:
-
-```kotlin
-enum class CommandResult { Permitted, DeniedByUser }
-
-val message = when (commandResult) {
-    Permitted -> "the operation was permitted"
-    DeniedByUser -> "the user said no"
-}
-
-println(message)
-```
-
-This highlights challenges for library API design and compatibility. Consider
-the following addition to the `CommandResult` possibilities:
-
-```kotlin {.bad}
-enum class CommandResult {
-    Permitted,
-    DeniedByUser,
-    DeniedByAdmin // New in androidx.mylibrary:1.1.0!
-}
-```
-
-This change is both **source and binary breaking.**
-
-It is **source breaking** because the author of the `when` block above will see
-a compiler error about not handling the new result value.
-
-It is **binary breaking** because if the `when` block above was compiled as part
-of a library `com.example.library:1.0.0` that transitively depends on
-`androidx.mylibrary:1.0.0`, and an app declares the dependencies:
-
-```kotlin
-implementation("com.example.library:1.0.0")
-implementation("androidx.mylibrary:1.1.0") // Updated!
-```
-
-`com.example.library:1.0.0` does not handle the new result value, leading to a
-runtime exception.
-
-**Note:** The above example is one where Kotlin's `enum class` is the correct
-tool and the library should **not** add a new constant! Kotlin turns this
-semantic API design problem into a compiler or runtime error. This type of
-library API change could silently cause app logic errors or data corruption
-without the protection provided by exhaustive `when`. See
-[When to use exhaustive types](#when-to-use-exhaustive-types).
-
-`sealed class` exhibits the same characteristic; adding a new subtype of an
-existing sealed class is a breaking change for the following code:
-
-```kotlin
-val message = when (command) {
-    is Command.Migrate -> "migrating to ${command.destination}"
-    is Command.Quack -> "quack!"
-}
-```
-
-##### Non-exhaustive alternatives to `enum class`
-
-Kotlin's `@JvmInline value class` with a `private constructor` can be used to
-create type-safe sets of non-exhaustive constants as of Kotlin 1.5. Compose's
-`BlendMode` uses the following pattern:
-
-```kotlin {.good}
-@JvmInline
-value class BlendMode private constructor(val value: Int) {
-    companion object {
-        /** Drop both the source and destination images, leaving nothing. */
-        val Clear = BlendMode(0)
-        /** Drop the destination image, only paint the source image. */
-        val Src = BlendMode(1)
-        // ...
-    }
-}
-```
-
-**Note:** This recommendation may be temporary. Kotlin may add new annotations
-or other language features to declare non-exhaustive enum classes in the future.
-
-Alternatively, the existing `@IntDef` mechanism used in Java-language androidx
-libraries may also be used, but type checking of constants will only be
-performed by lint, and functions overloaded with parameters of different value
-class types are not supported. Prefer the `@JvmInline value class` solution for
-new code unless it would break local consistency with other API in the same
-module that already uses `@IntDef`.
-
-##### Non-exhaustive alternatives to `sealed class`
-
-Abstract classes with constructors marked as `internal` or `private` can
-represent the same subclassing restrictions of sealed classes as seen from
-outside of a library module's own codebase:
-
-```kotlin
-abstract class Command private constructor() {
-    class Migrate(val destination: String) : Command()
-    object Quack : Command()
-}
-```
-
-Using an `internal` constructor will permit non-nested subclasses, but will
-**not** restrict subclasses to the same package within the module, as sealed
-classes do.
-
-##### When to use exhaustive types
-
-Use `enum class` or `sealed class` when the values or subtypes are intended to
-be exhaustive by design from the API's initial release. Use non-exhaustive
-alternatives when the set of constants or subtypes might expand in a minor
-version release.
-
-Consider using an **exhaustive** (`enum class` or `sealed class`) type
-declaration if:
-
-*   The developer is expected to **accept** values of the type
-*   The developer is expected to **act** on **any and all** values received
-
-Consider using a **non-exhaustive** type declaration if:
-
-*   The developer is expected to **provide** values of the type to APIs exposed
-    by the same module **only**
-*   The developer is expected to **ignore** unknown values received
-
-The `CommandResult` example above is a good example of a type that **should**
-use the exhaustive `enum class`; `CommandResult`s are **returned** to the
-developer and the developer cannot implement correct app behavior by ignoring
-unrecognized result values. Adding a new result value would semantically break
-existing code regardless of the language facility used to express the type.
-
-```kotlin {.good}
-enum class CommandResult { Permitted, DeniedByUser, DeniedByAdmin }
-```
-
-Compose's `BlendMode` is a good example of a type that **should not** use the
-exhaustive `enum class`; blending modes are used as arguments to Compose
-graphics APIs and are not intended for interpretation by app code. Additionally,
-there is historical precedent from `android.graphics` for new blending modes to
-be added in the future.
-
-#### Extension and top-level functions {#kotlin-extension-functions}
-
-If your Kotlin file contains any symbols outside of class-like types
-(extension/top-level functions, properties, etc), the file must be annotated
-with `@JvmName`. This ensures unanticipated use-cases from Java callers don't
-get stuck using `BlahKt` files.
-
-Example:
-
-```kotlin {.bad}
-package androidx.example
-
-fun String.foo() = // ...
-```
-
-```kotlin {.good}
-@file:JvmName("StringUtils")
-
-package androidx.example
-
-fun String.foo() = // ...
-```
-
-NOTE This guideline may be ignored for libraries that only work in Kotlin (think
-Compose).
-
-## Testing Guidelines
-
-### [Do not Mock, AndroidX](do_not_mock.md)
-
-### Validating class verification fixes
-
-To verify class verification, the best way is to look for `adb` output during
-install time.
-
-You can generate class verification logs from test APKs. Simply call the
-class/method that should generate a class verification failure in a test.
-
-The test APK will generate class verification logs on install.
-
-```bash
-# Enable ART logging (requires root). Note the 2 pairs of quotes!
-adb root
-adb shell setprop dalvik.vm.dex2oat-flags '"--runtime-arg -verbose:verifier"'
-
-# Restart Android services to pick up the settings
-adb shell stop && adb shell start
-
-# Optional: clear logs which aren't relevant
-adb logcat -c
-
-# Install the app and check for ART logs
-# This line is what triggers log lines, and can be repeated
-adb install -d -r someApk.apk
-
-# it's useful to run this _during_ install in another shell
-adb logcat | grep 'dex2oat'
-...
-... I dex2oat : Soft verification failures in
-```
-
-## Android Lint Guidelines
-
-### Suppression vs Baselines
-
-Lint sometimes flags false positives, even though it is safe to ignore these
-errors (for example WeakerAccess warnings when you are avoiding synthetic
-access). There may also be lint failures when your library is in the middle of a
-beta / rc / stable release, and cannot make the breaking changes needed to fix
-the root cause. There are two ways of ignoring lint errors:
-
-1.  Suppression - using `@SuppressLint` (for Java) or `@Suppress` annotations to
-    ignore the warning per call site, per method, or per file. *Note
-    `@SuppressLint` - Requires Android dependency*.
-2.  Baselines - allowlisting errors in a lint-baseline.xml file at the root of
-    the project directory.
-
-Where possible, you should use a **suppression annotation at the call site**.
-This helps ensure that you are only suppressing the *exact* failure, and this
-also keeps the failure visible so it can be fixed later on. Only use a baseline
-if you are in a Java library without Android dependencies, or when enabling a
-new lint check, and it is prohibitively expensive / not possible to fix the
-errors generated by enabling this lint check.
-
-To update a lint baseline (`lint-baseline.xml`) after you have fixed issues, run
-the `updateLintBaseline` task.
-
-```shell
-./gradlew :core:core:updateLintBaseline
-```
-
-## Metalava API Lint
-
-As well as Android Lint, which runs on all source code, Metalava will also run
-checks on the public API surface of each library. Similar to with Android Lint,
-there can sometimes be false positives / intended deviations from the API
-guidelines that Metalava will lint your API surface against. When this happens,
-you can suppress Metalava API lint issues using `@SuppressLint` (for Java) or
-`@Suppress` annotations. In cases where it is not possible, update Metalava's
-baseline with the `updateApiLintBaseline` task.
-
-```shell
-./gradlew :core:core:updateApiLintBaseline
-```
-
-This will create/amend the `api_lint.ignore` file that lives in a library's
-`api` directory.
-
-## Build Output Guidelines
-
-In order to more easily identify the root cause of build failures, we want to
-keep the amount of output generated by a successful build to a minimum.
-Consequently, we track build output similarly to the way in which we track Lint
-warnings.
-
-### Invoking build output validation
-
-You can add `-Pandroidx.validateNoUnrecognizedMessages` to any other AndroidX
-gradlew command to enable validation of build output. For example:
-
-```shell
-/gradlew -Pandroidx.validateNoUnrecognizedMessages :help
-```
-
-### Exempting new build output messages
-
-Please avoid exempting new build output and instead fix or suppress the warnings
-themselves, because that will take effect not only on the build server but also
-in Android Studio, and will also run more quickly.
-
-If you cannot prevent the message from being generating and must exempt the
-message anyway, follow the instructions in the error:
-
-```shell
-$ ./gradlew -Pandroidx.validateNoUnrecognizedMessages :help
-
-Error: build_log_simplifier.py found 15 new messages found in /usr/local/google/workspace/aosp-androidx-git/out/dist/gradle.log.
-
-Please fix or suppress these new messages in the tool that generates them.
-If you cannot, then you can exempt them by doing:
-
-  1. cp /usr/local/google/workspace/aosp-androidx-git/out/dist/gradle.log.ignore /usr/local/google/workspace/aosp-androidx-git/frameworks/support/development/build_log_simplifier/messages.ignore
-  2. modify the new lines to be appropriately generalized
-```
-
-Each line in this exemptions file is a regular expressing matching one or more
-lines of output to be exempted. You may want to make these expressions as
-specific as possible to ensure that the addition of new, similar messages will
-also be detected (for example, discovering an existing warning in a new source
-file).
-
-## Behavior changes
-
-### Changes that affect API documentation
-
-Do not make behavior changes that require altering API documentation in a way
-that would break existing clients, even if such changes are technically binary
-compatible. For example, changing the meaning of a method's return value to
-return true rather than false in a given state would be considered a breaking
-change. Because this change is binary-compatible, it will not be caught by
-tooling and is effectively invisible to clients.
-
-Instead, add new methods and deprecate the existing ones if necessary, noting
-behavior changes in the deprecation message.
-
-### High-risk behavior changes
-
-Behavior changes that conform to documented API contracts but are highly complex
-and difficult to comprehensively test are considered high-risk and should be
-implemented using behavior flags. These changes may be flagged on initially, but
-the original behaviors must be preserved until the library enters release
-candidate stage and the behavior changes have been appropriately verified by
-integration testing against public pre-release
-revisions.
-
-It may be necessary to soft-revert a high-risk behavior change with only 24-hour
-notice, which should be achievable by flipping the behavior flag to off.
-
-```java
-// Flag for whether to throw exceptions when the state is known to be bad. This
-// is expected to be a high-risk change since apps may be working fine even with
-// a bad state, so we may need to disable this as a hotfix.
-private static final boolean FLAG_EXCEPTION_ON_BAD_STATE = false;
-```
-
-```java
-/**
- * Allows a developer to toggle throwing exceptions when the state is known to
- * be bad. This method is intended to give developers time to update their code.
- * It is temporary and will be removed in a future release.
- */
-@TemporaryFeatureFlag
-public void setExceptionOnBadStateEnabled(boolean enabled);
-```
-
-Avoid adding multiple high-risk changes during a feature cycle, as verifying the
-interaction of multiple feature flags leads to unnecessary complexity and
-exposes clients to high risk even when a single change is flagged off. Instead,
-wait until one high-risk change has landed in RC before moving on to the next.
-
-#### Testing
-
-Relevant tests should be run for the behavior change in both the on and off
-flagged states to prevent regressions.
-
-## Sample code in Kotlin modules
-
-### Background
-
-Public API can (and should!) have small corresponding code snippets that
-demonstrate functionality and usage of a particular API. These are often exposed
-inline in the documentation for the function / class - this causes consistency
-and correctness issues as this code is not compiled against, and the underlying
-implementation can easily change.
-
-KDoc (JavaDoc for Kotlin) supports a `@sample` tag, which allows referencing the
-body of a function from documentation. This means that code samples can be just
-written as a normal function, compiled and linted against, and reused from other
-modules such as tests! This allows for some guarantees on the correctness of a
-sample, and ensuring that it is always kept up to date.
-
-### Enforcement
-
-There are still some visibility issues here - it can be hard to tell if a
-function is a sample, and is used from public documentation - so as a result we
-have lint checks to ensure sample correctness.
-
-Primarily, there are three requirements when using sample links:
-
-1.  All functions linked to from a `@sample` KDoc tag must be annotated with
-    `@Sampled`
-2.  All sample functions annotated with `@Sampled` must be linked to from a
-    `@sample` KDoc tag
-3.  All sample functions must live inside a separate `samples` library
-    submodule - see the section on module configuration below for more
-    information.
-
-This enforces visibility guarantees, and make it easier to know that a sample is
-a sample. This also prevents orphaned samples that aren't used, and remain
-unmaintained and outdated.
-
-### Sample usage
-
-The follow demonstrates how to reference sample functions from public API. It is
-also recommended to reuse these samples in unit tests / integration tests / test
-apps / library demos where possible to help ensure that the samples work as
-intended.
-
-**Public API:**
-
-```
-/*
- * Fancy prints the given [string]
- *
- * @sample androidx.printer.samples.fancySample
- */
-fun fancyPrint(str: String) ...
-```
-
-**Sample function:**
-
-```
-package androidx.printer.samples
-
-import androidx.printer.fancyPrint
-
-@Sampled
-fun fancySample() {
-   fancyPrint("Fancy!")
-}
-```
-
-**Generated documentation visible on d.android.com / within Android Studio**
-
-```
-fun fancyPrint(str: String)
-
-Fancy prints the given [string]
-
-<code>
- import androidx.printer.fancyPrint
-
- fancyPrint("Fancy!")
-<code>
-```
-
-Warning: Only the body of the function is used in generated documentation, so
-any other references to elements defined outside the body of the function (such
-as variables defined within the sample file) will not be visible. To ensure that
-samples can be easily copy and pasted without errors, make sure that any
-references are defined within the body of the function.
-
-### Module configuration
-
-The following module setups should be used for sample functions:
-
-**Per-module samples**
-
-For library groups with relatively independent sub-libraries. This is the
-recommended project setup, and should be used in most cases.
-
-Gradle project name: `:foo-library:foo-module:foo-module-samples`
-
-```
-foo-library/
-  foo-module/
-    samples/
-```
-
-**Group-level samples**
-
-For library groups with strongly related samples that want to share code and be
-reused across a library group, a singular shared samples library can be created.
-In most cases this is discouraged - samples should be small and show the usage
-of a particular API / small set of APIs, instead of more complicated usage
-combining multiple APIs from across libraries. For these cases a sample
-application is more appropriate.
-
-Gradle project name: `:foo-library:foo-library-samples`
-
-```
-foo-library/
-  foo-module/
-  bar-module/
-  samples/
-```
-
-**Samples module configuration**
-
-Samples modules are published to GMaven so that they are available to Android
-Studio, which displays referenced samples as hover-over pop-ups.
-
-To achieve this, samples modules must declare the same MavenGroup and `publish`
-as the library(s) they are samples for.
diff --git a/docs/api_guidelines/behavior_changes.md b/docs/api_guidelines/behavior_changes.md
new file mode 100644
index 0000000..da275303
--- /dev/null
+++ b/docs/api_guidelines/behavior_changes.md
@@ -0,0 +1,53 @@
+## Behavior changes
+
+### Changes that affect API documentation
+
+Do not make behavior changes that require altering API documentation in a way
+that would break existing clients, even if such changes are technically binary
+compatible. For example, changing the meaning of a method's return value to
+return true rather than false in a given state would be considered a breaking
+change. Because this change is binary-compatible, it will not be caught by
+tooling and is effectively invisible to clients.
+
+Instead, add new methods and deprecate the existing ones if necessary, noting
+behavior changes in the deprecation message.
+
+### High-risk behavior changes
+
+Behavior changes that conform to documented API contracts but are highly complex
+and difficult to comprehensively test are considered high-risk and should be
+implemented using behavior flags. These changes may be flagged on initially, but
+the original behaviors must be preserved until the library enters release
+candidate stage and the behavior changes have been appropriately verified by
+integration testing against public pre-release
+revisions.
+
+It may be necessary to soft-revert a high-risk behavior change with only 24-hour
+notice, which should be achievable by flipping the behavior flag to off.
+
+```java
+// Flag for whether to throw exceptions when the state is known to be bad. This
+// is expected to be a high-risk change since apps may be working fine even with
+// a bad state, so we may need to disable this as a hotfix.
+private static final boolean FLAG_EXCEPTION_ON_BAD_STATE = false;
+```
+
+```java
+/**
+ * Allows a developer to toggle throwing exceptions when the state is known to
+ * be bad. This method is intended to give developers time to update their code.
+ * It is temporary and will be removed in a future release.
+ */
+@TemporaryFeatureFlag
+public void setExceptionOnBadStateEnabled(boolean enabled);
+```
+
+Avoid adding multiple high-risk changes during a feature cycle, as verifying the
+interaction of multiple feature flags leads to unnecessary complexity and
+exposes clients to high risk even when a single change is flagged off. Instead,
+wait until one high-risk change has landed in RC before moving on to the next.
+
+#### Testing
+
+Relevant tests should be run for the behavior change in both the on and off
+flagged states to prevent regressions.
diff --git a/docs/api_guidelines/checks.md b/docs/api_guidelines/checks.md
new file mode 100644
index 0000000..eb381e9
--- /dev/null
+++ b/docs/api_guidelines/checks.md
@@ -0,0 +1,91 @@
+## Android Lint Guidelines
+
+### Suppression vs Baselines
+
+Lint sometimes flags false positives, even though it is safe to ignore these
+errors (for example `WeakerAccess` warnings when you are avoiding synthetic
+access). There may also be lint failures when your library is in the middle of a
+beta / rc / stable release, and cannot make the breaking changes needed to fix
+the root cause. There are two ways of ignoring lint errors:
+
+1.  Suppression - using `@SuppressLint` (for Java) or `@Suppress` annotations to
+    ignore the warning per call site, per method, or per file.
+
+    Note: `@SuppressLint` requires Android dependency
+
+2.  Baselines - allowlisting errors in a `lint-baseline.xml` file at the root of
+    the project directory.
+
+Where possible, you should use a **suppression annotation at the call site**.
+This helps ensure that you are only suppressing the *exact* failure, and this
+also keeps the failure visible so it can be fixed later on. Only use a baseline
+if you are in a Java library without Android dependencies, or when enabling a
+new lint check, and it is prohibitively expensive / not possible to fix the
+errors generated by enabling this lint check.
+
+To update a lint baseline after you have fixed issues, run the
+`updateLintBaseline` task.
+
+```shell
+./gradlew :core:core:updateLintBaseline
+```
+
+## Metalava API Lint
+
+As well as Android Lint, which runs on all source code, Metalava will also run
+checks on the public API surface of each library. Similar to with Android Lint,
+there can sometimes be false positives / intended deviations from the API
+guidelines that Metalava will lint your API surface against. When this happens,
+you can suppress Metalava API lint issues using `@SuppressLint` (for Java) or
+`@Suppress` annotations. In cases where it is not possible, update Metalava's
+baseline with the `updateApiLintBaseline` task.
+
+```shell
+./gradlew :core:core:updateApiLintBaseline
+```
+
+This will create/amend the `api_lint.ignore` file that lives in a library's
+`api` directory.
+
+## Build Output Guidelines
+
+In order to more easily identify the root cause of build failures, we want to
+keep the amount of output generated by a successful build to a minimum.
+Consequently, we track build output similarly to the way in which we track Lint
+warnings.
+
+### Invoking build output validation
+
+You can add `-Pandroidx.validateNoUnrecognizedMessages` to any other AndroidX
+gradlew command to enable validation of build output. For example:
+
+```shell
+/gradlew -Pandroidx.validateNoUnrecognizedMessages :help
+```
+
+### Exempting new build output messages
+
+Please avoid exempting new build output and instead fix or suppress the warnings
+themselves, because that will take effect not only on the build server but also
+in Android Studio, and will also run more quickly.
+
+If you cannot prevent the message from being generating and must exempt the
+message anyway, follow the instructions in the error:
+
+```shell
+$ ./gradlew -Pandroidx.validateNoUnrecognizedMessages :help
+
+Error: build_log_simplifier.py found 15 new messages found in /usr/local/google/workspace/aosp-androidx-git/out/dist/gradle.log.
+
+Please fix or suppress these new messages in the tool that generates them.
+If you cannot, then you can exempt them by doing:
+
+  1. cp /usr/local/google/workspace/aosp-androidx-git/out/dist/gradle.log.ignore /usr/local/google/workspace/aosp-androidx-git/frameworks/support/development/build_log_simplifier/messages.ignore
+  2. modify the new lines to be appropriately generalized
+```
+
+Each line in this exemptions file is a regular expressing matching one or more
+lines of output to be exempted. You may want to make these expressions as
+specific as possible to ensure that the addition of new, similar messages will
+also be detected (for example, discovering an existing warning in a new source
+file).
diff --git a/docs/api_guidelines/compat.md b/docs/api_guidelines/compat.md
new file mode 100644
index 0000000..69d1a5c
--- /dev/null
+++ b/docs/api_guidelines/compat.md
@@ -0,0 +1,239 @@
+## Implementing compatibility {#compat}
+
+### Referencing new APIs {#compat-newapi}
+
+Generally, methods on library classes should be available to all devices above
+the library's `minSdkVersion`; however, the behavior of the method may vary
+based on platform API availability.
+
+For example, a method may delegate to a platform API on SDKs where the API is
+available, backport a subset of behavior on earlier SDKs, and no-op on very old
+SDKs.
+
+#### Checking device SDK version {#compat-sdk}
+
+The most common way of delegating to platform or backport implementations is to
+compare the device's `Build.VERSION.SDK_INT` field to a known-good SDK version;
+for example, the SDK in which a method first appeared or in which a critical bug
+was first fixed.
+
+Non-reflective calls to new APIs gated on `SDK_INT` **must** be made from
+version-specific static inner classes to avoid verification errors that
+negatively affect run-time performance. This is enforced at build time by the
+`ClassVerificationFailure` lint check, which offers auto-fixes in Java sources.
+
+For more information, see Chromium's guide to
+[Class Verification Failures](https://chromium.googlesource.com/chromium/src/+/HEAD/build/android/docs/class_verification_failures.md).
+
+Methods in implementation-specific classes **must** be paired with the
+`@DoNotInline` annotation to prevent them from being inlined.
+
+```java {.good}
+public static void saveAttributeDataForStyleable(@NonNull View view, ...) {
+  if (Build.VERSION.SDK_INT >= 29) {
+    Api29Impl.saveAttributeDataForStyleable(view, ...);
+  }
+}
+
+@RequiresApi(29)
+private static class Api29Impl {
+  @DoNotInline
+  static void saveAttributeDataForStyleable(@NonNull View view, ...) {
+    view.saveAttributeDataForStyleable(...);
+  }
+}
+```
+
+Alternatively, in Kotlin sources:
+
+```kotlin {.good}
+@RequiresApi(29)
+private object Api29Impl {
+  @JvmStatic
+  @DoNotInline
+  fun saveAttributeDataForStyleable(view: View, ...) { ... }
+}
+```
+
+When developing against pre-release SDKs where the `SDK_INT` has not been
+finalized, SDK checks **must** use `BuildCompat.isAtLeastX()` methods.
+
+```java {.good}
+@NonNull
+public static List<Window> getAllWindows() {
+  if (BuildCompat.isAtLeastR()) {
+    return ApiRImpl.getAllWindows();
+  }
+  return Collections.emptyList();
+}
+```
+
+#### Device-specific issues {#compat-oem}
+
+Library code may work around device- or manufacturer-specific issues -- issues
+not present in AOSP builds of Android -- *only* if a corresponding CTS test
+and/or CDD policy is added to the next revision of the Android platform. Doing
+so ensures that such issues can be detected and fixed by OEMs.
+
+#### Handling `minSdkVersion` disparity {#compat-minsdk}
+
+Methods that only need to be accessible on newer devices, including
+`to<PlatformClass>()` methods, may be annotated with `@RequiresApi(<sdk>)` to
+indicate they must not be called when running on older SDKs. This annotation is
+enforced at build time by the `NewApi` lint check.
+
+#### Handling `targetSdkVersion` behavior changes {#compat-targetsdk}
+
+To preserve application functionality, device behavior at a given API level may
+change based on an application's `targetSdkVersion`. For example, if an app with
+`targetSdkVersion` set to API level 22 runs on a device with API level 29, all
+required permissions will be granted at installation time and the run-time
+permissions framework will emulate earlier device behavior.
+
+Libraries do not have control over the app's `targetSdkVersion` and -- in rare
+cases -- may need to handle variations in platform behavior. Refer to the
+following pages for version-specific behavior changes:
+
+*   [API level 33](https://developer.android.com/about/versions/13/behavior-changes-13)
+*   [API level 31](https://developer.android.com/about/versions/12/behavior-changes-12)
+*   [API level 30](https://developer.android.com/about/versions/11/behavior-changes-11)
+*   [API level 29](https://developer.android.com/about/versions/10/behavior-changes-10)
+*   [API level 28](https://developer.android.com/about/versions/pie/android-9.0-changes-28)
+*   [API level 26](https://developer.android.com/about/versions/oreo/android-8.0-changes)
+*   [API level 24](https://developer.android.com/about/versions/nougat/android-7.0-changes)
+*   [API level 21](https://developer.android.com/about/versions/lollipop/android-5.0-changes)
+*   [API level 19](https://developer.android.com/about/versions/kitkat/android-4.4#Behaviors)
+
+#### Working around Lint issues {#compat-lint}
+
+In rare cases, Lint may fail to interpret API usages and yield a `NewApi` error
+and require the use of `@TargetApi` or `@SuppressLint('NewApi')` annotations.
+Both of these annotations are strongly discouraged and may only be used
+temporarily. They **must never** be used in a stable release. Any usage of these
+annotation **must** be associated with an active bug, and the usage must be
+removed when the bug is resolved.
+
+### Delegating to API-specific implementations {#delegating-to-api-specific-implementations}
+
+#### SDK-dependent reflection
+
+Starting in API level 28, the platform restricts which
+[non-SDK interfaces](https://developer.android.com/distribute/best-practices/develop/restrictions-non-sdk-interfaces)
+can be accessed via reflection by apps and libraries. As a general rule, you
+will **not** be able to use reflection to access hidden APIs on devices with
+`SDK_INT` greater than `Build.VERSION_CODES.P` (28).
+
+On earlier devices, reflection on hidden platform APIs is allowed **only** when
+an alternative public platform API exists in a later revision of the Android
+SDK. For example, the following implementation is allowed:
+
+```java
+public AccessibilityDelegate getAccessibilityDelegate(View v) {
+    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+        // Retrieve the delegate using a public API.
+        return v.getAccessibilityDelegate();
+    } else if (Build.VERSION.SDK_INT >= 11) {
+        // Retrieve the delegate by reflecting on a private field. If the
+        // field does not exist or cannot be accessed, this will no-op.
+        if (sAccessibilityDelegateField == null) {
+            try {
+                sAccessibilityDelegateField = View.class
+                        .getDeclaredField("mAccessibilityDelegate");
+                sAccessibilityDelegateField.setAccessible(true);
+            } catch (Throwable t) {
+                sAccessibilityDelegateCheckFailed = true;
+                return null;
+            }
+        }
+        try {
+            Object o = sAccessibilityDelegateField.get(v);
+            if (o instanceof View.AccessibilityDelegate) {
+                return (View.AccessibilityDelegate) o;
+            }
+            return null;
+        } catch (Throwable t) {
+            sAccessibilityDelegateCheckFailed = true;
+            return null;
+        }
+    } else {
+        // There is no way to retrieve the delegate, even via reflection.
+        return null;
+    }
+```
+
+Calls to public APIs added in pre-release revisions *must* be gated using
+`BuildCompat`:
+
+```java
+if (BuildCompat.isAtLeastQ()) {
+   // call new API added in Q
+} else if (Build.SDK_INT.VERSION >= 23) {
+   // make a best-effort using APIs that we expect to be available
+} else {
+   // no-op or best-effort given no information
+}
+```
+
+### Inter-process communication {#inter-process-communication}
+
+Protocols and data structures used for IPC must support interoperability between
+different versions of libraries and should be treated similarly to public API.
+
+#### Data structures
+
+**Do not** use `Parcelable` for any class that may be used for IPC or otherwise
+exposed as public API. The wire format used by `Parcelable` does not provide any
+compatibility guarantees and will result in crashes if fields are added or
+removed between library versions.
+
+**Do not** design your own serialization mechanism or wire format for disk
+storage or inter-process communication. Preserving and verifying compatibility
+is difficult and error-prone.
+
+Developers **should** use protocol buffers for most cases. See
+[Protobuf](#dependencies-protobuf) for more information on using protocol
+buffers in your library. **Do** use protocol buffers if your data structure is
+complex and likely to change over time. If your data includes `FileDescriptor`s,
+`Binder`s, or other platform-defined `Parcelable` data structures, they will
+need to be stored alongside the protobuf bytes in a `Bundle`.
+
+Developers **may** use `Bundle` in simple cases that require sending `Binder`s,
+`FileDescriptor`s, or platform `Parcelable`s across IPC
+([example](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:core/core/src/main/java/androidx/core/graphics/drawable/IconCompat.java;l=820)).
+Note that `Bundle` has several caveats:
+
+-   When running on Android S and below, accessing *any* entry in a `Bundle`
+    will result in the platform attempting to deserialize *every* entry. This
+    has been fixed in Android T and later with "lazy" bundles, but developers
+    should be careful when accessing `Bundle` on earlier platforms. If a single
+    entry cannot be loaded -- for example if a developer added a custom
+    `Parcelable` that doesn't exist in the receiver's classpath -- an exception
+    will be thrown when accessing *any* entry.
+-   On all platforms, library code that receives `Bundle`s data from outside the
+    process **must** read the data defensively. See previous note regarding
+    additional concerns for Android S and below.
+-   On all platforms, library code that sends `Bundle`s outside the process
+    *should* discourage clients from passing custom `Parcelable`s.
+-   `Bundle` provides no versioning and Jetpack provides no affordances for
+    tracking the keys or value types associated with a `Bundle`. Library owners
+    are responsible for providing their own system for guaranteeing wire format
+    compatibility between versions.
+
+Developers **may** use `VersionedParcelable` in cases where they are already
+using the library and understand its limitations.
+
+In all cases, **do not** expose your serialization mechanism in your API
+surface.
+
+NOTE We are currently investigating the suitability of Square's
+[`wire` library](https://github.com/square/wire) for handling protocol buffers
+in Android libraries. If adopted, it will replace `proto` library dependencies.
+Libraries that expose their serialization mechanism in their API surface *will
+not be able to migrate*.
+
+#### Communication protocols
+
+Any communication prototcol, handshake, etc. must maintain compatibility
+consistent with SemVer guidelines. Consider how your protocol will handle
+addition and removal of operations or constants, compatibility-breaking changes,
+and other modifications without crashing either the host or client process.
diff --git a/docs/api_guidelines/dependencies.md b/docs/api_guidelines/dependencies.md
new file mode 100644
index 0000000..0292b59
--- /dev/null
+++ b/docs/api_guidelines/dependencies.md
@@ -0,0 +1,249 @@
+## Dependencies {#dependencies}
+
+Artifacts may depend on other artifacts within AndroidX as well as sanctioned
+third-party libraries.
+
+### Versioned artifacts {#dependencies-versioned}
+
+One of the most difficult aspects of independently-versioned releases is
+maintaining compatibility with public artifacts. In a mono repo such as Google's
+repository or Android Git at master revision, it's easy for an artifact to
+accidentally gain a dependency on a feature that may not be released on the same
+schedule.
+
+-   Project `project(":core:core")` uses the tip-of-tree sources for the
+    `androidx.core:core` library and requires that they be loaded in the
+    workspace.
+-   Playground `projectOrArtifact(":core:core")` is used for
+    [Playground](playground.md) projects and will use tip-of-tree sources, if
+    present in the workspace, or `SNAPSHOT` prebuilt artifacts from
+    [androidx.dev](http://androidx.dev) otherwise.
+-   Explicit `"androidx.core:core:1.4.0"` uses the prebuilt AAR and requires
+    that it be checked in to the `prebuilts/androidx/internal` local Maven
+    repository.
+
+Libraries should prefer explicit dependencies with the lowest possible versions
+that include the APIs or behaviors required by the library, using project or
+Playground specs only in cases where tip-of-tree APIs or behaviors are required.
+
+#### Pre-release dependencies {#dependencies-pre-release}
+
+Pre-release suffixes **must** propagate up the dependency tree. For example, if
+your artifact has API-type dependencies on pre-release artifacts, ex.
+`1.1.0-alpha01`, then your artifact must also carry the `alpha` suffix. If you
+only have implementation-type dependencies, your artifact may carry either the
+`alpha` or `beta` suffix.
+
+Note: This does not apply to test dependencies: suffixes of test dependencies do
+*not* carry over to your artifact.
+
+#### Pinned versions {#dependencies-prebuilt}
+
+To avoid issues with dependency versioning, consider pinning your artifact's
+dependencies to the oldest version (available via local `maven_repo` or Google
+Maven) that satisfies the artifact's API requirements. This will ensure that the
+artifact's release schedule is not accidentally tied to that of another artifact
+and will allow developers to use older libraries if desired.
+
+```
+dependencies {
+   api("androidx.collection:collection:1.0.0")
+   ...
+}
+```
+
+Artifacts should be built and tested against both pinned and tip-of-tree
+versions of their dependencies to ensure behavioral compatibility.
+
+#### Tip-of-tree versions {#dependencies-project}
+
+Below is an example of a non-pinned dependency. It ties the artifact's release
+schedule to that of the dependency artifact, because the dependency will need to
+be released at the same time.
+
+```
+dependencies {
+   api(project(":collection"))
+   ...
+}
+```
+
+### Non-public APIs {#dependencies-non-public-apis}
+
+Artifacts may depend on non-public (e.g. `@hide`) APIs exposed within their own
+artifact or another artifact in the same `groupId`; however, cross-artifact
+usages are subject to binary compatibility guarantees and
+`@RestrictTo(Scope.LIBRARY_GROUP)` APIs must be tracked like public APIs.
+
+```
+Dependency versioning policies are enforced at build time in the createArchive task. This task will ensure that pre-release version suffixes are propagated appropriately.
+
+Cross-artifact API usage policies are enforced by the checkApi and checkApiRelease tasks (see Life of a release).
+```
+
+### Third-party libraries {#dependencies-3p}
+
+Artifacts may depend on libraries developed outside of AndroidX; however, they
+must conform to the following guidelines:
+
+*   Prebuilt **must** be checked into Android Git with both Maven and Make
+    artifacts
+    *   `prebuilts/maven_repo` is recommended if this dependency is only
+        intended for use with AndroidX artifacts, otherwise please use
+        `external`
+*   Prebuilt directory **must** contains an `OWNERS` file identifying one or
+    more individual owners (e.g. NOT a group alias)
+*   Library **must** be approved by legal
+
+Please see Jetpack's [open-source policy page](open_source.md) for more details
+on using third-party libraries.
+
+### Types of dependencies {#dependencies-types}
+
+AndroidX allows dependencies to be specified as `api` or `implementation` with a
+"pinned" Maven spec (ex. `androidx.core:core:1.0.0`) or a "tip-of-tree" project
+spec (ex. `project(":core:core")`).
+
+Projects used in Playground, the experimental GitHub workflow, should use a
+"recent" project or artifact spec (ex. `projectOrArtifact(":core:core")`) which
+will default to tip-of-tree when used outside of the Playground workflow or a
+pinned `SNAPSHOT` artifact otherwise.
+
+Regardless of which dependency spec is used, all projects are built against
+tip-of-tree dependencies in CI to prevent regressions and enforce Jetpack's
+compatible-at-head policy.
+
+#### `api` versus `implementation` {#dependencies-api-vs-impl}
+
+`api`-type dependencies will appear in clients' auto-complete as though they had
+added the dependency directly to their project, and Studio will run any lint
+checks bundled with `api`-type dependencies.
+
+Dependencies whose APIs are exposed in a library's API surface **must** be
+included as `api`-type. For example, if your library's API surface includes
+`AccessibilityNodeInfoCompat` then you will use an `api`-type dependency on the
+`androidx.core:core` library.
+
+NOTE Libraries that provide client-facing lint checks, including
+`annotation-experimental`, **must** be included as `api`-type to ensure that
+lint checks are run in the clients' dependent projects.
+
+`implementation`-type dependencies will be included in the classpath, but will
+not be made available at design time (ex. in auto-complete) unless the client
+explicitly adds them.
+
+### System health {#dependencies-health}
+
+Generally, Jetpack libraries should avoid dependencies that negatively impact
+developers without providing substantial benefit. Libraries should consider the
+system health implications of their dependencies, including:
+
+-   Large dependencies where only a small portion is needed (e.g. APK bloat)
+-   Dependencies that slow down build times through annotation processing or
+    compiler overhead
+
+#### Kotlin {#dependencies-kotlin}
+
+Kotlin is *strongly recommended* for new libraries; however, it's important to
+consider its size impact on clients. Currently, the Kotlin stdlib adds a minimum
+of 40kB post-optimization. It may not make sense to use Kotlin for a library
+that targets Java-only clients or space-constrained (ex. Android Go) clients.
+
+Existing Java-based libraries are *strongly discouraged* from using Kotlin,
+primarily because our documentation system does not currently provide a
+Java-facing version of Kotlin API reference docs. Java-based libraries *may*
+migrate to Kotlin, but they must consider the docs usability and size impacts on
+existing Java-only and space-constrained clients.
+
+#### Kotlin coroutines {#dependencies-coroutines}
+
+Kotlin's coroutine library adds around 100kB post-shrinking. New libraries that
+are written in Kotlin should prefer coroutines over `ListenableFuture`, but
+existing libraries must consider the size impact on their clients. See
+[Asynchronous work with return values](#async-return) for more details on using
+Kotlin coroutines in Jetpack libraries.
+
+#### Guava {#dependencies-guava}
+
+The full Guava library is very large and *must not* be used. Libraries that
+would like to depend on Guava's `ListenableFuture` may instead depend on the
+standalone `com.google.guava:listenablefuture` artifact. See
+[Asynchronous work with return values](#async-return) for more details on using
+`ListenableFuture` in Jetpack libraries.
+
+#### Java 8 {#dependencies-java8}
+
+Libraries that take a dependency on a library targeting Java 8 must *also*
+target Java 8, which will incur a ~5% build performance (as of 8/2019) hit for
+clients. New libraries targeting Java 8 may use Java 8 dependencies.
+
+The default language level for `androidx` libraries is Java 8, and we encourage
+libraries to stay on Java 8. However, if you have a business need to target Java
+7, you can specify Java 7 in your `build.gradle` as follows:
+
+```groovy
+android {
+    compileOptions {
+        sourceCompatibility = JavaVersion.VERSION_1_7
+        targetCompatibility = JavaVersion.VERSION_1_7
+    }
+}
+```
+
+#### Protobuf {#dependencies-protobuf}
+
+[Protocol buffers](https://developers.google.com/protocol-buffers) provide a
+language- and platform-neutral mechanism for serializing structured data. The
+implementation enables developers to maintain protocol compatibility across
+library versions, meaning that two clients can communicate regardless of the
+library versions included in their APKs.
+
+The Protobuf library itself, however, does not guarantee ABI compatibility
+across minor versions and a specific version **must** be bundled with a library
+to avoid conflict with other dependencies used by the developer.
+
+Additionally, the Java API surface generated by the Protobuf compiler is not
+guaranteed to be stable and **must not** be exposed to developers. Library
+owners should wrap the generated API surface with well-documented public APIs
+that follow an appropriate language-specific paradigm for constructing data
+classes, e.g. the Java `Builder` pattern.
+
+### Open-source compatibility {#dependencies-aosp}
+
+Jetpack's [open-source](open_source.md) principle requires that libraries
+consider the open-source compatibility implications of their dependencies,
+including:
+
+-   Closed-source or proprietary libraries or services that may not be available
+    on AOSP devices
+-   Dependencies that may prevent developers from effectively isolating their
+    tests from third-party libraries or services
+
+Primary artifacts, e.g. `workmanager`, **must not** depend on closed-source
+components including libraries and hard-coded references to packages,
+permissions, or IPC mechanisms that may only be fulfilled by closed-source
+components.
+
+Optional artifacts, e.g. `workmanager-gcm`, *may* depend on closed-source
+components or configure a primary artifact to be backed by a closed-source
+component via service discovery or initialization.
+
+Some examples of safely depending on closed-source components include:
+
+-   WorkManager's GCM Network Manager integration, which uses
+    [manifest metadata](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:work/workmanager-gcm/src/main/AndroidManifest.xml)
+    for service discovery and provides an optional artifact exposing the
+    service.
+-   Ads Identifier's Play Services integration, which provides a default backend
+    and uses
+    [`Intent` handling](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-master-dev:ads/ads-identifier-provider/src/main/java/androidx/ads/identifier/provider/AdvertisingIdProviderManager.java;l=108)
+    as a service discovery mechanism for Play Services.
+-   Downloadable Fonts integration with Play Services, which plugs in via a
+    [`ContentProvider`](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:core/core/src/androidTest/java/androidx/core/provider/MockFontProvider.java)
+    as a service discovery mechanism with developer-specified
+    [signature verification](https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts#adding-certificates)
+    for additional security.
+
+Note that in all cases, the developer is not *required* to use GCM or Play
+Services and may instead use another compatible service implementing the same
+publicly-defined protocols.
diff --git a/docs/api_guidelines/deprecation.md b/docs/api_guidelines/deprecation.md
new file mode 100644
index 0000000..ae4246a
--- /dev/null
+++ b/docs/api_guidelines/deprecation.md
@@ -0,0 +1,89 @@
+## Deprecation and removal
+
+While SemVer's binary compatibility guarantees restrict the types of changes
+that may be made within a library revision and make it difficult to remove an
+API, there are many other ways to influence how developers interact with your
+library.
+
+### Deprecation (`@deprecated`)
+
+Deprecation lets a developer know that they should stop using an API or class.
+All deprecations must be marked with a `@Deprecated` Java annotation as well as
+a `@deprecated <migration-docs>` docs annotation explaining how the developer
+should migrate away from the API.
+
+Deprecation is an non-breaking API change that must occur in a **major** or
+**minor** release.
+
+APIs that are added during a pre-release cycle and marked as `@Deprecated`
+within the same cycle, e.g. added in `alpha01` and deprecated in `alpha06`,
+[must be removed](versioning.md#beta-checklist) before moving to `beta01`.
+
+### Soft removal (@removed)
+
+Soft removal preserves binary compatibility while preventing source code from
+compiling against an API. It is a *source-breaking change* and not recommended.
+
+Soft removals **must** do the following:
+
+*   Mark the API as deprecated for at least one stable release prior to removal.
+*   Mark the API with a `@RestrictTo(LIBRARY)` Java annotation as well as a
+    `@removed <reason>` docs annotation explaining why the API was removed.
+*   Maintain binary compatibility, as the API may still be called by existing
+    dependent libraries.
+*   Maintain behavioral compatibility and existing tests.
+
+This is a disruptive change and should be avoided when possible.
+
+Soft removal is a source-breaking API change that must occur in a **major** or
+**minor** release.
+
+### Hard removal
+
+Hard removal entails removing the entire implementation of an API that was
+exposed in a public release. Prior to removal, an API must be marked as
+`@deprecated` for a full **minor** version (`alpha`->`beta`->`rc`->stable),
+prior to being hard removed.
+
+This is a disruptive change and should be avoided when possible.
+
+Hard removal is a binary-breaking API change that must occur in a **major**
+release.
+
+### For entire artifacts
+
+We do not typically deprecate or remove entire artifacts; however, it may be
+useful in cases where we want to halt development and focus elsewhere or
+strongly discourage developers from using a library.
+
+Halting development, either because of staffing or prioritization issues, leaves
+the door open for future bug fixes or continued development. This quite simply
+means we stop releasing updates but retain the source in our tree.
+
+Deprecating an artifact provides developers with a migration path and strongly
+encourages them -- through Lint warnings -- to migrate elsewhere. This is
+accomplished by adding a `@Deprecated` and `@deprecated` (with migration
+comment) annotation pair to *every* class and interface in the artifact.
+
+To deprecate an entire artifact:
+
+1.  Mark every top-level API (class, interface, extension function, etc.) in the
+    artifact as `@Deprecated` and update the API files
+    ([example CL](https://android-review.googlesource.com/c/platform/frameworks/support/+/1938773))
+1.  Schedule a release of the artifact as a new minor version. When you populate
+    the release notes, explain that the entire artifact has been deprecated.
+    Include the reason for deprecation and the migration strategy.
+1.  After the artifact has been released, remove the artifact from the source
+    tree, versions file, and tip-of-tree docs configuration
+    ([example CL](https://android-review.googlesource.com/c/platform/frameworks/support/+/2061731/))
+
+The fully-deprecated artifact will be released as a deprecation release -- it
+will ship normally with accompanying release notes indicating the reason for
+deprecation and migration strategy, and it will be the last version of the
+artifact that ships. It will ship as a new minor stable release. For example, if
+`1.0.0` was the last stable release, then the deprecation release will be
+`1.1.0`. This is so Android Studio users will get a suggestion to update to a
+new stable version, which will contain the `@deprecated` annotations.
+
+After an artifact has been released as fully-deprecated, it can be removed from
+the source tree.
diff --git a/docs/api_guidelines/index.md b/docs/api_guidelines/index.md
new file mode 100644
index 0000000..4cff936
--- /dev/null
+++ b/docs/api_guidelines/index.md
@@ -0,0 +1,70 @@
+# Library API guidelines
+
+[TOC]
+
+## Introduction {#introduction}
+
+This guide is an addendum to
+s.android.com/api-guidelines,
+which covers standard and practices for designing platform APIs.
+
+All platform API design guidelines also apply to Jetpack libraries, with any
+additional guidelines or exceptions noted in this document. Jetpack libraries
+also follow
+[explicit API mode](https://kotlinlang.org/docs/reference/whatsnew14.html#explicit-api-mode-for-library-authors)
+for Kotlin libraries.
+
+<!--#include file="/company/teams/androidx/api_guidelines/modules.md"-->
+
+<!--#include file="/company/teams/androidx/api_guidelines/platform_compat.md"-->
+
+<!--#include file="/company/teams/androidx/api_guidelines/compat.md"-->
+
+<!--#include file="/company/teams/androidx/api_guidelines/deprecation.md"-->
+
+<!--#include file="/company/teams/androidx/api_guidelines/resources.md"-->
+
+<!--#include file="/company/teams/androidx/api_guidelines/dependencies.md"-->
+
+<!--#include file="/company/teams/androidx/api_guidelines/misc.md"-->
+
+## Testing Guidelines
+
+### [Do not Mock, AndroidX](do_not_mock.md)
+
+### Validating class verification fixes
+
+To verify class verification, the best way is to look for `adb` output during
+install time.
+
+You can generate class verification logs from test APKs. Simply call the
+class/method that should generate a class verification failure in a test.
+
+The test APK will generate class verification logs on install.
+
+```bash
+# Enable ART logging (requires root). Note the 2 pairs of quotes!
+adb root
+adb shell setprop dalvik.vm.dex2oat-flags '"--runtime-arg -verbose:verifier"'
+
+# Restart Android services to pick up the settings
+adb shell stop && adb shell start
+
+# Optional: clear logs which aren't relevant
+adb logcat -c
+
+# Install the app and check for ART logs
+# This line is what triggers log lines, and can be repeated
+adb install -d -r someApk.apk
+
+# it's useful to run this _during_ install in another shell
+adb logcat | grep 'dex2oat'
+...
+... I dex2oat : Soft verification failures in
+```
+
+<!--#include file="/company/teams/androidx/api_guidelines/checks.md"-->
+
+<!--#include file="/company/teams/androidx/api_guidelines/behavior_changes.md"-->
+
+<!--#include file="/company/teams/androidx/api_guidelines/samples.md"-->
diff --git a/docs/api_guidelines/misc.md b/docs/api_guidelines/misc.md
new file mode 100644
index 0000000..71ea499
--- /dev/null
+++ b/docs/api_guidelines/misc.md
@@ -0,0 +1,692 @@
+## More API guidelines {#more-api-guidelines}
+
+### Annotations {#annotation}
+
+#### Annotation processors {#annotation-processor}
+
+Annotation processors should opt-in to incremental annotation processing to
+avoid triggering a full recompilation on every client source code change. See
+Gradle's
+[Incremental annotation processing](https://docs.gradle.org/current/userguide/java_plugin.html#sec:incremental_annotation_processing)
+documentation for information on how to opt-in.
+
+### `@RequiresOptIn` APIs {#experimental-api}
+
+Jetpack libraries may choose to annotate API surfaces as unstable using either
+Kotlin's
+[`@RequiresOptIn` meta-annotation](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-requires-opt-in/)
+for APIs written in Kotlin or Jetpack's
+[`@RequiresOptIn` meta-annotation](https://developer.android.com/reference/kotlin/androidx/annotation/RequiresOptIn)
+for APIs written in Java.
+
+> `@RequiresOptIn` at-a-glance:
+>
+> *   Use for unstable API surfaces
+> *   Can be called by anyone
+> *   Documented in public documentation
+> *   Does not maintain compatibility
+
+For either annotation, API surfaces marked as opt-in are considered alpha and
+will be excluded from API compatibility guarantees. Due to the lack of
+compatibility guarantees, stable libraries *must never* call experimental APIs
+exposed by other libraries outside of their
+[same-version group](#same-version-atomic-groups) and *may not* use the `@OptIn`
+annotation except in the following cases:
+
+*   A library within a same-version group *may* call an experimental API exposed
+    by another library **within its same-version group**. In this case, API
+    compatibility guarantees are covered under the same-version group policies
+    and the library *may* use the `@OptIn` annotation to prevent propagation of
+    the experimental property. **Library owners must exercise care to ensure
+    that post-alpha APIs backed by experimental APIs actually meet the release
+    criteria for post-alpha APIs.**
+*   An `alpha` library may use experimental APIs from outside its same-version
+    group. These usages must be removed when the library moves to `beta`.
+
+NOTE JetBrains's own usage of `@RequiresOptIn` in Kotlin language libraries
+varies and may indicate binary instability, functional instability, or simply
+that an API is really difficult to use. Jetpack libraries should treat instances
+of `@RequiresOptIn` in JetBrains libraries as indicating **binary instability**
+and avoid using them outside of `alpha`; however, teams are welcome to obtain
+written assurance from JetBrains regarding binary stability of specific APIs.
+`@RequiresOptIn` APIs that are guaranteed to remain binary compatible *may* be
+used in `beta`, but usages must be removed when the library moves to `rc`.
+
+#### When to mark an API surface as experimental
+
+*Do not* use `@RequiresOptIn` for a stable API surface that is difficult to use.
+It is not a substitute for a properly-designed API surface.
+
+*Do not* use `@RequiresOptIn` for an API surface that is unreliable or unstable
+because it is missing tests. It is not a substitute for a properly-tested API
+surface, and all APIs -- including those in `alpha` -- are expected to be
+functionally stable.
+
+*Do not* use `@RequiresOptIn` for an internal-facing API surface. Use either the
+appropriate language visibility (ex. `private` or `internal`) or `@RestrictTo`.
+
+*Do not* use `@RequiresOptIn` for an API that you expect library developers to
+call. Experimental APIs do not maintain binary compatibility guarantees, and you
+will put external clients in a difficult situation.
+
+*Do* use `@RequiresOptIn` for API surfaces that must be publicly available and
+documented but need the flexibility to stay in `alpha` (and break compatibility)
+during the rest of the library's `beta`, `rc`, or stable cycles.
+
+#### How to mark an API surface as experimental
+
+All libraries using `@RequiresOptIn` annotations *must* depend on the
+`androidx.annotation:annotation-experimental` artifact regardless of whether
+they are using the `androidx` or Kotlin annotation. This artifact provides Lint
+enforcement of experimental usage restrictions for Kotlin callers as well as
+Java (which the Kotlin annotation doesn't handle on its own, since it's a Kotlin
+compiler feature). Libraries *may* include the dependency as `api`-type to make
+`@OptIn` available to Java clients; however, this will also unnecessarily expose
+the `@RequiresOptIn` annotation.
+
+```java
+dependencies {
+    implementation(project(":annotation:annotation-experimental"))
+}
+```
+
+See Kotlin's
+[opt-in requirements documentation](https://kotlinlang.org/docs/reference/opt-in-requirements.html)
+for general usage information. If you are writing experimental Java APIs, you
+will use the Jetpack
+[`@RequiresOptIn` annotation](https://developer.android.com/reference/kotlin/androidx/annotation/RequiresOptIn)
+rather than the Kotlin compiler's annotation.
+
+#### How to transition an API out of experimental
+
+When an API surface is ready to transition out of experimental, the annotation
+may only be removed during an alpha pre-release stage. Removing the experimental
+marker from an API is equivalent to adding the API to the current API surface.
+
+When transitioning an entire feature surface out of experimental, you *should*
+remove the definition for the associated experimental marker annotation.
+
+When making any change to the experimental API surface, you *must* run
+`./gradlew updateApi` prior to uploading your change.
+
+NOTE Experimental marker annotation *are themselves* experimental, meaning that
+it's considered binary compatible to refactor or remove an experimental marker
+annotation.
+
+### `@RestrictTo` APIs {#restricted-api}
+
+Jetpack's library tooling supports hiding Java-visible (ex. `public` and
+`protected`) APIs from developers using a combination of the `@RestrictTo`
+source annotation, and the `@hide` docs annotation (`@suppress` in Kotlin).
+These annotations **must** be paired together when used, and are validated as
+part of presubmit checks for Java code.
+
+> `@RestrictTo` at-a-glance:
+>
+> *   Use for internal-facing API surfaces
+> *   Can be called within the specified `Scope`
+> *   Does not appear in public documentation
+> *   Does not maintain compatibility in most scopes
+
+While restricted APIs do not appear in documentation and Android Studio will
+warn against calling them, hiding an API does *not* provide strong guarantees
+about usage:
+
+*   There are no runtime restrictions on calling hidden APIs
+*   Android Studio will not warn if hidden APIs are called using reflection
+*   Hidden APIs will still show in Android Studio's auto-complete
+
+#### When to use `@hide` {#restricted-api-usage}
+
+In other cases, avoid using `@hide` / `@suppress`. These annotations indicates
+that developers should not call an API that is *technically* public from a Java
+visibility perspective. Hiding APIs is often a sign of a poorly-abstracted API
+surface, and priority should be given to creating public, maintainable APIs and
+using Java visibility modifiers.
+
+*Do not* use `@hide`/`@suppress` to bypass API tracking and review for
+production APIs; instead, rely on API+1 and API Council review to ensure APIs
+are reviewed on a timely basis.
+
+*Do not* use `@hide`/`@suppress` for implementation detail APIs that are used
+between libraries and could reasonably be made public.
+
+*Do* use `@hide`/`@suppress` paired with `@RestrictTo(LIBRARY)` for
+implementation detail APIs used within a single library (but prefer Java
+language `private` or `default` visibility).
+
+#### `RestrictTo.Scope` and inter- versus intra-library API surfaces {#private-api-types}
+
+To maintain binary compatibility between different versions of libraries,
+restricted API surfaces that are used between libraries within Jetpack
+(inter-library APIs) must follow the same Semantic Versioning rules as public
+APIs. Inter-library APIs should be annotated with the
+`@RestrictTo(LIBRARY_GROUP)` source annotation and `@hide` docs annotation.
+
+Restricted API surfaces used within a single library (intra-library APIs), on
+the other hand, may be added or removed without any compatibility
+considerations. It is safe to assume that developers *never* call these APIs,
+even though it is technically feasible. Intra-library APIs should be annotated
+with the `@RestrictTo(LIBRARY)` source annotation and `@hide` docs annotation.
+
+In all cases, correctness and compatibility tracking are handled by AndroidX's
+build system and lint checks.
+
+The following table shows the visibility of a hypothetical API within Maven
+coordinate `androidx.concurrent:concurrent` when annotated with a variety of
+scopes:
+
+<table>
+    <tr>
+        <td><code>RestrictTo.Scope</code></td>
+        <td>Visibility by Maven coordinate</td>
+        <td>Versioning</td>
+        <td>Note</td>
+    </tr>
+    <tr>
+        <td><code>LIBRARY</code></td>
+        <td><code>androidx.concurrent:concurrent</code></td>
+        <td>No compatibility guarantees (same as private)</td>
+        <td></td>
+    </tr>
+    <tr>
+        <td><code>LIBRARY_GROUP</code></td>
+        <td><code>androidx.concurrent:*</code></td>
+        <td>Semantic versioning (including deprecation)</td>
+        <td></td>
+    </tr>
+    <tr>
+        <td><code>LIBRARY_GROUP_PREFIX</code></td>
+        <td><code>androidx.*:*</code></td>
+        <td>Semantic versioning (including deprecation)</td>
+        <td></td>
+    </tr>
+    <tr>
+        <td><code>TEST</code></td>
+        <td><code>*</code></td>
+        <td>No compatibility guarantees (same as private)</td>
+        <td>Not recommended. Prefer language visibility, e.g. `internal` or package-private.</td>
+    </tr>
+</table>
+
+#### `@IntDef` `@StringDef` and `@LongDef` and visibility
+
+All `@IntDef`, `@StringDef`, and `@LongDef` will be stripped from resulting
+artifacts to avoid issues where compiler inlining constants removes information
+as to which `@IntDef` defined the value of `1`. The annotations are extracted
+and packaged separately to be read by Android Studio and lint which enforces the
+types in application code.
+
+*   Libraries *must* `@hide` all `@IntDef`, `@StringDef`, and `@LongDef`
+    declarations.
+*   Libraries *must* expose constants used to define the `@IntDef` etc at the
+    same Java visibility as the hidden `@IntDef`
+*   Libraries *must* use `@RestrictTo` to create a warning when the type is used
+    incorrectly.
+
+Here is a complete example of an `@IntDef`
+
+```java
+// constants match Java visibility of ExifStreamType
+// code outside this module interacting with ExifStreamType uses these constants
+public static final int STREAM_TYPE_FULL_IMAGE_DATA = 1;
+public static final int STREAM_TYPE_EXIF_DATA_ONLY = 2;
+
+/** @hide */
+@RestrictTo(RestrictTo.Scope.LIBRARY) // Don't export ExifStreamType outside module
+@Retention(RetentionPolicy.SOURCE)
+@IntDef({
+  STREAM_TYPE_FULL_IMAGE_DATA,
+  STREAM_TYPE_EXIF_DATA_ONLY,
+})
+public @interface ExifStreamType {}
+```
+
+Java visibilty should be set as appropriate for the code in question (`private`,
+`package` or `public`) and is unrelated to hiding.
+
+For more, read the section in
+[Android API Council Guidelines](https://android.googlesource.com/platform/developers/docs/+/refs/heads/master/api-guidelines/index.md#no-public-typedefs)
+
+### Constructors {#constructors}
+
+#### View constructors {#view-constructors}
+
+The four-arg View constructor -- `View(Context, AttributeSet, int, int)` -- was
+added in SDK 21 and allows a developer to pass in an explicit default style
+resource rather than relying on a theme attribute to resolve the default style
+resource. Because this API was added in SDK 21, care must be taken to ensure
+that it is not called through any < SDK 21 code path.
+
+Views *may* implement a four-arg constructor in one of the following ways:
+
+1.  Do not implement.
+1.  Implement and annotate with `@RequiresApi(21)`. This means the three-arg
+    constructor **must not** call into the four-arg constructor.
+
+### Asynchronous work {#async}
+
+#### With return values {#async-return}
+
+###### Kotlin
+
+Traditionally, asynchronous work on Android that results in an output value
+would use a callback; however, better alternatives exist for libraries.
+
+Kotlin libraries should consider
+[coroutines](https://kotlinlang.org/docs/reference/coroutines-overview.html) and
+`suspend` functions for APIs according to the following rules, but please refer
+to the guidance on [allowable dependencies](#dependencies-coroutines) before
+adding a new dependency on coroutines.
+
+Kotlin suspend fun vs blocking       | Behavior
+------------------------------------ | --------------------------
+blocking function with @WorkerThread | API is blocking
+suspend                              | API is async (e.g. Future)
+
+In general, do not introduce a suspend function entirely to switch threads for
+blocking calls. To do so correctly requires that we allow the developer to
+configure the Dispatcher. As there is already a coroutines-based API for
+changing dispatchers (withContext) that the caller may use to switch threads, it
+is unecessary API overhead to provide a duplicate mechanism. In addition, it
+unecessary limits callers to coroutine contexts.
+
+```kotlin
+// DO expose blocking calls as blocking calls
+@WorkerThread
+fun blockingCall()
+
+// DON'T wrap in suspend functions (only to switch threads)
+suspend fun blockingCallWrappedInSuspend(
+  dispatcher: CoroutineDispatcher = Dispatchers.Default
+) = withContext(dispatcher) { /* ... */ }
+
+// DO expose async calls as suspend funs
+suspend fun asyncCall(): ReturnValue
+
+// DON'T expose async calls as a callback-based API (for the main API)
+fun asyncCall(executor: Executor, callback: (ReturnValue) -> Unit)
+```
+
+###### Java
+
+Java libraries should prefer `ListenableFuture` and the
+[`CallbackToFutureAdapter`](https://developer.android.com/reference/androidx/concurrent/futures/CallbackToFutureAdapter)
+implementation provided by the `androidx.concurrent:concurrent-futures` library.
+Functions and methods that return `ListenableFuture` should be suffixed by,
+`Async` to reserve the shorter, unmodified name for a `suspend` method or
+extension function in Kotlin that returns the value normally in accordance with
+structured concurrency.
+
+Libraries **must not** use `java.util.concurrent.CompletableFuture`, as it has a
+large API surface that permits arbitrary mutation of the future's value and has
+error-prone defaults.
+
+See the [Dependencies](#dependencies) section for more information on using
+Kotlin coroutines and Guava in your library.
+
+#### Cancellation
+
+Libraries that expose APIs for performing asynchronous work should support
+cancellation. There are *very few* cases where it is not feasible to support
+cancellation.
+
+Libraries that use `ListenableFuture` must be careful to follow the exact
+specification of
+[`Future.cancel(boolean mayInterruptIfRunning)`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html?is-external=true#cancel-boolean-)
+behavior.
+
+```java {.bad}
+@Override
+public boolean cancel(boolean mayInterruptIfRunning) {
+    // Does not support cancellation.
+    return false;
+}
+```
+
+```java {.bad}
+@Override
+public boolean cancel(boolean mayInterruptIfRunning) {
+    // Aggressively does not support cancellation.
+    throw new UnsupportedOperationException();
+}
+```
+
+```java {.good}
+@Override
+public boolean cancel(boolean mayInterruptIfRunning) {
+    // Pseudocode that ignores threading but follows the spec.
+    if (mCompleted
+            || mCancelled
+            || mRunning && !mayInterruptIfRunning) {
+        return false;
+    }
+    mCancelled = true;
+    return true;
+}
+```
+
+#### Avoid `synchronized` methods
+
+Whenever multiple threads are interacting with shared (mutable) references those
+reads and writes must be synchronized in some way. However synchronized blocks
+make your code thread-safe at the expense of concurrent execution. Any time
+execution enters a synchronized block or method any other thread trying to enter
+a synchronized block on the same object has to wait; even if in practice the
+operations are unrelated (e.g. they interact with different fields). This can
+dramatically reduce the benefit of trying to write multi-threaded code in the
+first place.
+
+Locking with synchronized is a heavyweight form of ensuring ordering between
+threads, and there are a number of common APIs and patterns that you can use
+that are more lightweight, depending on your use case:
+
+*   Compute a value once and make it available to all threads
+*   Update Set and Map data structures across threads
+*   Allow a group of threads to process a stream of data concurrently
+*   Provide instances of a non-thread-safe type to multiple threads
+*   Update a value from multiple threads atomically
+*   Maintain granular control of your concurrency invariants
+
+### Kotlin-specific guidelines {#kotlin}
+
+#### Nullability from Java (new APIs)
+
+All new Java APIs should be annotated either `@Nullable` or `@NonNull` for all
+reference parameters and reference return types.
+
+```java
+    @Nullable
+    public Object someNewApi(@NonNull Thing arg1, @Nullable List<WhatsIt> arg2) {
+        if(/** something **/) {
+            return someObject;
+        } else {
+            return null;
+    }
+```
+
+#### Nullability from Java (existing APIs)
+
+Adding `@Nullable` or `@NonNull` annotations to existing APIs to document their
+existing nullability is OK. This is a source breaking change for Kotlin
+consumers, and you should ensure that it's noted in the release notes and try to
+minimize the frequency of these updates in releases.
+
+Changing the nullability of an API is a breaking change.
+
+#### Extending APIs that expose types without nullability annotations
+
+[Platform types](https://kotlinlang.org/docs/java-interop.html#null-safety-and-platform-types)
+are exposed by Java types that do not have a `@Nullable` or `@NonNull`
+annotation. In Kotlin they are indicated with the `!` suffix.
+
+When interacting with an Android platform API that exposes APIs with unknown
+nullability follow these rules:
+
+1.  If wrapping the type in a new API, define and handle `@Nullable` or
+    `@NonNull` in the library. Treat types with unknown nullability passed into
+    or return from Android as `@Nullable` in the library.
+2.  If extending an existing API (e.g. `@Override`), pass through the existing
+    types with unknown nullability and annotate each with
+    `@SuppressLint("UnknownNullness")`
+
+In Kotlin, a type with unknown nullability is exposed as a "platform type"
+(indicated with a `!` suffix) which has unknown nullability in the type checker,
+and may bypass type checking leading to runtime errors. When possible, do not
+directly expose types with unknown nullability in new public APIs.
+
+#### Extending `@RecentlyNonNull` and `@RecentlyNullable` APIs
+
+Platform APIs are annotated in the platform SDK artifacts with fake annotations
+`@RecentlyNonNull` and `@RecentlyNullable` to avoid breaking builds when we
+annotated platform APIs with nullability. These annotations cause warnings
+instead of build failures. The `RecentlyNonNull` and `RecentlyNullable`
+annotations are added by Metalava and do not appear in platform code.
+
+When extending an API that is annotated `@RecentlyNonNull`, you should annotate
+the override with `@NonNull`, and the same for `@RecentlyNullable` and
+`@Nullable`.
+
+For example `SpannableStringBuilder.append` is annotated `RecentlyNonNull` and
+an override should look like:
+
+```java
+    @NonNull
+    @Override
+    public SpannableStringBuilder append(@SuppressLint("UnknownNullness") CharSequence text) {
+        super.append(text);
+        return this;
+    }
+```
+
+#### Data classes {#kotlin-data}
+
+Kotlin `data` classes provide a convenient way to define simple container
+objects, where Kotlin will generate `equals()` and `hashCode()` for you.
+However, they are not designed to preserve API/binary compatibility when members
+are added. This is due to other methods which are generated for you -
+[destructuring declarations](https://kotlinlang.org/docs/reference/multi-declarations.html),
+and [copying](https://kotlinlang.org/docs/reference/data-classes.html#copying).
+
+Example data class as tracked by metalava:
+
+<pre>
+  public final class TargetAnimation {
+    ctor public TargetAnimation(float target, androidx.animation.AnimationBuilder animation);
+    <b>method public float component1();</b>
+    <b>method public androidx.animation.AnimationBuilder component2();</b>
+    <b>method public androidx.animation.TargetAnimation copy(float target, androidx.animation.AnimationBuilder animation);</b>
+    method public androidx.animation.AnimationBuilder getAnimation();
+    method public float getTarget();
+  }
+</pre>
+
+Because members are exposed as numbered components for destructuring, you can
+only safely add members at the end of the member list. As `copy` is generated
+with every member name in order as well, you'll also have to manually
+re-implement any old `copy` variants as items are added. If these constraints
+are acceptable, data classes may still be useful to you.
+
+As a result, Kotlin `data` classes are *strongly discouraged* in library APIs.
+Instead, follow best-practices for Java data classes including implementing
+`equals`, `hashCode`, and `toString`.
+
+See Jake Wharton's article on
+[Public API challenges in Kotlin](https://jakewharton.com/public-api-challenges-in-kotlin/)
+for more details.
+
+#### Exhaustive `when` and `sealed class`/`enum class` {#exhaustive-when}
+
+A key feature of Kotlin's `sealed class` and `enum class` declarations is that
+they permit the use of **exhaustive `when` expressions.** For example:
+
+```kotlin
+enum class CommandResult { Permitted, DeniedByUser }
+
+val message = when (commandResult) {
+    Permitted -> "the operation was permitted"
+    DeniedByUser -> "the user said no"
+}
+
+println(message)
+```
+
+This highlights challenges for library API design and compatibility. Consider
+the following addition to the `CommandResult` possibilities:
+
+```kotlin {.bad}
+enum class CommandResult {
+    Permitted,
+    DeniedByUser,
+    DeniedByAdmin // New in androidx.mylibrary:1.1.0!
+}
+```
+
+This change is both **source and binary breaking.**
+
+It is **source breaking** because the author of the `when` block above will see
+a compiler error about not handling the new result value.
+
+It is **binary breaking** because if the `when` block above was compiled as part
+of a library `com.example.library:1.0.0` that transitively depends on
+`androidx.mylibrary:1.0.0`, and an app declares the dependencies:
+
+```kotlin
+implementation("com.example.library:1.0.0")
+implementation("androidx.mylibrary:1.1.0") // Updated!
+```
+
+`com.example.library:1.0.0` does not handle the new result value, leading to a
+runtime exception.
+
+**Note:** The above example is one where Kotlin's `enum class` is the correct
+tool and the library should **not** add a new constant! Kotlin turns this
+semantic API design problem into a compiler or runtime error. This type of
+library API change could silently cause app logic errors or data corruption
+without the protection provided by exhaustive `when`. See
+[When to use exhaustive types](#when-to-use-exhaustive-types).
+
+`sealed class` exhibits the same characteristic; adding a new subtype of an
+existing sealed class is a breaking change for the following code:
+
+```kotlin
+val message = when (command) {
+    is Command.Migrate -> "migrating to ${command.destination}"
+    is Command.Quack -> "quack!"
+}
+```
+
+##### Non-exhaustive alternatives to `enum class`
+
+Kotlin's `@JvmInline value class` with a `private constructor` can be used to
+create type-safe sets of non-exhaustive constants as of Kotlin 1.5. Compose's
+`BlendMode` uses the following pattern:
+
+```kotlin {.good}
+@JvmInline
+value class BlendMode private constructor(val value: Int) {
+    companion object {
+        /** Drop both the source and destination images, leaving nothing. */
+        val Clear = BlendMode(0)
+        /** Drop the destination image, only paint the source image. */
+        val Src = BlendMode(1)
+        // ...
+    }
+}
+```
+
+**Note:** This recommendation may be temporary. Kotlin may add new annotations
+or other language features to declare non-exhaustive enum classes in the future.
+
+Alternatively, the existing `@IntDef` mechanism used in Java-language androidx
+libraries may also be used, but type checking of constants will only be
+performed by lint, and functions overloaded with parameters of different value
+class types are not supported. Prefer the `@JvmInline value class` solution for
+new code unless it would break local consistency with other API in the same
+module that already uses `@IntDef`.
+
+##### Non-exhaustive alternatives to `sealed class`
+
+Abstract classes with constructors marked as `internal` or `private` can
+represent the same subclassing restrictions of sealed classes as seen from
+outside of a library module's own codebase:
+
+```kotlin
+abstract class Command private constructor() {
+    class Migrate(val destination: String) : Command()
+    object Quack : Command()
+}
+```
+
+Using an `internal` constructor will permit non-nested subclasses, but will
+**not** restrict subclasses to the same package within the module, as sealed
+classes do.
+
+##### When to use exhaustive types
+
+Use `enum class` or `sealed class` when the values or subtypes are intended to
+be exhaustive by design from the API's initial release. Use non-exhaustive
+alternatives when the set of constants or subtypes might expand in a minor
+version release.
+
+Consider using an **exhaustive** (`enum class` or `sealed class`) type
+declaration if:
+
+*   The developer is expected to **accept** values of the type
+*   The developer is expected to **act** on **any and all** values received
+
+Consider using a **non-exhaustive** type declaration if:
+
+*   The developer is expected to **provide** values of the type to APIs exposed
+    by the same module **only**
+*   The developer is expected to **ignore** unknown values received
+
+The `CommandResult` example above is a good example of a type that **should**
+use the exhaustive `enum class`; `CommandResult`s are **returned** to the
+developer and the developer cannot implement correct app behavior by ignoring
+unrecognized result values. Adding a new result value would semantically break
+existing code regardless of the language facility used to express the type.
+
+```kotlin {.good}
+enum class CommandResult { Permitted, DeniedByUser, DeniedByAdmin }
+```
+
+Compose's `BlendMode` is a good example of a type that **should not** use the
+exhaustive `enum class`; blending modes are used as arguments to Compose
+graphics APIs and are not intended for interpretation by app code. Additionally,
+there is historical precedent from `android.graphics` for new blending modes to
+be added in the future.
+
+#### Extension and top-level functions {#kotlin-extension-functions}
+
+If your Kotlin file contains any symbols outside of class-like types
+(extension/top-level functions, properties, etc), the file must be annotated
+with `@JvmName`. This ensures unanticipated use-cases from Java callers don't
+get stuck using `BlahKt` files.
+
+Example:
+
+```kotlin {.bad}
+package androidx.example
+
+fun String.foo() = // ...
+```
+
+```kotlin {.good}
+@file:JvmName("StringUtils")
+
+package androidx.example
+
+fun String.foo() = // ...
+```
+
+NOTE This guideline may be ignored for libraries that only work in Kotlin (think
+Compose).
+
+#### Function paremeters order {#kotlin-params-order}
+
+In Kotlin function parameters can have default values, which are used when you
+skip the corresponding argument.
+
+If a default parameter precedes a parameter with no default value, the default
+value can only be used by calling the function with named arguments:
+
+```kotlin
+fun foo(
+    someBoolean: Boolean = true,
+    someInt: Int,
+) { /*...*/ }
+
+// usage:
+foo(1) // does not compile as we try to set 1 as a value for "someBoolean" and
+       // didn't specify "someInt".
+foo(someInt = 1) // this compiles as we used named arguments syntax.
+```
+
+To not force our users to use named arguments we enforce the following
+parameters order for the public Kotlin functions:
+
+1.  All parameters without default values.
+2.  All parameters with default values.
+3.  An optional last parameter without default value which can be used as a
+    trailing lambda.
diff --git a/docs/api_guidelines/modules.md b/docs/api_guidelines/modules.md
new file mode 100644
index 0000000..4f94a16
--- /dev/null
+++ b/docs/api_guidelines/modules.md
@@ -0,0 +1,277 @@
+## Modules {#module}
+
+### Packaging and naming {#module-naming}
+
+Java packages within Jetpack follow the format `androidx.<feature-name>`. All
+classes within a feature's artifact must reside within this package, and may
+further subdivide into `androidx.<feature-name>.<layer>` using standard Android
+layers (app, widget, etc.) or layers specific to the feature.
+
+Maven specifications use the groupId format `androidx.<feature-name>` and
+artifactId format `<feature-name>` to match the Java package. For example,
+`androidx.core.role` uses the Maven spec `androidx.core:core-role`.
+
+Sub-features that can be separated into their own artifact are recommended to
+use the following formats:
+
+-   Java package: `androidx.<feature-name>.<sub-feature>.<layer>`
+-   Maven groupId: `androidx.<feature-name>`
+-   Maven artifactId: `<feature-name>-<sub-feature>`
+
+Gradle project names and directories follow the Maven spec format, substituting
+the project name separator `:` or directory separator `/` for the Maven
+separators `.` or `:`. For example, `androidx.core:core-role` would use project
+name `:core:core-role` and directory `/core/core-role`.
+
+Android namespaces should be unique and match the module's root Java package. If
+the root Java package is not unique, include the sub-feature name.
+
+```
+android {
+    namespace "androidx.core.role"
+}
+```
+
+New modules in androidx can be created using the
+[project creator script](#module-creation).
+
+NOTE Modules for OEM-implemented shared libraries (also known as extensions or
+sidecars) that ship on-device and are referenced via the `<uses-library>` tag
+should follow the naming convention `com.android.extensions.<feature-name>` to
+avoid placing `androidx`-packaged code in the platform's boot classpath.
+
+#### Project directory structure {#module-structure}
+
+Libraries developed in AndroidX follow a consistent project naming and directory
+structure.
+
+Library groups should organize their projects into directories and project names
+(in brackets) as:
+
+```
+<feature-name>/
+  <feature-name>-<sub-feature>/ [<feature-name>:<feature-name>-<sub-feature>]
+    samples/ [<feature-name>:<feature-name>-<sub-feature>-samples]
+  integration-tests/
+    testapp/ [<feature-name>:testapp]
+    testlib/ [<feature-name>:testlib]
+```
+
+For example, the `navigation` library group's directory structure is:
+
+```
+navigation/
+  navigation-benchmark/ [navigation:navigation-benchmark]
+  ...
+  navigation-ui/ [navigation:navigation-ui]
+  navigation-ui-ktx/ [navigation:navigation-ui-ktx]
+  integration-tests/
+    testapp/ [navigation:integration-tests:testapp]
+```
+
+#### Project creator script {#module-creation}
+
+Note: The terms *project*, *module*, and *library* are often used
+interchangeably within AndroidX, with project being the technical term used by
+Gradle to describe a build target, e.g. a library that maps to a single AAR.
+
+New projects can be created using our
+[project creation script](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:development/project-creator/?q=project-creator&ss=androidx%2Fplatform%2Fframeworks%2Fsupport)
+available in our repo.
+
+It will create a new project with the proper structure and configuration based
+on your project needs!
+
+To use it:
+
+```sh
+cd ~/androidx-main/frameworks/support && \
+cd development/project-creator && \
+./create_project.py androidx.foo foo-bar
+```
+
+If you are creating an unpublished module such as an integration test app with \
+the project creator script, it may not make sense to follow the same naming \
+conventions as published libraries. In this situation it is safe to comment out
+\
+the `artifact_id` validation from the script or rename the module after it has \
+been created.
+
+If you see an error message `No module named 'toml'` try the following steps.
+
+*   Install necessary tools if they are not already installed
+    *   (Linux) `sudo apt-get install virtualenv python3-venv`
+    *   (Mac) `pip3 install virtualenv`
+*   Create a virtual environment with `virtualenv androidx_project_creator` (you
+    can choose another name for your virtualenv if you wish).
+*   Install the `toml` library in your virtual env with
+    `androidx_project_creator/bin/pip3 install toml`
+*   Run the project creator script from your virtual env with
+    `androidx_project_creator/bin/python3
+    ../../development/project-creator/create_project.py androidx.foo foo-bar`
+*   Delete your virtual env with `rm -rf ./androidx-project_creator`
+    *   virtualenv will automatically .gitignore itself, but you may want to to
+        remove it anyway.
+
+#### Common sub-feature names {#module-naming-subfeature}
+
+*   `-testing` for an artifact intended to be used while testing usages of your
+    library, e.g. `androidx.room:room-testing`
+*   `-core` for a low-level artifact that *may* contain public APIs but is
+    primarily intended for use by other libraries in the group
+*   `-ktx` for an Kotlin artifact that exposes idiomatic Kotlin APIs as an
+    extension to a Java-only library (see
+    [additional -ktx guidance](#module-ktx))
+*   `-samples` for sample code which can be inlined in documentation (see
+    [Sample code in Kotlin modules](#sample-code-in-kotlin-modules)
+*   `-<third-party>` for an artifact that integrates an optional third-party API
+    surface, e.g. `-proto` or `-rxjava2`. Note that a major version is included
+    in the sub-feature name for third-party API surfaces where the major version
+    indicates binary compatibility (only needed for post-1.x).
+
+Artifacts **should not** use `-impl` or `-base` to indicate that a library is an
+implementation detail shared within the group. Instead, use `-core`.
+
+#### Splitting existing modules
+
+Existing modules *should not* be split into smaller modules; doing so creates
+the potential for class duplication issues when a developer depends on a new
+sub-module alongside the older top-level module. Consider the following
+scenario:
+
+*   `androidx.library:1.0.0`
+    *   contains class `androidx.library.A`
+    *   contains class `androidx.library.util.B`
+
+This module is split, moving `androidx.library.util.B` to a new module:
+
+*   `androidx.library:1.1.0`
+    *   contains class `androidx.library.A`
+    *   depends on `androidx.library.util:1.1.0`
+*   `androidx.library.util:1.1.0`
+    *   contains class `androidx.library.util.B`
+
+A developer writes an app that depends directly on `androidx.library.util:1.1.0`
+and also transitively pulls in `androidx.library:1.0.0`. Their app will no
+longer compile due to class duplication of `androidx.library.util.B`.
+
+While it is possible for the developer to fix this by manually specifying a
+dependency on `androidx.library:1.1.0`, there is no easy way for the developer
+to discover this solution from the class duplication error raised at compile
+time.
+
+Same-version groups are a special case for this rule. Existing modules that are
+already in a same-version group may be split into sub-modules provided that (a)
+the sub-modules are also in the same-version group and (b) the full API surface
+of the existing module is preserved through transitive dependencies, e.g. the
+sub-modules are added as dependencies of the existing module.
+
+#### Same-version (atomic) groups {#modules-atomic}
+
+Library groups are encouraged to opt-in to a same-version policy whereby all
+libraries in the group use the same version and express exact-match dependencies
+on libraries within the group. Such groups must increment the version of every
+library at the same time and release all libraries at the same time.
+
+Atomic groups are specified in
+[libraryversions.toml](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:libraryversions.toml):
+
+```
+// Non-atomic library group
+APPCOMPAT = { group = "androidx.appcompat" }
+// Atomic library group
+APPSEARCH = { group = "androidx.appsearch", atomicGroupVersion = "versions.APPSEARCH" }
+```
+
+Libraries within an atomic group should not specify a version in their
+`build.gradle`:
+
+```groovy
+androidx {
+    name = 'AppSearch'
+    publish = Publish.SNAPSHOT_AND_RELEASE
+    mavenGroup = LibraryGroups.APPSEARCH
+    inceptionYear = '2019'
+    description = 'Provides local and centralized app indexing'
+}
+```
+
+The benefits of using an atomic group are:
+
+-   Easier for developers to understand dependency versioning
+-   `@RestrictTo(LIBRARY_GROUP)` APIs are treated as private APIs and not
+    tracked for binary compatibility
+-   `@RequiresOptIn` APIs defined within the group may be used without any
+    restrictions between libraries in the group
+
+Potential drawbacks include:
+
+-   All libraries within the group must be versioned identically at head
+-   All libraries within the group must release at the same time
+
+#### Early-stage development {#modules-atomic-alpha}
+
+There is one exception to the same-version policy: newly-added libraries within
+an atomic group may be "quarantined" from other libraries to allow for rapid
+iteration until they are API-stable.
+
+A quarantined library must stay within the `1.0.0-alphaXX` cycle until it is
+ready to conform to the same-version policy. While in quarantime, a library is
+treated at though it is in a separate group from its nomical same-version group:
+
+-   Must stay in `1.0.0-alphaXX`, e.g. same-version policy is not enforced
+-   May use `project` or pinned version dependencies, e.g. strict-match
+    dependencies are not enforced
+-   May release on a separate cadence from other libraries within group
+-   Must not reference restricted `LIBRARY-GROUP`-scoped APIs
+
+When the library would like to leave quarantine, it must wait for its atomic
+group to be within a `beta` cycle and then match the version. It is okay for a
+library in this situation to skip versions, e.g. move directly from
+`1.0.0-alpha02` to `2.1.3-beta06`.
+
+### Choosing a `minSdkVersion` {#module-minsdkversion}
+
+The recommended minimum SDK version for new Jetpack libraries is currently
+**19** (Android 4.4, KitKat). This SDK was chosen to represent 99% of active
+devices based on Play Store check-ins (see Android Studio
+[distribution metadata](https://dl.google.com/android/studio/metadata/distributions.json)
+for current statistics). This maximizes potential users for external developers
+while minimizing the amount of overhead necessary to support legacy versions.
+
+However, if no explicit minimum SDK version is specified for a library, the
+default is **14** (Android 4.0, Ice Cream Sandwich).
+
+Note that a library **must not** depend on another library with a higher
+`minSdkVersion` that its own, so it may be necessary for a new library to match
+its dependent libraries' `minSdkVersion`.
+
+Individual modules may choose a higher minimum SDK version for business or
+technical reasons. This is common for device-specific modules such as Auto or
+Wear.
+
+Individual classes or methods may be annotated with the
+[@RequiresApi](https://developer.android.com/reference/android/annotation/RequiresApi.html)
+annotation to indicate divergence from the overall module's minimum SDK version.
+Note that this pattern is *not recommended* because it leads to confusion for
+external developers and should be considered a last-resort when backporting
+behavior is not feasible.
+
+### Kotlin extension `-ktx` libraries {#module-ktx}
+
+New libraries should prefer Kotlin sources with built-in Java compatibility via
+`@JvmName` and other affordances of the Kotlin language; however, existing Java
+sourced libraries may benefit from extending their API surface with
+Kotlin-friendly APIs in a `-ktx` library.
+
+A Kotlin extension library **may only** provide extensions for a single base
+library's API surface and its name **must** match the base library exactly. For
+example, `work:work-ktx` may only provide extensions for APIs exposed by
+`work:work`.
+
+Additionally, an extension library **must** specify an `api`-type dependency on
+the base library and **must** be versioned and released identically to the base
+library.
+
+Kotlin extension libraries *should not* expose new functionality; they should
+only provide Kotlin-friendly versions of existing Java-facing functionality.
diff --git a/docs/api_guidelines/platform_compat.md b/docs/api_guidelines/platform_compat.md
new file mode 100644
index 0000000..6de372e
--- /dev/null
+++ b/docs/api_guidelines/platform_compat.md
@@ -0,0 +1,394 @@
+## Platform compatibility API patterns {#platform-compatibility-apis}
+
+NOTE For all library APIs that wrap or provide parity with platform APIs,
+*parity with the platform APIs overrides API guidelines*. For example, if the
+platform API being wrapped has incorrect `Executor` and `Callback` ordering
+according to the API Guidelines, the corresponding library API should have the
+exact same (incorrect) ordering.
+
+### Static shims (ex. [ViewCompat](https://developer.android.com/reference/android/support/v4/view/ViewCompat.html)) {#static-shim}
+
+When to use?
+
+*   Platform class exists at module's `minSdkVersion`
+*   Compatibility implementation does not need to store additional metadata
+
+Implementation requirements
+
+*   Class name **must** be `<PlatformClass>Compat`
+*   Package name **must** be `androidx.<feature>.<platform.package>`
+*   Superclass **must** be `Object`
+*   Class **must** be non-instantiable, i.e. constructor is private no-op
+*   Static fields and static methods **must** match match signatures with
+    `<PlatformClass>`
+    *   Static fields that can be inlined, ex. integer constants, **must not**
+        be shimmed
+*   Public method names **must** match platform method names
+*   Public methods **must** be static and take `<PlatformClass>` as first
+    parameter (except in the case of static methods on the platform class, as
+    shown below)
+*   Implementation *may* delegate to `<PlatformClass>` methods when available
+
+#### Sample {#static-shim-sample}
+
+The following sample provides static helper methods for the platform class
+`android.os.Process`.
+
+```java
+/**
+ * Helper for accessing features in {@link Process}.
+ */
+public final class ProcessCompat {
+    private ProcessCompat() {
+        // This class is non-instantiable.
+    }
+
+    /**
+     * [Docs should match platform docs.]
+     *
+     * Compatibility behavior:
+     * <ul>
+     * <li>SDK 24 and above, this method matches platform behavior.
+     * <li>SDK 16 through 23, this method is a best-effort to match platform behavior, but may
+     * default to returning {@code true} if an accurate result is not available.
+     * <li>SDK 15 and below, this method always returns {@code true} as application UIDs and
+     * isolated processes did not exist yet.
+     * </ul>
+     *
+     * @param [match platform docs]
+     * @return [match platform docs], or a value based on platform-specific fallback behavior
+     */
+    public static boolean isApplicationUid(int uid) {
+        if (Build.VERSION.SDK_INT >= 24) {
+            return Api24Impl.isApplicationUid(uid);
+        } else if (Build.VERSION.SDK_INT >= 17) {
+            return Api17Impl.isApplicationUid(uid);
+        } else if (Build.VERSION.SDK_INT == 16) {
+            return Api16Impl.isApplicationUid(uid);
+        } else {
+            return true;
+        }
+    }
+
+    @RequiresApi(24)
+    static class Api24Impl {
+        static boolean isApplicationUid(int uid) {
+            // In N, the method was made public on android.os.Process.
+            return Process.isApplicationUid(uid);
+        }
+    }
+
+    @RequiresApi(17)
+    static class Api17Impl {
+        private static Method sMethod_isAppMethod;
+        private static boolean sResolved;
+
+        static boolean isApplicationUid(int uid) {
+            // In JELLY_BEAN_MR2, the equivalent isApp(int) hidden method moved to public class
+            // android.os.UserHandle.
+            try {
+                if (!sResolved) {
+                    sResolved = true;
+                    sMethod_isAppMethod = UserHandle.class.getDeclaredMethod("isApp",int.class);
+                }
+                if (sMethod_isAppMethod != null) {
+                    return (Boolean) sMethod_isAppMethod.invoke(null, uid);
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            return true;
+        }
+    }
+
+    ...
+}
+```
+
+### Wrapper (ex. [AccessibilityNodeInfoCompat](https://developer.android.com/reference/android/support/v4/view/accessibility/AccessibilityNodeInfoCompat.html)) {#wrapper}
+
+When to use?
+
+*   Platform class may not exist at module's `minSdkVersion`
+*   Compatibility implementation may need to store additional metadata
+*   Needs to integrate with platform APIs as return value or method argument
+*   **Note:** Should be avoided when possible, as using wrapper classes makes it
+    very difficult to deprecate classes and migrate source code when the
+    `minSdkVersion` is raised
+
+#### Sample {#wrapper-sample}
+
+The following sample wraps a hypothetical platform class `ModemInfo` that was
+added to the platform SDK in API level 23:
+
+```java
+public final class ModemInfoCompat {
+  // Only guaranteed to be non-null on SDK_INT >= 23. Note that referencing the
+  // class itself directly is fine -- only references to class members need to
+  // be pushed into static inner classes.
+  private final ModemInfo wrappedObj;
+
+  /**
+   * [Copy platform docs for matching constructor.]
+   */
+  public ModemInfoCompat() {
+    if (SDK_INT >= 23) {
+      wrappedObj = Api23Impl.create();
+    } else {
+      wrappedObj = null;
+    }
+    ...
+  }
+
+  @RequiresApi(23)
+  private ModemInfoCompat(@NonNull ModemInfo obj) {
+    mWrapped = obj;
+  }
+
+  /**
+   * Provides a backward-compatible wrapper for {@link ModemInfo}.
+   * <p>
+   * This method is not supported on devices running SDK < 23 since the platform
+   * class will not be available.
+   *
+   * @param info platform class to wrap
+   * @return wrapped class, or {@code null} if parameter is {@code null}
+   */
+  @RequiresApi(23)
+  @NonNull
+  public static ModemInfoCompat toModemInfoCompat(@NonNull ModemInfo info) {
+    return new ModemInfoCompat(obj);
+  }
+
+  /**
+   * Provides the {@link ModemInfo} represented by this object.
+   * <p>
+   * This method is not supported on devices running SDK < 23 since the platform
+   * class will not be available.
+   *
+   * @return platform class object
+   * @see ModemInfoCompat#toModemInfoCompat(ModemInfo)
+   */
+  @RequiresApi(23)
+  @NonNull
+  public ModemInfo toModemInfo() {
+    return mWrapped;
+  }
+
+  /**
+   * [Docs should match platform docs.]
+   *
+   * Compatibility behavior:
+   * <ul>
+   * <li>API level 23 and above, this method matches platform behavior.
+   * <li>API level 18 through 22, this method ...
+   * <li>API level 17 and earlier, this method always returns false.
+   * </ul>
+   *
+   * @return [match platform docs], or platform-specific fallback behavior
+   */
+  public boolean isLteSupported() {
+    if (SDK_INT >= 23) {
+      return Api23Impl.isLteSupported(mWrapped);
+    } else if (SDK_INT >= 18) {
+      // Smart fallback behavior based on earlier APIs.
+      ...
+    }
+    // Default behavior.
+    return false;
+  }
+
+  // All references to class members -- including the constructor -- must be
+  // made on an inner class to avoid soft-verification errors that slow class
+  // loading and prevent optimization.
+  @RequiresApi(23)
+  private static class Api23Impl {
+    @DoNotInline
+    @NonNull
+    static ModemInfo create() {
+      return new ModemInfo();
+    }
+
+    @DoNotInline
+    static boolean isLteSupported(ModemInfo obj) {
+      return obj.isLteSupported();
+    }
+  }
+}
+```
+
+Note that libraries written in Java should express conversion to and from the
+platform class differently than Kotlin classes. For Java classes, conversion
+from the platform class to the wrapper should be expressed as a `static` method,
+while conversion from the wrapper to the platform class should be a method on
+the wrapper object:
+
+```java
+@NonNull
+public static ModemInfoCompat toModemInfoCompat(@NonNull ModemInfo info);
+
+@NonNull
+public ModemInfo toModemInfo();
+```
+
+In cases where the primary library is written in Java and has an accompanying
+`-ktx` Kotlin extensions library, the following conversion should be provided as
+an extension function:
+
+```kotlin
+fun ModemInfo.toModemInfoCompat() : ModemInfoCompat
+```
+
+Whereas in cases where the primary library is written in Kotlin, the conversion
+should be provided as an extension factory:
+
+```kotlin
+class ModemInfoCompat {
+  fun toModemInfo() : ModemInfo
+
+  companion object {
+    @JvmStatic
+    @JvmName("toModemInfoCompat")
+    fun ModemInfo.toModemInfoCompat() : ModemInfoCompat
+  }
+}
+```
+
+#### API guidelines {#wrapper-api-guidelines}
+
+##### Naming {#wrapper-naming}
+
+*   Class name **must** be `<PlatformClass>Compat`
+*   Package name **must** be `androidx.core.<platform.package>`
+*   Superclass **must not** be `<PlatformClass>`
+
+##### Construction {#wrapper-construction}
+
+*   Class *may* have public constructor(s) to provide parity with public
+    `PlatformClass` constructors
+    *   Constructor used to wrap `PlatformClass` **must not** be public
+*   Class **must** implement a static `PlatformClassCompat
+    toPlatformClassCompat(PlatformClass)` method to wrap `PlatformClass` on
+    supported SDK levels
+    *   If class does not exist at module's `minSdkVersion`, method must be
+        annotated with `@RequiresApi(<sdk>)` for SDK version where class was
+        introduced
+
+#### Implementation {#wrapper-implementation}
+
+*   Class **must** implement a `PlatformClass toPlatformClass()` method to
+    unwrap `PlatformClass` on supported SDK levels
+    *   If class does not exist at module's `minSdkVersion`, method must be
+        annotated with `@RequiresApi(<sdk>)` for SDK version where class was
+        introduced
+*   Implementation *may* delegate to `PlatformClass` methods when available (see
+    below note for caveats)
+*   To avoid runtime class verification issues, all operations that interact
+    with the internal structure of `PlatformClass` must be implemented in inner
+    classes targeted to the SDK level at which the operation was added.
+    *   See the [sample](#wrapper-sample) for an example of interacting with a
+        method that was added in SDK level 23.
+
+### Safe super. invocation {#safe-super-calls}
+
+When to use?
+
+*   When invoking `method.superMethodIntroducedSinceMinSdk()`
+
+Implementation requirements
+
+*   Class must be a *non-static* **inner class** (captures `this` pointer)
+*   Class may not be exposed in public API
+
+This should only be used when calling `super` methods that will not verify (such
+as when overriding a new method to provide back compat).
+
+Super calls is not available in a `static` context in Java. It can however be
+called from an inner class.
+
+#### Sample {#safe-super-calls-sample}
+
+```java
+class AppCompatTextView : TextView {
+
+  @Nullable
+  SuperCaller mSuperCaller = null;
+
+  @Override
+  int getPropertyFromApi99() {
+  if (Build.VERSION.SDK_INT > 99) {
+    getSuperCaller().getPropertyFromApi99)();
+  }
+
+  @NonNull
+  @RequiresApi(99)
+  SuperCaller getSuperCaller() {
+    if (mSuperCaller == null) {
+      mSuperCaller = new SuperCaller();
+    }
+    return mSuperCaller;
+  }
+
+  @RequiresApi(99)
+  class SuperCaller {
+    int getPropertyFromApi99() {
+      return AppCompatTextView.super.getPropertyFromApi99();
+    }
+  }
+}
+```
+
+### Standalone (ex. [ArraySet](https://developer.android.com/reference/android/support/v4/util/ArraySet.html), [Fragment](https://developer.android.com/reference/android/support/v4/app/Fragment.html)) {#standalone}
+
+When to use?
+
+*   Platform class may exist at module's `minSdkVersion`
+*   Does not need to integrate with platform APIs
+*   Does not need to coexist with platform class, ex. no potential `import`
+    collision due to both compatibility and platform classes being referenced
+    within the same source file
+
+Implementation requirements
+
+*   Class name **must** be `<PlatformClass>`
+*   Package name **must** be `androidx.<platform.package>`
+*   Superclass **must not** be `<PlatformClass>`
+*   Class **must not** expose `PlatformClass` in public API
+    *   In exceptional cases, a *released* standalone class may add conversion
+        between itself and the equivalent platform class; however, *new* classes
+        that support conversion should follow the [Wrapper](#wrapper)
+        guidelines. In these cases, use a `toPlatform<PlatformClass>` and
+        `static toCompat<PlatformClass>` method naming convention.
+*   Implementation *may* delegate to `PlatformClass` methods when available
+
+### Standalone JAR library (no Android dependencies) {#standalone-jar-library-no-android-dependencies}
+
+When to use
+
+*   General purpose library with minimal interaction with Android types
+    *   or when abstraction around types can be used (e.g. Room's SQLite
+        wrapper)
+*   Lib used in parts of app with minimal Android dependencies
+    *   ex. Repository, ViewModel
+*   When Android dependency can sit on top of common library
+*   Clear separation between android dependent and independent parts of your
+    library
+*   Clear that future integration with android dependencies can be layered
+    separately
+
+**Examples:**
+
+The **Paging Library** pages data from DataSources (such as DB content from Room
+or network content from Retrofit) into PagedLists, so they can be presented in a
+RecyclerView. Since the included Adapter receives a PagedList, and there are no
+other Android dependencies, Paging is split into two parts - a no-android
+library (paging-common) with the majority of the paging code, and an android
+library (paging-runtime) with just the code to present a PagedList in a
+RecyclerView Adapter. This way, tests of Repositories and their components can
+be tested in host-side tests.
+
+**Room** loads SQLite data on Android, but provides an abstraction for those
+that want to use a different SQL implementation on device. This abstraction, and
+the fact that Room generates code dynamically, means that Room interfaces can be
+used in host-side tests (though actual DB code should be tested on device, since
+DB impls may be significantly different on host).
diff --git a/docs/api_guidelines/resources.md b/docs/api_guidelines/resources.md
new file mode 100644
index 0000000..3290271
--- /dev/null
+++ b/docs/api_guidelines/resources.md
@@ -0,0 +1,193 @@
+## Resources {#resources}
+
+Generally, follow the official Android guidelines for
+[app resources](https://developer.android.com/guide/topics/resources/providing-resources).
+Special guidelines for library resources are noted below.
+
+### Defining new resources
+
+Libraries may define new value and attribute resources using the standard
+application directory structure used by Android Gradle Plugin:
+
+```
+src/main/res/
+  values/
+    attrs.xml   Theme attributes and styleables
+    dimens.xml  Dimensional values
+    public.xml  Public resource definitions
+    ...
+```
+
+However, some libraries may still be using non-standard, legacy directory
+structures such as `res-public` for their public resource declarations or a
+top-level `res` directory and accompanying custom source set in `build.gradle`.
+These libraries will eventually be migrated to follow standard guidelines.
+
+#### Naming conventions
+
+Libraries follow the Android platform's resource naming conventions, which use
+`camelCase` for attributes and `underline_delimited` for values. For example,
+`R.attr.fontProviderPackage` and `R.dimen.material_blue_grey_900`.
+
+#### Attribute formats
+
+At build time, attribute definitions are pooled globally across all libraries
+used in an application, which means attribute `format`s *must* be identical for
+a given `name` to avoid a conflict.
+
+Within Jetpack, new attribute names *must* be globally unique. Libraries *may*
+reference existing public attributes from their dependencies. See below for more
+information on public attributes.
+
+When adding a new attribute, the format should be defined *once* in an `<attr
+/>` element in the definitions block at the top of `src/main/res/attrs.xml`.
+Subsequent references in `<declare-styleable>` elements *must* not include a
+`format`:
+
+`src/main/res/attrs.xml`
+
+```xml
+<resources>
+  <attr name="fontProviderPackage" format="string" />
+
+  <declare-styleable name="FontFamily">
+      <attr name="fontProviderPackage" />
+  </declare-styleable>
+</resources>
+```
+
+#### Translatable strings
+
+Translatable strings *must* be contained within files named `strings.xml` to be
+picked up for translation.
+
+### Public resources
+
+Library resources in Jetpack are private by default, which means developers are
+discouraged from referencing any defined attributes or values from XML or code;
+however, library resources may be declared public to make them available to
+developers.
+
+Public library resources are considered API surface and are thus subject to the
+same API consistency and documentation requirements as Java APIs.
+
+Libraries will typically only expose theme attributes, ex. `<attr />` elements,
+as public API so that developers can set and retrieve the values stored in
+styles and themes. Exposing values -- such as `<dimen />` and `<string />` -- or
+images -- such as drawable XML and PNGs -- locks the current state of those
+elements as public API that cannot be changed without a major version bump. That
+means changing a publicly-visible icon would be considered a breaking change.
+
+#### Documentation
+
+All public resource definitions should be documented, including top-level
+definitions and re-uses inside `<styleable>` elements:
+
+`src/main/res/attrs.xml`
+
+```xml
+<resources>
+  <!-- String specifying the application package for a Font Provider. -->
+  <attr name="fontProviderPackage" format="string" />
+
+  <!-- Attributes that are read when parsing a <fontfamily> tag. -->
+  <declare-styleable name="FontFamily">
+      <!-- The package for the Font Provider to be used for the request. This is
+           used to verify the identity of the provider. -->
+      <attr name="fontProviderPackage" />
+  </declare-styleable>
+</resources>
+```
+
+`src/main/res/colors.xml`
+
+```xml
+<resources>
+  <!-- Color for Material Blue-Grey 900. -->
+  <color name="material_blue_grey_900">#ff263238</color>
+</resources>
+```
+
+#### Public declaration
+
+Resources are declared public by providing a separate `<public />` element with
+a matching type:
+
+`src/main/res/public.xml`
+
+```xml
+<resources>
+  <public name="fontProviderPackage" type="attr" />
+  <public name="material_blue_grey_900" type="color" />
+</resources>
+```
+
+#### More information
+
+See also the official Android Gradle Plugin documentation for
+[Private Resources](https://developer.android.com/studio/projects/android-library#PrivateResources).
+
+### Manifest entries (`AndroidManifest.xml`) {#resources-manifest}
+
+#### Metadata tags (`<meta-data>`) {#resources-manifest-metadata}
+
+Developers **must not** add `<application>`-level `<meta-data>` tags to library
+manifests or advise developers to add such tags to their application manifests.
+Doing so may *inadvertently cause denial-of-service attacks against other apps*.
+
+Assume a library adds a single item of meta-data at the application level. When
+an app uses the library, that meta-data will be merged into the resulting app's
+application entry via manifest merger.
+
+If another app attempts to obtain a list of all activities associated with the
+primary app, that list will contain multiple copies of the `ApplicationInfo`,
+each of which in turn contains a copy of the library's meta-data. As a result,
+one `<metadata>` tag may become hundreds of KB on the binder call to obtain the
+list -- resulting in apps hitting transaction too large exceptions and crashing.
+
+```xml {.bad}
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="androidx.librarypackage">
+  <application>
+    <meta-data
+        android:name="keyName"
+        android:value="@string/value" />
+  </application>
+</manifest>
+```
+
+Instead, developers may consider adding `<metadata>` nested inside of
+placeholder `<service>` tags.
+
+```xml {.good}
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="androidx.librarypackage">
+  <application>
+    <service
+        android:name="androidx.librarypackage.MetadataHolderService"
+        android:enabled="false"
+        android:exported="false">
+      <meta-data
+          android:name="androidx.librarypackage.MetadataHolderService.KEY_NAME"
+          android:resource="@string/value" />
+    </service>
+  </application>
+```
+
+```java {.good}
+package androidx.libraryname.featurename;
+
+/**
+ * A placeholder service to avoid adding application-level metadata. The service
+ * is only used to expose metadata defined in the library's manifest. It is
+ * never invoked.
+ */
+public final class MetadataHolderService {
+  private MetadataHolderService() {}
+
+  @Override
+  public IBinder onBind(Intent intent) {
+    throw new UnsupportedOperationException();
+  }
+}
+```
diff --git a/docs/api_guidelines/samples.md b/docs/api_guidelines/samples.md
new file mode 100644
index 0000000..bad40a9
--- /dev/null
+++ b/docs/api_guidelines/samples.md
@@ -0,0 +1,129 @@
+## Sample code in Kotlin modules
+
+### Background
+
+Public API can (and should!) have small corresponding code snippets that
+demonstrate functionality and usage of a particular API. These are often exposed
+inline in the documentation for the function / class - this causes consistency
+and correctness issues as this code is not compiled against, and the underlying
+implementation can easily change.
+
+KDoc (JavaDoc for Kotlin) supports a `@sample` tag, which allows referencing the
+body of a function from documentation. This means that code samples can be just
+written as a normal function, compiled and linted against, and reused from other
+modules such as tests! This allows for some guarantees on the correctness of a
+sample, and ensuring that it is always kept up to date.
+
+### Enforcement
+
+There are still some visibility issues here - it can be hard to tell if a
+function is a sample, and is used from public documentation - so as a result we
+have lint checks to ensure sample correctness.
+
+Primarily, there are three requirements when using sample links:
+
+1.  All functions linked to from a `@sample` KDoc tag must be annotated with
+    `@Sampled`
+2.  All sample functions annotated with `@Sampled` must be linked to from a
+    `@sample` KDoc tag
+3.  All sample functions must live inside a separate `samples` library
+    submodule - see the section on module configuration below for more
+    information.
+
+This enforces visibility guarantees, and make it easier to know that a sample is
+a sample. This also prevents orphaned samples that aren't used, and remain
+unmaintained and outdated.
+
+### Sample usage
+
+The follow demonstrates how to reference sample functions from public API. It is
+also recommended to reuse these samples in unit tests / integration tests / test
+apps / library demos where possible to help ensure that the samples work as
+intended.
+
+**Public API:**
+
+```
+/*
+ * Fancy prints the given [string]
+ *
+ * @sample androidx.printer.samples.fancySample
+ */
+fun fancyPrint(str: String) ...
+```
+
+**Sample function:**
+
+```
+package androidx.printer.samples
+
+import androidx.printer.fancyPrint
+
+@Sampled
+fun fancySample() {
+   fancyPrint("Fancy!")
+}
+```
+
+**Generated documentation visible on d.android.com / within Android Studio**
+
+```
+fun fancyPrint(str: String)
+
+Fancy prints the given [string]
+
+<code>
+ import androidx.printer.fancyPrint
+
+ fancyPrint("Fancy!")
+<code>
+```
+
+Warning: Only the body of the function is used in generated documentation, so
+any other references to elements defined outside the body of the function (such
+as variables defined within the sample file) will not be visible. To ensure that
+samples can be easily copy and pasted without errors, make sure that any
+references are defined within the body of the function.
+
+### Module configuration
+
+The following module setups should be used for sample functions:
+
+**Per-module samples**
+
+For library groups with relatively independent sub-libraries. This is the
+recommended project setup, and should be used in most cases.
+
+Gradle project name: `:foo-library:foo-module:foo-module-samples`
+
+```
+foo-library/
+  foo-module/
+    samples/
+```
+
+**Group-level samples**
+
+For library groups with strongly related samples that want to share code and be
+reused across a library group, a singular shared samples library can be created.
+In most cases this is discouraged - samples should be small and show the usage
+of a particular API / small set of APIs, instead of more complicated usage
+combining multiple APIs from across libraries. For these cases a sample
+application is more appropriate.
+
+Gradle project name: `:foo-library:foo-library-samples`
+
+```
+foo-library/
+  foo-module/
+  bar-module/
+  samples/
+```
+
+**Samples module configuration**
+
+Samples modules are published to GMaven so that they are available to Android
+Studio, which displays referenced samples as hover-over pop-ups.
+
+To achieve this, samples modules must declare the same MavenGroup and `publish`
+as the library(s) they are samples for.
diff --git a/docs/onboarding.md b/docs/onboarding.md
index 681b6c1..7fd3c15 100644
--- a/docs/onboarding.md
+++ b/docs/onboarding.md
@@ -389,10 +389,22 @@
 
 ### Attaching a debugger to the build
 
-Gradle tasks, including building a module, may be run or debugged from Android
-Studio's `Gradle` pane by finding the task to be debugged -- for example,
-`androidx > androidx > appcompat > appcompat > build > assemble` --
-right-clicking on it, and then selecting `Debug...`.
+Gradle tasks, including building a module, may be run or debugged from within
+Android Studio. To start, you need to add the task as a run configuration: you
+can do this manually by adding the corresponding task by clicking on the run
+configuration dropdown, pressing
+[`Edit Configurations`](https://www.jetbrains.com/help/idea/run-debug-gradle.html),
+and adding the corresponding task.
+
+You can also run the task through the IDE from the terminal, by using the
+[`Run highlighted command using IDE`](https://blog.jetbrains.com/idea/2020/07/run-ide-features-from-the-terminal/)
+feature - type in the task you want to run in the in-IDE terminal, and
+`ctrl+enter` / `cmd+enter` to launch this through the IDE. This will
+automatically add the configuration to the run configuration menu - you can then
+cancel the task.
+
+Once the task has been added to the run configuration menu, you can start
+debugging as with any other task by pressing the `debug` button.
 
 Note that debugging will not be available until Gradle sync has completed.
 
@@ -496,6 +508,24 @@
 *   docs-tip-of-tree:
     `{androidx-main}/out/androidx/docs-tip-of-tree/build/dackkaDocs`
 
+The generated docs are plain HTML pages with links that do not work locally.
+These issues are fixed when the docs are published to DAC, but to preview a
+local version of the docs with functioning links and CSS, run:
+
+```
+python3 development/offlinifyDocs/offlinify_dackka_docs.py
+```
+
+You will need to have the `bs4` Python package installed. The CSS used is not
+the same as what will be used when the docs are published.
+
+By default, this command converts the tip-of-tree docs for all libraries. To see
+more options, run:
+
+```
+python3 development/offlinifyDocs/offlinify_dackka_docs.py --help
+```
+
 #### Release docs
 
 To build API reference docs for published artifacts formatted for use on
diff --git a/docs/open_source.md b/docs/open_source.md
index 6e8a794..173d1e77 100644
--- a/docs/open_source.md
+++ b/docs/open_source.md
@@ -29,8 +29,8 @@
 #### Closed-source dependencies
 
 In specific cases, libraries *may* include closed-source dependencies. See the
-[Open-source compatibility](api_guidelines.md#dependencies-aosp) section of the
-API Guidelines for implementation details.
+[Open-source compatibility](api_guidelines/dependencies.md#dependencies-aosp)
+section of the API Guidelines for implementation details.
 
 ### Examples of products that are _not_ open-source
 
diff --git a/drawerlayout/drawerlayout/src/androidTest/java/androidx/drawerlayout/widget/DrawerBackHandlingTest.kt b/drawerlayout/drawerlayout/src/androidTest/java/androidx/drawerlayout/widget/DrawerBackHandlingTest.kt
index f9f638f..4a24651 100644
--- a/drawerlayout/drawerlayout/src/androidTest/java/androidx/drawerlayout/widget/DrawerBackHandlingTest.kt
+++ b/drawerlayout/drawerlayout/src/androidTest/java/androidx/drawerlayout/widget/DrawerBackHandlingTest.kt
@@ -57,6 +57,15 @@
         }
         listener.reset()
 
+        // Make sure we have focus, which in turn ensures we receive key events.
+        activityScenarioRule.withActivity {
+            drawerLayout.requestFocus()
+        }
+
+        PollingCheck.waitFor {
+            drawerLayout.hasFocus()
+        }
+
         // Ensure that back pressed dispatcher callback is registered on T+.
         if (Build.VERSION.SDK_INT >= 33) {
             Assert.assertTrue(drawerLayout.isBackInvokedCallbackRegistered)
diff --git a/emoji/emoji/src/androidTest/java/androidx/emoji/widget/EmojiEditTextTest.java b/emoji/emoji/src/androidTest/java/androidx/emoji/widget/EmojiEditTextTest.java
index fdcee13..0ef6166 100644
--- a/emoji/emoji/src/androidTest/java/androidx/emoji/widget/EmojiEditTextTest.java
+++ b/emoji/emoji/src/androidTest/java/androidx/emoji/widget/EmojiEditTextTest.java
@@ -44,6 +44,7 @@
 
 @MediumTest
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 22) // there's a memory leak in API 21 that this triggers
 public class EmojiEditTextTest {
 
     @SuppressWarnings("deprecation")
diff --git a/emoji2/emoji2-views/src/androidTest/java/androidx/emoji2/widget/EmojiEditTextTest.java b/emoji2/emoji2-views/src/androidTest/java/androidx/emoji2/widget/EmojiEditTextTest.java
index b1bb56e..9c5854a 100644
--- a/emoji2/emoji2-views/src/androidTest/java/androidx/emoji2/widget/EmojiEditTextTest.java
+++ b/emoji2/emoji2-views/src/androidTest/java/androidx/emoji2/widget/EmojiEditTextTest.java
@@ -28,6 +28,7 @@
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.platform.app.InstrumentationRegistry;
 
 import org.junit.BeforeClass;
@@ -36,6 +37,7 @@
 
 @MediumTest
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 22) // there's a memory leak in API 21 that this triggers
 public class EmojiEditTextTest {
 
     @BeforeClass
diff --git a/fragment/fragment/proguard-rules.pro b/fragment/fragment/proguard-rules.pro
index ee93125..02c0a31 100644
--- a/fragment/fragment/proguard-rules.pro
+++ b/fragment/fragment/proguard-rules.pro
@@ -17,3 +17,13 @@
 -keepclasseswithmembers,allowobfuscation public class <1> {
     public <init>();
 }
+
+# FragmentTransition will reflectively lookup:
+# androidx.transition.FragmentTransitionSupport
+# We should ensure that we keep the constructor if the code using this is alive
+-if class androidx.fragment.app.FragmentTransition {
+   private static androidx.fragment.app.FragmentTransitionImpl resolveSupportImpl();
+}
+-keep class androidx.transition.FragmentTransitionSupport {
+    public <init>();
+}
diff --git a/glance/glance-appwidget-preview/src/androidMain/AndroidManifest.xml b/glance/glance-appwidget-preview/src/androidMain/AndroidManifest.xml
deleted file mode 100644
index 9a2fb82..0000000
--- a/glance/glance-appwidget-preview/src/androidMain/AndroidManifest.xml
+++ /dev/null
@@ -1,17 +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.
-  -->
-<manifest />
\ No newline at end of file
diff --git a/glance/glance-appwidget/integration-tests/template-demos/src/main/AndroidManifest.xml b/glance/glance-appwidget/integration-tests/template-demos/src/main/AndroidManifest.xml
index 4f61b07..714f730 100644
--- a/glance/glance-appwidget/integration-tests/template-demos/src/main/AndroidManifest.xml
+++ b/glance/glance-appwidget/integration-tests/template-demos/src/main/AndroidManifest.xml
@@ -35,10 +35,38 @@
         </receiver>
 
         <receiver
-            android:name="androidx.glance.appwidget.template.demos.GalleryDemoWidgetReceiver"
+            android:name="androidx.glance.appwidget.template.demos.SmallImageGalleryReceiver"
             android:enabled="@bool/glance_appwidget_available"
             android:exported="false"
-            android:label="@string/gallery_template_name">
+            android:label="@string/small_image_gallery">
+            <intent-filter>
+                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
+                <action android:name="android.intent.action.LOCALE_CHANGED" />
+            </intent-filter>
+            <meta-data
+                android:name="android.appwidget.provider"
+                android:resource="@xml/default_app_widget_info" />
+        </receiver>
+
+        <receiver
+            android:name="androidx.glance.appwidget.template.demos.MediumImageGalleryReceiver"
+            android:enabled="@bool/glance_appwidget_available"
+            android:exported="false"
+            android:label="@string/medium_image_gallery">
+            <intent-filter>
+                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
+                <action android:name="android.intent.action.LOCALE_CHANGED" />
+            </intent-filter>
+            <meta-data
+                android:name="android.appwidget.provider"
+                android:resource="@xml/default_app_widget_info" />
+        </receiver>
+
+        <receiver
+            android:name="androidx.glance.appwidget.template.demos.LargeImageGalleryReceiver"
+            android:enabled="@bool/glance_appwidget_available"
+            android:exported="false"
+            android:label="@string/large_image_gallery">
             <intent-filter>
                 <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                 <action android:name="android.intent.action.LOCALE_CHANGED" />
diff --git a/glance/glance-appwidget/integration-tests/template-demos/src/main/java/androidx/glance/appwidget/template/demos/GalleryDemoWidget.kt b/glance/glance-appwidget/integration-tests/template-demos/src/main/java/androidx/glance/appwidget/template/demos/GalleryDemoWidget.kt
index 9c8b9f1..2c00db6 100644
--- a/glance/glance-appwidget/integration-tests/template-demos/src/main/java/androidx/glance/appwidget/template/demos/GalleryDemoWidget.kt
+++ b/glance/glance-appwidget/integration-tests/template-demos/src/main/java/androidx/glance/appwidget/template/demos/GalleryDemoWidget.kt
@@ -25,9 +25,11 @@
 import androidx.glance.appwidget.template.GalleryTemplate
 import androidx.glance.appwidget.template.GlanceTemplateAppWidget
 import androidx.glance.template.ActionBlock
+import androidx.glance.template.AspectRatio
 import androidx.glance.template.GalleryTemplateData
 import androidx.glance.template.HeaderBlock
 import androidx.glance.template.ImageBlock
+import androidx.glance.template.ImageSize
 import androidx.glance.template.TemplateImageWithDescription
 import androidx.glance.template.TemplateText
 import androidx.glance.template.TemplateTextButton
@@ -35,15 +37,60 @@
 import androidx.glance.template.TextType
 
 /**
- * A widget that uses [GalleryTemplate].
+ * Gallery demo for the default Small sized images with 1:1 aspect ratio and left-to-right main
+ * text/image block flow using data and gallery template from [BaseGalleryTemplateWidget].
  */
-class GalleryTemplateWidget : GlanceTemplateAppWidget() {
+class SmallGalleryTemplateDemoWidget : BaseGalleryTemplateWidget() {
+    @Composable
+    override fun TemplateContent() = GalleryTemplateContent()
+}
+
+/**
+ * Gallery demo for the Medium sized images with 16:9 aspect ratio and right-to-left main
+ * text/image block flow using data and gallery template from [BaseGalleryTemplateWidget].
+ */
+class MediumGalleryTemplateDemoWidget : BaseGalleryTemplateWidget() {
+    @Composable
+    override fun TemplateContent() =
+        GalleryTemplateContent(ImageSize.Medium, AspectRatio.Ratio16x9, false)
+}
+
+/**
+ * Gallery demo for the Large sized images with 2:3 aspect ratio and left-to-right main
+ * text/image block flow using data and gallery template from [BaseGalleryTemplateWidget].
+ */
+class LargeGalleryTemplateDemoWidget : BaseGalleryTemplateWidget() {
+    @Composable
+    override fun TemplateContent() = GalleryTemplateContent(ImageSize.Large, AspectRatio.Ratio2x3)
+}
+
+class SmallImageGalleryReceiver : GlanceAppWidgetReceiver() {
+    override val glanceAppWidget: GlanceAppWidget = SmallGalleryTemplateDemoWidget()
+}
+
+class MediumImageGalleryReceiver : GlanceAppWidgetReceiver() {
+    override val glanceAppWidget: GlanceAppWidget = MediumGalleryTemplateDemoWidget()
+}
+
+class LargeImageGalleryReceiver : GlanceAppWidgetReceiver() {
+    override val glanceAppWidget: GlanceAppWidget = LargeGalleryTemplateDemoWidget()
+}
+
+/**
+ * Base Gallery Demo widget binding [GalleryTemplateData] to [GalleryTemplate] layout.
+ * It is overridable by gallery image aspect ratio, image size, and main blocks ordering.
+ */
+abstract class BaseGalleryTemplateWidget : GlanceTemplateAppWidget() {
     override val sizeMode = SizeMode.Exact
 
     @Composable
-    override fun TemplateContent() {
+    internal fun GalleryTemplateContent(
+        imageSize: ImageSize = ImageSize.Small,
+        aspectRatio: AspectRatio = AspectRatio.Ratio1x1,
+        isMainTextBlockFirst: Boolean = true,
+    ) {
         val galleryContent = mutableListOf<TemplateImageWithDescription>()
-        for (i in 1..8) {
+        for (i in 1..30) {
             galleryContent.add(
                 TemplateImageWithDescription(
                     ImageProvider(R.drawable.compose),
@@ -64,7 +111,7 @@
                     text1 = TemplateText("Title1", TextType.Title),
                     text2 = TemplateText("Headline1", TextType.Headline),
                     text3 = TemplateText("Label1", TextType.Label),
-                    priority = 0,
+                    priority = if (isMainTextBlockFirst) 0 else 1,
                 ),
                 mainImageBlock = ImageBlock(
                     images = listOf(
@@ -73,7 +120,7 @@
                             "test image"
                         )
                     ),
-                    priority = 1,
+                    priority = if (isMainTextBlockFirst) 1 else 0,
                 ),
                 mainActionBlock = ActionBlock(
                     actionButtons = listOf(
@@ -89,13 +136,10 @@
                 ),
                 galleryImageBlock = ImageBlock(
                     images = galleryContent,
-                    priority = 2,
+                    aspectRatio = aspectRatio,
+                    size = imageSize,
                 ),
             )
         )
     }
 }
-
-class GalleryDemoWidgetReceiver : GlanceAppWidgetReceiver() {
-    override val glanceAppWidget: GlanceAppWidget = GalleryTemplateWidget()
-}
diff --git a/glance/glance-appwidget/integration-tests/template-demos/src/main/res/values/strings.xml b/glance/glance-appwidget/integration-tests/template-demos/src/main/res/values/strings.xml
index 8277be9..4ee5288 100644
--- a/glance/glance-appwidget/integration-tests/template-demos/src/main/res/values/strings.xml
+++ b/glance/glance-appwidget/integration-tests/template-demos/src/main/res/values/strings.xml
@@ -19,8 +19,6 @@
 
     <!-- Name of the app widgets -->
     <string name="single_entity_template_widget_name"><u>Single Entity Template demo</u></string>
-    <string name="gallery_template_name"><u>Gallery demo</u></string>
-    <string name="list_template_widget_name"><u>List Template demo</u></string>
     <string name="override_widget_name"><u>Template layout override demo</u></string>
 
     <string name="template_data_saved_message">Saved</string>
@@ -32,4 +30,9 @@
     <string name="list_style_with_header">List Template with header demo</string>
     <string name="list_style_no_header">List Template with no header demo</string>
     <string name="list_style_brief">List Template with no header demo in brief info</string>
+
+    <!-- Sample of the Gallery Template widgets -->
+    <string name="small_image_gallery">Gallery Template with small 1:1 images, text first</string>
+    <string name="medium_image_gallery">Gallery Template with medium 16:9 images, text last</string>
+    <string name="large_image_gallery">Gallery Template with large 2:3 images, text first</string>
 </resources>
diff --git a/glance/glance-appwidget/proguard-rules.pro b/glance/glance-appwidget/proguard-rules.pro
index edbc7a8..0b596fd 100644
--- a/glance/glance-appwidget/proguard-rules.pro
+++ b/glance/glance-appwidget/proguard-rules.pro
@@ -18,5 +18,3 @@
 -keepclassmembers class * extends androidx.glance.appwidget.protobuf.GeneratedMessageLite {
   <fields>;
 }
-
--keep androidx.glance.appwidget.proto.** { *; }
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/action/StartActivityIntentAction.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/action/StartActivityIntentAction.kt
index 9e01c9d..304c2bb 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/action/StartActivityIntentAction.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/action/StartActivityIntentAction.kt
@@ -34,6 +34,17 @@
  *
  * This action is supported by app widgets only.
  *
+ * The given intent will be wrapped in a [PendingIntent]. This means that if you create multiple
+ * actions with this function, they will be conflated unless the underlying intents are
+ * distinct from one another, as defined by [Intent.filterEquals]. For example, if you create two
+ * [Intent]s that target the same Activity but only differ by parameters, they will get conflated
+ * (the PendingIntent created by the first call to actionStartActivity will be overwritten by the
+ * second). A simple way to avoid this is to set a unique data URI on these intents, so that they
+ * are distinct as defined by [Intent.filterEquals]. There is more information in the class
+ * documentation for [PendingIntent]. This is taken care of by the library for the
+ * [androidx.glance.action.actionStartActivity] overloads defined in the androidx.glance.action
+ * package.
+ *
  * @param intent the intent used to launch the activity
  * @param parameters the parameters associated with the action. Parameter values will be added to
  * the activity intent, keyed by the parameter key name string.
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/template/GalleryTemplateLayouts.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/template/GalleryTemplateLayouts.kt
index 9cf2f5b..d59b2d4 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/template/GalleryTemplateLayouts.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/template/GalleryTemplateLayouts.kt
@@ -16,10 +16,18 @@
 
 package androidx.glance.appwidget.template
 
+import android.os.Build
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.unit.dp
 import androidx.glance.GlanceModifier
+import androidx.glance.Image
+import androidx.glance.LocalSize
+import androidx.glance.appwidget.cornerRadius
+import androidx.glance.appwidget.lazy.GridCells
+import androidx.glance.appwidget.lazy.LazyVerticalGrid
+import androidx.glance.appwidget.lazy.itemsIndexed
 import androidx.glance.background
+import androidx.glance.layout.Alignment
 import androidx.glance.layout.Column
 import androidx.glance.layout.ContentScale
 import androidx.glance.layout.Row
@@ -29,10 +37,17 @@
 import androidx.glance.layout.fillMaxWidth
 import androidx.glance.layout.height
 import androidx.glance.layout.padding
+import androidx.glance.layout.width
+import androidx.glance.template.AspectRatio
 import androidx.glance.template.GalleryTemplateData
+import androidx.glance.template.ImageSize
 import androidx.glance.template.LocalTemplateColors
 import androidx.glance.template.LocalTemplateMode
 import androidx.glance.template.TemplateMode
+import kotlin.math.ceil
+import kotlin.math.pow
+import kotlin.math.roundToInt
+import kotlin.math.sqrt
 
 /**
  * Composable layout for a gallery template app widget. The template is optimized to show images.
@@ -59,32 +74,64 @@
 
 @Composable
 private fun WidgetLayoutHorizontal(data: GalleryTemplateData) {
-    Row(modifier = createTopLevelModifier(data)) {
-        Column(
-            modifier = GlanceModifier.defaultWeight().fillMaxHeight()
-        ) {
-            HeaderBlockTemplate(data.header)
-            Spacer(modifier = GlanceModifier.height(16.dp).defaultWeight())
-            TextBlockTemplate(data.mainTextBlock)
-            ActionBlockTemplate(data.mainActionBlock)
-        }
-        SingleImageBlockTemplate(
-            data.mainImageBlock,
-            GlanceModifier.fillMaxHeight().defaultWeight()
-        )
+    Row(
+        modifier = createTopLevelModifier(data),
+        verticalAlignment = Alignment.CenterVertically
+    ) {
+        MainEntity(data, GlanceModifier.defaultWeight().fillMaxHeight())
     }
 }
 
 @Composable
 private fun WidgetLayoutVertical(data: GalleryTemplateData) {
-    Column(modifier = createTopLevelModifier(data)) {
-        HeaderBlockTemplate(data.header)
-        Spacer(modifier = GlanceModifier.height(16.dp))
-        SingleImageBlockTemplate(data.mainImageBlock, GlanceModifier.fillMaxWidth().defaultWeight())
-        Row(modifier = GlanceModifier.fillMaxWidth()) {
-            TextBlockTemplate(data.mainTextBlock)
-            Spacer(modifier = GlanceModifier.defaultWeight())
-            ActionBlockTemplate(data.mainActionBlock)
+    val aspectRatio: Double = when (data.galleryImageBlock.aspectRatio) {
+        AspectRatio.Ratio1x1 -> 1.0
+        AspectRatio.Ratio2x3 -> 2.0 / 3
+        AspectRatio.Ratio16x9 -> 16.0 / 9
+        else -> 1.0
+    }
+    val imageSize: Double = when (data.galleryImageBlock.size) {
+        ImageSize.Small -> 64.0.pow(2.0)
+        ImageSize.Medium -> 96.0.pow(2.0)
+        ImageSize.Large -> 128.0.pow(2.0)
+        else -> 64.0.pow(2.0)
+    }
+    val margin = 16
+    val imageHeight = sqrt(imageSize / aspectRatio)
+    val imageWidth = imageHeight * aspectRatio
+    val galleryWidth = LocalSize.current.width.value
+    val nCols =
+        1.coerceAtLeast(ceil(((galleryWidth - margin) / (imageWidth + margin))).roundToInt())
+    val gridCells = if (Build.VERSION.SDK_INT >= 31) {
+        GridCells.Adaptive((imageWidth + margin).dp)
+    } else {
+        GridCells.Fixed(nCols)
+    }
+    Column {
+        Row(
+            modifier = createCardModifier(),
+            verticalAlignment = Alignment.CenterVertically
+        ) {
+            MainEntity(data, GlanceModifier.defaultWeight())
+        }
+        Row(
+            modifier = createCardModifier(),
+            verticalAlignment = Alignment.CenterVertically
+        ) {
+            LazyVerticalGrid(
+                modifier = GlanceModifier.defaultWeight().fillMaxHeight(),
+                gridCells = gridCells
+            ) {
+                itemsIndexed(data.galleryImageBlock.images) { _, image ->
+                    Image(
+                        provider = image.image,
+                        contentDescription = image.description,
+                        modifier = GlanceModifier.padding((margin / 2).dp)
+                            .height(imageHeight.dp).width(imageWidth.dp),
+                        contentScale = ContentScale.Crop
+                    )
+                }
+            }
         }
     }
 }
@@ -95,7 +142,8 @@
     isImmersive: Boolean = false
 ): GlanceModifier {
     var modifier = GlanceModifier
-        .fillMaxSize().padding(16.dp).background(LocalTemplateColors.current.surface)
+        .fillMaxSize().padding(16.dp).cornerRadius(16.dp)
+        .background(LocalTemplateColors.current.primaryContainer)
     if (isImmersive && data.mainImageBlock.images.isNotEmpty()) {
         val mainImage = data.mainImageBlock.images[0]
         modifier = modifier.background(mainImage.image, ContentScale.Crop)
@@ -103,3 +151,31 @@
 
     return modifier
 }
+
+@Composable
+private fun createCardModifier() = GlanceModifier.fillMaxWidth().padding(16.dp).cornerRadius(16.dp)
+    .background(LocalTemplateColors.current.primaryContainer)
+
+@Composable
+private fun HeaderAndTextBlocks(data: GalleryTemplateData, modifier: GlanceModifier) {
+    Column(modifier = modifier) {
+        HeaderBlockTemplate(data.header)
+        Spacer(modifier = GlanceModifier.height(16.dp).defaultWeight())
+        TextBlockTemplate(data.mainTextBlock)
+        ActionBlockTemplate(data.mainActionBlock)
+    }
+}
+
+@Composable
+private fun MainEntity(data: GalleryTemplateData, modifier: GlanceModifier) {
+    // Show first block by lower numbered priority
+    if (data.mainTextBlock.priority <= data.mainImageBlock.priority) {
+        HeaderAndTextBlocks(data, modifier)
+        Spacer(modifier = GlanceModifier.width(16.dp))
+        SingleImageBlockTemplate(data.mainImageBlock)
+    } else {
+        SingleImageBlockTemplate(data.mainImageBlock)
+        Spacer(modifier = GlanceModifier.width(16.dp))
+        HeaderAndTextBlocks(data, modifier)
+    }
+}
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/template/GlanceAppWidgetTemplates.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/template/GlanceAppWidgetTemplates.kt
index 2fed787..4a3c354 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/template/GlanceAppWidgetTemplates.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/template/GlanceAppWidgetTemplates.kt
@@ -185,7 +185,6 @@
     modifier: GlanceModifier = GlanceModifier
 ) {
     if (imageBlock.images.isNotEmpty()) {
-        Spacer(modifier = GlanceModifier.width(16.dp))
         val mainImage = imageBlock.images[0]
         Image(
             provider = mainImage.image,
diff --git a/glance/glance-wear-tiles-preview/api/current.txt b/glance/glance-wear-tiles-preview/api/current.txt
new file mode 100644
index 0000000..5bfa654
--- /dev/null
+++ b/glance/glance-wear-tiles-preview/api/current.txt
@@ -0,0 +1,8 @@
+// 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
new file mode 100644
index 0000000..5bfa654
--- /dev/null
+++ b/glance/glance-wear-tiles-preview/api/public_plus_experimental_current.txt
@@ -0,0 +1,8 @@
+// Signature format: 4.0
+package androidx.glance.wear.tiles.preview {
+
+  public final class GlanceTileServiceViewAdapterKt {
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/glance/glance-wear-tiles-preview/api/res-current.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to glance/glance-wear-tiles-preview/api/res-current.txt
diff --git a/glance/glance-wear-tiles-preview/api/restricted_current.txt b/glance/glance-wear-tiles-preview/api/restricted_current.txt
new file mode 100644
index 0000000..5bfa654
--- /dev/null
+++ b/glance/glance-wear-tiles-preview/api/restricted_current.txt
@@ -0,0 +1,8 @@
+// Signature format: 4.0
+package androidx.glance.wear.tiles.preview {
+
+  public final class GlanceTileServiceViewAdapterKt {
+  }
+
+}
+
diff --git a/glance/glance-wear-tiles-preview/build.gradle b/glance/glance-wear-tiles-preview/build.gradle
new file mode 100644
index 0000000..d1a59d07
--- /dev/null
+++ b/glance/glance-wear-tiles-preview/build.gradle
@@ -0,0 +1,60 @@
+/*
+ * 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.AndroidXComposePlugin
+import androidx.build.LibraryType
+
+plugins {
+    id("AndroidXComposePlugin")
+    id("AndroidXPlugin")
+    id("com.android.library")
+}
+
+// Disable multi-platform; this will only be used on Android.
+AndroidXComposePlugin.applyAndConfigureKotlinPlugin(project, /* isMultiplatformEnabled= */false)
+
+dependencies {
+    api("androidx.wear.tiles:tiles-renderer:1.0.0")
+
+    api(libs.kotlinStdlib)
+    api(libs.kotlinReflect)
+    api(libs.kotlinCoroutinesAndroid)
+
+    implementation("androidx.core:core:1.1.0")
+
+    api(project(":compose:runtime:runtime"))
+    api(project(":glance:glance-wear-tiles"))
+
+    androidTestImplementation(libs.junit)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+}
+
+android {
+    defaultConfig {
+        minSdkVersion 26
+    }
+    namespace "androidx.glance.wear.tiles.preview"
+}
+
+androidx {
+    name = "Android Glance Wear Tiles Preview"
+    type = LibraryType.PUBLISHED_LIBRARY
+    mavenGroup = LibraryGroups.GLANCE
+    inceptionYear = "2022"
+    description = "Glance tooling library. This library provides the API required for the " +
+            "GlanceTileService components and its Glance @Composable to be previewable in the IDE."
+}
diff --git a/glance/glance-wear-tiles-preview/src/androidAndroidTest/AndroidManifest.xml b/glance/glance-wear-tiles-preview/src/androidAndroidTest/AndroidManifest.xml
new file mode 100644
index 0000000..a1660e9
--- /dev/null
+++ b/glance/glance-wear-tiles-preview/src/androidAndroidTest/AndroidManifest.xml
@@ -0,0 +1,25 @@
+<!--
+  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"
+    xmlns:tools="http://schemas.android.com/tools">
+    <application
+        android:debuggable="true"
+        tools:ignore="HardcodedDebugMode">
+        <activity
+            android:name="androidx.glance.wear.tiles.preview.GlanceTileServiceViewAdapterTest$Companion$TestActivity"
+            android:theme="@style/TestTheme" />
+    </application>
+</manifest>
\ No newline at end of file
diff --git a/glance/glance-wear-tiles-preview/src/androidAndroidTest/kotlin/androidx/glance/wear/tiles/preview/FirstGlancePreview.kt b/glance/glance-wear-tiles-preview/src/androidAndroidTest/kotlin/androidx/glance/wear/tiles/preview/FirstGlancePreview.kt
new file mode 100644
index 0000000..94ad581
--- /dev/null
+++ b/glance/glance-wear-tiles-preview/src/androidAndroidTest/kotlin/androidx/glance/wear/tiles/preview/FirstGlancePreview.kt
@@ -0,0 +1,65 @@
+/*
+ * 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.wear.tiles.preview
+
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.unit.dp
+import androidx.glance.action.Action
+import androidx.glance.Button
+import androidx.glance.GlanceModifier
+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.height
+import androidx.glance.layout.padding
+import androidx.glance.text.FontWeight
+import androidx.glance.text.Text
+import androidx.glance.text.TextStyle
+
+@Composable
+fun FirstGlancePreview() {
+    Column(
+        modifier = GlanceModifier
+            .fillMaxSize()
+            .padding(16.dp)
+    ) {
+        Text(
+            text = "First Glance widget",
+            modifier = GlanceModifier
+                .fillMaxWidth()
+                .padding(bottom = 8.dp),
+            style = TextStyle(fontWeight = FontWeight.Bold),
+        )
+        Row(
+            modifier = GlanceModifier.fillMaxSize(),
+            verticalAlignment = Alignment.CenterVertically
+        ) {
+            Button(
+                text = "Button 1",
+                modifier = GlanceModifier.height(48.dp),
+                onClick = object : Action { }
+            )
+            Button(
+                text = "Button 2",
+                modifier = GlanceModifier.height(48.dp),
+                onClick = object : Action { }
+            )
+        }
+    }
+}
\ No newline at end of file
diff --git a/glance/glance-wear-tiles-preview/src/androidAndroidTest/kotlin/androidx/glance/wear/tiles/preview/GlanceTileServiceViewAdapterTest.kt b/glance/glance-wear-tiles-preview/src/androidAndroidTest/kotlin/androidx/glance/wear/tiles/preview/GlanceTileServiceViewAdapterTest.kt
new file mode 100644
index 0000000..3f4b8fd
--- /dev/null
+++ b/glance/glance-wear-tiles-preview/src/androidAndroidTest/kotlin/androidx/glance/wear/tiles/preview/GlanceTileServiceViewAdapterTest.kt
@@ -0,0 +1,110 @@
+/*
+ * 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.wear.tiles.preview
+
+import androidx.glance.wear.tiles.preview.test.R
+import android.app.Activity
+import android.os.Bundle
+import android.view.ViewGroup
+import android.widget.FrameLayout
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.test.filters.MediumTest
+import org.junit.Assert
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+
+@MediumTest
+class GlanceTileServiceViewAdapterTest {
+    @Suppress("DEPRECATION")
+    @get:Rule
+    val activityTestRule = androidx.test.rule.ActivityTestRule(TestActivity::class.java)
+
+    private lateinit var glanceTileServiceViewAdapter: GlanceTileServiceViewAdapter
+
+    @Before
+    fun setup() {
+        glanceTileServiceViewAdapter =
+            activityTestRule.activity.findViewById(R.id.glance_tile_service_view_adapter)
+    }
+
+    private fun initAndInflate(
+        className: String,
+        methodName: String,
+    ) {
+        activityTestRule.runOnUiThread {
+            glanceTileServiceViewAdapter.init(className, methodName)
+            glanceTileServiceViewAdapter.requestLayout()
+        }
+    }
+
+    private inline fun <reified T> ViewGroup.getChildOfType(count: Int = 0): T? {
+        var i = 0
+        (0 until childCount).forEach {
+            val child = getChildAt(it)
+            if (child is T) {
+                if (i == count) {
+                    return child
+                }
+                i += 1
+            }
+        }
+        return null
+    }
+
+    private fun viewNotFoundMsg(viewTypeName: String, composableName: String) =
+        "Could not find the $viewTypeName View matching $composableName"
+
+    @Test
+    fun testFirstGlancePreview() {
+        initAndInflate(
+            "androidx.glance.wear.tiles.preview.FirstGlancePreviewKt",
+            "FirstGlancePreview")
+
+        activityTestRule.runOnUiThread {
+            val rootComposable = glanceTileServiceViewAdapter.getChildAt(0) as ViewGroup
+            val linearLayoutColumn = rootComposable.getChildOfType<LinearLayout>()
+            Assert.assertNotNull(viewNotFoundMsg("LinearLayout", "Column"), linearLayoutColumn)
+
+            val frameLayout = linearLayoutColumn!!.getChildOfType<FrameLayout>()
+            val textView = frameLayout!!.getChildOfType<TextView>()
+            Assert.assertNotNull(viewNotFoundMsg("TextView", "Text"), textView)
+
+            val linearLayoutRow = linearLayoutColumn.getChildOfType<LinearLayout>()
+            Assert.assertNotNull(viewNotFoundMsg("LinearLayout", "Row"), linearLayoutRow)
+
+            val button1 =
+                linearLayoutRow!!.getChildOfType<FrameLayout>()!!.getChildOfType<TextView>()
+            val button2 =
+                linearLayoutRow.getChildOfType<FrameLayout>(1)!!.getChildOfType<TextView>()
+            Assert.assertNotNull(viewNotFoundMsg("TextView", "Button"), button1)
+            Assert.assertEquals("Button 1", button1!!.text.toString())
+            Assert.assertNotNull(viewNotFoundMsg("TextView", "Button"), button2)
+            Assert.assertEquals("Button 2", button2!!.text.toString())
+        }
+    }
+
+    companion object {
+        class TestActivity : Activity() {
+            override fun onCreate(savedInstanceState: Bundle?) {
+                super.onCreate(savedInstanceState)
+                setContentView(R.layout.glance_tile_service_adapter_test)
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/glance/glance-wear-tiles-preview/src/androidAndroidTest/res/layout/glance_tile_service_adapter_test.xml b/glance/glance-wear-tiles-preview/src/androidAndroidTest/res/layout/glance_tile_service_adapter_test.xml
new file mode 100644
index 0000000..9a093d8
--- /dev/null
+++ b/glance/glance-wear-tiles-preview/src/androidAndroidTest/res/layout/glance_tile_service_adapter_test.xml
@@ -0,0 +1,22 @@
+<!--
+  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.glance.wear.tiles.preview.GlanceTileServiceViewAdapter
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/glance_tile_service_view_adapter"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent" />
\ No newline at end of file
diff --git a/glance/glance-wear-tiles-preview/src/androidAndroidTest/res/values/styles.xml b/glance/glance-wear-tiles-preview/src/androidAndroidTest/res/values/styles.xml
new file mode 100644
index 0000000..c2f0b86
--- /dev/null
+++ b/glance/glance-wear-tiles-preview/src/androidAndroidTest/res/values/styles.xml
@@ -0,0 +1,25 @@
+<!--
+  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>
+    <style name="TestTheme" parent="@android:style/Theme.Material.Light.NoActionBar">
+        <item name="android:windowActionBar">false</item>
+        <item name="android:windowAnimationStyle">@null</item>
+        <item name="android:windowContentOverlay">@null</item>
+        <item name="android:windowFullscreen">true</item>
+        <item name="android:windowNoTitle">true</item>
+    </style>
+</resources>
\ No newline at end of file
diff --git a/glance/glance-wear-tiles-preview/src/androidMain/kotlin/androidx/glance/wear/tiles/preview/ComposableInvoker.kt b/glance/glance-wear-tiles-preview/src/androidMain/kotlin/androidx/glance/wear/tiles/preview/ComposableInvoker.kt
new file mode 100644
index 0000000..6f9269c
--- /dev/null
+++ b/glance/glance-wear-tiles-preview/src/androidMain/kotlin/androidx/glance/wear/tiles/preview/ComposableInvoker.kt
@@ -0,0 +1,205 @@
+/*
+ * 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.wear.tiles.preview
+
+import androidx.compose.runtime.Composer
+import java.lang.reflect.Method
+import java.lang.reflect.Modifier
+import kotlin.math.ceil
+
+/**
+ * TODO(b/228423246): REMOVE THIS FILE
+ * TEMPORARILY COPIED FROM UI-TOOLING UNTIL IT IS NOT AVAILABLE FROM COMPOSE RUNTIME
+ *
+ * A utility object to invoke composable function by its name and containing class.
+ */
+internal object ComposableInvoker {
+
+    /**
+     * Returns true if the [methodTypes] and [actualTypes] are compatible. This means that every
+     * `actualTypes[n]` are assignable to `methodTypes[n]`.
+     */
+    private fun compatibleTypes(
+        methodTypes: Array<Class<*>>,
+        actualTypes: Array<Class<*>>
+    ): Boolean =
+        methodTypes.size == actualTypes.size &&
+            methodTypes.mapIndexed { index, clazz -> clazz.isAssignableFrom(actualTypes[index]) }
+                .all { it }
+
+    /**
+     * Same as [Class#getDeclaredMethod] but it accounts for compatible types so the signature does
+     * not need to exactly match. This allows finding method calls that use subclasses as parameters
+     * instead of the exact types.
+     */
+    private fun Class<*>.getDeclaredCompatibleMethod(
+        methodName: String,
+        vararg args: Class<*>
+    ): Method {
+        val actualTypes: Array<Class<*>> = arrayOf(*args)
+        return declaredMethods.firstOrNull {
+            methodName == it.name && compatibleTypes(it.parameterTypes, actualTypes)
+        } ?: throw NoSuchMethodException("$methodName not found")
+    }
+
+    private inline fun <reified T> T.dup(count: Int): Array<T> {
+        return (0 until count).map { this }.toTypedArray()
+    }
+
+    /**
+     * Find the given method by name. If the method has parameters, this function will try to find
+     * the version that accepts default parameters.
+     */
+    private fun Class<*>.findComposableMethod(methodName: String, vararg args: Any?): Method {
+        val method = try {
+            // without defaults
+            val changedParams = changedParamCount(args.size, 0)
+            getDeclaredCompatibleMethod(
+                methodName,
+                *args.mapNotNull { it?.javaClass }.toTypedArray(),
+                Composer::class.java, // composer param
+                *kotlin.Int::class.java.dup(changedParams) // changed params
+            )
+        } catch (e: ReflectiveOperationException) {
+            try {
+                declaredMethods.find { it.name == methodName }
+            } catch (e: ReflectiveOperationException) {
+                null
+            }
+        } ?: throw NoSuchMethodException("$name.$methodName")
+
+        return method
+    }
+
+    /**
+     * Returns the default value for the [Class] type. This will be 0 for numeric types, false for
+     * boolean, '0' for char and null for object references.
+     */
+    private fun Class<*>.getDefaultValue(): Any? = when (name) {
+        "int" -> 0.toInt()
+        "short" -> 0.toShort()
+        "byte" -> 0.toByte()
+        "long" -> 0.toLong()
+        "double" -> 0.toDouble()
+        "float" -> 0.toFloat()
+        "boolean" -> false
+        "char" -> 0.toChar()
+        else -> null
+    }
+
+    /**
+     * Calls the method on the given [instance]. If the method accepts default values, this function
+     * will call it with the correct options set.
+     */
+    @Suppress("BanUncheckedReflection")
+    private fun Method.invokeComposableMethod(
+        instance: Any?,
+        composer: Composer,
+        vararg args: Any?
+    ): Any? {
+        val composerIndex = parameterTypes.indexOfLast { it == Composer::class.java }
+        val realParams = composerIndex
+        val thisParams = if (instance != null) 1 else 0
+        val changedParams = changedParamCount(realParams, thisParams)
+        val totalParamsWithoutDefaults = realParams +
+            1 + // composer
+            changedParams
+        val totalParams = parameterTypes.size
+        val isDefault = totalParams != totalParamsWithoutDefaults
+        val defaultParams = if (isDefault)
+            defaultParamCount(realParams)
+        else
+            0
+
+        check(
+            realParams +
+                1 + // composer
+                changedParams +
+                defaultParams ==
+                totalParams
+        )
+
+        val changedStartIndex = composerIndex + 1
+        val defaultStartIndex = changedStartIndex + changedParams
+
+        val arguments = Array(totalParams) { idx ->
+            when (idx) {
+                // pass in "empty" value for all real parameters since we will be using defaults.
+                in 0 until realParams -> args.getOrElse(idx) {
+                    parameterTypes[idx].getDefaultValue()
+                }
+                // the composer is the first synthetic parameter
+                composerIndex -> composer
+                // since this is the root we don't need to be anything unique. 0 should suffice.
+                // changed parameters should be 0 to indicate "uncertain"
+                in changedStartIndex until defaultStartIndex -> 0
+                // Default values mask, all parameters set to use defaults
+                in defaultStartIndex until totalParams -> 0b111111111111111111111.toInt()
+                else -> error("Unexpected index")
+            }
+        }
+        return invoke(instance, *arguments)
+    }
+
+    private const val SLOTS_PER_INT = 10
+    private const val BITS_PER_INT = 31
+
+    private fun changedParamCount(realValueParams: Int, thisParams: Int): Int {
+        if (realValueParams == 0) return 1
+        val totalParams = realValueParams + thisParams
+        return ceil(
+            totalParams.toDouble() / SLOTS_PER_INT.toDouble()
+        ).toInt()
+    }
+
+    private fun defaultParamCount(realValueParams: Int): Int {
+        return ceil(
+            realValueParams.toDouble() / BITS_PER_INT.toDouble()
+        ).toInt()
+    }
+
+    /**
+     * Invokes the given [methodName] belonging to the given [className]. The [methodName] is
+     * expected to be a Composable function.
+     * This method [args] will be forwarded to the Composable function.
+     */
+    fun invokeComposable(
+        className: String,
+        methodName: String,
+        composer: Composer,
+        vararg args: Any?
+    ) {
+        try {
+            val composableClass = Class.forName(className)
+
+            val method = composableClass.findComposableMethod(methodName, *args)
+            method.isAccessible = true
+
+            if (Modifier.isStatic(method.modifiers)) {
+                // This is a top level or static method
+                method.invokeComposableMethod(null, composer, *args)
+            } else {
+                // The method is part of a class. We try to instantiate the class with an empty
+                // constructor.
+                val instance = composableClass.getConstructor().newInstance()
+                method.invokeComposableMethod(instance, composer, *args)
+            }
+        } catch (e: ReflectiveOperationException) {
+            throw ClassNotFoundException("Composable Method '$className.$methodName' not found", e)
+        }
+    }
+}
\ No newline at end of file
diff --git a/glance/glance-wear-tiles-preview/src/androidMain/kotlin/androidx/glance/wear/tiles/preview/GlanceTileServiceViewAdapter.kt b/glance/glance-wear-tiles-preview/src/androidMain/kotlin/androidx/glance/wear/tiles/preview/GlanceTileServiceViewAdapter.kt
new file mode 100644
index 0000000..6ed80ec
--- /dev/null
+++ b/glance/glance-wear-tiles-preview/src/androidMain/kotlin/androidx/glance/wear/tiles/preview/GlanceTileServiceViewAdapter.kt
@@ -0,0 +1,110 @@
+/*
+ * 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.wear.tiles.preview
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.Gravity
+import android.widget.FrameLayout
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.currentComposer
+import androidx.compose.ui.unit.DpSize
+import androidx.core.content.ContextCompat
+import androidx.glance.wear.tiles.ExperimentalGlanceWearTilesApi
+import androidx.glance.wear.tiles.compose
+import androidx.glance.wear.tiles.preview.ComposableInvoker.invokeComposable
+import androidx.wear.tiles.LayoutElementBuilders
+import androidx.wear.tiles.TileBuilders
+import androidx.wear.tiles.TimelineBuilders
+import kotlinx.coroutines.runBlocking
+import androidx.wear.tiles.renderer.TileRenderer
+
+private const val TOOLS_NS_URI = "http://schemas.android.com/tools"
+
+/**
+ * View adapter that renders a glance `@Composable`. The `@Composable` is found by reading the
+ * `tools:composableName` attribute that contains the FQN of the function.
+ */
+internal class GlanceTileServiceViewAdapter : FrameLayout {
+
+    constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
+        init(attrs)
+    }
+
+    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(
+        context,
+        attrs,
+        defStyleAttr
+    ) {
+        init(attrs)
+    }
+
+    @OptIn(ExperimentalGlanceWearTilesApi::class)
+    internal fun init(
+        className: String,
+        methodName: String,
+    ) {
+        val content = @Composable {
+            val composer = currentComposer
+            invokeComposable(
+                className,
+                methodName,
+                composer)
+        }
+
+        val wearTilesComposition = runBlocking {
+            compose(
+                context = context,
+                size = DpSize.Unspecified,
+                content = content)
+        }
+        // As far as GlanceWearTiles.compose accepts no timeleine argument, assume we only support
+        // [TimelineMode.SingleEntry]
+        val timelineBuilders = TimelineBuilders.Timeline.Builder()
+        timelineBuilders.addTimelineEntry(
+            TimelineBuilders.TimelineEntry.Builder()
+                .setLayout(
+                    LayoutElementBuilders.Layout.Builder()
+                        .setRoot(wearTilesComposition.layout)
+                        .build()
+                ).build()
+        )
+        val tile = TileBuilders.Tile.Builder()
+            .setTimeline(timelineBuilders.build())
+            .build()
+        val layout = tile.timeline?.timelineEntries?.get(0)?.layout
+
+        if (layout != null) {
+            val renderer = TileRenderer(
+                context,
+                layout,
+                wearTilesComposition.resources,
+                ContextCompat.getMainExecutor(context)
+            ) { }
+            renderer.inflate(this)?.apply {
+                (layoutParams as LayoutParams).gravity = Gravity.CENTER
+            }
+        }
+    }
+
+    private fun init(attrs: AttributeSet) {
+        val composableName = attrs.getAttributeValue(TOOLS_NS_URI, "composableName") ?: return
+        val className = composableName.substringBeforeLast('.')
+        val methodName = composableName.substringAfterLast('.')
+
+        init(className, methodName)
+    }
+}
\ No newline at end of file
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 9dec36d..7d66694 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -33,8 +33,8 @@
 kotlin = "1.7.10"
 kotlinBenchmark = "0.4.4"
 kotlinNative = "1.7.10"
-kotlinCompileTesting = "1.4.1"
-kotlinCoroutines = "1.6.1"
+kotlinCompileTesting = "1.4.9"
+kotlinCoroutines = "1.6.4"
 kotlinSerialization = "1.3.3"
 ksp = "1.7.10-1.0.6"
 ktlint = "0.46.0-20220520.192227-74"
@@ -42,6 +42,8 @@
 metalava = "1.0.0-alpha06"
 mockito = "2.25.0"
 protobuf = "3.19.4"
+paparazzi = "1.0.0"
+paparazziNative = "2021.1.1-573f070"
 skiko = "0.7.7"
 sqldelight = "1.3.0"
 wire = "4.4.1"
@@ -73,7 +75,7 @@
 apacheCommonIo = { module = "commons-io:commons-io", version = "2.4" }
 assertj = { module = "org.assertj:assertj-core", version = "3.11.1" }
 checkerframework = { module = "org.checkerframework:checker-qual", version = "2.5.3" }
-checkmark = { module = "net.saff.checkmark:checkmark", version = "0.1.2" }
+checkmark = { module = "net.saff.checkmark:checkmark", version = "0.1.6" }
 constraintLayout = { module = "androidx.constraintlayout:constraintlayout", version = "2.0.1"}
 dackka = { module = "com.google.devsite:dackka", version = "0.0.19" }
 dagger = { module = "com.google.dagger:dagger", version.ref = "dagger" }
@@ -164,7 +166,10 @@
 playServicesBase = { module = "com.google.android.gms:play-services-base", version = "17.0.0" }
 playServicesBasement = { module = "com.google.android.gms:play-services-basement", version = "17.0.0" }
 playServicesWearable = { module = "com.google.android.gms:play-services-wearable", version = "17.1.0" }
-paparazzi = { module = "app.cash.paparazzi:paparazzi", version="1.0.0" }
+paparazzi = { module = "app.cash.paparazzi:paparazzi", version.ref = "paparazzi" }
+paparazziNativeLinuxX64 = { module = "app.cash.paparazzi:layoutlib-native-linux", version.ref = "paparazziNative" }
+paparazziNativeMacOsArm64 = { module = "app.cash.paparazzi:layoutlib-native-macarm", version.ref = "paparazziNative" }
+paparazziNativeMacOsX64 = { module = "app.cash.paparazzi:layoutlib-native-macosx", version.ref = "paparazziNative" }
 protobuf = { module = "com.google.protobuf:protobuf-java", version.ref = "protobuf" }
 protobufCompiler = { module = "com.google.protobuf:protoc", version.ref = "protobuf" }
 protobufGradlePluginz = { module = "com.google.protobuf:protobuf-gradle-plugin", version = "0.8.18" }
diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml
index 51bedde..a2b67b6 100644
--- a/gradle/verification-metadata.xml
+++ b/gradle/verification-metadata.xml
@@ -269,6 +269,7 @@
          <trusted-key id="7e22d50a7ebd9d2cd269b2d4056aca74d46000bf" group="io.netty"/>
          <trusted-key id="7f36e793ae3252e5d9e9b98fee9e7dc9d92fc896" group="com.google.errorprone"/>
          <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="82f833963889d7ed06f1e4dc6525fd70cc303655" group="org.codehaus.mojo"/>
@@ -376,7 +377,10 @@
          <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="c5aa57f4a38eba7b7f9156ddab2da4527f6ffc0b" group="com.squareup" name="kotlinpoet"/>
+         <trusted-key id="c5aa57f4a38eba7b7f9156ddab2da4527f6ffc0b">
+            <trusting group="com.squareup" name="kotlinpoet"/>
+            <trusting group="com.squareup" name="kotlinpoet-javapoet"/>
+         </trusted-key>
          <trusted-key id="c6f7d1c804c821f49af3bfc13ad93c3c677a106e" group="io.perfmark" name="perfmark-api"/>
          <trusted-key id="c70b844f002f21f6d2b9c87522e44ac0622b91c3" group="com.beust" name="jcommander"/>
          <trusted-key id="c7be5bcc9fec15518cfda882b0f3710fa64900e7">
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 7542d8a7..1c50354 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
@@ -52,6 +52,7 @@
 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
 
@@ -633,8 +634,8 @@
             }
         }
     }
-
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.KITKAT)
+    @Ignore("b/242180917")
     @Test
     fun testEglDupNativeFenceFDANDROIDawaitForever() {
         testEGLManager {
diff --git a/health/connect/connect-client-proto/build.gradle b/health/connect/connect-client-proto/build.gradle
new file mode 100644
index 0000000..507a245
--- /dev/null
+++ b/health/connect/connect-client-proto/build.gradle
@@ -0,0 +1,92 @@
+/*
+ * 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.
+ */
+
+import androidx.build.Publish
+
+/*
+ * All the following content was derived from :datastore:datastore-core.
+ */
+
+plugins {
+    id("AndroidXPlugin")
+    id("java-library")
+    id("com.google.protobuf")
+}
+
+dependencies {
+    implementation(libs.protobufLite)
+}
+
+sourceSets {
+    main.java.srcDirs += "$buildDir/generated/source/proto"
+}
+
+protobuf {
+    protoc {
+        artifact = libs.protobufCompiler.get()
+    }
+
+    // Generates the java proto-lite code for the protos in this project. See
+    // https://github.com/google/protobuf-gradle-plugin#customizing-protobuf-compilation
+    // for more information.
+    generateProtoTasks {
+        all().each { task ->
+            project.tasks.named("sourceJar").configure {
+                it.dependsOn(task)
+            }
+            project.tasks.named("runErrorProne").configure {
+                it.dependsOn(task)
+            }
+            project.tasks.named("lint").configure {
+                it.dependsOn(task)
+                it.enabled = false
+            }
+            project.tasks.named("lintAnalyze").configure {
+                it.dependsOn(task)
+                it.enabled = false
+            }
+            task.builtins {
+                java {
+                    option "lite"
+                }
+            }
+        }
+    }
+}
+
+// Create export artifact for for JarJaring
+def preferencesProtoJarJarTask = tasks.register("exportJar", Jar) {
+    archiveBaseName.set("export")
+    from(sourceSets.main.output)
+    // The proto-lite dependency includes .proto files, which are not used by datastore. When apps
+    // depend on datastore as well as proto-lite directly, these files conflict since jarjar only
+    // renames the java classes. Remove them here since they are unused.
+    exclude("**/*.proto")
+
+    from(zipTree(configurations.detachedConfiguration(
+            dependencies.create(libs.protobufLite.get())).getSingleFile()))
+}
+
+def jarjarConf = configurations.register("export")
+artifacts.add(jarjarConf.name, preferencesProtoJarJarTask.flatMap { it.archiveFile })
+
+androidx {
+    name = "AndroidX Health Connect Client Proto"
+    publish = Publish.NONE
+    mavenGroup = LibraryGroups.HEALTH_CONNECT
+    inceptionYear = "2022"
+    description = "Proto files for health-connect-client"
+}
diff --git a/health/health-connect-client-proto/src/main/proto/change.proto b/health/connect/connect-client-proto/src/main/proto/change.proto
similarity index 100%
rename from health/health-connect-client-proto/src/main/proto/change.proto
rename to health/connect/connect-client-proto/src/main/proto/change.proto
diff --git a/health/health-connect-client-proto/src/main/proto/data.proto b/health/connect/connect-client-proto/src/main/proto/data.proto
similarity index 100%
rename from health/health-connect-client-proto/src/main/proto/data.proto
rename to health/connect/connect-client-proto/src/main/proto/data.proto
diff --git a/health/health-connect-client-proto/src/main/proto/error.proto b/health/connect/connect-client-proto/src/main/proto/error.proto
similarity index 100%
rename from health/health-connect-client-proto/src/main/proto/error.proto
rename to health/connect/connect-client-proto/src/main/proto/error.proto
diff --git a/health/health-connect-client-proto/src/main/proto/permission.proto b/health/connect/connect-client-proto/src/main/proto/permission.proto
similarity index 100%
rename from health/health-connect-client-proto/src/main/proto/permission.proto
rename to health/connect/connect-client-proto/src/main/proto/permission.proto
diff --git a/health/connect/connect-client-proto/src/main/proto/request.proto b/health/connect/connect-client-proto/src/main/proto/request.proto
new file mode 100644
index 0000000..9ccbd99
--- /dev/null
+++ b/health/connect/connect-client-proto/src/main/proto/request.proto
@@ -0,0 +1,108 @@
+/*
+ * 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.
+ */
+syntax = "proto2";
+
+package androidx.health.platform.client.proto;
+
+import "data.proto";
+import "time.proto";
+
+option java_package = "androidx.health.platform.client.proto";
+option java_outer_classname = "RequestProto";
+
+message SimpleDataRequest {
+  optional DataPoint data_point = 1;
+}
+
+message ReadDataPointRequest {
+  optional DataType data_type = 1;
+  optional string uid = 2;
+  optional string client_id = 3;
+}
+
+message RequestContext {
+  optional string calling_package = 1;
+  optional int32 sdk_version = 2;
+  optional string permission_token = 3;
+  optional bool is_in_foreground = 4;
+}
+
+message UpsertDataRequest {
+  repeated DataPoint data_point = 1;
+}
+
+message DataTypeIdPair {
+  optional DataType data_type = 1;
+  optional string id = 2;
+}
+
+message DeleteDataRequest {
+  repeated DataTypeIdPair uids = 1;
+  repeated DataTypeIdPair client_ids = 2;
+}
+
+message DeleteDataRangeRequest {
+  optional TimeSpec time_spec = 1;
+  repeated DataType data_type = 2;
+}
+
+message ReadDataRequest {
+  optional DataTypeIdPair data_type_id_pair = 1;
+}
+
+message ReadDataRangeRequest {
+  optional TimeSpec time_spec = 1;
+  optional DataType data_type = 2;
+  repeated DataOrigin data_origin_filters = 3;
+  optional bool asc_ordering = 7 [default = true];
+  optional int32 limit = 4;
+  optional int32 page_size = 5;
+  optional string page_token = 6;
+}
+
+message AggregateMetricSpec {
+  optional string data_type_name = 1;
+  // count, duration, etc
+  optional string aggregation_type = 2;
+  optional string field_name = 3;
+}
+
+// Flattened aggregation
+message AggregateDataRequest {
+  optional TimeSpec time_spec = 1;
+  repeated AggregateMetricSpec metric_spec = 2;
+  repeated DataOrigin data_origin = 3;
+  optional int64 slice_duration_millis = 4;
+  optional string slice_period = 5;
+}
+
+message GetChangesTokenRequest {
+  repeated DataType data_type = 1;
+  repeated DataOrigin data_origin_filters = 2;
+}
+
+message GetChangesRequest {
+  optional string changes_token = 1;
+}
+
+message RegisterForDataNotificationsRequest {
+  optional string notificationIntentAction = 1;
+  repeated DataType data_types = 2;
+}
+
+message UnregisterFromDataNotificationsRequest {
+  optional string notificationIntentAction = 1;
+}
diff --git a/health/health-connect-client-proto/src/main/proto/response.proto b/health/connect/connect-client-proto/src/main/proto/response.proto
similarity index 100%
rename from health/health-connect-client-proto/src/main/proto/response.proto
rename to health/connect/connect-client-proto/src/main/proto/response.proto
diff --git a/health/health-connect-client-proto/src/main/proto/time.proto b/health/connect/connect-client-proto/src/main/proto/time.proto
similarity index 100%
rename from health/health-connect-client-proto/src/main/proto/time.proto
rename to health/connect/connect-client-proto/src/main/proto/time.proto
diff --git a/health/health-connect-client/OWNERS b/health/connect/connect-client/OWNERS
similarity index 100%
rename from health/health-connect-client/OWNERS
rename to health/connect/connect-client/OWNERS
diff --git a/health/connect/connect-client/api/current.txt b/health/connect/connect-client/api/current.txt
new file mode 100644
index 0000000..e0d7e87
--- /dev/null
+++ b/health/connect/connect-client/api/current.txt
@@ -0,0 +1,1607 @@
+// Signature format: 4.0
+package androidx.health.connect.client {
+
+  public interface HealthConnectClient {
+    method public suspend Object? aggregate(androidx.health.connect.client.request.AggregateRequest request, kotlin.coroutines.Continuation<? super androidx.health.connect.client.aggregate.AggregationResult>);
+    method public suspend Object? aggregateGroupByDuration(androidx.health.connect.client.request.AggregateGroupByDurationRequest request, kotlin.coroutines.Continuation<? super java.util.List<? extends androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration>>);
+    method public suspend Object? aggregateGroupByPeriod(androidx.health.connect.client.request.AggregateGroupByPeriodRequest request, kotlin.coroutines.Continuation<? super java.util.List<? extends androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod>>);
+    method public suspend Object? deleteRecords(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType, java.util.List<java.lang.String> uidsList, java.util.List<java.lang.String> clientRecordIdsList, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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 androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context, optional java.util.List<java.lang.String> packageNames);
+    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 isAvailable(android.content.Context context, optional java.util.List<java.lang.String> packageNames);
+    method public default static boolean isAvailable(android.content.Context context);
+    method public suspend <T extends androidx.health.connect.client.records.Record> Object? readRecord(kotlin.reflect.KClass<T> recordType, String uid, 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 suspend Object? updateRecords(java.util.List<? extends androidx.health.connect.client.records.Record> records, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    property public abstract androidx.health.connect.client.PermissionController permissionController;
+    field public static final androidx.health.connect.client.HealthConnectClient.Companion Companion;
+  }
+
+  public static final class HealthConnectClient.Companion {
+    method public androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context, optional java.util.List<java.lang.String> packageNames);
+    method public androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context);
+    method public boolean isAvailable(android.content.Context context, optional java.util.List<java.lang.String> packageNames);
+    method public boolean isAvailable(android.content.Context context);
+  }
+
+  public interface PermissionController {
+    method public androidx.activity.result.contract.ActivityResultContract<java.util.Set<androidx.health.connect.client.permission.HealthPermission>,java.util.Set<androidx.health.connect.client.permission.HealthPermission>> createRequestPermissionActivityContract();
+    method public suspend Object? getGrantedPermissions(java.util.Set<androidx.health.connect.client.permission.HealthPermission> permissions, kotlin.coroutines.Continuation<? super java.util.Set<? extends androidx.health.connect.client.permission.HealthPermission>>);
+    method public suspend Object? revokeAllPermissions(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+  }
+
+}
+
+package androidx.health.connect.client.aggregate {
+
+  public final class AggregateMetric<T> {
+  }
+
+  public final class AggregationResult {
+    method public operator boolean contains(androidx.health.connect.client.aggregate.AggregateMetric<?> metric);
+    method public operator <T> T? get(androidx.health.connect.client.aggregate.AggregateMetric<? extends T> metric);
+    method public java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> getDataOrigins();
+    method @Deprecated public <T> T? getMetric(androidx.health.connect.client.aggregate.AggregateMetric<? extends T> metric);
+    method @Deprecated public boolean hasMetric(androidx.health.connect.client.aggregate.AggregateMetric<?> metric);
+    property public final java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOrigins;
+  }
+
+  public final class AggregationResultGroupedByDuration {
+    method public java.time.Instant getEndTime();
+    method public androidx.health.connect.client.aggregate.AggregationResult getResult();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset getZoneOffset();
+    property public final java.time.Instant endTime;
+    property public final androidx.health.connect.client.aggregate.AggregationResult result;
+    property public final java.time.Instant startTime;
+    property public final java.time.ZoneOffset zoneOffset;
+  }
+
+  public final class AggregationResultGroupedByPeriod {
+    method public java.time.LocalDateTime getEndTime();
+    method public androidx.health.connect.client.aggregate.AggregationResult getResult();
+    method public java.time.LocalDateTime getStartTime();
+    property public final java.time.LocalDateTime endTime;
+    property public final androidx.health.connect.client.aggregate.AggregationResult result;
+    property public final java.time.LocalDateTime startTime;
+  }
+
+}
+
+package androidx.health.connect.client.changes {
+
+  public interface Change {
+  }
+
+  public final class DeletionChange implements androidx.health.connect.client.changes.Change {
+    method public String getUid();
+    property public final String uid;
+  }
+
+  public final class UpsertionChange implements androidx.health.connect.client.changes.Change {
+    method public androidx.health.connect.client.records.Record getRecord();
+    property public final androidx.health.connect.client.records.Record record;
+  }
+
+}
+
+package androidx.health.connect.client.permission {
+
+  public final class HealthDataRequestPermissionsKt {
+  }
+
+  public final class HealthPermission {
+    method public static androidx.health.connect.client.permission.HealthPermission createReadPermission(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType);
+    method public static androidx.health.connect.client.permission.HealthPermission createWritePermission(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType);
+    field public static final androidx.health.connect.client.permission.HealthPermission.Companion Companion;
+  }
+
+  public static final class HealthPermission.Companion {
+    method public androidx.health.connect.client.permission.HealthPermission createReadPermission(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType);
+    method public androidx.health.connect.client.permission.HealthPermission createWritePermission(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType);
+  }
+
+}
+
+package androidx.health.connect.client.records {
+
+  public final class ActiveCaloriesBurnedRecord implements androidx.health.connect.client.records.Record {
+    ctor public ActiveCaloriesBurnedRecord(androidx.health.connect.client.units.Energy energy, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.units.Energy getEnergy();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public final androidx.health.connect.client.units.Energy energy;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> ACTIVE_CALORIES_TOTAL;
+    field public static final androidx.health.connect.client.records.ActiveCaloriesBurnedRecord.Companion Companion;
+  }
+
+  public static final class ActiveCaloriesBurnedRecord.Companion {
+  }
+
+  public final class BasalBodyTemperatureRecord implements androidx.health.connect.client.records.Record {
+    ctor public BasalBodyTemperatureRecord(androidx.health.connect.client.units.Temperature temperature, optional String? measurementLocation, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public String? getMeasurementLocation();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public androidx.health.connect.client.units.Temperature getTemperature();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final String? measurementLocation;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final androidx.health.connect.client.units.Temperature temperature;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public final class BasalMetabolicRateRecord implements androidx.health.connect.client.records.Record {
+    ctor public BasalMetabolicRateRecord(androidx.health.connect.client.units.Power basalMetabolicRate, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.units.Power getBasalMetabolicRate();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final androidx.health.connect.client.units.Power basalMetabolicRate;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> BASAL_CALORIES_TOTAL;
+    field public static final androidx.health.connect.client.records.BasalMetabolicRateRecord.Companion Companion;
+  }
+
+  public static final class BasalMetabolicRateRecord.Companion {
+  }
+
+  public final class BloodGlucoseRecord implements androidx.health.connect.client.records.Record {
+    ctor public BloodGlucoseRecord(double levelMillimolesPerLiter, optional String? specimenSource, optional String? mealType, optional String? relationToMeal, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public double getLevelMillimolesPerLiter();
+    method public String? getMealType();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public String? getRelationToMeal();
+    method public String? getSpecimenSource();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final double levelMillimolesPerLiter;
+    property public final String? mealType;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final String? relationToMeal;
+    property public final String? specimenSource;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public static final class BloodGlucoseRecord.SpecimenSource {
+    field public static final String CAPILLARY_BLOOD = "capillary_blood";
+    field public static final androidx.health.connect.client.records.BloodGlucoseRecord.SpecimenSource INSTANCE;
+    field public static final String INTERSTITIAL_FLUID = "interstitial_fluid";
+    field public static final String PLASMA = "plasma";
+    field public static final String SERUM = "serum";
+    field public static final String TEARS = "tears";
+    field public static final String WHOLE_BLOOD = "whole_blood";
+  }
+
+  public final class BloodPressureRecord implements androidx.health.connect.client.records.Record {
+    ctor public BloodPressureRecord(androidx.health.connect.client.units.Pressure systolic, androidx.health.connect.client.units.Pressure diastolic, optional String? bodyPosition, optional String? measurementLocation, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public String? getBodyPosition();
+    method public androidx.health.connect.client.units.Pressure getDiastolic();
+    method public String? getMeasurementLocation();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public androidx.health.connect.client.units.Pressure getSystolic();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final String? bodyPosition;
+    property public final androidx.health.connect.client.units.Pressure diastolic;
+    property public final String? measurementLocation;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final androidx.health.connect.client.units.Pressure systolic;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+    field public static final androidx.health.connect.client.records.BloodPressureRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> DIASTOLIC_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> DIASTOLIC_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> DIASTOLIC_MIN;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> SYSTOLIC_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> SYSTOLIC_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> SYSTOLIC_MIN;
+  }
+
+  public static final class BloodPressureRecord.Companion {
+  }
+
+  public static final class BloodPressureRecord.MeasurementLocation {
+    field public static final androidx.health.connect.client.records.BloodPressureRecord.MeasurementLocation INSTANCE;
+    field public static final String LEFT_UPPER_ARM = "left_upper_arm";
+    field public static final String LEFT_WRIST = "left_wrist";
+    field public static final String RIGHT_UPPER_ARM = "right_upper_arm";
+    field public static final String RIGHT_WRIST = "right_wrist";
+  }
+
+  public final class BodyFatRecord implements androidx.health.connect.client.records.Record {
+    ctor public BodyFatRecord(androidx.health.connect.client.units.Percentage percentage, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public androidx.health.connect.client.units.Percentage getPercentage();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final androidx.health.connect.client.units.Percentage percentage;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public final class BodyPosition {
+    field public static final androidx.health.connect.client.records.BodyPosition INSTANCE;
+    field public static final String LYING_DOWN = "lying_down";
+    field public static final String RECLINING = "reclining";
+    field public static final String SITTING_DOWN = "sitting_down";
+    field public static final String STANDING_UP = "standing_up";
+  }
+
+  public final class BodyTemperatureMeasurementLocation {
+    field public static final String ARMPIT = "armpit";
+    field public static final String EAR = "ear";
+    field public static final String FINGER = "finger";
+    field public static final String FOREHEAD = "forehead";
+    field public static final androidx.health.connect.client.records.BodyTemperatureMeasurementLocation INSTANCE;
+    field public static final String MOUTH = "mouth";
+    field public static final String RECTUM = "rectum";
+    field public static final String TEMPORAL_ARTERY = "temporal_artery";
+    field public static final String TOE = "toe";
+    field public static final String VAGINA = "vagina";
+    field public static final String WRIST = "wrist";
+  }
+
+  public final class BodyTemperatureRecord implements androidx.health.connect.client.records.Record {
+    ctor public BodyTemperatureRecord(androidx.health.connect.client.units.Temperature temperature, optional String? measurementLocation, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public String? getMeasurementLocation();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public androidx.health.connect.client.units.Temperature getTemperature();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final String? measurementLocation;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final androidx.health.connect.client.units.Temperature temperature;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public final class BoneMassRecord implements androidx.health.connect.client.records.Record {
+    ctor public BoneMassRecord(androidx.health.connect.client.units.Mass mass, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.units.Mass getMass();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final androidx.health.connect.client.units.Mass mass;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public final class CervicalMucusRecord implements androidx.health.connect.client.records.Record {
+    ctor public CervicalMucusRecord(optional String? appearance, optional String? sensation, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public String? getAppearance();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public String? getSensation();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final String? appearance;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final String? sensation;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public static final class CervicalMucusRecord.Appearance {
+    field public static final String CLEAR = "clear";
+    field public static final String CREAMY = "creamy";
+    field public static final String DRY = "dry";
+    field public static final androidx.health.connect.client.records.CervicalMucusRecord.Appearance INSTANCE;
+    field public static final String STICKY = "sticky";
+    field public static final String WATERY = "watery";
+  }
+
+  public static final class CervicalMucusRecord.Sensation {
+    field public static final String HEAVY = "heavy";
+    field public static final androidx.health.connect.client.records.CervicalMucusRecord.Sensation INSTANCE;
+    field public static final String LIGHT = "light";
+    field public static final String MEDIUM = "medium";
+  }
+
+  public final class CyclingPedalingCadenceRecord implements androidx.health.connect.client.records.Record {
+    ctor public CyclingPedalingCadenceRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.CyclingPedalingCadenceRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.util.List<androidx.health.connect.client.records.CyclingPedalingCadenceRecord.Sample> getSamples();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.util.List<androidx.health.connect.client.records.CyclingPedalingCadenceRecord.Sample> samples;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.records.CyclingPedalingCadenceRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RPM_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RPM_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RPM_MIN;
+  }
+
+  public static final class CyclingPedalingCadenceRecord.Companion {
+  }
+
+  public static final class CyclingPedalingCadenceRecord.Sample {
+    ctor public CyclingPedalingCadenceRecord.Sample(java.time.Instant time, @FloatRange(from=0.0, to=10000.0) double revolutionsPerMinute);
+    method public double getRevolutionsPerMinute();
+    method public java.time.Instant getTime();
+    property public final double revolutionsPerMinute;
+    property public final java.time.Instant time;
+  }
+
+  public final class DistanceRecord implements androidx.health.connect.client.records.Record {
+    ctor public DistanceRecord(androidx.health.connect.client.units.Length distance, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.units.Length getDistance();
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public final androidx.health.connect.client.units.Length distance;
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.records.DistanceRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> DISTANCE_TOTAL;
+  }
+
+  public static final class DistanceRecord.Companion {
+  }
+
+  public final class ElevationGainedRecord implements androidx.health.connect.client.records.Record {
+    ctor public ElevationGainedRecord(androidx.health.connect.client.units.Length elevation, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.units.Length getElevation();
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public final androidx.health.connect.client.units.Length elevation;
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.records.ElevationGainedRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> ELEVATION_GAINED_TOTAL;
+  }
+
+  public static final class ElevationGainedRecord.Companion {
+  }
+
+  public final class ExerciseEventRecord implements androidx.health.connect.client.records.Record {
+    ctor public ExerciseEventRecord(String eventType, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public String getEventType();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public final String eventType;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+  }
+
+  public static final class ExerciseEventRecord.EventType {
+    field public static final androidx.health.connect.client.records.ExerciseEventRecord.EventType INSTANCE;
+    field public static final String PAUSE = "pause";
+    field public static final String REST = "rest";
+  }
+
+  public final class ExerciseLapRecord implements androidx.health.connect.client.records.Record {
+    ctor public ExerciseLapRecord(optional androidx.health.connect.client.units.Length? length, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.units.Length? getLength();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public final androidx.health.connect.client.units.Length? length;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+  }
+
+  public final class ExerciseRepetitionsRecord implements androidx.health.connect.client.records.Record {
+    ctor public ExerciseRepetitionsRecord(long count, String type, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public long getCount();
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    method public String getType();
+    property public final long count;
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    property public final String type;
+  }
+
+  public static final class ExerciseRepetitionsRecord.ExerciseType {
+    field public static final String ARM_CURL = "arm_curl";
+    field public static final String BACK_EXTENSION = "back_extension";
+    field public static final String BALL_SLAM = "ball_slam";
+    field public static final String BENCH_PRESS = "bench_press";
+    field public static final String BURPEE = "burpee";
+    field public static final String CRUNCH = "crunch";
+    field public static final String DEADLIFT = "deadlift";
+    field public static final String DOUBLE_ARM_TRICEPS_EXTENSION = "double_arm_triceps_extension";
+    field public static final String DUMBBELL_ROW = "dumbbell_row";
+    field public static final String FRONT_RAISE = "front_raise";
+    field public static final String HIP_THRUST = "hip_thrust";
+    field public static final String HULA_HOOP = "hula_hoop";
+    field public static final androidx.health.connect.client.records.ExerciseRepetitionsRecord.ExerciseType INSTANCE;
+    field public static final String JUMPING_JACK = "jumping_jack";
+    field public static final String JUMP_ROPE = "jump_rope";
+    field public static final String KETTLEBELL_SWING = "kettlebell_swing";
+    field public static final String LATERAL_RAISE = "lateral_raise";
+    field public static final String LAT_PULL_DOWN = "lat_pull_down";
+    field public static final String LEG_CURL = "leg_curl";
+    field public static final String LEG_EXTENSION = "leg_extension";
+    field public static final String LEG_PRESS = "leg_press";
+    field public static final String LEG_RAISE = "leg_raise";
+    field public static final String LUNGE = "lunge";
+    field public static final String MOUNTAIN_CLIMBER = "mountain_climber";
+    field public static final String PLANK = "plank";
+    field public static final String PULL_UP = "pull_up";
+    field public static final String PUNCH = "punch";
+    field public static final String SHOULDER_PRESS = "shoulder_press";
+    field public static final String SINGLE_ARM_TRICEPS_EXTENSION = "single_arm_triceps_extension";
+    field public static final String SIT_UP = "sit_up";
+    field public static final String SQUAT = "squat";
+  }
+
+  public final class ExerciseSessionRecord implements androidx.health.connect.client.records.Record {
+    ctor public ExerciseSessionRecord(String exerciseType, optional String? title, optional String? notes, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public String getExerciseType();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public String? getNotes();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    method public String? getTitle();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public final String exerciseType;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final String? notes;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    property public final String? title;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.time.Duration> ACTIVE_TIME_TOTAL;
+    field public static final androidx.health.connect.client.records.ExerciseSessionRecord.Companion Companion;
+  }
+
+  public static final class ExerciseSessionRecord.Companion {
+  }
+
+  public static final class ExerciseSessionRecord.ExerciseType {
+    field public static final String BACK_EXTENSION = "back_extension";
+    field public static final String BADMINTON = "badminton";
+    field public static final String BARBELL_SHOULDER_PRESS = "barbell_shoulder_press";
+    field public static final String BASEBALL = "baseball";
+    field public static final String BASKETBALL = "basketball";
+    field public static final String BENCH_PRESS = "bench_press";
+    field public static final String BENCH_SIT_UP = "bench_sit_up";
+    field public static final String BIKING = "biking";
+    field public static final String BIKING_STATIONARY = "biking_stationary";
+    field public static final String BOOT_CAMP = "boot_camp";
+    field public static final String BOXING = "boxing";
+    field public static final String BURPEE = "burpee";
+    field public static final String CALISTHENICS = "calisthenics";
+    field public static final String CRICKET = "cricket";
+    field public static final String CRUNCH = "crunch";
+    field public static final String DANCING = "dancing";
+    field public static final String DEADLIFT = "deadlift";
+    field public static final String DUMBBELL_CURL_LEFT_ARM = "dumbbell_curl_left_arm";
+    field public static final String DUMBBELL_CURL_RIGHT_ARM = "dumbbell_curl_right_arm";
+    field public static final String DUMBBELL_FRONT_RAISE = "dumbbell_front_raise";
+    field public static final String DUMBBELL_LATERAL_RAISE = "dumbbell_lateral_raise";
+    field public static final String DUMBBELL_TRICEPS_EXTENSION_LEFT_ARM = "dumbbell_triceps_extension_left_arm";
+    field public static final String DUMBBELL_TRICEPS_EXTENSION_RIGHT_ARM = "dumbbell_triceps_extension_right_arm";
+    field public static final String DUMBBELL_TRICEPS_EXTENSION_TWO_ARM = "dumbbell_triceps_extension_two_arm";
+    field public static final String ELLIPTICAL = "elliptical";
+    field public static final String EXERCISE_CLASS = "exercise_class";
+    field public static final String FENCING = "fencing";
+    field public static final String FOOTBALL_AMERICAN = "football_american";
+    field public static final String FOOTBALL_AUSTRALIAN = "football_australian";
+    field public static final String FORWARD_TWIST = "forward_twist";
+    field public static final String FRISBEE_DISC = "frisbee_disc";
+    field public static final String GOLF = "golf";
+    field public static final String GUIDED_BREATHING = "guided_breathing";
+    field public static final String GYMNASTICS = "gymnastics";
+    field public static final String HANDBALL = "handball";
+    field public static final String HIGH_INTENSITY_INTERVAL_TRAINING = "high_intensity_interval_training";
+    field public static final String HIKING = "hiking";
+    field public static final String ICE_HOCKEY = "ice_hockey";
+    field public static final String ICE_SKATING = "ice_skating";
+    field public static final androidx.health.connect.client.records.ExerciseSessionRecord.ExerciseType INSTANCE;
+    field public static final String JUMPING_JACK = "jumping_jack";
+    field public static final String JUMP_ROPE = "jump_rope";
+    field public static final String LAT_PULL_DOWN = "lat_pull_down";
+    field public static final String LUNGE = "lunge";
+    field public static final String MARTIAL_ARTS = "martial_arts";
+    field public static final String MEDITATION = "meditation";
+    field public static final String PADDLING = "paddling";
+    field public static final String PARA_GLIDING = "para_gliding";
+    field public static final String PILATES = "pilates";
+    field public static final String PLANK = "plank";
+    field public static final String RACQUETBALL = "racquetball";
+    field public static final String ROCK_CLIMBING = "rock_climbing";
+    field public static final String ROLLER_HOCKEY = "roller_hockey";
+    field public static final String ROWING = "rowing";
+    field public static final String ROWING_MACHINE = "rowing_machine";
+    field public static final String RUGBY = "rugby";
+    field public static final String RUNNING = "running";
+    field public static final String RUNNING_TREADMILL = "running_treadmill";
+    field public static final String SAILING = "sailing";
+    field public static final String SCUBA_DIVING = "scuba_diving";
+    field public static final String SKATING = "skating";
+    field public static final String SKIING = "skiing";
+    field public static final String SNOWBOARDING = "snowboarding";
+    field public static final String SNOWSHOEING = "snowshoeing";
+    field public static final String SOCCER = "soccer";
+    field public static final String SOFTBALL = "softball";
+    field public static final String SQUASH = "squash";
+    field public static final String SQUAT = "squat";
+    field public static final String STAIR_CLIMBING = "stair_climbing";
+    field public static final String STAIR_CLIMBING_MACHINE = "stair_climbing_machine";
+    field public static final String STRENGTH_TRAINING = "strength_training";
+    field public static final String STRETCHING = "stretching";
+    field public static final String SURFING = "surfing";
+    field public static final String SWIMMING_OPEN_WATER = "swimming_open_water";
+    field public static final String SWIMMING_POOL = "swimming_pool";
+    field public static final String TABLE_TENNIS = "table_tennis";
+    field public static final String TENNIS = "tennis";
+    field public static final String UPPER_TWIST = "upper_twist";
+    field public static final String VOLLEYBALL = "volleyball";
+    field public static final String WALKING = "walking";
+    field public static final String WATER_POLO = "water_polo";
+    field public static final String WEIGHTLIFTING = "weightlifting";
+    field public static final String WHEELCHAIR = "wheelchair";
+    field public static final String WORKOUT = "workout";
+    field public static final String YOGA = "yoga";
+  }
+
+  public final class FloorsClimbedRecord implements androidx.health.connect.client.records.Record {
+    ctor public FloorsClimbedRecord(double floors, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public double getFloors();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public final double floors;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.records.FloorsClimbedRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> FLOORS_CLIMBED_TOTAL;
+  }
+
+  public static final class FloorsClimbedRecord.Companion {
+  }
+
+  public final class HeartRateRecord implements androidx.health.connect.client.records.Record {
+    ctor public HeartRateRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.HeartRateRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.util.List<androidx.health.connect.client.records.HeartRateRecord.Sample> getSamples();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.util.List<androidx.health.connect.client.records.HeartRateRecord.Sample> samples;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_MIN;
+    field public static final androidx.health.connect.client.records.HeartRateRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> MEASUREMENTS_COUNT;
+  }
+
+  public static final class HeartRateRecord.Companion {
+  }
+
+  public static final class HeartRateRecord.Sample {
+    ctor public HeartRateRecord.Sample(java.time.Instant time, @IntRange(from=1L, to=300L) long beatsPerMinute);
+    method public long getBeatsPerMinute();
+    method public java.time.Instant getTime();
+    property public final long beatsPerMinute;
+    property public final java.time.Instant time;
+  }
+
+  public final class HeightRecord implements androidx.health.connect.client.records.Record {
+    ctor public HeightRecord(androidx.health.connect.client.units.Length height, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.units.Length getHeight();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final androidx.health.connect.client.units.Length height;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+    field public static final androidx.health.connect.client.records.HeightRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> HEIGHT_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> HEIGHT_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> HEIGHT_MIN;
+  }
+
+  public static final class HeightRecord.Companion {
+  }
+
+  public final class HipCircumferenceRecord implements androidx.health.connect.client.records.Record {
+    ctor public HipCircumferenceRecord(androidx.health.connect.client.units.Length circumference, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.units.Length getCircumference();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final androidx.health.connect.client.units.Length circumference;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public final class HydrationRecord implements androidx.health.connect.client.records.Record {
+    ctor public HydrationRecord(androidx.health.connect.client.units.Volume volume, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    method public androidx.health.connect.client.units.Volume getVolume();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    property public final androidx.health.connect.client.units.Volume volume;
+    field public static final androidx.health.connect.client.records.HydrationRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Volume> VOLUME_TOTAL;
+  }
+
+  public static final class HydrationRecord.Companion {
+  }
+
+  public final class LeanBodyMassRecord implements androidx.health.connect.client.records.Record {
+    ctor public LeanBodyMassRecord(androidx.health.connect.client.units.Mass mass, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.units.Mass getMass();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final androidx.health.connect.client.units.Mass mass;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public final class MealType {
+    field public static final String BREAKFAST = "breakfast";
+    field public static final String DINNER = "dinner";
+    field public static final androidx.health.connect.client.records.MealType INSTANCE;
+    field public static final String LUNCH = "lunch";
+    field public static final String SNACK = "snack";
+    field public static final String UNKNOWN = "unknown";
+  }
+
+  public final class MenstruationFlowRecord implements androidx.health.connect.client.records.Record {
+    ctor public MenstruationFlowRecord(optional String? flow, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public String? getFlow();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final String? flow;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public static final class MenstruationFlowRecord.Flow {
+    field public static final String HEAVY = "heavy";
+    field public static final androidx.health.connect.client.records.MenstruationFlowRecord.Flow INSTANCE;
+    field public static final String LIGHT = "light";
+    field public static final String MEDIUM = "medium";
+    field public static final String SPOTTING = "spotting";
+  }
+
+  public final class NutritionRecord implements androidx.health.connect.client.records.Record {
+    ctor public NutritionRecord(optional androidx.health.connect.client.units.Mass? biotin, optional androidx.health.connect.client.units.Mass? caffeine, optional androidx.health.connect.client.units.Mass? calcium, optional androidx.health.connect.client.units.Energy? energy, optional androidx.health.connect.client.units.Energy? energyFromFat, optional androidx.health.connect.client.units.Mass? chloride, optional androidx.health.connect.client.units.Mass? cholesterol, optional androidx.health.connect.client.units.Mass? chromium, optional androidx.health.connect.client.units.Mass? copper, optional androidx.health.connect.client.units.Mass? dietaryFiber, optional androidx.health.connect.client.units.Mass? folate, optional androidx.health.connect.client.units.Mass? folicAcid, optional androidx.health.connect.client.units.Mass? iodine, optional androidx.health.connect.client.units.Mass? iron, optional androidx.health.connect.client.units.Mass? magnesium, optional androidx.health.connect.client.units.Mass? manganese, optional androidx.health.connect.client.units.Mass? molybdenum, optional androidx.health.connect.client.units.Mass? monounsaturatedFat, optional androidx.health.connect.client.units.Mass? niacin, optional androidx.health.connect.client.units.Mass? pantothenicAcid, optional androidx.health.connect.client.units.Mass? phosphorus, optional androidx.health.connect.client.units.Mass? polyunsaturatedFat, optional androidx.health.connect.client.units.Mass? potassium, optional androidx.health.connect.client.units.Mass? protein, optional androidx.health.connect.client.units.Mass? riboflavin, optional androidx.health.connect.client.units.Mass? saturatedFat, optional androidx.health.connect.client.units.Mass? selenium, optional androidx.health.connect.client.units.Mass? sodium, optional androidx.health.connect.client.units.Mass? sugar, optional androidx.health.connect.client.units.Mass? thiamin, optional androidx.health.connect.client.units.Mass? totalCarbohydrate, optional androidx.health.connect.client.units.Mass? totalFat, optional androidx.health.connect.client.units.Mass? transFat, optional androidx.health.connect.client.units.Mass? unsaturatedFat, optional androidx.health.connect.client.units.Mass? vitaminA, optional androidx.health.connect.client.units.Mass? vitaminB12, optional androidx.health.connect.client.units.Mass? vitaminB6, optional androidx.health.connect.client.units.Mass? vitaminC, optional androidx.health.connect.client.units.Mass? vitaminD, optional androidx.health.connect.client.units.Mass? vitaminE, optional androidx.health.connect.client.units.Mass? vitaminK, optional androidx.health.connect.client.units.Mass? zinc, optional String? name, optional String? mealType, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.units.Mass? getBiotin();
+    method public androidx.health.connect.client.units.Mass? getCaffeine();
+    method public androidx.health.connect.client.units.Mass? getCalcium();
+    method public androidx.health.connect.client.units.Mass? getChloride();
+    method public androidx.health.connect.client.units.Mass? getCholesterol();
+    method public androidx.health.connect.client.units.Mass? getChromium();
+    method public androidx.health.connect.client.units.Mass? getCopper();
+    method public androidx.health.connect.client.units.Mass? getDietaryFiber();
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.units.Energy? getEnergy();
+    method public androidx.health.connect.client.units.Energy? getEnergyFromFat();
+    method public androidx.health.connect.client.units.Mass? getFolate();
+    method public androidx.health.connect.client.units.Mass? getFolicAcid();
+    method public androidx.health.connect.client.units.Mass? getIodine();
+    method public androidx.health.connect.client.units.Mass? getIron();
+    method public androidx.health.connect.client.units.Mass? getMagnesium();
+    method public androidx.health.connect.client.units.Mass? getManganese();
+    method public String? getMealType();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public androidx.health.connect.client.units.Mass? getMolybdenum();
+    method public androidx.health.connect.client.units.Mass? getMonounsaturatedFat();
+    method public String? getName();
+    method public androidx.health.connect.client.units.Mass? getNiacin();
+    method public androidx.health.connect.client.units.Mass? getPantothenicAcid();
+    method public androidx.health.connect.client.units.Mass? getPhosphorus();
+    method public androidx.health.connect.client.units.Mass? getPolyunsaturatedFat();
+    method public androidx.health.connect.client.units.Mass? getPotassium();
+    method public androidx.health.connect.client.units.Mass? getProtein();
+    method public androidx.health.connect.client.units.Mass? getRiboflavin();
+    method public androidx.health.connect.client.units.Mass? getSaturatedFat();
+    method public androidx.health.connect.client.units.Mass? getSelenium();
+    method public androidx.health.connect.client.units.Mass? getSodium();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    method public androidx.health.connect.client.units.Mass? getSugar();
+    method public androidx.health.connect.client.units.Mass? getThiamin();
+    method public androidx.health.connect.client.units.Mass? getTotalCarbohydrate();
+    method public androidx.health.connect.client.units.Mass? getTotalFat();
+    method public androidx.health.connect.client.units.Mass? getTransFat();
+    method public androidx.health.connect.client.units.Mass? getUnsaturatedFat();
+    method public androidx.health.connect.client.units.Mass? getVitaminA();
+    method public androidx.health.connect.client.units.Mass? getVitaminB12();
+    method public androidx.health.connect.client.units.Mass? getVitaminB6();
+    method public androidx.health.connect.client.units.Mass? getVitaminC();
+    method public androidx.health.connect.client.units.Mass? getVitaminD();
+    method public androidx.health.connect.client.units.Mass? getVitaminE();
+    method public androidx.health.connect.client.units.Mass? getVitaminK();
+    method public androidx.health.connect.client.units.Mass? getZinc();
+    property public final androidx.health.connect.client.units.Mass? biotin;
+    property public final androidx.health.connect.client.units.Mass? caffeine;
+    property public final androidx.health.connect.client.units.Mass? calcium;
+    property public final androidx.health.connect.client.units.Mass? chloride;
+    property public final androidx.health.connect.client.units.Mass? cholesterol;
+    property public final androidx.health.connect.client.units.Mass? chromium;
+    property public final androidx.health.connect.client.units.Mass? copper;
+    property public final androidx.health.connect.client.units.Mass? dietaryFiber;
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public final androidx.health.connect.client.units.Energy? energy;
+    property public final androidx.health.connect.client.units.Energy? energyFromFat;
+    property public final androidx.health.connect.client.units.Mass? folate;
+    property public final androidx.health.connect.client.units.Mass? folicAcid;
+    property public final androidx.health.connect.client.units.Mass? iodine;
+    property public final androidx.health.connect.client.units.Mass? iron;
+    property public final androidx.health.connect.client.units.Mass? magnesium;
+    property public final androidx.health.connect.client.units.Mass? manganese;
+    property public final String? mealType;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final androidx.health.connect.client.units.Mass? molybdenum;
+    property public final androidx.health.connect.client.units.Mass? monounsaturatedFat;
+    property public final String? name;
+    property public final androidx.health.connect.client.units.Mass? niacin;
+    property public final androidx.health.connect.client.units.Mass? pantothenicAcid;
+    property public final androidx.health.connect.client.units.Mass? phosphorus;
+    property public final androidx.health.connect.client.units.Mass? polyunsaturatedFat;
+    property public final androidx.health.connect.client.units.Mass? potassium;
+    property public final androidx.health.connect.client.units.Mass? protein;
+    property public final androidx.health.connect.client.units.Mass? riboflavin;
+    property public final androidx.health.connect.client.units.Mass? saturatedFat;
+    property public final androidx.health.connect.client.units.Mass? selenium;
+    property public final androidx.health.connect.client.units.Mass? sodium;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    property public final androidx.health.connect.client.units.Mass? sugar;
+    property public final androidx.health.connect.client.units.Mass? thiamin;
+    property public final androidx.health.connect.client.units.Mass? totalCarbohydrate;
+    property public final androidx.health.connect.client.units.Mass? totalFat;
+    property public final androidx.health.connect.client.units.Mass? transFat;
+    property public final androidx.health.connect.client.units.Mass? unsaturatedFat;
+    property public final androidx.health.connect.client.units.Mass? vitaminA;
+    property public final androidx.health.connect.client.units.Mass? vitaminB12;
+    property public final androidx.health.connect.client.units.Mass? vitaminB6;
+    property public final androidx.health.connect.client.units.Mass? vitaminC;
+    property public final androidx.health.connect.client.units.Mass? vitaminD;
+    property public final androidx.health.connect.client.units.Mass? vitaminE;
+    property public final androidx.health.connect.client.units.Mass? vitaminK;
+    property public final androidx.health.connect.client.units.Mass? zinc;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> BIOTIN_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CAFFEINE_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CALCIUM_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CHLORIDE_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CHOLESTEROL_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CHROMIUM_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> COPPER_TOTAL;
+    field public static final androidx.health.connect.client.records.NutritionRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> DIETARY_FIBER_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> ENERGY_FROM_FAT_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> ENERGY_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> FOLATE_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> FOLIC_ACID_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> IODINE_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> IRON_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> MAGNESIUM_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> MANGANESE_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> MOLYBDENUM_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> MONOUNSATURATED_FAT_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> NIACIN_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> PANTOTHENIC_ACID_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> PHOSPHORUS_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> POLYUNSATURATED_FAT_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> POTASSIUM_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> PROTEIN_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> RIBOFLAVIN_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> SATURATED_FAT_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> SELENIUM_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> SODIUM_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> SUGAR_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> THIAMIN_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> TOTAL_CARBOHYDRATE_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> TOTAL_FAT_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> TRANS_FAT_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> UNSATURATED_FAT_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_A_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_B12_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_B6_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_C_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_D_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_E_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_K_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> ZINC_TOTAL;
+  }
+
+  public static final class NutritionRecord.Companion {
+  }
+
+  public final class OvulationTestRecord implements androidx.health.connect.client.records.Record {
+    ctor public OvulationTestRecord(String result, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public String getResult();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final String result;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public static final class OvulationTestRecord.Result {
+    field public static final String HIGH = "high";
+    field public static final String INCONCLUSIVE = "inconclusive";
+    field public static final androidx.health.connect.client.records.OvulationTestRecord.Result INSTANCE;
+    field public static final String NEGATIVE = "negative";
+    field public static final String POSITIVE = "positive";
+  }
+
+  public final class OxygenSaturationRecord implements androidx.health.connect.client.records.Record {
+    ctor public OxygenSaturationRecord(androidx.health.connect.client.units.Percentage percentage, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public androidx.health.connect.client.units.Percentage getPercentage();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final androidx.health.connect.client.units.Percentage percentage;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public final class PowerRecord implements androidx.health.connect.client.records.Record {
+    ctor public PowerRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.PowerRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.util.List<androidx.health.connect.client.records.PowerRecord.Sample> getSamples();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.util.List<androidx.health.connect.client.records.PowerRecord.Sample> samples;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.records.PowerRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Power> POWER_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Power> POWER_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Power> POWER_MIN;
+  }
+
+  public static final class PowerRecord.Companion {
+  }
+
+  public static final class PowerRecord.Sample {
+    ctor public PowerRecord.Sample(java.time.Instant time, androidx.health.connect.client.units.Power power);
+    method public androidx.health.connect.client.units.Power getPower();
+    method public java.time.Instant getTime();
+    property public final androidx.health.connect.client.units.Power power;
+    property public final java.time.Instant time;
+  }
+
+  public interface Record {
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    property public abstract androidx.health.connect.client.records.metadata.Metadata metadata;
+  }
+
+  public final class RelationToMeal {
+    field public static final String AFTER_MEAL = "after_meal";
+    field public static final String BEFORE_MEAL = "before_meal";
+    field public static final String FASTING = "fasting";
+    field public static final String GENERAL = "general";
+    field public static final androidx.health.connect.client.records.RelationToMeal INSTANCE;
+  }
+
+  public final class RespiratoryRateRecord implements androidx.health.connect.client.records.Record {
+    ctor public RespiratoryRateRecord(double rate, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public double getRate();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final double rate;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public final class RestingHeartRateRecord implements androidx.health.connect.client.records.Record {
+    ctor public RestingHeartRateRecord(long beatsPerMinute, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public long getBeatsPerMinute();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final long beatsPerMinute;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_MIN;
+    field public static final androidx.health.connect.client.records.RestingHeartRateRecord.Companion Companion;
+  }
+
+  public static final class RestingHeartRateRecord.Companion {
+  }
+
+  public final class SexualActivityRecord implements androidx.health.connect.client.records.Record {
+    ctor public SexualActivityRecord(optional String? protectionUsed, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public String? getProtectionUsed();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final String? protectionUsed;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public static final class SexualActivityRecord.Protection {
+    field public static final androidx.health.connect.client.records.SexualActivityRecord.Protection INSTANCE;
+    field public static final String PROTECTED = "protected";
+    field public static final String UNPROTECTED = "unprotected";
+  }
+
+  public final class SleepSessionRecord implements androidx.health.connect.client.records.Record {
+    ctor public SleepSessionRecord(optional String? title, optional String? notes, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public String? getNotes();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    method public String? getTitle();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final String? notes;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    property public final String? title;
+    field public static final androidx.health.connect.client.records.SleepSessionRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.time.Duration> SLEEP_DURATION_TOTAL;
+  }
+
+  public static final class SleepSessionRecord.Companion {
+  }
+
+  public final class SleepStageRecord implements androidx.health.connect.client.records.Record {
+    ctor public SleepStageRecord(String stage, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public String getStage();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final String stage;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+  }
+
+  public static final class SleepStageRecord.StageType {
+    field public static final String AWAKE = "awake";
+    field public static final String DEEP = "deep";
+    field public static final androidx.health.connect.client.records.SleepStageRecord.StageType INSTANCE;
+    field public static final String LIGHT = "light";
+    field public static final String OUT_OF_BED = "out_of_bed";
+    field public static final String REM = "rem";
+    field public static final String SLEEPING = "sleeping";
+    field public static final String UNKNOWN = "unknown";
+  }
+
+  public final class SpeedRecord implements androidx.health.connect.client.records.Record {
+    ctor public SpeedRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.SpeedRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.util.List<androidx.health.connect.client.records.SpeedRecord.Sample> getSamples();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.util.List<androidx.health.connect.client.records.SpeedRecord.Sample> samples;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.records.SpeedRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Velocity> SPEED_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Velocity> SPEED_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Velocity> SPEED_MIN;
+  }
+
+  public static final class SpeedRecord.Companion {
+  }
+
+  public static final class SpeedRecord.Sample {
+    ctor public SpeedRecord.Sample(java.time.Instant time, androidx.health.connect.client.units.Velocity speed);
+    method public androidx.health.connect.client.units.Velocity getSpeed();
+    method public java.time.Instant getTime();
+    property public final androidx.health.connect.client.units.Velocity speed;
+    property public final java.time.Instant time;
+  }
+
+  public final class StepsCadenceRecord implements androidx.health.connect.client.records.Record {
+    ctor public StepsCadenceRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.StepsCadenceRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.util.List<androidx.health.connect.client.records.StepsCadenceRecord.Sample> getSamples();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.util.List<androidx.health.connect.client.records.StepsCadenceRecord.Sample> samples;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.records.StepsCadenceRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RATE_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RATE_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RATE_MIN;
+  }
+
+  public static final class StepsCadenceRecord.Companion {
+  }
+
+  public static final class StepsCadenceRecord.Sample {
+    ctor public StepsCadenceRecord.Sample(java.time.Instant time, @FloatRange(from=0.0, to=10000.0) double rate);
+    method public double getRate();
+    method public java.time.Instant getTime();
+    property public final double rate;
+    property public final java.time.Instant time;
+  }
+
+  public final class StepsRecord implements androidx.health.connect.client.records.Record {
+    ctor public StepsRecord(long count, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public long getCount();
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public final long count;
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> COUNT_TOTAL;
+    field public static final androidx.health.connect.client.records.StepsRecord.Companion Companion;
+  }
+
+  public static final class StepsRecord.Companion {
+  }
+
+  public final class SwimmingStrokesRecord implements androidx.health.connect.client.records.Record {
+    ctor public SwimmingStrokesRecord(optional long count, String type, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public long getCount();
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    method public String getType();
+    property public final long count;
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    property public final String type;
+  }
+
+  public static final class SwimmingStrokesRecord.SwimmingType {
+    field public static final String BACKSTROKE = "backstroke";
+    field public static final String BREASTSTROKE = "breaststroke";
+    field public static final String BUTTERFLY = "butterfly";
+    field public static final String FREESTYLE = "freestyle";
+    field public static final androidx.health.connect.client.records.SwimmingStrokesRecord.SwimmingType INSTANCE;
+    field public static final String MIXED = "mixed";
+    field public static final String OTHER = "other";
+  }
+
+  public final class TotalCaloriesBurnedRecord implements androidx.health.connect.client.records.Record {
+    ctor public TotalCaloriesBurnedRecord(androidx.health.connect.client.units.Energy energy, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.units.Energy getEnergy();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public final androidx.health.connect.client.units.Energy energy;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.records.TotalCaloriesBurnedRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> ENERGY_TOTAL;
+  }
+
+  public static final class TotalCaloriesBurnedRecord.Companion {
+  }
+
+  public final class Vo2MaxRecord implements androidx.health.connect.client.records.Record {
+    ctor public Vo2MaxRecord(double vo2MillilitersPerMinuteKilogram, optional String? measurementMethod, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public String? getMeasurementMethod();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public double getVo2MillilitersPerMinuteKilogram();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final String? measurementMethod;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public final double vo2MillilitersPerMinuteKilogram;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public static final class Vo2MaxRecord.MeasurementMethod {
+    field public static final String COOPER_TEST = "cooper_test";
+    field public static final String HEART_RATE_RATIO = "heart_rate_ratio";
+    field public static final androidx.health.connect.client.records.Vo2MaxRecord.MeasurementMethod INSTANCE;
+    field public static final String METABOLIC_CART = "metabolic_cart";
+    field public static final String MULTISTAGE_FITNESS_TEST = "multistage_fitness_test";
+    field public static final String OTHER = "other";
+    field public static final String ROCKPORT_FITNESS_TEST = "rockport_fitness_test";
+  }
+
+  public final class WaistCircumferenceRecord implements androidx.health.connect.client.records.Record {
+    ctor public WaistCircumferenceRecord(androidx.health.connect.client.units.Length circumference, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.units.Length getCircumference();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final androidx.health.connect.client.units.Length circumference;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public final class WeightRecord implements androidx.health.connect.client.records.Record {
+    ctor public WeightRecord(androidx.health.connect.client.units.Mass weight, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public androidx.health.connect.client.units.Mass getWeight();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public final androidx.health.connect.client.units.Mass weight;
+    property public java.time.ZoneOffset? zoneOffset;
+    field public static final androidx.health.connect.client.records.WeightRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> WEIGHT_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> WEIGHT_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> WEIGHT_MIN;
+  }
+
+  public static final class WeightRecord.Companion {
+  }
+
+  public final class WheelchairPushesRecord implements androidx.health.connect.client.records.Record {
+    ctor public WheelchairPushesRecord(long count, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public long getCount();
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public final long count;
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> COUNT_TOTAL;
+    field public static final androidx.health.connect.client.records.WheelchairPushesRecord.Companion Companion;
+  }
+
+  public static final class WheelchairPushesRecord.Companion {
+  }
+
+}
+
+package androidx.health.connect.client.records.metadata {
+
+  public final class DataOrigin {
+    ctor public DataOrigin(String packageName);
+    method public String getPackageName();
+    property public final String packageName;
+  }
+
+  public final class Device {
+    ctor public Device(optional String? manufacturer, optional String? model, optional String? type);
+    method public String? getManufacturer();
+    method public String? getModel();
+    method public String? getType();
+    property public final String? manufacturer;
+    property public final String? model;
+    property public final String? type;
+  }
+
+  public final class DeviceTypes {
+    field public static final String CHEST_STRAP = "CHEST_STRAP";
+    field public static final String FITNESS_BAND = "FITNESS_BAND";
+    field public static final String HEAD_MOUNTED = "HEAD_MOUNTED";
+    field public static final androidx.health.connect.client.records.metadata.DeviceTypes INSTANCE;
+    field public static final String PHONE = "PHONE";
+    field public static final String RING = "RING";
+    field public static final String SCALE = "SCALE";
+    field public static final String SMART_DISPLAY = "SMART_DISPLAY";
+    field public static final String UNKNOWN = "UNKNOWN";
+    field public static final String WATCH = "WATCH";
+  }
+
+  public final class Metadata {
+    ctor public Metadata(optional String uid, optional androidx.health.connect.client.records.metadata.DataOrigin dataOrigin, optional java.time.Instant lastModifiedTime, optional String? clientRecordId, optional long clientRecordVersion, optional androidx.health.connect.client.records.metadata.Device? device);
+    method public String? getClientRecordId();
+    method public long getClientRecordVersion();
+    method public androidx.health.connect.client.records.metadata.DataOrigin getDataOrigin();
+    method public androidx.health.connect.client.records.metadata.Device? getDevice();
+    method public java.time.Instant getLastModifiedTime();
+    method public String getUid();
+    property public final String? clientRecordId;
+    property public final long clientRecordVersion;
+    property public final androidx.health.connect.client.records.metadata.DataOrigin dataOrigin;
+    property public final androidx.health.connect.client.records.metadata.Device? device;
+    property public final java.time.Instant lastModifiedTime;
+    property public final String uid;
+  }
+
+}
+
+package androidx.health.connect.client.request {
+
+  public final class AggregateGroupByDurationRequest {
+    ctor public AggregateGroupByDurationRequest(java.util.Set<? extends androidx.health.connect.client.aggregate.AggregateMetric<?>> metrics, androidx.health.connect.client.time.TimeRangeFilter timeRangeFilter, java.time.Duration timeRangeSlicer, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilter);
+  }
+
+  public final class AggregateGroupByPeriodRequest {
+    ctor public AggregateGroupByPeriodRequest(java.util.Set<? extends androidx.health.connect.client.aggregate.AggregateMetric<?>> metrics, androidx.health.connect.client.time.TimeRangeFilter timeRangeFilter, java.time.Period timeRangeSlicer, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilter);
+  }
+
+  public final class AggregateRequest {
+    ctor public AggregateRequest(java.util.Set<? extends androidx.health.connect.client.aggregate.AggregateMetric<?>> metrics, androidx.health.connect.client.time.TimeRangeFilter timeRangeFilter, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilter);
+  }
+
+  public final class ChangesTokenRequest {
+    ctor public ChangesTokenRequest(java.util.Set<? extends kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record>> recordTypes, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilters);
+  }
+
+  public final class ReadRecordsRequest<T extends androidx.health.connect.client.records.Record> {
+    ctor public ReadRecordsRequest(kotlin.reflect.KClass<T> recordType, androidx.health.connect.client.time.TimeRangeFilter timeRangeFilter, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilter, optional boolean ascendingOrder, optional int pageSize, optional String? pageToken);
+  }
+
+}
+
+package androidx.health.connect.client.response {
+
+  public final class ChangesResponse {
+    method public java.util.List<androidx.health.connect.client.changes.Change> getChanges();
+    method public boolean getChangesTokenExpired();
+    method public boolean getHasMore();
+    method public String getNextChangesToken();
+    property public final java.util.List<androidx.health.connect.client.changes.Change> changes;
+    property public final boolean changesTokenExpired;
+    property public final boolean hasMore;
+    property public final String nextChangesToken;
+  }
+
+  public final class InsertRecordsResponse {
+    method public java.util.List<java.lang.String> getRecordUidsList();
+    property public final java.util.List<java.lang.String> recordUidsList;
+  }
+
+  public final class ReadRecordResponse<T extends androidx.health.connect.client.records.Record> {
+    method public T getRecord();
+    property public final T record;
+  }
+
+  public final class ReadRecordsResponse<T extends androidx.health.connect.client.records.Record> {
+    method public String? getPageToken();
+    method public java.util.List<T> getRecords();
+    property public final String? pageToken;
+    property public final java.util.List<T> records;
+  }
+
+}
+
+package androidx.health.connect.client.time {
+
+  public final class TimeRangeFilter {
+    method public static androidx.health.connect.client.time.TimeRangeFilter after(java.time.Instant startTime);
+    method public static androidx.health.connect.client.time.TimeRangeFilter after(java.time.LocalDateTime startTime);
+    method public static androidx.health.connect.client.time.TimeRangeFilter before(java.time.Instant endTime);
+    method public static androidx.health.connect.client.time.TimeRangeFilter before(java.time.LocalDateTime endTime);
+    method public static androidx.health.connect.client.time.TimeRangeFilter between(java.time.Instant startTime, java.time.Instant endTime);
+    method public static androidx.health.connect.client.time.TimeRangeFilter between(java.time.LocalDateTime startTime, java.time.LocalDateTime endTime);
+    field public static final androidx.health.connect.client.time.TimeRangeFilter.Companion Companion;
+  }
+
+  public static final class TimeRangeFilter.Companion {
+    method public androidx.health.connect.client.time.TimeRangeFilter after(java.time.Instant startTime);
+    method public androidx.health.connect.client.time.TimeRangeFilter after(java.time.LocalDateTime startTime);
+    method public androidx.health.connect.client.time.TimeRangeFilter before(java.time.Instant endTime);
+    method public androidx.health.connect.client.time.TimeRangeFilter before(java.time.LocalDateTime endTime);
+    method public androidx.health.connect.client.time.TimeRangeFilter between(java.time.Instant startTime, java.time.Instant endTime);
+    method public androidx.health.connect.client.time.TimeRangeFilter between(java.time.LocalDateTime startTime, java.time.LocalDateTime endTime);
+  }
+
+}
+
+package androidx.health.connect.client.units {
+
+  public final class Energy implements java.lang.Comparable<androidx.health.connect.client.units.Energy> {
+    method public static androidx.health.connect.client.units.Energy calories(double value);
+    method public int compareTo(androidx.health.connect.client.units.Energy other);
+    method public double getCalories();
+    method public double getJoules();
+    method public double getKilocalories();
+    method public double getKilojoules();
+    method public static androidx.health.connect.client.units.Energy joules(double value);
+    method public static androidx.health.connect.client.units.Energy kilocalories(double value);
+    method public static androidx.health.connect.client.units.Energy kilojoules(double value);
+    property public final double inCalories;
+    property public final double inJoules;
+    property public final double inKilocalories;
+    property public final double inKilojoules;
+    field public static final androidx.health.connect.client.units.Energy.Companion Companion;
+  }
+
+  public static final class Energy.Companion {
+    method public androidx.health.connect.client.units.Energy calories(double value);
+    method public androidx.health.connect.client.units.Energy joules(double value);
+    method public androidx.health.connect.client.units.Energy kilocalories(double value);
+    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);
+    method public double getFeet();
+    method public double getInches();
+    method public double getKilometers();
+    method public double getMeters();
+    method public double getMiles();
+    method public static androidx.health.connect.client.units.Length inches(double value);
+    method public static androidx.health.connect.client.units.Length kilometers(double value);
+    method public static androidx.health.connect.client.units.Length meters(double value);
+    method public static androidx.health.connect.client.units.Length miles(double value);
+    property public final double inFeet;
+    property public final double inInches;
+    property public final double inKilometers;
+    property public final double inMeters;
+    property public final double inMiles;
+    field public static final androidx.health.connect.client.units.Length.Companion Companion;
+  }
+
+  public static final class Length.Companion {
+    method public androidx.health.connect.client.units.Length feet(double value);
+    method public androidx.health.connect.client.units.Length inches(double value);
+    method public androidx.health.connect.client.units.Length kilometers(double value);
+    method public androidx.health.connect.client.units.Length meters(double value);
+    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();
+    method public double getKilograms();
+    method public double getMicrograms();
+    method public double getMilligrams();
+    method public double getOunces();
+    method public double getPounds();
+    method public static androidx.health.connect.client.units.Mass grams(double value);
+    method public static androidx.health.connect.client.units.Mass kilograms(double value);
+    method public static androidx.health.connect.client.units.Mass micrograms(double value);
+    method public static androidx.health.connect.client.units.Mass milligrams(double value);
+    method public static androidx.health.connect.client.units.Mass ounces(double value);
+    method public static androidx.health.connect.client.units.Mass pounds(double value);
+    property public final double inGrams;
+    property public final double inKilograms;
+    property public final double inMicrograms;
+    property public final double inMilligrams;
+    property public final double inOunces;
+    property public final double inPounds;
+    field public static final androidx.health.connect.client.units.Mass.Companion Companion;
+  }
+
+  public static final class Mass.Companion {
+    method public androidx.health.connect.client.units.Mass grams(double value);
+    method public androidx.health.connect.client.units.Mass kilograms(double value);
+    method public androidx.health.connect.client.units.Mass micrograms(double value);
+    method public androidx.health.connect.client.units.Mass milligrams(double value);
+    method public androidx.health.connect.client.units.Mass ounces(double value);
+    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);
+    method public double getValue();
+    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();
+    method public double getWatts();
+    method public static androidx.health.connect.client.units.Power kilocaloriesPerDay(double value);
+    method public static androidx.health.connect.client.units.Power watts(double value);
+    property public final double inKilocaloriesPerDay;
+    property public final double inWatts;
+    field public static final androidx.health.connect.client.units.Power.Companion Companion;
+  }
+
+  public static final class Power.Companion {
+    method public androidx.health.connect.client.units.Power kilocaloriesPerDay(double value);
+    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();
+    method public static androidx.health.connect.client.units.Pressure millimetersOfMercury(double value);
+    property public final double inMillimetersOfMercury;
+    field public static final androidx.health.connect.client.units.Pressure.Companion Companion;
+  }
+
+  public static final class Pressure.Companion {
+    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);
+    method public static androidx.health.connect.client.units.Temperature fahrenheit(double value);
+    method public double getCelsius();
+    method public double getFahrenheit();
+    property public final double inCelsius;
+    property public final double inFahrenheit;
+    field public static final androidx.health.connect.client.units.Temperature.Companion Companion;
+  }
+
+  public static final class Temperature.Companion {
+    method public androidx.health.connect.client.units.Temperature celsius(double value);
+    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();
+    method public double getMetersPerSecond();
+    method public double getMilesPerHour();
+    method public static androidx.health.connect.client.units.Velocity kilometersPerHour(double value);
+    method public static androidx.health.connect.client.units.Velocity metersPerSecond(double value);
+    method public static androidx.health.connect.client.units.Velocity milesPerHour(double value);
+    property public final double inKilometersPerHour;
+    property public final double inMetersPerSecond;
+    property public final double inMilesPerHour;
+    field public static final androidx.health.connect.client.units.Velocity.Companion Companion;
+  }
+
+  public static final class Velocity.Companion {
+    method public androidx.health.connect.client.units.Velocity kilometersPerHour(double value);
+    method public androidx.health.connect.client.units.Velocity metersPerSecond(double value);
+    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);
+    method public double getFluidOuncesUs();
+    method public double getLiters();
+    method public double getMilliliters();
+    method public static androidx.health.connect.client.units.Volume liters(double value);
+    method public static androidx.health.connect.client.units.Volume milliliters(double value);
+    property public final double inFluidOuncesUs;
+    property public final double inLiters;
+    property public final double inMilliliters;
+    field public static final androidx.health.connect.client.units.Volume.Companion Companion;
+  }
+
+  public static final class Volume.Companion {
+    method public androidx.health.connect.client.units.Volume fluidOuncesUs(double value);
+    method public androidx.health.connect.client.units.Volume liters(double value);
+    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
new file mode 100644
index 0000000..e0d7e87
--- /dev/null
+++ b/health/connect/connect-client/api/public_plus_experimental_current.txt
@@ -0,0 +1,1607 @@
+// Signature format: 4.0
+package androidx.health.connect.client {
+
+  public interface HealthConnectClient {
+    method public suspend Object? aggregate(androidx.health.connect.client.request.AggregateRequest request, kotlin.coroutines.Continuation<? super androidx.health.connect.client.aggregate.AggregationResult>);
+    method public suspend Object? aggregateGroupByDuration(androidx.health.connect.client.request.AggregateGroupByDurationRequest request, kotlin.coroutines.Continuation<? super java.util.List<? extends androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration>>);
+    method public suspend Object? aggregateGroupByPeriod(androidx.health.connect.client.request.AggregateGroupByPeriodRequest request, kotlin.coroutines.Continuation<? super java.util.List<? extends androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod>>);
+    method public suspend Object? deleteRecords(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType, java.util.List<java.lang.String> uidsList, java.util.List<java.lang.String> clientRecordIdsList, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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 androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context, optional java.util.List<java.lang.String> packageNames);
+    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 isAvailable(android.content.Context context, optional java.util.List<java.lang.String> packageNames);
+    method public default static boolean isAvailable(android.content.Context context);
+    method public suspend <T extends androidx.health.connect.client.records.Record> Object? readRecord(kotlin.reflect.KClass<T> recordType, String uid, 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 suspend Object? updateRecords(java.util.List<? extends androidx.health.connect.client.records.Record> records, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    property public abstract androidx.health.connect.client.PermissionController permissionController;
+    field public static final androidx.health.connect.client.HealthConnectClient.Companion Companion;
+  }
+
+  public static final class HealthConnectClient.Companion {
+    method public androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context, optional java.util.List<java.lang.String> packageNames);
+    method public androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context);
+    method public boolean isAvailable(android.content.Context context, optional java.util.List<java.lang.String> packageNames);
+    method public boolean isAvailable(android.content.Context context);
+  }
+
+  public interface PermissionController {
+    method public androidx.activity.result.contract.ActivityResultContract<java.util.Set<androidx.health.connect.client.permission.HealthPermission>,java.util.Set<androidx.health.connect.client.permission.HealthPermission>> createRequestPermissionActivityContract();
+    method public suspend Object? getGrantedPermissions(java.util.Set<androidx.health.connect.client.permission.HealthPermission> permissions, kotlin.coroutines.Continuation<? super java.util.Set<? extends androidx.health.connect.client.permission.HealthPermission>>);
+    method public suspend Object? revokeAllPermissions(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+  }
+
+}
+
+package androidx.health.connect.client.aggregate {
+
+  public final class AggregateMetric<T> {
+  }
+
+  public final class AggregationResult {
+    method public operator boolean contains(androidx.health.connect.client.aggregate.AggregateMetric<?> metric);
+    method public operator <T> T? get(androidx.health.connect.client.aggregate.AggregateMetric<? extends T> metric);
+    method public java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> getDataOrigins();
+    method @Deprecated public <T> T? getMetric(androidx.health.connect.client.aggregate.AggregateMetric<? extends T> metric);
+    method @Deprecated public boolean hasMetric(androidx.health.connect.client.aggregate.AggregateMetric<?> metric);
+    property public final java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOrigins;
+  }
+
+  public final class AggregationResultGroupedByDuration {
+    method public java.time.Instant getEndTime();
+    method public androidx.health.connect.client.aggregate.AggregationResult getResult();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset getZoneOffset();
+    property public final java.time.Instant endTime;
+    property public final androidx.health.connect.client.aggregate.AggregationResult result;
+    property public final java.time.Instant startTime;
+    property public final java.time.ZoneOffset zoneOffset;
+  }
+
+  public final class AggregationResultGroupedByPeriod {
+    method public java.time.LocalDateTime getEndTime();
+    method public androidx.health.connect.client.aggregate.AggregationResult getResult();
+    method public java.time.LocalDateTime getStartTime();
+    property public final java.time.LocalDateTime endTime;
+    property public final androidx.health.connect.client.aggregate.AggregationResult result;
+    property public final java.time.LocalDateTime startTime;
+  }
+
+}
+
+package androidx.health.connect.client.changes {
+
+  public interface Change {
+  }
+
+  public final class DeletionChange implements androidx.health.connect.client.changes.Change {
+    method public String getUid();
+    property public final String uid;
+  }
+
+  public final class UpsertionChange implements androidx.health.connect.client.changes.Change {
+    method public androidx.health.connect.client.records.Record getRecord();
+    property public final androidx.health.connect.client.records.Record record;
+  }
+
+}
+
+package androidx.health.connect.client.permission {
+
+  public final class HealthDataRequestPermissionsKt {
+  }
+
+  public final class HealthPermission {
+    method public static androidx.health.connect.client.permission.HealthPermission createReadPermission(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType);
+    method public static androidx.health.connect.client.permission.HealthPermission createWritePermission(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType);
+    field public static final androidx.health.connect.client.permission.HealthPermission.Companion Companion;
+  }
+
+  public static final class HealthPermission.Companion {
+    method public androidx.health.connect.client.permission.HealthPermission createReadPermission(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType);
+    method public androidx.health.connect.client.permission.HealthPermission createWritePermission(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType);
+  }
+
+}
+
+package androidx.health.connect.client.records {
+
+  public final class ActiveCaloriesBurnedRecord implements androidx.health.connect.client.records.Record {
+    ctor public ActiveCaloriesBurnedRecord(androidx.health.connect.client.units.Energy energy, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.units.Energy getEnergy();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public final androidx.health.connect.client.units.Energy energy;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> ACTIVE_CALORIES_TOTAL;
+    field public static final androidx.health.connect.client.records.ActiveCaloriesBurnedRecord.Companion Companion;
+  }
+
+  public static final class ActiveCaloriesBurnedRecord.Companion {
+  }
+
+  public final class BasalBodyTemperatureRecord implements androidx.health.connect.client.records.Record {
+    ctor public BasalBodyTemperatureRecord(androidx.health.connect.client.units.Temperature temperature, optional String? measurementLocation, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public String? getMeasurementLocation();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public androidx.health.connect.client.units.Temperature getTemperature();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final String? measurementLocation;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final androidx.health.connect.client.units.Temperature temperature;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public final class BasalMetabolicRateRecord implements androidx.health.connect.client.records.Record {
+    ctor public BasalMetabolicRateRecord(androidx.health.connect.client.units.Power basalMetabolicRate, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.units.Power getBasalMetabolicRate();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final androidx.health.connect.client.units.Power basalMetabolicRate;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> BASAL_CALORIES_TOTAL;
+    field public static final androidx.health.connect.client.records.BasalMetabolicRateRecord.Companion Companion;
+  }
+
+  public static final class BasalMetabolicRateRecord.Companion {
+  }
+
+  public final class BloodGlucoseRecord implements androidx.health.connect.client.records.Record {
+    ctor public BloodGlucoseRecord(double levelMillimolesPerLiter, optional String? specimenSource, optional String? mealType, optional String? relationToMeal, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public double getLevelMillimolesPerLiter();
+    method public String? getMealType();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public String? getRelationToMeal();
+    method public String? getSpecimenSource();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final double levelMillimolesPerLiter;
+    property public final String? mealType;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final String? relationToMeal;
+    property public final String? specimenSource;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public static final class BloodGlucoseRecord.SpecimenSource {
+    field public static final String CAPILLARY_BLOOD = "capillary_blood";
+    field public static final androidx.health.connect.client.records.BloodGlucoseRecord.SpecimenSource INSTANCE;
+    field public static final String INTERSTITIAL_FLUID = "interstitial_fluid";
+    field public static final String PLASMA = "plasma";
+    field public static final String SERUM = "serum";
+    field public static final String TEARS = "tears";
+    field public static final String WHOLE_BLOOD = "whole_blood";
+  }
+
+  public final class BloodPressureRecord implements androidx.health.connect.client.records.Record {
+    ctor public BloodPressureRecord(androidx.health.connect.client.units.Pressure systolic, androidx.health.connect.client.units.Pressure diastolic, optional String? bodyPosition, optional String? measurementLocation, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public String? getBodyPosition();
+    method public androidx.health.connect.client.units.Pressure getDiastolic();
+    method public String? getMeasurementLocation();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public androidx.health.connect.client.units.Pressure getSystolic();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final String? bodyPosition;
+    property public final androidx.health.connect.client.units.Pressure diastolic;
+    property public final String? measurementLocation;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final androidx.health.connect.client.units.Pressure systolic;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+    field public static final androidx.health.connect.client.records.BloodPressureRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> DIASTOLIC_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> DIASTOLIC_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> DIASTOLIC_MIN;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> SYSTOLIC_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> SYSTOLIC_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> SYSTOLIC_MIN;
+  }
+
+  public static final class BloodPressureRecord.Companion {
+  }
+
+  public static final class BloodPressureRecord.MeasurementLocation {
+    field public static final androidx.health.connect.client.records.BloodPressureRecord.MeasurementLocation INSTANCE;
+    field public static final String LEFT_UPPER_ARM = "left_upper_arm";
+    field public static final String LEFT_WRIST = "left_wrist";
+    field public static final String RIGHT_UPPER_ARM = "right_upper_arm";
+    field public static final String RIGHT_WRIST = "right_wrist";
+  }
+
+  public final class BodyFatRecord implements androidx.health.connect.client.records.Record {
+    ctor public BodyFatRecord(androidx.health.connect.client.units.Percentage percentage, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public androidx.health.connect.client.units.Percentage getPercentage();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final androidx.health.connect.client.units.Percentage percentage;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public final class BodyPosition {
+    field public static final androidx.health.connect.client.records.BodyPosition INSTANCE;
+    field public static final String LYING_DOWN = "lying_down";
+    field public static final String RECLINING = "reclining";
+    field public static final String SITTING_DOWN = "sitting_down";
+    field public static final String STANDING_UP = "standing_up";
+  }
+
+  public final class BodyTemperatureMeasurementLocation {
+    field public static final String ARMPIT = "armpit";
+    field public static final String EAR = "ear";
+    field public static final String FINGER = "finger";
+    field public static final String FOREHEAD = "forehead";
+    field public static final androidx.health.connect.client.records.BodyTemperatureMeasurementLocation INSTANCE;
+    field public static final String MOUTH = "mouth";
+    field public static final String RECTUM = "rectum";
+    field public static final String TEMPORAL_ARTERY = "temporal_artery";
+    field public static final String TOE = "toe";
+    field public static final String VAGINA = "vagina";
+    field public static final String WRIST = "wrist";
+  }
+
+  public final class BodyTemperatureRecord implements androidx.health.connect.client.records.Record {
+    ctor public BodyTemperatureRecord(androidx.health.connect.client.units.Temperature temperature, optional String? measurementLocation, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public String? getMeasurementLocation();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public androidx.health.connect.client.units.Temperature getTemperature();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final String? measurementLocation;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final androidx.health.connect.client.units.Temperature temperature;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public final class BoneMassRecord implements androidx.health.connect.client.records.Record {
+    ctor public BoneMassRecord(androidx.health.connect.client.units.Mass mass, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.units.Mass getMass();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final androidx.health.connect.client.units.Mass mass;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public final class CervicalMucusRecord implements androidx.health.connect.client.records.Record {
+    ctor public CervicalMucusRecord(optional String? appearance, optional String? sensation, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public String? getAppearance();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public String? getSensation();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final String? appearance;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final String? sensation;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public static final class CervicalMucusRecord.Appearance {
+    field public static final String CLEAR = "clear";
+    field public static final String CREAMY = "creamy";
+    field public static final String DRY = "dry";
+    field public static final androidx.health.connect.client.records.CervicalMucusRecord.Appearance INSTANCE;
+    field public static final String STICKY = "sticky";
+    field public static final String WATERY = "watery";
+  }
+
+  public static final class CervicalMucusRecord.Sensation {
+    field public static final String HEAVY = "heavy";
+    field public static final androidx.health.connect.client.records.CervicalMucusRecord.Sensation INSTANCE;
+    field public static final String LIGHT = "light";
+    field public static final String MEDIUM = "medium";
+  }
+
+  public final class CyclingPedalingCadenceRecord implements androidx.health.connect.client.records.Record {
+    ctor public CyclingPedalingCadenceRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.CyclingPedalingCadenceRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.util.List<androidx.health.connect.client.records.CyclingPedalingCadenceRecord.Sample> getSamples();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.util.List<androidx.health.connect.client.records.CyclingPedalingCadenceRecord.Sample> samples;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.records.CyclingPedalingCadenceRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RPM_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RPM_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RPM_MIN;
+  }
+
+  public static final class CyclingPedalingCadenceRecord.Companion {
+  }
+
+  public static final class CyclingPedalingCadenceRecord.Sample {
+    ctor public CyclingPedalingCadenceRecord.Sample(java.time.Instant time, @FloatRange(from=0.0, to=10000.0) double revolutionsPerMinute);
+    method public double getRevolutionsPerMinute();
+    method public java.time.Instant getTime();
+    property public final double revolutionsPerMinute;
+    property public final java.time.Instant time;
+  }
+
+  public final class DistanceRecord implements androidx.health.connect.client.records.Record {
+    ctor public DistanceRecord(androidx.health.connect.client.units.Length distance, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.units.Length getDistance();
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public final androidx.health.connect.client.units.Length distance;
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.records.DistanceRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> DISTANCE_TOTAL;
+  }
+
+  public static final class DistanceRecord.Companion {
+  }
+
+  public final class ElevationGainedRecord implements androidx.health.connect.client.records.Record {
+    ctor public ElevationGainedRecord(androidx.health.connect.client.units.Length elevation, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.units.Length getElevation();
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public final androidx.health.connect.client.units.Length elevation;
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.records.ElevationGainedRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> ELEVATION_GAINED_TOTAL;
+  }
+
+  public static final class ElevationGainedRecord.Companion {
+  }
+
+  public final class ExerciseEventRecord implements androidx.health.connect.client.records.Record {
+    ctor public ExerciseEventRecord(String eventType, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public String getEventType();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public final String eventType;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+  }
+
+  public static final class ExerciseEventRecord.EventType {
+    field public static final androidx.health.connect.client.records.ExerciseEventRecord.EventType INSTANCE;
+    field public static final String PAUSE = "pause";
+    field public static final String REST = "rest";
+  }
+
+  public final class ExerciseLapRecord implements androidx.health.connect.client.records.Record {
+    ctor public ExerciseLapRecord(optional androidx.health.connect.client.units.Length? length, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.units.Length? getLength();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public final androidx.health.connect.client.units.Length? length;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+  }
+
+  public final class ExerciseRepetitionsRecord implements androidx.health.connect.client.records.Record {
+    ctor public ExerciseRepetitionsRecord(long count, String type, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public long getCount();
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    method public String getType();
+    property public final long count;
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    property public final String type;
+  }
+
+  public static final class ExerciseRepetitionsRecord.ExerciseType {
+    field public static final String ARM_CURL = "arm_curl";
+    field public static final String BACK_EXTENSION = "back_extension";
+    field public static final String BALL_SLAM = "ball_slam";
+    field public static final String BENCH_PRESS = "bench_press";
+    field public static final String BURPEE = "burpee";
+    field public static final String CRUNCH = "crunch";
+    field public static final String DEADLIFT = "deadlift";
+    field public static final String DOUBLE_ARM_TRICEPS_EXTENSION = "double_arm_triceps_extension";
+    field public static final String DUMBBELL_ROW = "dumbbell_row";
+    field public static final String FRONT_RAISE = "front_raise";
+    field public static final String HIP_THRUST = "hip_thrust";
+    field public static final String HULA_HOOP = "hula_hoop";
+    field public static final androidx.health.connect.client.records.ExerciseRepetitionsRecord.ExerciseType INSTANCE;
+    field public static final String JUMPING_JACK = "jumping_jack";
+    field public static final String JUMP_ROPE = "jump_rope";
+    field public static final String KETTLEBELL_SWING = "kettlebell_swing";
+    field public static final String LATERAL_RAISE = "lateral_raise";
+    field public static final String LAT_PULL_DOWN = "lat_pull_down";
+    field public static final String LEG_CURL = "leg_curl";
+    field public static final String LEG_EXTENSION = "leg_extension";
+    field public static final String LEG_PRESS = "leg_press";
+    field public static final String LEG_RAISE = "leg_raise";
+    field public static final String LUNGE = "lunge";
+    field public static final String MOUNTAIN_CLIMBER = "mountain_climber";
+    field public static final String PLANK = "plank";
+    field public static final String PULL_UP = "pull_up";
+    field public static final String PUNCH = "punch";
+    field public static final String SHOULDER_PRESS = "shoulder_press";
+    field public static final String SINGLE_ARM_TRICEPS_EXTENSION = "single_arm_triceps_extension";
+    field public static final String SIT_UP = "sit_up";
+    field public static final String SQUAT = "squat";
+  }
+
+  public final class ExerciseSessionRecord implements androidx.health.connect.client.records.Record {
+    ctor public ExerciseSessionRecord(String exerciseType, optional String? title, optional String? notes, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public String getExerciseType();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public String? getNotes();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    method public String? getTitle();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public final String exerciseType;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final String? notes;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    property public final String? title;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.time.Duration> ACTIVE_TIME_TOTAL;
+    field public static final androidx.health.connect.client.records.ExerciseSessionRecord.Companion Companion;
+  }
+
+  public static final class ExerciseSessionRecord.Companion {
+  }
+
+  public static final class ExerciseSessionRecord.ExerciseType {
+    field public static final String BACK_EXTENSION = "back_extension";
+    field public static final String BADMINTON = "badminton";
+    field public static final String BARBELL_SHOULDER_PRESS = "barbell_shoulder_press";
+    field public static final String BASEBALL = "baseball";
+    field public static final String BASKETBALL = "basketball";
+    field public static final String BENCH_PRESS = "bench_press";
+    field public static final String BENCH_SIT_UP = "bench_sit_up";
+    field public static final String BIKING = "biking";
+    field public static final String BIKING_STATIONARY = "biking_stationary";
+    field public static final String BOOT_CAMP = "boot_camp";
+    field public static final String BOXING = "boxing";
+    field public static final String BURPEE = "burpee";
+    field public static final String CALISTHENICS = "calisthenics";
+    field public static final String CRICKET = "cricket";
+    field public static final String CRUNCH = "crunch";
+    field public static final String DANCING = "dancing";
+    field public static final String DEADLIFT = "deadlift";
+    field public static final String DUMBBELL_CURL_LEFT_ARM = "dumbbell_curl_left_arm";
+    field public static final String DUMBBELL_CURL_RIGHT_ARM = "dumbbell_curl_right_arm";
+    field public static final String DUMBBELL_FRONT_RAISE = "dumbbell_front_raise";
+    field public static final String DUMBBELL_LATERAL_RAISE = "dumbbell_lateral_raise";
+    field public static final String DUMBBELL_TRICEPS_EXTENSION_LEFT_ARM = "dumbbell_triceps_extension_left_arm";
+    field public static final String DUMBBELL_TRICEPS_EXTENSION_RIGHT_ARM = "dumbbell_triceps_extension_right_arm";
+    field public static final String DUMBBELL_TRICEPS_EXTENSION_TWO_ARM = "dumbbell_triceps_extension_two_arm";
+    field public static final String ELLIPTICAL = "elliptical";
+    field public static final String EXERCISE_CLASS = "exercise_class";
+    field public static final String FENCING = "fencing";
+    field public static final String FOOTBALL_AMERICAN = "football_american";
+    field public static final String FOOTBALL_AUSTRALIAN = "football_australian";
+    field public static final String FORWARD_TWIST = "forward_twist";
+    field public static final String FRISBEE_DISC = "frisbee_disc";
+    field public static final String GOLF = "golf";
+    field public static final String GUIDED_BREATHING = "guided_breathing";
+    field public static final String GYMNASTICS = "gymnastics";
+    field public static final String HANDBALL = "handball";
+    field public static final String HIGH_INTENSITY_INTERVAL_TRAINING = "high_intensity_interval_training";
+    field public static final String HIKING = "hiking";
+    field public static final String ICE_HOCKEY = "ice_hockey";
+    field public static final String ICE_SKATING = "ice_skating";
+    field public static final androidx.health.connect.client.records.ExerciseSessionRecord.ExerciseType INSTANCE;
+    field public static final String JUMPING_JACK = "jumping_jack";
+    field public static final String JUMP_ROPE = "jump_rope";
+    field public static final String LAT_PULL_DOWN = "lat_pull_down";
+    field public static final String LUNGE = "lunge";
+    field public static final String MARTIAL_ARTS = "martial_arts";
+    field public static final String MEDITATION = "meditation";
+    field public static final String PADDLING = "paddling";
+    field public static final String PARA_GLIDING = "para_gliding";
+    field public static final String PILATES = "pilates";
+    field public static final String PLANK = "plank";
+    field public static final String RACQUETBALL = "racquetball";
+    field public static final String ROCK_CLIMBING = "rock_climbing";
+    field public static final String ROLLER_HOCKEY = "roller_hockey";
+    field public static final String ROWING = "rowing";
+    field public static final String ROWING_MACHINE = "rowing_machine";
+    field public static final String RUGBY = "rugby";
+    field public static final String RUNNING = "running";
+    field public static final String RUNNING_TREADMILL = "running_treadmill";
+    field public static final String SAILING = "sailing";
+    field public static final String SCUBA_DIVING = "scuba_diving";
+    field public static final String SKATING = "skating";
+    field public static final String SKIING = "skiing";
+    field public static final String SNOWBOARDING = "snowboarding";
+    field public static final String SNOWSHOEING = "snowshoeing";
+    field public static final String SOCCER = "soccer";
+    field public static final String SOFTBALL = "softball";
+    field public static final String SQUASH = "squash";
+    field public static final String SQUAT = "squat";
+    field public static final String STAIR_CLIMBING = "stair_climbing";
+    field public static final String STAIR_CLIMBING_MACHINE = "stair_climbing_machine";
+    field public static final String STRENGTH_TRAINING = "strength_training";
+    field public static final String STRETCHING = "stretching";
+    field public static final String SURFING = "surfing";
+    field public static final String SWIMMING_OPEN_WATER = "swimming_open_water";
+    field public static final String SWIMMING_POOL = "swimming_pool";
+    field public static final String TABLE_TENNIS = "table_tennis";
+    field public static final String TENNIS = "tennis";
+    field public static final String UPPER_TWIST = "upper_twist";
+    field public static final String VOLLEYBALL = "volleyball";
+    field public static final String WALKING = "walking";
+    field public static final String WATER_POLO = "water_polo";
+    field public static final String WEIGHTLIFTING = "weightlifting";
+    field public static final String WHEELCHAIR = "wheelchair";
+    field public static final String WORKOUT = "workout";
+    field public static final String YOGA = "yoga";
+  }
+
+  public final class FloorsClimbedRecord implements androidx.health.connect.client.records.Record {
+    ctor public FloorsClimbedRecord(double floors, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public double getFloors();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public final double floors;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.records.FloorsClimbedRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> FLOORS_CLIMBED_TOTAL;
+  }
+
+  public static final class FloorsClimbedRecord.Companion {
+  }
+
+  public final class HeartRateRecord implements androidx.health.connect.client.records.Record {
+    ctor public HeartRateRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.HeartRateRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.util.List<androidx.health.connect.client.records.HeartRateRecord.Sample> getSamples();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.util.List<androidx.health.connect.client.records.HeartRateRecord.Sample> samples;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_MIN;
+    field public static final androidx.health.connect.client.records.HeartRateRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> MEASUREMENTS_COUNT;
+  }
+
+  public static final class HeartRateRecord.Companion {
+  }
+
+  public static final class HeartRateRecord.Sample {
+    ctor public HeartRateRecord.Sample(java.time.Instant time, @IntRange(from=1L, to=300L) long beatsPerMinute);
+    method public long getBeatsPerMinute();
+    method public java.time.Instant getTime();
+    property public final long beatsPerMinute;
+    property public final java.time.Instant time;
+  }
+
+  public final class HeightRecord implements androidx.health.connect.client.records.Record {
+    ctor public HeightRecord(androidx.health.connect.client.units.Length height, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.units.Length getHeight();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final androidx.health.connect.client.units.Length height;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+    field public static final androidx.health.connect.client.records.HeightRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> HEIGHT_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> HEIGHT_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> HEIGHT_MIN;
+  }
+
+  public static final class HeightRecord.Companion {
+  }
+
+  public final class HipCircumferenceRecord implements androidx.health.connect.client.records.Record {
+    ctor public HipCircumferenceRecord(androidx.health.connect.client.units.Length circumference, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.units.Length getCircumference();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final androidx.health.connect.client.units.Length circumference;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public final class HydrationRecord implements androidx.health.connect.client.records.Record {
+    ctor public HydrationRecord(androidx.health.connect.client.units.Volume volume, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    method public androidx.health.connect.client.units.Volume getVolume();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    property public final androidx.health.connect.client.units.Volume volume;
+    field public static final androidx.health.connect.client.records.HydrationRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Volume> VOLUME_TOTAL;
+  }
+
+  public static final class HydrationRecord.Companion {
+  }
+
+  public final class LeanBodyMassRecord implements androidx.health.connect.client.records.Record {
+    ctor public LeanBodyMassRecord(androidx.health.connect.client.units.Mass mass, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.units.Mass getMass();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final androidx.health.connect.client.units.Mass mass;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public final class MealType {
+    field public static final String BREAKFAST = "breakfast";
+    field public static final String DINNER = "dinner";
+    field public static final androidx.health.connect.client.records.MealType INSTANCE;
+    field public static final String LUNCH = "lunch";
+    field public static final String SNACK = "snack";
+    field public static final String UNKNOWN = "unknown";
+  }
+
+  public final class MenstruationFlowRecord implements androidx.health.connect.client.records.Record {
+    ctor public MenstruationFlowRecord(optional String? flow, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public String? getFlow();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final String? flow;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public static final class MenstruationFlowRecord.Flow {
+    field public static final String HEAVY = "heavy";
+    field public static final androidx.health.connect.client.records.MenstruationFlowRecord.Flow INSTANCE;
+    field public static final String LIGHT = "light";
+    field public static final String MEDIUM = "medium";
+    field public static final String SPOTTING = "spotting";
+  }
+
+  public final class NutritionRecord implements androidx.health.connect.client.records.Record {
+    ctor public NutritionRecord(optional androidx.health.connect.client.units.Mass? biotin, optional androidx.health.connect.client.units.Mass? caffeine, optional androidx.health.connect.client.units.Mass? calcium, optional androidx.health.connect.client.units.Energy? energy, optional androidx.health.connect.client.units.Energy? energyFromFat, optional androidx.health.connect.client.units.Mass? chloride, optional androidx.health.connect.client.units.Mass? cholesterol, optional androidx.health.connect.client.units.Mass? chromium, optional androidx.health.connect.client.units.Mass? copper, optional androidx.health.connect.client.units.Mass? dietaryFiber, optional androidx.health.connect.client.units.Mass? folate, optional androidx.health.connect.client.units.Mass? folicAcid, optional androidx.health.connect.client.units.Mass? iodine, optional androidx.health.connect.client.units.Mass? iron, optional androidx.health.connect.client.units.Mass? magnesium, optional androidx.health.connect.client.units.Mass? manganese, optional androidx.health.connect.client.units.Mass? molybdenum, optional androidx.health.connect.client.units.Mass? monounsaturatedFat, optional androidx.health.connect.client.units.Mass? niacin, optional androidx.health.connect.client.units.Mass? pantothenicAcid, optional androidx.health.connect.client.units.Mass? phosphorus, optional androidx.health.connect.client.units.Mass? polyunsaturatedFat, optional androidx.health.connect.client.units.Mass? potassium, optional androidx.health.connect.client.units.Mass? protein, optional androidx.health.connect.client.units.Mass? riboflavin, optional androidx.health.connect.client.units.Mass? saturatedFat, optional androidx.health.connect.client.units.Mass? selenium, optional androidx.health.connect.client.units.Mass? sodium, optional androidx.health.connect.client.units.Mass? sugar, optional androidx.health.connect.client.units.Mass? thiamin, optional androidx.health.connect.client.units.Mass? totalCarbohydrate, optional androidx.health.connect.client.units.Mass? totalFat, optional androidx.health.connect.client.units.Mass? transFat, optional androidx.health.connect.client.units.Mass? unsaturatedFat, optional androidx.health.connect.client.units.Mass? vitaminA, optional androidx.health.connect.client.units.Mass? vitaminB12, optional androidx.health.connect.client.units.Mass? vitaminB6, optional androidx.health.connect.client.units.Mass? vitaminC, optional androidx.health.connect.client.units.Mass? vitaminD, optional androidx.health.connect.client.units.Mass? vitaminE, optional androidx.health.connect.client.units.Mass? vitaminK, optional androidx.health.connect.client.units.Mass? zinc, optional String? name, optional String? mealType, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.units.Mass? getBiotin();
+    method public androidx.health.connect.client.units.Mass? getCaffeine();
+    method public androidx.health.connect.client.units.Mass? getCalcium();
+    method public androidx.health.connect.client.units.Mass? getChloride();
+    method public androidx.health.connect.client.units.Mass? getCholesterol();
+    method public androidx.health.connect.client.units.Mass? getChromium();
+    method public androidx.health.connect.client.units.Mass? getCopper();
+    method public androidx.health.connect.client.units.Mass? getDietaryFiber();
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.units.Energy? getEnergy();
+    method public androidx.health.connect.client.units.Energy? getEnergyFromFat();
+    method public androidx.health.connect.client.units.Mass? getFolate();
+    method public androidx.health.connect.client.units.Mass? getFolicAcid();
+    method public androidx.health.connect.client.units.Mass? getIodine();
+    method public androidx.health.connect.client.units.Mass? getIron();
+    method public androidx.health.connect.client.units.Mass? getMagnesium();
+    method public androidx.health.connect.client.units.Mass? getManganese();
+    method public String? getMealType();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public androidx.health.connect.client.units.Mass? getMolybdenum();
+    method public androidx.health.connect.client.units.Mass? getMonounsaturatedFat();
+    method public String? getName();
+    method public androidx.health.connect.client.units.Mass? getNiacin();
+    method public androidx.health.connect.client.units.Mass? getPantothenicAcid();
+    method public androidx.health.connect.client.units.Mass? getPhosphorus();
+    method public androidx.health.connect.client.units.Mass? getPolyunsaturatedFat();
+    method public androidx.health.connect.client.units.Mass? getPotassium();
+    method public androidx.health.connect.client.units.Mass? getProtein();
+    method public androidx.health.connect.client.units.Mass? getRiboflavin();
+    method public androidx.health.connect.client.units.Mass? getSaturatedFat();
+    method public androidx.health.connect.client.units.Mass? getSelenium();
+    method public androidx.health.connect.client.units.Mass? getSodium();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    method public androidx.health.connect.client.units.Mass? getSugar();
+    method public androidx.health.connect.client.units.Mass? getThiamin();
+    method public androidx.health.connect.client.units.Mass? getTotalCarbohydrate();
+    method public androidx.health.connect.client.units.Mass? getTotalFat();
+    method public androidx.health.connect.client.units.Mass? getTransFat();
+    method public androidx.health.connect.client.units.Mass? getUnsaturatedFat();
+    method public androidx.health.connect.client.units.Mass? getVitaminA();
+    method public androidx.health.connect.client.units.Mass? getVitaminB12();
+    method public androidx.health.connect.client.units.Mass? getVitaminB6();
+    method public androidx.health.connect.client.units.Mass? getVitaminC();
+    method public androidx.health.connect.client.units.Mass? getVitaminD();
+    method public androidx.health.connect.client.units.Mass? getVitaminE();
+    method public androidx.health.connect.client.units.Mass? getVitaminK();
+    method public androidx.health.connect.client.units.Mass? getZinc();
+    property public final androidx.health.connect.client.units.Mass? biotin;
+    property public final androidx.health.connect.client.units.Mass? caffeine;
+    property public final androidx.health.connect.client.units.Mass? calcium;
+    property public final androidx.health.connect.client.units.Mass? chloride;
+    property public final androidx.health.connect.client.units.Mass? cholesterol;
+    property public final androidx.health.connect.client.units.Mass? chromium;
+    property public final androidx.health.connect.client.units.Mass? copper;
+    property public final androidx.health.connect.client.units.Mass? dietaryFiber;
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public final androidx.health.connect.client.units.Energy? energy;
+    property public final androidx.health.connect.client.units.Energy? energyFromFat;
+    property public final androidx.health.connect.client.units.Mass? folate;
+    property public final androidx.health.connect.client.units.Mass? folicAcid;
+    property public final androidx.health.connect.client.units.Mass? iodine;
+    property public final androidx.health.connect.client.units.Mass? iron;
+    property public final androidx.health.connect.client.units.Mass? magnesium;
+    property public final androidx.health.connect.client.units.Mass? manganese;
+    property public final String? mealType;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final androidx.health.connect.client.units.Mass? molybdenum;
+    property public final androidx.health.connect.client.units.Mass? monounsaturatedFat;
+    property public final String? name;
+    property public final androidx.health.connect.client.units.Mass? niacin;
+    property public final androidx.health.connect.client.units.Mass? pantothenicAcid;
+    property public final androidx.health.connect.client.units.Mass? phosphorus;
+    property public final androidx.health.connect.client.units.Mass? polyunsaturatedFat;
+    property public final androidx.health.connect.client.units.Mass? potassium;
+    property public final androidx.health.connect.client.units.Mass? protein;
+    property public final androidx.health.connect.client.units.Mass? riboflavin;
+    property public final androidx.health.connect.client.units.Mass? saturatedFat;
+    property public final androidx.health.connect.client.units.Mass? selenium;
+    property public final androidx.health.connect.client.units.Mass? sodium;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    property public final androidx.health.connect.client.units.Mass? sugar;
+    property public final androidx.health.connect.client.units.Mass? thiamin;
+    property public final androidx.health.connect.client.units.Mass? totalCarbohydrate;
+    property public final androidx.health.connect.client.units.Mass? totalFat;
+    property public final androidx.health.connect.client.units.Mass? transFat;
+    property public final androidx.health.connect.client.units.Mass? unsaturatedFat;
+    property public final androidx.health.connect.client.units.Mass? vitaminA;
+    property public final androidx.health.connect.client.units.Mass? vitaminB12;
+    property public final androidx.health.connect.client.units.Mass? vitaminB6;
+    property public final androidx.health.connect.client.units.Mass? vitaminC;
+    property public final androidx.health.connect.client.units.Mass? vitaminD;
+    property public final androidx.health.connect.client.units.Mass? vitaminE;
+    property public final androidx.health.connect.client.units.Mass? vitaminK;
+    property public final androidx.health.connect.client.units.Mass? zinc;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> BIOTIN_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CAFFEINE_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CALCIUM_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CHLORIDE_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CHOLESTEROL_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CHROMIUM_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> COPPER_TOTAL;
+    field public static final androidx.health.connect.client.records.NutritionRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> DIETARY_FIBER_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> ENERGY_FROM_FAT_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> ENERGY_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> FOLATE_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> FOLIC_ACID_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> IODINE_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> IRON_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> MAGNESIUM_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> MANGANESE_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> MOLYBDENUM_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> MONOUNSATURATED_FAT_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> NIACIN_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> PANTOTHENIC_ACID_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> PHOSPHORUS_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> POLYUNSATURATED_FAT_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> POTASSIUM_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> PROTEIN_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> RIBOFLAVIN_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> SATURATED_FAT_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> SELENIUM_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> SODIUM_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> SUGAR_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> THIAMIN_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> TOTAL_CARBOHYDRATE_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> TOTAL_FAT_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> TRANS_FAT_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> UNSATURATED_FAT_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_A_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_B12_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_B6_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_C_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_D_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_E_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_K_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> ZINC_TOTAL;
+  }
+
+  public static final class NutritionRecord.Companion {
+  }
+
+  public final class OvulationTestRecord implements androidx.health.connect.client.records.Record {
+    ctor public OvulationTestRecord(String result, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public String getResult();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final String result;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public static final class OvulationTestRecord.Result {
+    field public static final String HIGH = "high";
+    field public static final String INCONCLUSIVE = "inconclusive";
+    field public static final androidx.health.connect.client.records.OvulationTestRecord.Result INSTANCE;
+    field public static final String NEGATIVE = "negative";
+    field public static final String POSITIVE = "positive";
+  }
+
+  public final class OxygenSaturationRecord implements androidx.health.connect.client.records.Record {
+    ctor public OxygenSaturationRecord(androidx.health.connect.client.units.Percentage percentage, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public androidx.health.connect.client.units.Percentage getPercentage();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final androidx.health.connect.client.units.Percentage percentage;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public final class PowerRecord implements androidx.health.connect.client.records.Record {
+    ctor public PowerRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.PowerRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.util.List<androidx.health.connect.client.records.PowerRecord.Sample> getSamples();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.util.List<androidx.health.connect.client.records.PowerRecord.Sample> samples;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.records.PowerRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Power> POWER_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Power> POWER_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Power> POWER_MIN;
+  }
+
+  public static final class PowerRecord.Companion {
+  }
+
+  public static final class PowerRecord.Sample {
+    ctor public PowerRecord.Sample(java.time.Instant time, androidx.health.connect.client.units.Power power);
+    method public androidx.health.connect.client.units.Power getPower();
+    method public java.time.Instant getTime();
+    property public final androidx.health.connect.client.units.Power power;
+    property public final java.time.Instant time;
+  }
+
+  public interface Record {
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    property public abstract androidx.health.connect.client.records.metadata.Metadata metadata;
+  }
+
+  public final class RelationToMeal {
+    field public static final String AFTER_MEAL = "after_meal";
+    field public static final String BEFORE_MEAL = "before_meal";
+    field public static final String FASTING = "fasting";
+    field public static final String GENERAL = "general";
+    field public static final androidx.health.connect.client.records.RelationToMeal INSTANCE;
+  }
+
+  public final class RespiratoryRateRecord implements androidx.health.connect.client.records.Record {
+    ctor public RespiratoryRateRecord(double rate, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public double getRate();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final double rate;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public final class RestingHeartRateRecord implements androidx.health.connect.client.records.Record {
+    ctor public RestingHeartRateRecord(long beatsPerMinute, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public long getBeatsPerMinute();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final long beatsPerMinute;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_MIN;
+    field public static final androidx.health.connect.client.records.RestingHeartRateRecord.Companion Companion;
+  }
+
+  public static final class RestingHeartRateRecord.Companion {
+  }
+
+  public final class SexualActivityRecord implements androidx.health.connect.client.records.Record {
+    ctor public SexualActivityRecord(optional String? protectionUsed, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public String? getProtectionUsed();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final String? protectionUsed;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public static final class SexualActivityRecord.Protection {
+    field public static final androidx.health.connect.client.records.SexualActivityRecord.Protection INSTANCE;
+    field public static final String PROTECTED = "protected";
+    field public static final String UNPROTECTED = "unprotected";
+  }
+
+  public final class SleepSessionRecord implements androidx.health.connect.client.records.Record {
+    ctor public SleepSessionRecord(optional String? title, optional String? notes, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public String? getNotes();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    method public String? getTitle();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final String? notes;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    property public final String? title;
+    field public static final androidx.health.connect.client.records.SleepSessionRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.time.Duration> SLEEP_DURATION_TOTAL;
+  }
+
+  public static final class SleepSessionRecord.Companion {
+  }
+
+  public final class SleepStageRecord implements androidx.health.connect.client.records.Record {
+    ctor public SleepStageRecord(String stage, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public String getStage();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final String stage;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+  }
+
+  public static final class SleepStageRecord.StageType {
+    field public static final String AWAKE = "awake";
+    field public static final String DEEP = "deep";
+    field public static final androidx.health.connect.client.records.SleepStageRecord.StageType INSTANCE;
+    field public static final String LIGHT = "light";
+    field public static final String OUT_OF_BED = "out_of_bed";
+    field public static final String REM = "rem";
+    field public static final String SLEEPING = "sleeping";
+    field public static final String UNKNOWN = "unknown";
+  }
+
+  public final class SpeedRecord implements androidx.health.connect.client.records.Record {
+    ctor public SpeedRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.SpeedRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.util.List<androidx.health.connect.client.records.SpeedRecord.Sample> getSamples();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.util.List<androidx.health.connect.client.records.SpeedRecord.Sample> samples;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.records.SpeedRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Velocity> SPEED_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Velocity> SPEED_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Velocity> SPEED_MIN;
+  }
+
+  public static final class SpeedRecord.Companion {
+  }
+
+  public static final class SpeedRecord.Sample {
+    ctor public SpeedRecord.Sample(java.time.Instant time, androidx.health.connect.client.units.Velocity speed);
+    method public androidx.health.connect.client.units.Velocity getSpeed();
+    method public java.time.Instant getTime();
+    property public final androidx.health.connect.client.units.Velocity speed;
+    property public final java.time.Instant time;
+  }
+
+  public final class StepsCadenceRecord implements androidx.health.connect.client.records.Record {
+    ctor public StepsCadenceRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.StepsCadenceRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.util.List<androidx.health.connect.client.records.StepsCadenceRecord.Sample> getSamples();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.util.List<androidx.health.connect.client.records.StepsCadenceRecord.Sample> samples;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.records.StepsCadenceRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RATE_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RATE_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RATE_MIN;
+  }
+
+  public static final class StepsCadenceRecord.Companion {
+  }
+
+  public static final class StepsCadenceRecord.Sample {
+    ctor public StepsCadenceRecord.Sample(java.time.Instant time, @FloatRange(from=0.0, to=10000.0) double rate);
+    method public double getRate();
+    method public java.time.Instant getTime();
+    property public final double rate;
+    property public final java.time.Instant time;
+  }
+
+  public final class StepsRecord implements androidx.health.connect.client.records.Record {
+    ctor public StepsRecord(long count, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public long getCount();
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public final long count;
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> COUNT_TOTAL;
+    field public static final androidx.health.connect.client.records.StepsRecord.Companion Companion;
+  }
+
+  public static final class StepsRecord.Companion {
+  }
+
+  public final class SwimmingStrokesRecord implements androidx.health.connect.client.records.Record {
+    ctor public SwimmingStrokesRecord(optional long count, String type, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public long getCount();
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    method public String getType();
+    property public final long count;
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    property public final String type;
+  }
+
+  public static final class SwimmingStrokesRecord.SwimmingType {
+    field public static final String BACKSTROKE = "backstroke";
+    field public static final String BREASTSTROKE = "breaststroke";
+    field public static final String BUTTERFLY = "butterfly";
+    field public static final String FREESTYLE = "freestyle";
+    field public static final androidx.health.connect.client.records.SwimmingStrokesRecord.SwimmingType INSTANCE;
+    field public static final String MIXED = "mixed";
+    field public static final String OTHER = "other";
+  }
+
+  public final class TotalCaloriesBurnedRecord implements androidx.health.connect.client.records.Record {
+    ctor public TotalCaloriesBurnedRecord(androidx.health.connect.client.units.Energy energy, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.units.Energy getEnergy();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public final androidx.health.connect.client.units.Energy energy;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.records.TotalCaloriesBurnedRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> ENERGY_TOTAL;
+  }
+
+  public static final class TotalCaloriesBurnedRecord.Companion {
+  }
+
+  public final class Vo2MaxRecord implements androidx.health.connect.client.records.Record {
+    ctor public Vo2MaxRecord(double vo2MillilitersPerMinuteKilogram, optional String? measurementMethod, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public String? getMeasurementMethod();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public double getVo2MillilitersPerMinuteKilogram();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final String? measurementMethod;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public final double vo2MillilitersPerMinuteKilogram;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public static final class Vo2MaxRecord.MeasurementMethod {
+    field public static final String COOPER_TEST = "cooper_test";
+    field public static final String HEART_RATE_RATIO = "heart_rate_ratio";
+    field public static final androidx.health.connect.client.records.Vo2MaxRecord.MeasurementMethod INSTANCE;
+    field public static final String METABOLIC_CART = "metabolic_cart";
+    field public static final String MULTISTAGE_FITNESS_TEST = "multistage_fitness_test";
+    field public static final String OTHER = "other";
+    field public static final String ROCKPORT_FITNESS_TEST = "rockport_fitness_test";
+  }
+
+  public final class WaistCircumferenceRecord implements androidx.health.connect.client.records.Record {
+    ctor public WaistCircumferenceRecord(androidx.health.connect.client.units.Length circumference, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.units.Length getCircumference();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final androidx.health.connect.client.units.Length circumference;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public final class WeightRecord implements androidx.health.connect.client.records.Record {
+    ctor public WeightRecord(androidx.health.connect.client.units.Mass weight, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public androidx.health.connect.client.units.Mass getWeight();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public final androidx.health.connect.client.units.Mass weight;
+    property public java.time.ZoneOffset? zoneOffset;
+    field public static final androidx.health.connect.client.records.WeightRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> WEIGHT_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> WEIGHT_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> WEIGHT_MIN;
+  }
+
+  public static final class WeightRecord.Companion {
+  }
+
+  public final class WheelchairPushesRecord implements androidx.health.connect.client.records.Record {
+    ctor public WheelchairPushesRecord(long count, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public long getCount();
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public final long count;
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> COUNT_TOTAL;
+    field public static final androidx.health.connect.client.records.WheelchairPushesRecord.Companion Companion;
+  }
+
+  public static final class WheelchairPushesRecord.Companion {
+  }
+
+}
+
+package androidx.health.connect.client.records.metadata {
+
+  public final class DataOrigin {
+    ctor public DataOrigin(String packageName);
+    method public String getPackageName();
+    property public final String packageName;
+  }
+
+  public final class Device {
+    ctor public Device(optional String? manufacturer, optional String? model, optional String? type);
+    method public String? getManufacturer();
+    method public String? getModel();
+    method public String? getType();
+    property public final String? manufacturer;
+    property public final String? model;
+    property public final String? type;
+  }
+
+  public final class DeviceTypes {
+    field public static final String CHEST_STRAP = "CHEST_STRAP";
+    field public static final String FITNESS_BAND = "FITNESS_BAND";
+    field public static final String HEAD_MOUNTED = "HEAD_MOUNTED";
+    field public static final androidx.health.connect.client.records.metadata.DeviceTypes INSTANCE;
+    field public static final String PHONE = "PHONE";
+    field public static final String RING = "RING";
+    field public static final String SCALE = "SCALE";
+    field public static final String SMART_DISPLAY = "SMART_DISPLAY";
+    field public static final String UNKNOWN = "UNKNOWN";
+    field public static final String WATCH = "WATCH";
+  }
+
+  public final class Metadata {
+    ctor public Metadata(optional String uid, optional androidx.health.connect.client.records.metadata.DataOrigin dataOrigin, optional java.time.Instant lastModifiedTime, optional String? clientRecordId, optional long clientRecordVersion, optional androidx.health.connect.client.records.metadata.Device? device);
+    method public String? getClientRecordId();
+    method public long getClientRecordVersion();
+    method public androidx.health.connect.client.records.metadata.DataOrigin getDataOrigin();
+    method public androidx.health.connect.client.records.metadata.Device? getDevice();
+    method public java.time.Instant getLastModifiedTime();
+    method public String getUid();
+    property public final String? clientRecordId;
+    property public final long clientRecordVersion;
+    property public final androidx.health.connect.client.records.metadata.DataOrigin dataOrigin;
+    property public final androidx.health.connect.client.records.metadata.Device? device;
+    property public final java.time.Instant lastModifiedTime;
+    property public final String uid;
+  }
+
+}
+
+package androidx.health.connect.client.request {
+
+  public final class AggregateGroupByDurationRequest {
+    ctor public AggregateGroupByDurationRequest(java.util.Set<? extends androidx.health.connect.client.aggregate.AggregateMetric<?>> metrics, androidx.health.connect.client.time.TimeRangeFilter timeRangeFilter, java.time.Duration timeRangeSlicer, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilter);
+  }
+
+  public final class AggregateGroupByPeriodRequest {
+    ctor public AggregateGroupByPeriodRequest(java.util.Set<? extends androidx.health.connect.client.aggregate.AggregateMetric<?>> metrics, androidx.health.connect.client.time.TimeRangeFilter timeRangeFilter, java.time.Period timeRangeSlicer, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilter);
+  }
+
+  public final class AggregateRequest {
+    ctor public AggregateRequest(java.util.Set<? extends androidx.health.connect.client.aggregate.AggregateMetric<?>> metrics, androidx.health.connect.client.time.TimeRangeFilter timeRangeFilter, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilter);
+  }
+
+  public final class ChangesTokenRequest {
+    ctor public ChangesTokenRequest(java.util.Set<? extends kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record>> recordTypes, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilters);
+  }
+
+  public final class ReadRecordsRequest<T extends androidx.health.connect.client.records.Record> {
+    ctor public ReadRecordsRequest(kotlin.reflect.KClass<T> recordType, androidx.health.connect.client.time.TimeRangeFilter timeRangeFilter, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilter, optional boolean ascendingOrder, optional int pageSize, optional String? pageToken);
+  }
+
+}
+
+package androidx.health.connect.client.response {
+
+  public final class ChangesResponse {
+    method public java.util.List<androidx.health.connect.client.changes.Change> getChanges();
+    method public boolean getChangesTokenExpired();
+    method public boolean getHasMore();
+    method public String getNextChangesToken();
+    property public final java.util.List<androidx.health.connect.client.changes.Change> changes;
+    property public final boolean changesTokenExpired;
+    property public final boolean hasMore;
+    property public final String nextChangesToken;
+  }
+
+  public final class InsertRecordsResponse {
+    method public java.util.List<java.lang.String> getRecordUidsList();
+    property public final java.util.List<java.lang.String> recordUidsList;
+  }
+
+  public final class ReadRecordResponse<T extends androidx.health.connect.client.records.Record> {
+    method public T getRecord();
+    property public final T record;
+  }
+
+  public final class ReadRecordsResponse<T extends androidx.health.connect.client.records.Record> {
+    method public String? getPageToken();
+    method public java.util.List<T> getRecords();
+    property public final String? pageToken;
+    property public final java.util.List<T> records;
+  }
+
+}
+
+package androidx.health.connect.client.time {
+
+  public final class TimeRangeFilter {
+    method public static androidx.health.connect.client.time.TimeRangeFilter after(java.time.Instant startTime);
+    method public static androidx.health.connect.client.time.TimeRangeFilter after(java.time.LocalDateTime startTime);
+    method public static androidx.health.connect.client.time.TimeRangeFilter before(java.time.Instant endTime);
+    method public static androidx.health.connect.client.time.TimeRangeFilter before(java.time.LocalDateTime endTime);
+    method public static androidx.health.connect.client.time.TimeRangeFilter between(java.time.Instant startTime, java.time.Instant endTime);
+    method public static androidx.health.connect.client.time.TimeRangeFilter between(java.time.LocalDateTime startTime, java.time.LocalDateTime endTime);
+    field public static final androidx.health.connect.client.time.TimeRangeFilter.Companion Companion;
+  }
+
+  public static final class TimeRangeFilter.Companion {
+    method public androidx.health.connect.client.time.TimeRangeFilter after(java.time.Instant startTime);
+    method public androidx.health.connect.client.time.TimeRangeFilter after(java.time.LocalDateTime startTime);
+    method public androidx.health.connect.client.time.TimeRangeFilter before(java.time.Instant endTime);
+    method public androidx.health.connect.client.time.TimeRangeFilter before(java.time.LocalDateTime endTime);
+    method public androidx.health.connect.client.time.TimeRangeFilter between(java.time.Instant startTime, java.time.Instant endTime);
+    method public androidx.health.connect.client.time.TimeRangeFilter between(java.time.LocalDateTime startTime, java.time.LocalDateTime endTime);
+  }
+
+}
+
+package androidx.health.connect.client.units {
+
+  public final class Energy implements java.lang.Comparable<androidx.health.connect.client.units.Energy> {
+    method public static androidx.health.connect.client.units.Energy calories(double value);
+    method public int compareTo(androidx.health.connect.client.units.Energy other);
+    method public double getCalories();
+    method public double getJoules();
+    method public double getKilocalories();
+    method public double getKilojoules();
+    method public static androidx.health.connect.client.units.Energy joules(double value);
+    method public static androidx.health.connect.client.units.Energy kilocalories(double value);
+    method public static androidx.health.connect.client.units.Energy kilojoules(double value);
+    property public final double inCalories;
+    property public final double inJoules;
+    property public final double inKilocalories;
+    property public final double inKilojoules;
+    field public static final androidx.health.connect.client.units.Energy.Companion Companion;
+  }
+
+  public static final class Energy.Companion {
+    method public androidx.health.connect.client.units.Energy calories(double value);
+    method public androidx.health.connect.client.units.Energy joules(double value);
+    method public androidx.health.connect.client.units.Energy kilocalories(double value);
+    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);
+    method public double getFeet();
+    method public double getInches();
+    method public double getKilometers();
+    method public double getMeters();
+    method public double getMiles();
+    method public static androidx.health.connect.client.units.Length inches(double value);
+    method public static androidx.health.connect.client.units.Length kilometers(double value);
+    method public static androidx.health.connect.client.units.Length meters(double value);
+    method public static androidx.health.connect.client.units.Length miles(double value);
+    property public final double inFeet;
+    property public final double inInches;
+    property public final double inKilometers;
+    property public final double inMeters;
+    property public final double inMiles;
+    field public static final androidx.health.connect.client.units.Length.Companion Companion;
+  }
+
+  public static final class Length.Companion {
+    method public androidx.health.connect.client.units.Length feet(double value);
+    method public androidx.health.connect.client.units.Length inches(double value);
+    method public androidx.health.connect.client.units.Length kilometers(double value);
+    method public androidx.health.connect.client.units.Length meters(double value);
+    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();
+    method public double getKilograms();
+    method public double getMicrograms();
+    method public double getMilligrams();
+    method public double getOunces();
+    method public double getPounds();
+    method public static androidx.health.connect.client.units.Mass grams(double value);
+    method public static androidx.health.connect.client.units.Mass kilograms(double value);
+    method public static androidx.health.connect.client.units.Mass micrograms(double value);
+    method public static androidx.health.connect.client.units.Mass milligrams(double value);
+    method public static androidx.health.connect.client.units.Mass ounces(double value);
+    method public static androidx.health.connect.client.units.Mass pounds(double value);
+    property public final double inGrams;
+    property public final double inKilograms;
+    property public final double inMicrograms;
+    property public final double inMilligrams;
+    property public final double inOunces;
+    property public final double inPounds;
+    field public static final androidx.health.connect.client.units.Mass.Companion Companion;
+  }
+
+  public static final class Mass.Companion {
+    method public androidx.health.connect.client.units.Mass grams(double value);
+    method public androidx.health.connect.client.units.Mass kilograms(double value);
+    method public androidx.health.connect.client.units.Mass micrograms(double value);
+    method public androidx.health.connect.client.units.Mass milligrams(double value);
+    method public androidx.health.connect.client.units.Mass ounces(double value);
+    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);
+    method public double getValue();
+    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();
+    method public double getWatts();
+    method public static androidx.health.connect.client.units.Power kilocaloriesPerDay(double value);
+    method public static androidx.health.connect.client.units.Power watts(double value);
+    property public final double inKilocaloriesPerDay;
+    property public final double inWatts;
+    field public static final androidx.health.connect.client.units.Power.Companion Companion;
+  }
+
+  public static final class Power.Companion {
+    method public androidx.health.connect.client.units.Power kilocaloriesPerDay(double value);
+    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();
+    method public static androidx.health.connect.client.units.Pressure millimetersOfMercury(double value);
+    property public final double inMillimetersOfMercury;
+    field public static final androidx.health.connect.client.units.Pressure.Companion Companion;
+  }
+
+  public static final class Pressure.Companion {
+    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);
+    method public static androidx.health.connect.client.units.Temperature fahrenheit(double value);
+    method public double getCelsius();
+    method public double getFahrenheit();
+    property public final double inCelsius;
+    property public final double inFahrenheit;
+    field public static final androidx.health.connect.client.units.Temperature.Companion Companion;
+  }
+
+  public static final class Temperature.Companion {
+    method public androidx.health.connect.client.units.Temperature celsius(double value);
+    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();
+    method public double getMetersPerSecond();
+    method public double getMilesPerHour();
+    method public static androidx.health.connect.client.units.Velocity kilometersPerHour(double value);
+    method public static androidx.health.connect.client.units.Velocity metersPerSecond(double value);
+    method public static androidx.health.connect.client.units.Velocity milesPerHour(double value);
+    property public final double inKilometersPerHour;
+    property public final double inMetersPerSecond;
+    property public final double inMilesPerHour;
+    field public static final androidx.health.connect.client.units.Velocity.Companion Companion;
+  }
+
+  public static final class Velocity.Companion {
+    method public androidx.health.connect.client.units.Velocity kilometersPerHour(double value);
+    method public androidx.health.connect.client.units.Velocity metersPerSecond(double value);
+    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);
+    method public double getFluidOuncesUs();
+    method public double getLiters();
+    method public double getMilliliters();
+    method public static androidx.health.connect.client.units.Volume liters(double value);
+    method public static androidx.health.connect.client.units.Volume milliliters(double value);
+    property public final double inFluidOuncesUs;
+    property public final double inLiters;
+    property public final double inMilliliters;
+    field public static final androidx.health.connect.client.units.Volume.Companion Companion;
+  }
+
+  public static final class Volume.Companion {
+    method public androidx.health.connect.client.units.Volume fluidOuncesUs(double value);
+    method public androidx.health.connect.client.units.Volume liters(double value);
+    method public androidx.health.connect.client.units.Volume milliliters(double value);
+  }
+
+  public final class VolumeKt {
+  }
+
+}
+
diff --git a/health/health-connect-client/api/res-current.txt b/health/connect/connect-client/api/res-current.txt
similarity index 100%
rename from health/health-connect-client/api/res-current.txt
rename to health/connect/connect-client/api/res-current.txt
diff --git a/health/connect/connect-client/api/restricted_current.txt b/health/connect/connect-client/api/restricted_current.txt
new file mode 100644
index 0000000..072fe29
--- /dev/null
+++ b/health/connect/connect-client/api/restricted_current.txt
@@ -0,0 +1,1630 @@
+// Signature format: 4.0
+package androidx.health.connect.client {
+
+  public interface HealthConnectClient {
+    method public suspend Object? aggregate(androidx.health.connect.client.request.AggregateRequest request, kotlin.coroutines.Continuation<? super androidx.health.connect.client.aggregate.AggregationResult>);
+    method public suspend Object? aggregateGroupByDuration(androidx.health.connect.client.request.AggregateGroupByDurationRequest request, kotlin.coroutines.Continuation<? super java.util.List<? extends androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration>>);
+    method public suspend Object? aggregateGroupByPeriod(androidx.health.connect.client.request.AggregateGroupByPeriodRequest request, kotlin.coroutines.Continuation<? super java.util.List<? extends androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod>>);
+    method public suspend Object? deleteRecords(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType, java.util.List<java.lang.String> uidsList, java.util.List<java.lang.String> clientRecordIdsList, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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 androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context, optional java.util.List<java.lang.String> packageNames);
+    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 isAvailable(android.content.Context context, optional java.util.List<java.lang.String> packageNames);
+    method public default static boolean isAvailable(android.content.Context context);
+    method public suspend <T extends androidx.health.connect.client.records.Record> Object? readRecord(kotlin.reflect.KClass<T> recordType, String uid, 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 suspend Object? updateRecords(java.util.List<? extends androidx.health.connect.client.records.Record> records, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    property public abstract androidx.health.connect.client.PermissionController permissionController;
+    field public static final androidx.health.connect.client.HealthConnectClient.Companion Companion;
+  }
+
+  public static final class HealthConnectClient.Companion {
+    method public androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context, optional java.util.List<java.lang.String> packageNames);
+    method public androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context);
+    method public boolean isAvailable(android.content.Context context, optional java.util.List<java.lang.String> packageNames);
+    method public boolean isAvailable(android.content.Context context);
+  }
+
+  public interface PermissionController {
+    method public androidx.activity.result.contract.ActivityResultContract<java.util.Set<androidx.health.connect.client.permission.HealthPermission>,java.util.Set<androidx.health.connect.client.permission.HealthPermission>> createRequestPermissionActivityContract();
+    method public suspend Object? getGrantedPermissions(java.util.Set<androidx.health.connect.client.permission.HealthPermission> permissions, kotlin.coroutines.Continuation<? super java.util.Set<? extends androidx.health.connect.client.permission.HealthPermission>>);
+    method public suspend Object? revokeAllPermissions(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+  }
+
+}
+
+package androidx.health.connect.client.aggregate {
+
+  public final class AggregateMetric<T> {
+  }
+
+  public final class AggregationResult {
+    method public operator boolean contains(androidx.health.connect.client.aggregate.AggregateMetric<?> metric);
+    method public operator <T> T? get(androidx.health.connect.client.aggregate.AggregateMetric<? extends T> metric);
+    method public java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> getDataOrigins();
+    method @Deprecated public <T> T? getMetric(androidx.health.connect.client.aggregate.AggregateMetric<? extends T> metric);
+    method @Deprecated public boolean hasMetric(androidx.health.connect.client.aggregate.AggregateMetric<?> metric);
+    property public final java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOrigins;
+  }
+
+  public final class AggregationResultGroupedByDuration {
+    method public java.time.Instant getEndTime();
+    method public androidx.health.connect.client.aggregate.AggregationResult getResult();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset getZoneOffset();
+    property public final java.time.Instant endTime;
+    property public final androidx.health.connect.client.aggregate.AggregationResult result;
+    property public final java.time.Instant startTime;
+    property public final java.time.ZoneOffset zoneOffset;
+  }
+
+  public final class AggregationResultGroupedByPeriod {
+    method public java.time.LocalDateTime getEndTime();
+    method public androidx.health.connect.client.aggregate.AggregationResult getResult();
+    method public java.time.LocalDateTime getStartTime();
+    property public final java.time.LocalDateTime endTime;
+    property public final androidx.health.connect.client.aggregate.AggregationResult result;
+    property public final java.time.LocalDateTime startTime;
+  }
+
+}
+
+package androidx.health.connect.client.changes {
+
+  public interface Change {
+  }
+
+  public final class DeletionChange implements androidx.health.connect.client.changes.Change {
+    method public String getUid();
+    property public final String uid;
+  }
+
+  public final class UpsertionChange implements androidx.health.connect.client.changes.Change {
+    method public androidx.health.connect.client.records.Record getRecord();
+    property public final androidx.health.connect.client.records.Record record;
+  }
+
+}
+
+package androidx.health.connect.client.permission {
+
+  public final class HealthDataRequestPermissionsKt {
+  }
+
+  public final class HealthPermission {
+    method public static androidx.health.connect.client.permission.HealthPermission createReadPermission(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType);
+    method public static androidx.health.connect.client.permission.HealthPermission createWritePermission(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType);
+    field public static final androidx.health.connect.client.permission.HealthPermission.Companion Companion;
+  }
+
+  public static final class HealthPermission.Companion {
+    method public androidx.health.connect.client.permission.HealthPermission createReadPermission(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType);
+    method public androidx.health.connect.client.permission.HealthPermission createWritePermission(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType);
+  }
+
+}
+
+package androidx.health.connect.client.records {
+
+  public final class ActiveCaloriesBurnedRecord implements androidx.health.connect.client.records.IntervalRecord {
+    ctor public ActiveCaloriesBurnedRecord(androidx.health.connect.client.units.Energy energy, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.units.Energy getEnergy();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public final androidx.health.connect.client.units.Energy energy;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> ACTIVE_CALORIES_TOTAL;
+    field public static final androidx.health.connect.client.records.ActiveCaloriesBurnedRecord.Companion Companion;
+  }
+
+  public static final class ActiveCaloriesBurnedRecord.Companion {
+  }
+
+  public final class BasalBodyTemperatureRecord implements androidx.health.connect.client.records.InstantaneousRecord {
+    ctor public BasalBodyTemperatureRecord(androidx.health.connect.client.units.Temperature temperature, optional String? measurementLocation, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public String? getMeasurementLocation();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public androidx.health.connect.client.units.Temperature getTemperature();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final String? measurementLocation;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final androidx.health.connect.client.units.Temperature temperature;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public final class BasalMetabolicRateRecord implements androidx.health.connect.client.records.InstantaneousRecord {
+    ctor public BasalMetabolicRateRecord(androidx.health.connect.client.units.Power basalMetabolicRate, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.units.Power getBasalMetabolicRate();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final androidx.health.connect.client.units.Power basalMetabolicRate;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> BASAL_CALORIES_TOTAL;
+    field public static final androidx.health.connect.client.records.BasalMetabolicRateRecord.Companion Companion;
+  }
+
+  public static final class BasalMetabolicRateRecord.Companion {
+  }
+
+  public final class BloodGlucoseRecord implements androidx.health.connect.client.records.InstantaneousRecord {
+    ctor public BloodGlucoseRecord(double levelMillimolesPerLiter, optional String? specimenSource, optional String? mealType, optional String? relationToMeal, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public double getLevelMillimolesPerLiter();
+    method public String? getMealType();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public String? getRelationToMeal();
+    method public String? getSpecimenSource();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final double levelMillimolesPerLiter;
+    property public final String? mealType;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final String? relationToMeal;
+    property public final String? specimenSource;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public static final class BloodGlucoseRecord.SpecimenSource {
+    field public static final String CAPILLARY_BLOOD = "capillary_blood";
+    field public static final androidx.health.connect.client.records.BloodGlucoseRecord.SpecimenSource INSTANCE;
+    field public static final String INTERSTITIAL_FLUID = "interstitial_fluid";
+    field public static final String PLASMA = "plasma";
+    field public static final String SERUM = "serum";
+    field public static final String TEARS = "tears";
+    field public static final String WHOLE_BLOOD = "whole_blood";
+  }
+
+  public final class BloodPressureRecord implements androidx.health.connect.client.records.InstantaneousRecord {
+    ctor public BloodPressureRecord(androidx.health.connect.client.units.Pressure systolic, androidx.health.connect.client.units.Pressure diastolic, optional String? bodyPosition, optional String? measurementLocation, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public String? getBodyPosition();
+    method public androidx.health.connect.client.units.Pressure getDiastolic();
+    method public String? getMeasurementLocation();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public androidx.health.connect.client.units.Pressure getSystolic();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final String? bodyPosition;
+    property public final androidx.health.connect.client.units.Pressure diastolic;
+    property public final String? measurementLocation;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final androidx.health.connect.client.units.Pressure systolic;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+    field public static final androidx.health.connect.client.records.BloodPressureRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> DIASTOLIC_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> DIASTOLIC_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> DIASTOLIC_MIN;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> SYSTOLIC_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> SYSTOLIC_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> SYSTOLIC_MIN;
+  }
+
+  public static final class BloodPressureRecord.Companion {
+  }
+
+  public static final class BloodPressureRecord.MeasurementLocation {
+    field public static final androidx.health.connect.client.records.BloodPressureRecord.MeasurementLocation INSTANCE;
+    field public static final String LEFT_UPPER_ARM = "left_upper_arm";
+    field public static final String LEFT_WRIST = "left_wrist";
+    field public static final String RIGHT_UPPER_ARM = "right_upper_arm";
+    field public static final String RIGHT_WRIST = "right_wrist";
+  }
+
+  public final class BodyFatRecord implements androidx.health.connect.client.records.InstantaneousRecord {
+    ctor public BodyFatRecord(androidx.health.connect.client.units.Percentage percentage, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public androidx.health.connect.client.units.Percentage getPercentage();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final androidx.health.connect.client.units.Percentage percentage;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public final class BodyPosition {
+    field public static final androidx.health.connect.client.records.BodyPosition INSTANCE;
+    field public static final String LYING_DOWN = "lying_down";
+    field public static final String RECLINING = "reclining";
+    field public static final String SITTING_DOWN = "sitting_down";
+    field public static final String STANDING_UP = "standing_up";
+  }
+
+  public final class BodyTemperatureMeasurementLocation {
+    field public static final String ARMPIT = "armpit";
+    field public static final String EAR = "ear";
+    field public static final String FINGER = "finger";
+    field public static final String FOREHEAD = "forehead";
+    field public static final androidx.health.connect.client.records.BodyTemperatureMeasurementLocation INSTANCE;
+    field public static final String MOUTH = "mouth";
+    field public static final String RECTUM = "rectum";
+    field public static final String TEMPORAL_ARTERY = "temporal_artery";
+    field public static final String TOE = "toe";
+    field public static final String VAGINA = "vagina";
+    field public static final String WRIST = "wrist";
+  }
+
+  public final class BodyTemperatureRecord implements androidx.health.connect.client.records.InstantaneousRecord {
+    ctor public BodyTemperatureRecord(androidx.health.connect.client.units.Temperature temperature, optional String? measurementLocation, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public String? getMeasurementLocation();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public androidx.health.connect.client.units.Temperature getTemperature();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final String? measurementLocation;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final androidx.health.connect.client.units.Temperature temperature;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public final class BoneMassRecord implements androidx.health.connect.client.records.InstantaneousRecord {
+    ctor public BoneMassRecord(androidx.health.connect.client.units.Mass mass, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.units.Mass getMass();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final androidx.health.connect.client.units.Mass mass;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public final class CervicalMucusRecord implements androidx.health.connect.client.records.InstantaneousRecord {
+    ctor public CervicalMucusRecord(optional String? appearance, optional String? sensation, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public String? getAppearance();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public String? getSensation();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final String? appearance;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final String? sensation;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public static final class CervicalMucusRecord.Appearance {
+    field public static final String CLEAR = "clear";
+    field public static final String CREAMY = "creamy";
+    field public static final String DRY = "dry";
+    field public static final androidx.health.connect.client.records.CervicalMucusRecord.Appearance INSTANCE;
+    field public static final String STICKY = "sticky";
+    field public static final String WATERY = "watery";
+  }
+
+  public static final class CervicalMucusRecord.Sensation {
+    field public static final String HEAVY = "heavy";
+    field public static final androidx.health.connect.client.records.CervicalMucusRecord.Sensation INSTANCE;
+    field public static final String LIGHT = "light";
+    field public static final String MEDIUM = "medium";
+  }
+
+  public final class CyclingPedalingCadenceRecord implements androidx.health.connect.client.records.SeriesRecord<androidx.health.connect.client.records.CyclingPedalingCadenceRecord.Sample> {
+    ctor public CyclingPedalingCadenceRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.CyclingPedalingCadenceRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.util.List<androidx.health.connect.client.records.CyclingPedalingCadenceRecord.Sample> getSamples();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.util.List<androidx.health.connect.client.records.CyclingPedalingCadenceRecord.Sample> samples;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.records.CyclingPedalingCadenceRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RPM_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RPM_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RPM_MIN;
+  }
+
+  public static final class CyclingPedalingCadenceRecord.Companion {
+  }
+
+  public static final class CyclingPedalingCadenceRecord.Sample {
+    ctor public CyclingPedalingCadenceRecord.Sample(java.time.Instant time, @FloatRange(from=0.0, to=10000.0) double revolutionsPerMinute);
+    method public double getRevolutionsPerMinute();
+    method public java.time.Instant getTime();
+    property public final double revolutionsPerMinute;
+    property public final java.time.Instant time;
+  }
+
+  public final class DistanceRecord implements androidx.health.connect.client.records.IntervalRecord {
+    ctor public DistanceRecord(androidx.health.connect.client.units.Length distance, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.units.Length getDistance();
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public final androidx.health.connect.client.units.Length distance;
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.records.DistanceRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> DISTANCE_TOTAL;
+  }
+
+  public static final class DistanceRecord.Companion {
+  }
+
+  public final class ElevationGainedRecord implements androidx.health.connect.client.records.IntervalRecord {
+    ctor public ElevationGainedRecord(androidx.health.connect.client.units.Length elevation, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.units.Length getElevation();
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public final androidx.health.connect.client.units.Length elevation;
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.records.ElevationGainedRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> ELEVATION_GAINED_TOTAL;
+  }
+
+  public static final class ElevationGainedRecord.Companion {
+  }
+
+  public final class ExerciseEventRecord implements androidx.health.connect.client.records.IntervalRecord {
+    ctor public ExerciseEventRecord(String eventType, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public String getEventType();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public final String eventType;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+  }
+
+  public static final class ExerciseEventRecord.EventType {
+    field public static final androidx.health.connect.client.records.ExerciseEventRecord.EventType INSTANCE;
+    field public static final String PAUSE = "pause";
+    field public static final String REST = "rest";
+  }
+
+  public final class ExerciseLapRecord implements androidx.health.connect.client.records.IntervalRecord {
+    ctor public ExerciseLapRecord(optional androidx.health.connect.client.units.Length? length, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.units.Length? getLength();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public final androidx.health.connect.client.units.Length? length;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+  }
+
+  public final class ExerciseRepetitionsRecord implements androidx.health.connect.client.records.IntervalRecord {
+    ctor public ExerciseRepetitionsRecord(long count, String type, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public long getCount();
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    method public String getType();
+    property public final long count;
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    property public final String type;
+  }
+
+  public static final class ExerciseRepetitionsRecord.ExerciseType {
+    field public static final String ARM_CURL = "arm_curl";
+    field public static final String BACK_EXTENSION = "back_extension";
+    field public static final String BALL_SLAM = "ball_slam";
+    field public static final String BENCH_PRESS = "bench_press";
+    field public static final String BURPEE = "burpee";
+    field public static final String CRUNCH = "crunch";
+    field public static final String DEADLIFT = "deadlift";
+    field public static final String DOUBLE_ARM_TRICEPS_EXTENSION = "double_arm_triceps_extension";
+    field public static final String DUMBBELL_ROW = "dumbbell_row";
+    field public static final String FRONT_RAISE = "front_raise";
+    field public static final String HIP_THRUST = "hip_thrust";
+    field public static final String HULA_HOOP = "hula_hoop";
+    field public static final androidx.health.connect.client.records.ExerciseRepetitionsRecord.ExerciseType INSTANCE;
+    field public static final String JUMPING_JACK = "jumping_jack";
+    field public static final String JUMP_ROPE = "jump_rope";
+    field public static final String KETTLEBELL_SWING = "kettlebell_swing";
+    field public static final String LATERAL_RAISE = "lateral_raise";
+    field public static final String LAT_PULL_DOWN = "lat_pull_down";
+    field public static final String LEG_CURL = "leg_curl";
+    field public static final String LEG_EXTENSION = "leg_extension";
+    field public static final String LEG_PRESS = "leg_press";
+    field public static final String LEG_RAISE = "leg_raise";
+    field public static final String LUNGE = "lunge";
+    field public static final String MOUNTAIN_CLIMBER = "mountain_climber";
+    field public static final String PLANK = "plank";
+    field public static final String PULL_UP = "pull_up";
+    field public static final String PUNCH = "punch";
+    field public static final String SHOULDER_PRESS = "shoulder_press";
+    field public static final String SINGLE_ARM_TRICEPS_EXTENSION = "single_arm_triceps_extension";
+    field public static final String SIT_UP = "sit_up";
+    field public static final String SQUAT = "squat";
+  }
+
+  public final class ExerciseSessionRecord implements androidx.health.connect.client.records.IntervalRecord {
+    ctor public ExerciseSessionRecord(String exerciseType, optional String? title, optional String? notes, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public String getExerciseType();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public String? getNotes();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    method public String? getTitle();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public final String exerciseType;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final String? notes;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    property public final String? title;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.time.Duration> ACTIVE_TIME_TOTAL;
+    field public static final androidx.health.connect.client.records.ExerciseSessionRecord.Companion Companion;
+  }
+
+  public static final class ExerciseSessionRecord.Companion {
+  }
+
+  public static final class ExerciseSessionRecord.ExerciseType {
+    field public static final String BACK_EXTENSION = "back_extension";
+    field public static final String BADMINTON = "badminton";
+    field public static final String BARBELL_SHOULDER_PRESS = "barbell_shoulder_press";
+    field public static final String BASEBALL = "baseball";
+    field public static final String BASKETBALL = "basketball";
+    field public static final String BENCH_PRESS = "bench_press";
+    field public static final String BENCH_SIT_UP = "bench_sit_up";
+    field public static final String BIKING = "biking";
+    field public static final String BIKING_STATIONARY = "biking_stationary";
+    field public static final String BOOT_CAMP = "boot_camp";
+    field public static final String BOXING = "boxing";
+    field public static final String BURPEE = "burpee";
+    field public static final String CALISTHENICS = "calisthenics";
+    field public static final String CRICKET = "cricket";
+    field public static final String CRUNCH = "crunch";
+    field public static final String DANCING = "dancing";
+    field public static final String DEADLIFT = "deadlift";
+    field public static final String DUMBBELL_CURL_LEFT_ARM = "dumbbell_curl_left_arm";
+    field public static final String DUMBBELL_CURL_RIGHT_ARM = "dumbbell_curl_right_arm";
+    field public static final String DUMBBELL_FRONT_RAISE = "dumbbell_front_raise";
+    field public static final String DUMBBELL_LATERAL_RAISE = "dumbbell_lateral_raise";
+    field public static final String DUMBBELL_TRICEPS_EXTENSION_LEFT_ARM = "dumbbell_triceps_extension_left_arm";
+    field public static final String DUMBBELL_TRICEPS_EXTENSION_RIGHT_ARM = "dumbbell_triceps_extension_right_arm";
+    field public static final String DUMBBELL_TRICEPS_EXTENSION_TWO_ARM = "dumbbell_triceps_extension_two_arm";
+    field public static final String ELLIPTICAL = "elliptical";
+    field public static final String EXERCISE_CLASS = "exercise_class";
+    field public static final String FENCING = "fencing";
+    field public static final String FOOTBALL_AMERICAN = "football_american";
+    field public static final String FOOTBALL_AUSTRALIAN = "football_australian";
+    field public static final String FORWARD_TWIST = "forward_twist";
+    field public static final String FRISBEE_DISC = "frisbee_disc";
+    field public static final String GOLF = "golf";
+    field public static final String GUIDED_BREATHING = "guided_breathing";
+    field public static final String GYMNASTICS = "gymnastics";
+    field public static final String HANDBALL = "handball";
+    field public static final String HIGH_INTENSITY_INTERVAL_TRAINING = "high_intensity_interval_training";
+    field public static final String HIKING = "hiking";
+    field public static final String ICE_HOCKEY = "ice_hockey";
+    field public static final String ICE_SKATING = "ice_skating";
+    field public static final androidx.health.connect.client.records.ExerciseSessionRecord.ExerciseType INSTANCE;
+    field public static final String JUMPING_JACK = "jumping_jack";
+    field public static final String JUMP_ROPE = "jump_rope";
+    field public static final String LAT_PULL_DOWN = "lat_pull_down";
+    field public static final String LUNGE = "lunge";
+    field public static final String MARTIAL_ARTS = "martial_arts";
+    field public static final String MEDITATION = "meditation";
+    field public static final String PADDLING = "paddling";
+    field public static final String PARA_GLIDING = "para_gliding";
+    field public static final String PILATES = "pilates";
+    field public static final String PLANK = "plank";
+    field public static final String RACQUETBALL = "racquetball";
+    field public static final String ROCK_CLIMBING = "rock_climbing";
+    field public static final String ROLLER_HOCKEY = "roller_hockey";
+    field public static final String ROWING = "rowing";
+    field public static final String ROWING_MACHINE = "rowing_machine";
+    field public static final String RUGBY = "rugby";
+    field public static final String RUNNING = "running";
+    field public static final String RUNNING_TREADMILL = "running_treadmill";
+    field public static final String SAILING = "sailing";
+    field public static final String SCUBA_DIVING = "scuba_diving";
+    field public static final String SKATING = "skating";
+    field public static final String SKIING = "skiing";
+    field public static final String SNOWBOARDING = "snowboarding";
+    field public static final String SNOWSHOEING = "snowshoeing";
+    field public static final String SOCCER = "soccer";
+    field public static final String SOFTBALL = "softball";
+    field public static final String SQUASH = "squash";
+    field public static final String SQUAT = "squat";
+    field public static final String STAIR_CLIMBING = "stair_climbing";
+    field public static final String STAIR_CLIMBING_MACHINE = "stair_climbing_machine";
+    field public static final String STRENGTH_TRAINING = "strength_training";
+    field public static final String STRETCHING = "stretching";
+    field public static final String SURFING = "surfing";
+    field public static final String SWIMMING_OPEN_WATER = "swimming_open_water";
+    field public static final String SWIMMING_POOL = "swimming_pool";
+    field public static final String TABLE_TENNIS = "table_tennis";
+    field public static final String TENNIS = "tennis";
+    field public static final String UPPER_TWIST = "upper_twist";
+    field public static final String VOLLEYBALL = "volleyball";
+    field public static final String WALKING = "walking";
+    field public static final String WATER_POLO = "water_polo";
+    field public static final String WEIGHTLIFTING = "weightlifting";
+    field public static final String WHEELCHAIR = "wheelchair";
+    field public static final String WORKOUT = "workout";
+    field public static final String YOGA = "yoga";
+  }
+
+  public final class FloorsClimbedRecord implements androidx.health.connect.client.records.IntervalRecord {
+    ctor public FloorsClimbedRecord(double floors, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public double getFloors();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public final double floors;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.records.FloorsClimbedRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> FLOORS_CLIMBED_TOTAL;
+  }
+
+  public static final class FloorsClimbedRecord.Companion {
+  }
+
+  public final class HeartRateRecord implements androidx.health.connect.client.records.SeriesRecord<androidx.health.connect.client.records.HeartRateRecord.Sample> {
+    ctor public HeartRateRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.HeartRateRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.util.List<androidx.health.connect.client.records.HeartRateRecord.Sample> getSamples();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.util.List<androidx.health.connect.client.records.HeartRateRecord.Sample> samples;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_MIN;
+    field public static final androidx.health.connect.client.records.HeartRateRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> MEASUREMENTS_COUNT;
+  }
+
+  public static final class HeartRateRecord.Companion {
+  }
+
+  public static final class HeartRateRecord.Sample {
+    ctor public HeartRateRecord.Sample(java.time.Instant time, @IntRange(from=1L, to=300L) long beatsPerMinute);
+    method public long getBeatsPerMinute();
+    method public java.time.Instant getTime();
+    property public final long beatsPerMinute;
+    property public final java.time.Instant time;
+  }
+
+  public final class HeightRecord implements androidx.health.connect.client.records.InstantaneousRecord {
+    ctor public HeightRecord(androidx.health.connect.client.units.Length height, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.units.Length getHeight();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final androidx.health.connect.client.units.Length height;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+    field public static final androidx.health.connect.client.records.HeightRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> HEIGHT_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> HEIGHT_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> HEIGHT_MIN;
+  }
+
+  public static final class HeightRecord.Companion {
+  }
+
+  public final class HipCircumferenceRecord implements androidx.health.connect.client.records.InstantaneousRecord {
+    ctor public HipCircumferenceRecord(androidx.health.connect.client.units.Length circumference, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.units.Length getCircumference();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final androidx.health.connect.client.units.Length circumference;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public final class HydrationRecord implements androidx.health.connect.client.records.IntervalRecord {
+    ctor public HydrationRecord(androidx.health.connect.client.units.Volume volume, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    method public androidx.health.connect.client.units.Volume getVolume();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    property public final androidx.health.connect.client.units.Volume volume;
+    field public static final androidx.health.connect.client.records.HydrationRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Volume> VOLUME_TOTAL;
+  }
+
+  public static final class HydrationRecord.Companion {
+  }
+
+  @kotlin.PublishedApi internal interface InstantaneousRecord extends androidx.health.connect.client.records.Record {
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public abstract java.time.Instant time;
+    property public abstract java.time.ZoneOffset? zoneOffset;
+  }
+
+  @kotlin.PublishedApi internal interface IntervalRecord extends androidx.health.connect.client.records.Record {
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public abstract java.time.Instant endTime;
+    property public abstract java.time.ZoneOffset? endZoneOffset;
+    property public abstract java.time.Instant startTime;
+    property public abstract java.time.ZoneOffset? startZoneOffset;
+  }
+
+  public final class LeanBodyMassRecord implements androidx.health.connect.client.records.InstantaneousRecord {
+    ctor public LeanBodyMassRecord(androidx.health.connect.client.units.Mass mass, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.units.Mass getMass();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final androidx.health.connect.client.units.Mass mass;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public final class MealType {
+    field public static final String BREAKFAST = "breakfast";
+    field public static final String DINNER = "dinner";
+    field public static final androidx.health.connect.client.records.MealType INSTANCE;
+    field public static final String LUNCH = "lunch";
+    field public static final String SNACK = "snack";
+    field public static final String UNKNOWN = "unknown";
+  }
+
+  public final class MenstruationFlowRecord implements androidx.health.connect.client.records.InstantaneousRecord {
+    ctor public MenstruationFlowRecord(optional String? flow, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public String? getFlow();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final String? flow;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public static final class MenstruationFlowRecord.Flow {
+    field public static final String HEAVY = "heavy";
+    field public static final androidx.health.connect.client.records.MenstruationFlowRecord.Flow INSTANCE;
+    field public static final String LIGHT = "light";
+    field public static final String MEDIUM = "medium";
+    field public static final String SPOTTING = "spotting";
+  }
+
+  public final class NutritionRecord implements androidx.health.connect.client.records.IntervalRecord {
+    ctor public NutritionRecord(optional androidx.health.connect.client.units.Mass? biotin, optional androidx.health.connect.client.units.Mass? caffeine, optional androidx.health.connect.client.units.Mass? calcium, optional androidx.health.connect.client.units.Energy? energy, optional androidx.health.connect.client.units.Energy? energyFromFat, optional androidx.health.connect.client.units.Mass? chloride, optional androidx.health.connect.client.units.Mass? cholesterol, optional androidx.health.connect.client.units.Mass? chromium, optional androidx.health.connect.client.units.Mass? copper, optional androidx.health.connect.client.units.Mass? dietaryFiber, optional androidx.health.connect.client.units.Mass? folate, optional androidx.health.connect.client.units.Mass? folicAcid, optional androidx.health.connect.client.units.Mass? iodine, optional androidx.health.connect.client.units.Mass? iron, optional androidx.health.connect.client.units.Mass? magnesium, optional androidx.health.connect.client.units.Mass? manganese, optional androidx.health.connect.client.units.Mass? molybdenum, optional androidx.health.connect.client.units.Mass? monounsaturatedFat, optional androidx.health.connect.client.units.Mass? niacin, optional androidx.health.connect.client.units.Mass? pantothenicAcid, optional androidx.health.connect.client.units.Mass? phosphorus, optional androidx.health.connect.client.units.Mass? polyunsaturatedFat, optional androidx.health.connect.client.units.Mass? potassium, optional androidx.health.connect.client.units.Mass? protein, optional androidx.health.connect.client.units.Mass? riboflavin, optional androidx.health.connect.client.units.Mass? saturatedFat, optional androidx.health.connect.client.units.Mass? selenium, optional androidx.health.connect.client.units.Mass? sodium, optional androidx.health.connect.client.units.Mass? sugar, optional androidx.health.connect.client.units.Mass? thiamin, optional androidx.health.connect.client.units.Mass? totalCarbohydrate, optional androidx.health.connect.client.units.Mass? totalFat, optional androidx.health.connect.client.units.Mass? transFat, optional androidx.health.connect.client.units.Mass? unsaturatedFat, optional androidx.health.connect.client.units.Mass? vitaminA, optional androidx.health.connect.client.units.Mass? vitaminB12, optional androidx.health.connect.client.units.Mass? vitaminB6, optional androidx.health.connect.client.units.Mass? vitaminC, optional androidx.health.connect.client.units.Mass? vitaminD, optional androidx.health.connect.client.units.Mass? vitaminE, optional androidx.health.connect.client.units.Mass? vitaminK, optional androidx.health.connect.client.units.Mass? zinc, optional String? name, optional String? mealType, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.units.Mass? getBiotin();
+    method public androidx.health.connect.client.units.Mass? getCaffeine();
+    method public androidx.health.connect.client.units.Mass? getCalcium();
+    method public androidx.health.connect.client.units.Mass? getChloride();
+    method public androidx.health.connect.client.units.Mass? getCholesterol();
+    method public androidx.health.connect.client.units.Mass? getChromium();
+    method public androidx.health.connect.client.units.Mass? getCopper();
+    method public androidx.health.connect.client.units.Mass? getDietaryFiber();
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.units.Energy? getEnergy();
+    method public androidx.health.connect.client.units.Energy? getEnergyFromFat();
+    method public androidx.health.connect.client.units.Mass? getFolate();
+    method public androidx.health.connect.client.units.Mass? getFolicAcid();
+    method public androidx.health.connect.client.units.Mass? getIodine();
+    method public androidx.health.connect.client.units.Mass? getIron();
+    method public androidx.health.connect.client.units.Mass? getMagnesium();
+    method public androidx.health.connect.client.units.Mass? getManganese();
+    method public String? getMealType();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public androidx.health.connect.client.units.Mass? getMolybdenum();
+    method public androidx.health.connect.client.units.Mass? getMonounsaturatedFat();
+    method public String? getName();
+    method public androidx.health.connect.client.units.Mass? getNiacin();
+    method public androidx.health.connect.client.units.Mass? getPantothenicAcid();
+    method public androidx.health.connect.client.units.Mass? getPhosphorus();
+    method public androidx.health.connect.client.units.Mass? getPolyunsaturatedFat();
+    method public androidx.health.connect.client.units.Mass? getPotassium();
+    method public androidx.health.connect.client.units.Mass? getProtein();
+    method public androidx.health.connect.client.units.Mass? getRiboflavin();
+    method public androidx.health.connect.client.units.Mass? getSaturatedFat();
+    method public androidx.health.connect.client.units.Mass? getSelenium();
+    method public androidx.health.connect.client.units.Mass? getSodium();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    method public androidx.health.connect.client.units.Mass? getSugar();
+    method public androidx.health.connect.client.units.Mass? getThiamin();
+    method public androidx.health.connect.client.units.Mass? getTotalCarbohydrate();
+    method public androidx.health.connect.client.units.Mass? getTotalFat();
+    method public androidx.health.connect.client.units.Mass? getTransFat();
+    method public androidx.health.connect.client.units.Mass? getUnsaturatedFat();
+    method public androidx.health.connect.client.units.Mass? getVitaminA();
+    method public androidx.health.connect.client.units.Mass? getVitaminB12();
+    method public androidx.health.connect.client.units.Mass? getVitaminB6();
+    method public androidx.health.connect.client.units.Mass? getVitaminC();
+    method public androidx.health.connect.client.units.Mass? getVitaminD();
+    method public androidx.health.connect.client.units.Mass? getVitaminE();
+    method public androidx.health.connect.client.units.Mass? getVitaminK();
+    method public androidx.health.connect.client.units.Mass? getZinc();
+    property public final androidx.health.connect.client.units.Mass? biotin;
+    property public final androidx.health.connect.client.units.Mass? caffeine;
+    property public final androidx.health.connect.client.units.Mass? calcium;
+    property public final androidx.health.connect.client.units.Mass? chloride;
+    property public final androidx.health.connect.client.units.Mass? cholesterol;
+    property public final androidx.health.connect.client.units.Mass? chromium;
+    property public final androidx.health.connect.client.units.Mass? copper;
+    property public final androidx.health.connect.client.units.Mass? dietaryFiber;
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public final androidx.health.connect.client.units.Energy? energy;
+    property public final androidx.health.connect.client.units.Energy? energyFromFat;
+    property public final androidx.health.connect.client.units.Mass? folate;
+    property public final androidx.health.connect.client.units.Mass? folicAcid;
+    property public final androidx.health.connect.client.units.Mass? iodine;
+    property public final androidx.health.connect.client.units.Mass? iron;
+    property public final androidx.health.connect.client.units.Mass? magnesium;
+    property public final androidx.health.connect.client.units.Mass? manganese;
+    property public final String? mealType;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final androidx.health.connect.client.units.Mass? molybdenum;
+    property public final androidx.health.connect.client.units.Mass? monounsaturatedFat;
+    property public final String? name;
+    property public final androidx.health.connect.client.units.Mass? niacin;
+    property public final androidx.health.connect.client.units.Mass? pantothenicAcid;
+    property public final androidx.health.connect.client.units.Mass? phosphorus;
+    property public final androidx.health.connect.client.units.Mass? polyunsaturatedFat;
+    property public final androidx.health.connect.client.units.Mass? potassium;
+    property public final androidx.health.connect.client.units.Mass? protein;
+    property public final androidx.health.connect.client.units.Mass? riboflavin;
+    property public final androidx.health.connect.client.units.Mass? saturatedFat;
+    property public final androidx.health.connect.client.units.Mass? selenium;
+    property public final androidx.health.connect.client.units.Mass? sodium;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    property public final androidx.health.connect.client.units.Mass? sugar;
+    property public final androidx.health.connect.client.units.Mass? thiamin;
+    property public final androidx.health.connect.client.units.Mass? totalCarbohydrate;
+    property public final androidx.health.connect.client.units.Mass? totalFat;
+    property public final androidx.health.connect.client.units.Mass? transFat;
+    property public final androidx.health.connect.client.units.Mass? unsaturatedFat;
+    property public final androidx.health.connect.client.units.Mass? vitaminA;
+    property public final androidx.health.connect.client.units.Mass? vitaminB12;
+    property public final androidx.health.connect.client.units.Mass? vitaminB6;
+    property public final androidx.health.connect.client.units.Mass? vitaminC;
+    property public final androidx.health.connect.client.units.Mass? vitaminD;
+    property public final androidx.health.connect.client.units.Mass? vitaminE;
+    property public final androidx.health.connect.client.units.Mass? vitaminK;
+    property public final androidx.health.connect.client.units.Mass? zinc;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> BIOTIN_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CAFFEINE_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CALCIUM_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CHLORIDE_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CHOLESTEROL_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CHROMIUM_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> COPPER_TOTAL;
+    field public static final androidx.health.connect.client.records.NutritionRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> DIETARY_FIBER_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> ENERGY_FROM_FAT_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> ENERGY_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> FOLATE_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> FOLIC_ACID_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> IODINE_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> IRON_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> MAGNESIUM_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> MANGANESE_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> MOLYBDENUM_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> MONOUNSATURATED_FAT_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> NIACIN_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> PANTOTHENIC_ACID_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> PHOSPHORUS_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> POLYUNSATURATED_FAT_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> POTASSIUM_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> PROTEIN_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> RIBOFLAVIN_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> SATURATED_FAT_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> SELENIUM_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> SODIUM_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> SUGAR_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> THIAMIN_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> TOTAL_CARBOHYDRATE_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> TOTAL_FAT_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> TRANS_FAT_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> UNSATURATED_FAT_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_A_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_B12_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_B6_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_C_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_D_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_E_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_K_TOTAL;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> ZINC_TOTAL;
+  }
+
+  public static final class NutritionRecord.Companion {
+  }
+
+  public final class OvulationTestRecord implements androidx.health.connect.client.records.InstantaneousRecord {
+    ctor public OvulationTestRecord(String result, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public String getResult();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final String result;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public static final class OvulationTestRecord.Result {
+    field public static final String HIGH = "high";
+    field public static final String INCONCLUSIVE = "inconclusive";
+    field public static final androidx.health.connect.client.records.OvulationTestRecord.Result INSTANCE;
+    field public static final String NEGATIVE = "negative";
+    field public static final String POSITIVE = "positive";
+  }
+
+  public final class OxygenSaturationRecord implements androidx.health.connect.client.records.InstantaneousRecord {
+    ctor public OxygenSaturationRecord(androidx.health.connect.client.units.Percentage percentage, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public androidx.health.connect.client.units.Percentage getPercentage();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final androidx.health.connect.client.units.Percentage percentage;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public final class PowerRecord implements androidx.health.connect.client.records.SeriesRecord<androidx.health.connect.client.records.PowerRecord.Sample> {
+    ctor public PowerRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.PowerRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.util.List<androidx.health.connect.client.records.PowerRecord.Sample> getSamples();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.util.List<androidx.health.connect.client.records.PowerRecord.Sample> samples;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.records.PowerRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Power> POWER_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Power> POWER_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Power> POWER_MIN;
+  }
+
+  public static final class PowerRecord.Companion {
+  }
+
+  public static final class PowerRecord.Sample {
+    ctor public PowerRecord.Sample(java.time.Instant time, androidx.health.connect.client.units.Power power);
+    method public androidx.health.connect.client.units.Power getPower();
+    method public java.time.Instant getTime();
+    property public final androidx.health.connect.client.units.Power power;
+    property public final java.time.Instant time;
+  }
+
+  public interface Record {
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    property public abstract androidx.health.connect.client.records.metadata.Metadata metadata;
+  }
+
+  public final class RelationToMeal {
+    field public static final String AFTER_MEAL = "after_meal";
+    field public static final String BEFORE_MEAL = "before_meal";
+    field public static final String FASTING = "fasting";
+    field public static final String GENERAL = "general";
+    field public static final androidx.health.connect.client.records.RelationToMeal INSTANCE;
+  }
+
+  public final class RespiratoryRateRecord implements androidx.health.connect.client.records.InstantaneousRecord {
+    ctor public RespiratoryRateRecord(double rate, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public double getRate();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final double rate;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public final class RestingHeartRateRecord implements androidx.health.connect.client.records.InstantaneousRecord {
+    ctor public RestingHeartRateRecord(long beatsPerMinute, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public long getBeatsPerMinute();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final long beatsPerMinute;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_MIN;
+    field public static final androidx.health.connect.client.records.RestingHeartRateRecord.Companion Companion;
+  }
+
+  public static final class RestingHeartRateRecord.Companion {
+  }
+
+  @kotlin.PublishedApi internal interface SeriesRecord<T> extends androidx.health.connect.client.records.IntervalRecord {
+    method public java.util.List<T> getSamples();
+    property public abstract java.util.List<T> samples;
+  }
+
+  public final class SexualActivityRecord implements androidx.health.connect.client.records.InstantaneousRecord {
+    ctor public SexualActivityRecord(optional String? protectionUsed, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public String? getProtectionUsed();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final String? protectionUsed;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public static final class SexualActivityRecord.Protection {
+    field public static final androidx.health.connect.client.records.SexualActivityRecord.Protection INSTANCE;
+    field public static final String PROTECTED = "protected";
+    field public static final String UNPROTECTED = "unprotected";
+  }
+
+  public final class SleepSessionRecord implements androidx.health.connect.client.records.IntervalRecord {
+    ctor public SleepSessionRecord(optional String? title, optional String? notes, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public String? getNotes();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    method public String? getTitle();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final String? notes;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    property public final String? title;
+    field public static final androidx.health.connect.client.records.SleepSessionRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.time.Duration> SLEEP_DURATION_TOTAL;
+  }
+
+  public static final class SleepSessionRecord.Companion {
+  }
+
+  public final class SleepStageRecord implements androidx.health.connect.client.records.IntervalRecord {
+    ctor public SleepStageRecord(String stage, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public String getStage();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public final String stage;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+  }
+
+  public static final class SleepStageRecord.StageType {
+    field public static final String AWAKE = "awake";
+    field public static final String DEEP = "deep";
+    field public static final androidx.health.connect.client.records.SleepStageRecord.StageType INSTANCE;
+    field public static final String LIGHT = "light";
+    field public static final String OUT_OF_BED = "out_of_bed";
+    field public static final String REM = "rem";
+    field public static final String SLEEPING = "sleeping";
+    field public static final String UNKNOWN = "unknown";
+  }
+
+  public final class SpeedRecord implements androidx.health.connect.client.records.SeriesRecord<androidx.health.connect.client.records.SpeedRecord.Sample> {
+    ctor public SpeedRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.SpeedRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.util.List<androidx.health.connect.client.records.SpeedRecord.Sample> getSamples();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.util.List<androidx.health.connect.client.records.SpeedRecord.Sample> samples;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.records.SpeedRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Velocity> SPEED_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Velocity> SPEED_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Velocity> SPEED_MIN;
+  }
+
+  public static final class SpeedRecord.Companion {
+  }
+
+  public static final class SpeedRecord.Sample {
+    ctor public SpeedRecord.Sample(java.time.Instant time, androidx.health.connect.client.units.Velocity speed);
+    method public androidx.health.connect.client.units.Velocity getSpeed();
+    method public java.time.Instant getTime();
+    property public final androidx.health.connect.client.units.Velocity speed;
+    property public final java.time.Instant time;
+  }
+
+  public final class StepsCadenceRecord implements androidx.health.connect.client.records.SeriesRecord<androidx.health.connect.client.records.StepsCadenceRecord.Sample> {
+    ctor public StepsCadenceRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.StepsCadenceRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.util.List<androidx.health.connect.client.records.StepsCadenceRecord.Sample> getSamples();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.util.List<androidx.health.connect.client.records.StepsCadenceRecord.Sample> samples;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.records.StepsCadenceRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RATE_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RATE_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RATE_MIN;
+  }
+
+  public static final class StepsCadenceRecord.Companion {
+  }
+
+  public static final class StepsCadenceRecord.Sample {
+    ctor public StepsCadenceRecord.Sample(java.time.Instant time, @FloatRange(from=0.0, to=10000.0) double rate);
+    method public double getRate();
+    method public java.time.Instant getTime();
+    property public final double rate;
+    property public final java.time.Instant time;
+  }
+
+  public final class StepsRecord implements androidx.health.connect.client.records.IntervalRecord {
+    ctor public StepsRecord(long count, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public long getCount();
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public final long count;
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> COUNT_TOTAL;
+    field public static final androidx.health.connect.client.records.StepsRecord.Companion Companion;
+  }
+
+  public static final class StepsRecord.Companion {
+  }
+
+  public final class SwimmingStrokesRecord implements androidx.health.connect.client.records.IntervalRecord {
+    ctor public SwimmingStrokesRecord(optional long count, String type, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public long getCount();
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    method public String getType();
+    property public final long count;
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    property public final String type;
+  }
+
+  public static final class SwimmingStrokesRecord.SwimmingType {
+    field public static final String BACKSTROKE = "backstroke";
+    field public static final String BREASTSTROKE = "breaststroke";
+    field public static final String BUTTERFLY = "butterfly";
+    field public static final String FREESTYLE = "freestyle";
+    field public static final androidx.health.connect.client.records.SwimmingStrokesRecord.SwimmingType INSTANCE;
+    field public static final String MIXED = "mixed";
+    field public static final String OTHER = "other";
+  }
+
+  public final class TotalCaloriesBurnedRecord implements androidx.health.connect.client.records.IntervalRecord {
+    ctor public TotalCaloriesBurnedRecord(androidx.health.connect.client.units.Energy energy, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.units.Energy getEnergy();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public final androidx.health.connect.client.units.Energy energy;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.records.TotalCaloriesBurnedRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> ENERGY_TOTAL;
+  }
+
+  public static final class TotalCaloriesBurnedRecord.Companion {
+  }
+
+  public final class Vo2MaxRecord implements androidx.health.connect.client.records.InstantaneousRecord {
+    ctor public Vo2MaxRecord(double vo2MillilitersPerMinuteKilogram, optional String? measurementMethod, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public String? getMeasurementMethod();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public double getVo2MillilitersPerMinuteKilogram();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final String? measurementMethod;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public final double vo2MillilitersPerMinuteKilogram;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public static final class Vo2MaxRecord.MeasurementMethod {
+    field public static final String COOPER_TEST = "cooper_test";
+    field public static final String HEART_RATE_RATIO = "heart_rate_ratio";
+    field public static final androidx.health.connect.client.records.Vo2MaxRecord.MeasurementMethod INSTANCE;
+    field public static final String METABOLIC_CART = "metabolic_cart";
+    field public static final String MULTISTAGE_FITNESS_TEST = "multistage_fitness_test";
+    field public static final String OTHER = "other";
+    field public static final String ROCKPORT_FITNESS_TEST = "rockport_fitness_test";
+  }
+
+  public final class WaistCircumferenceRecord implements androidx.health.connect.client.records.InstantaneousRecord {
+    ctor public WaistCircumferenceRecord(androidx.health.connect.client.units.Length circumference, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.units.Length getCircumference();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public final androidx.health.connect.client.units.Length circumference;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public java.time.ZoneOffset? zoneOffset;
+  }
+
+  public final class WeightRecord implements androidx.health.connect.client.records.InstantaneousRecord {
+    ctor public WeightRecord(androidx.health.connect.client.units.Mass weight, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getTime();
+    method public androidx.health.connect.client.units.Mass getWeight();
+    method public java.time.ZoneOffset? getZoneOffset();
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant time;
+    property public final androidx.health.connect.client.units.Mass weight;
+    property public java.time.ZoneOffset? zoneOffset;
+    field public static final androidx.health.connect.client.records.WeightRecord.Companion Companion;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> WEIGHT_AVG;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> WEIGHT_MAX;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> WEIGHT_MIN;
+  }
+
+  public static final class WeightRecord.Companion {
+  }
+
+  public final class WheelchairPushesRecord implements androidx.health.connect.client.records.IntervalRecord {
+    ctor public WheelchairPushesRecord(long count, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
+    method public long getCount();
+    method public java.time.Instant getEndTime();
+    method public java.time.ZoneOffset? getEndZoneOffset();
+    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
+    method public java.time.Instant getStartTime();
+    method public java.time.ZoneOffset? getStartZoneOffset();
+    property public final long count;
+    property public java.time.Instant endTime;
+    property public java.time.ZoneOffset? endZoneOffset;
+    property public androidx.health.connect.client.records.metadata.Metadata metadata;
+    property public java.time.Instant startTime;
+    property public java.time.ZoneOffset? startZoneOffset;
+    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> COUNT_TOTAL;
+    field public static final androidx.health.connect.client.records.WheelchairPushesRecord.Companion Companion;
+  }
+
+  public static final class WheelchairPushesRecord.Companion {
+  }
+
+}
+
+package androidx.health.connect.client.records.metadata {
+
+  public final class DataOrigin {
+    ctor public DataOrigin(String packageName);
+    method public String getPackageName();
+    property public final String packageName;
+  }
+
+  public final class Device {
+    ctor public Device(optional String? manufacturer, optional String? model, optional String? type);
+    method public String? getManufacturer();
+    method public String? getModel();
+    method public String? getType();
+    property public final String? manufacturer;
+    property public final String? model;
+    property public final String? type;
+  }
+
+  public final class DeviceTypes {
+    field public static final String CHEST_STRAP = "CHEST_STRAP";
+    field public static final String FITNESS_BAND = "FITNESS_BAND";
+    field public static final String HEAD_MOUNTED = "HEAD_MOUNTED";
+    field public static final androidx.health.connect.client.records.metadata.DeviceTypes INSTANCE;
+    field public static final String PHONE = "PHONE";
+    field public static final String RING = "RING";
+    field public static final String SCALE = "SCALE";
+    field public static final String SMART_DISPLAY = "SMART_DISPLAY";
+    field public static final String UNKNOWN = "UNKNOWN";
+    field public static final String WATCH = "WATCH";
+  }
+
+  public final class Metadata {
+    ctor public Metadata(optional String uid, optional androidx.health.connect.client.records.metadata.DataOrigin dataOrigin, optional java.time.Instant lastModifiedTime, optional String? clientRecordId, optional long clientRecordVersion, optional androidx.health.connect.client.records.metadata.Device? device);
+    method public String? getClientRecordId();
+    method public long getClientRecordVersion();
+    method public androidx.health.connect.client.records.metadata.DataOrigin getDataOrigin();
+    method public androidx.health.connect.client.records.metadata.Device? getDevice();
+    method public java.time.Instant getLastModifiedTime();
+    method public String getUid();
+    property public final String? clientRecordId;
+    property public final long clientRecordVersion;
+    property public final androidx.health.connect.client.records.metadata.DataOrigin dataOrigin;
+    property public final androidx.health.connect.client.records.metadata.Device? device;
+    property public final java.time.Instant lastModifiedTime;
+    property public final String uid;
+  }
+
+}
+
+package androidx.health.connect.client.request {
+
+  public final class AggregateGroupByDurationRequest {
+    ctor public AggregateGroupByDurationRequest(java.util.Set<? extends androidx.health.connect.client.aggregate.AggregateMetric<?>> metrics, androidx.health.connect.client.time.TimeRangeFilter timeRangeFilter, java.time.Duration timeRangeSlicer, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilter);
+  }
+
+  public final class AggregateGroupByPeriodRequest {
+    ctor public AggregateGroupByPeriodRequest(java.util.Set<? extends androidx.health.connect.client.aggregate.AggregateMetric<?>> metrics, androidx.health.connect.client.time.TimeRangeFilter timeRangeFilter, java.time.Period timeRangeSlicer, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilter);
+  }
+
+  public final class AggregateRequest {
+    ctor public AggregateRequest(java.util.Set<? extends androidx.health.connect.client.aggregate.AggregateMetric<?>> metrics, androidx.health.connect.client.time.TimeRangeFilter timeRangeFilter, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilter);
+  }
+
+  public final class ChangesTokenRequest {
+    ctor public ChangesTokenRequest(java.util.Set<? extends kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record>> recordTypes, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilters);
+  }
+
+  public final class ReadRecordsRequest<T extends androidx.health.connect.client.records.Record> {
+    ctor public ReadRecordsRequest(kotlin.reflect.KClass<T> recordType, androidx.health.connect.client.time.TimeRangeFilter timeRangeFilter, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilter, optional boolean ascendingOrder, optional int pageSize, optional String? pageToken);
+  }
+
+}
+
+package androidx.health.connect.client.response {
+
+  public final class ChangesResponse {
+    method public java.util.List<androidx.health.connect.client.changes.Change> getChanges();
+    method public boolean getChangesTokenExpired();
+    method public boolean getHasMore();
+    method public String getNextChangesToken();
+    property public final java.util.List<androidx.health.connect.client.changes.Change> changes;
+    property public final boolean changesTokenExpired;
+    property public final boolean hasMore;
+    property public final String nextChangesToken;
+  }
+
+  public final class InsertRecordsResponse {
+    method public java.util.List<java.lang.String> getRecordUidsList();
+    property public final java.util.List<java.lang.String> recordUidsList;
+  }
+
+  public final class ReadRecordResponse<T extends androidx.health.connect.client.records.Record> {
+    method public T getRecord();
+    property public final T record;
+  }
+
+  public final class ReadRecordsResponse<T extends androidx.health.connect.client.records.Record> {
+    method public String? getPageToken();
+    method public java.util.List<T> getRecords();
+    property public final String? pageToken;
+    property public final java.util.List<T> records;
+  }
+
+}
+
+package androidx.health.connect.client.time {
+
+  public final class TimeRangeFilter {
+    method public static androidx.health.connect.client.time.TimeRangeFilter after(java.time.Instant startTime);
+    method public static androidx.health.connect.client.time.TimeRangeFilter after(java.time.LocalDateTime startTime);
+    method public static androidx.health.connect.client.time.TimeRangeFilter before(java.time.Instant endTime);
+    method public static androidx.health.connect.client.time.TimeRangeFilter before(java.time.LocalDateTime endTime);
+    method public static androidx.health.connect.client.time.TimeRangeFilter between(java.time.Instant startTime, java.time.Instant endTime);
+    method public static androidx.health.connect.client.time.TimeRangeFilter between(java.time.LocalDateTime startTime, java.time.LocalDateTime endTime);
+    field public static final androidx.health.connect.client.time.TimeRangeFilter.Companion Companion;
+  }
+
+  public static final class TimeRangeFilter.Companion {
+    method public androidx.health.connect.client.time.TimeRangeFilter after(java.time.Instant startTime);
+    method public androidx.health.connect.client.time.TimeRangeFilter after(java.time.LocalDateTime startTime);
+    method public androidx.health.connect.client.time.TimeRangeFilter before(java.time.Instant endTime);
+    method public androidx.health.connect.client.time.TimeRangeFilter before(java.time.LocalDateTime endTime);
+    method public androidx.health.connect.client.time.TimeRangeFilter between(java.time.Instant startTime, java.time.Instant endTime);
+    method public androidx.health.connect.client.time.TimeRangeFilter between(java.time.LocalDateTime startTime, java.time.LocalDateTime endTime);
+  }
+
+}
+
+package androidx.health.connect.client.units {
+
+  public final class Energy implements java.lang.Comparable<androidx.health.connect.client.units.Energy> {
+    method public static androidx.health.connect.client.units.Energy calories(double value);
+    method public int compareTo(androidx.health.connect.client.units.Energy other);
+    method public double getCalories();
+    method public double getJoules();
+    method public double getKilocalories();
+    method public double getKilojoules();
+    method public static androidx.health.connect.client.units.Energy joules(double value);
+    method public static androidx.health.connect.client.units.Energy kilocalories(double value);
+    method public static androidx.health.connect.client.units.Energy kilojoules(double value);
+    property public final double inCalories;
+    property public final double inJoules;
+    property public final double inKilocalories;
+    property public final double inKilojoules;
+    field public static final androidx.health.connect.client.units.Energy.Companion Companion;
+  }
+
+  public static final class Energy.Companion {
+    method public androidx.health.connect.client.units.Energy calories(double value);
+    method public androidx.health.connect.client.units.Energy joules(double value);
+    method public androidx.health.connect.client.units.Energy kilocalories(double value);
+    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);
+    method public double getFeet();
+    method public double getInches();
+    method public double getKilometers();
+    method public double getMeters();
+    method public double getMiles();
+    method public static androidx.health.connect.client.units.Length inches(double value);
+    method public static androidx.health.connect.client.units.Length kilometers(double value);
+    method public static androidx.health.connect.client.units.Length meters(double value);
+    method public static androidx.health.connect.client.units.Length miles(double value);
+    property public final double inFeet;
+    property public final double inInches;
+    property public final double inKilometers;
+    property public final double inMeters;
+    property public final double inMiles;
+    field public static final androidx.health.connect.client.units.Length.Companion Companion;
+  }
+
+  public static final class Length.Companion {
+    method public androidx.health.connect.client.units.Length feet(double value);
+    method public androidx.health.connect.client.units.Length inches(double value);
+    method public androidx.health.connect.client.units.Length kilometers(double value);
+    method public androidx.health.connect.client.units.Length meters(double value);
+    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();
+    method public double getKilograms();
+    method public double getMicrograms();
+    method public double getMilligrams();
+    method public double getOunces();
+    method public double getPounds();
+    method public static androidx.health.connect.client.units.Mass grams(double value);
+    method public static androidx.health.connect.client.units.Mass kilograms(double value);
+    method public static androidx.health.connect.client.units.Mass micrograms(double value);
+    method public static androidx.health.connect.client.units.Mass milligrams(double value);
+    method public static androidx.health.connect.client.units.Mass ounces(double value);
+    method public static androidx.health.connect.client.units.Mass pounds(double value);
+    property public final double inGrams;
+    property public final double inKilograms;
+    property public final double inMicrograms;
+    property public final double inMilligrams;
+    property public final double inOunces;
+    property public final double inPounds;
+    field public static final androidx.health.connect.client.units.Mass.Companion Companion;
+  }
+
+  public static final class Mass.Companion {
+    method public androidx.health.connect.client.units.Mass grams(double value);
+    method public androidx.health.connect.client.units.Mass kilograms(double value);
+    method public androidx.health.connect.client.units.Mass micrograms(double value);
+    method public androidx.health.connect.client.units.Mass milligrams(double value);
+    method public androidx.health.connect.client.units.Mass ounces(double value);
+    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);
+    method public double getValue();
+    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();
+    method public double getWatts();
+    method public static androidx.health.connect.client.units.Power kilocaloriesPerDay(double value);
+    method public static androidx.health.connect.client.units.Power watts(double value);
+    property public final double inKilocaloriesPerDay;
+    property public final double inWatts;
+    field public static final androidx.health.connect.client.units.Power.Companion Companion;
+  }
+
+  public static final class Power.Companion {
+    method public androidx.health.connect.client.units.Power kilocaloriesPerDay(double value);
+    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();
+    method public static androidx.health.connect.client.units.Pressure millimetersOfMercury(double value);
+    property public final double inMillimetersOfMercury;
+    field public static final androidx.health.connect.client.units.Pressure.Companion Companion;
+  }
+
+  public static final class Pressure.Companion {
+    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);
+    method public static androidx.health.connect.client.units.Temperature fahrenheit(double value);
+    method public double getCelsius();
+    method public double getFahrenheit();
+    property public final double inCelsius;
+    property public final double inFahrenheit;
+    field public static final androidx.health.connect.client.units.Temperature.Companion Companion;
+  }
+
+  public static final class Temperature.Companion {
+    method public androidx.health.connect.client.units.Temperature celsius(double value);
+    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();
+    method public double getMetersPerSecond();
+    method public double getMilesPerHour();
+    method public static androidx.health.connect.client.units.Velocity kilometersPerHour(double value);
+    method public static androidx.health.connect.client.units.Velocity metersPerSecond(double value);
+    method public static androidx.health.connect.client.units.Velocity milesPerHour(double value);
+    property public final double inKilometersPerHour;
+    property public final double inMetersPerSecond;
+    property public final double inMilesPerHour;
+    field public static final androidx.health.connect.client.units.Velocity.Companion Companion;
+  }
+
+  public static final class Velocity.Companion {
+    method public androidx.health.connect.client.units.Velocity kilometersPerHour(double value);
+    method public androidx.health.connect.client.units.Velocity metersPerSecond(double value);
+    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);
+    method public double getFluidOuncesUs();
+    method public double getLiters();
+    method public double getMilliliters();
+    method public static androidx.health.connect.client.units.Volume liters(double value);
+    method public static androidx.health.connect.client.units.Volume milliliters(double value);
+    property public final double inFluidOuncesUs;
+    property public final double inLiters;
+    property public final double inMilliliters;
+    field public static final androidx.health.connect.client.units.Volume.Companion Companion;
+  }
+
+  public static final class Volume.Companion {
+    method public androidx.health.connect.client.units.Volume fluidOuncesUs(double value);
+    method public androidx.health.connect.client.units.Volume liters(double value);
+    method public androidx.health.connect.client.units.Volume milliliters(double value);
+  }
+
+  public final class VolumeKt {
+  }
+
+}
+
diff --git a/health/connect/connect-client/build.gradle b/health/connect/connect-client/build.gradle
new file mode 100644
index 0000000..6352024
--- /dev/null
+++ b/health/connect/connect-client/build.gradle
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import androidx.build.BundleInsideHelper
+import androidx.build.LibraryType
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("org.jetbrains.kotlin.android")
+}
+
+BundleInsideHelper.forInsideAar(
+        project,
+        /* from = */ "com.google.protobuf",
+        /* to =   */ "androidx.health.platform.client.proto"
+)
+
+dependencies {
+    api(libs.kotlinStdlib)
+    // Add dependencies here
+    api("androidx.activity:activity:1.2.0")
+    api("androidx.annotation:annotation:1.2.0")
+    bundleInside(project(
+            path: ":health:connect:connect-client-proto",
+            configuration: "export"
+    ))
+    implementation(libs.guavaListenableFuture)
+    implementation(libs.guavaAndroid)
+    implementation(libs.kotlinCoroutinesAndroid)
+    implementation(libs.kotlinCoroutinesGuava)
+
+    testImplementation(libs.testCore)
+    testImplementation(libs.testRunner)
+    testImplementation(libs.junit)
+    testImplementation(libs.truth)
+    testImplementation(libs.kotlinCoroutinesTest)
+    androidTestImplementation(libs.testRules)
+    testImplementation(libs.mockitoCore)
+    testImplementation(libs.robolectric)
+    testImplementation(libs.testExtJunit)
+    testImplementation(libs.kotlinTest)
+    testImplementation(libs.espressoCore)
+    testImplementation(libs.espressoIntents)
+
+    samples(project(":health:connect:connect-client-samples"))
+}
+
+android {
+    defaultConfig {
+        minSdkVersion 26
+    }
+    buildFeatures {
+        aidl = true
+    }
+    buildTypes.all {
+        consumerProguardFiles "proguard-rules.pro"
+    }
+    testOptions.unitTests.includeAndroidResources = true
+    namespace "androidx.health.connect.client"
+}
+
+androidx {
+    name = "AndroidX Health Connect Client Library"
+    type = LibraryType.PUBLISHED_LIBRARY
+    mavenGroup = LibraryGroups.HEALTH_CONNECT
+    inceptionYear = "2022"
+    description = "read or write user's health and fitness records."
+}
+
+// Allow usage of Kotlin's @OptIn.
+tasks.withType(KotlinCompile).configureEach {
+    kotlinOptions {
+        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
+    }
+}
diff --git a/health/health-connect-client/lint-baseline.xml b/health/connect/connect-client/lint-baseline.xml
similarity index 100%
rename from health/health-connect-client/lint-baseline.xml
rename to health/connect/connect-client/lint-baseline.xml
diff --git a/health/health-connect-client/proguard-rules.pro b/health/connect/connect-client/proguard-rules.pro
similarity index 100%
rename from health/health-connect-client/proguard-rules.pro
rename to health/connect/connect-client/proguard-rules.pro
diff --git a/health/connect/connect-client/samples/build.gradle b/health/connect/connect-client/samples/build.gradle
new file mode 100644
index 0000000..c4a7974
--- /dev/null
+++ b/health/connect/connect-client/samples/build.gradle
@@ -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.
+ */
+
+
+import androidx.build.Publish
+import androidx.build.LibraryType
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("org.jetbrains.kotlin.android")
+}
+
+dependencies {
+    implementation(libs.kotlinStdlib)
+
+    compileOnly projectOrArtifact(":annotation:annotation-sampled")
+    implementation project(":health:connect:connect-client")
+    implementation project(":appcompat:appcompat")
+    implementation project(":activity:activity")
+}
+
+androidx {
+    name = "AndroidX Health Connect Library Samples"
+    type = LibraryType.SAMPLES
+    mavenGroup = LibraryGroups.HEALTH_CONNECT
+    inceptionYear = "2022"
+    description = "Contains the sample code for the Androidx Health Connect Library"
+}
+
+android {
+    namespace "androidx.health.connect.client.samples"
+    defaultConfig {
+        minSdkVersion 26
+    }
+}
diff --git a/health/health-connect-client/samples/src/main/AndroidManifest.xml b/health/connect/connect-client/samples/src/main/AndroidManifest.xml
similarity index 100%
rename from health/health-connect-client/samples/src/main/AndroidManifest.xml
rename to health/connect/connect-client/samples/src/main/AndroidManifest.xml
diff --git a/health/health-connect-client/samples/src/main/java/androidx/health/connect/client/samples/AggregationSamples.kt b/health/connect/connect-client/samples/src/main/java/androidx/health/connect/client/samples/AggregationSamples.kt
similarity index 100%
rename from health/health-connect-client/samples/src/main/java/androidx/health/connect/client/samples/AggregationSamples.kt
rename to health/connect/connect-client/samples/src/main/java/androidx/health/connect/client/samples/AggregationSamples.kt
diff --git a/health/connect/connect-client/samples/src/main/java/androidx/health/connect/client/samples/DeleteRecordsSamples.kt b/health/connect/connect-client/samples/src/main/java/androidx/health/connect/client/samples/DeleteRecordsSamples.kt
new file mode 100644
index 0000000..892e6f2
--- /dev/null
+++ b/health/connect/connect-client/samples/src/main/java/androidx/health/connect/client/samples/DeleteRecordsSamples.kt
@@ -0,0 +1,62 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("UNUSED_VARIABLE")
+
+package androidx.health.connect.client.samples
+
+import androidx.annotation.Sampled
+import androidx.health.connect.client.HealthConnectClient
+import androidx.health.connect.client.records.SleepSessionRecord
+import androidx.health.connect.client.records.SleepStageRecord
+import androidx.health.connect.client.records.StepsRecord
+import androidx.health.connect.client.time.TimeRangeFilter
+import java.time.Instant
+
+@Sampled
+suspend fun DeleteByUniqueIdentifier(
+    healthConnectClient: HealthConnectClient,
+    uid1: String,
+    uid2: String
+) {
+    healthConnectClient.deleteRecords(
+        StepsRecord::class,
+        uidsList = listOf(uid1, uid2),
+        clientRecordIdsList = emptyList()
+    )
+}
+
+@Sampled
+suspend fun DeleteByTimeRange(
+    healthConnectClient: HealthConnectClient,
+    startTime: Instant,
+    endTime: Instant
+) {
+    healthConnectClient.deleteRecords(
+        StepsRecord::class,
+        timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
+    )
+}
+
+@Sampled
+suspend fun DeleteSleepSession(
+    healthConnectClient: HealthConnectClient,
+    sleepRecord: SleepSessionRecord,
+) {
+    val timeRangeFilter = TimeRangeFilter.between(sleepRecord.startTime, sleepRecord.endTime)
+    healthConnectClient.deleteRecords(SleepSessionRecord::class, timeRangeFilter)
+    healthConnectClient.deleteRecords(SleepStageRecord::class, timeRangeFilter)
+}
diff --git a/health/health-connect-client/samples/src/main/java/androidx/health/connect/client/samples/InsertRecordsSamples.kt b/health/connect/connect-client/samples/src/main/java/androidx/health/connect/client/samples/InsertRecordsSamples.kt
similarity index 100%
rename from health/health-connect-client/samples/src/main/java/androidx/health/connect/client/samples/InsertRecordsSamples.kt
rename to health/connect/connect-client/samples/src/main/java/androidx/health/connect/client/samples/InsertRecordsSamples.kt
diff --git a/health/health-connect-client/samples/src/main/java/androidx/health/connect/client/samples/PermissionSamples.kt b/health/connect/connect-client/samples/src/main/java/androidx/health/connect/client/samples/PermissionSamples.kt
similarity index 100%
rename from health/health-connect-client/samples/src/main/java/androidx/health/connect/client/samples/PermissionSamples.kt
rename to health/connect/connect-client/samples/src/main/java/androidx/health/connect/client/samples/PermissionSamples.kt
diff --git a/health/health-connect-client/samples/src/main/java/androidx/health/connect/client/samples/ReadRecordsSamples.kt b/health/connect/connect-client/samples/src/main/java/androidx/health/connect/client/samples/ReadRecordsSamples.kt
similarity index 100%
rename from health/health-connect-client/samples/src/main/java/androidx/health/connect/client/samples/ReadRecordsSamples.kt
rename to health/connect/connect-client/samples/src/main/java/androidx/health/connect/client/samples/ReadRecordsSamples.kt
diff --git a/health/health-connect-client/src/androidTest/AndroidManifest.xml b/health/connect/connect-client/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from health/health-connect-client/src/androidTest/AndroidManifest.xml
rename to health/connect/connect-client/src/androidTest/AndroidManifest.xml
diff --git a/health/health-connect-client/src/main/AndroidManifest.xml b/health/connect/connect-client/src/main/AndroidManifest.xml
similarity index 100%
rename from health/health-connect-client/src/main/AndroidManifest.xml
rename to health/connect/connect-client/src/main/AndroidManifest.xml
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/changes/ChangesEvent.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/changes/ChangesEvent.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/changes/ChangesEvent.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/changes/ChangesEvent.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/error/ErrorStatus.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/error/ErrorStatus.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/error/ErrorStatus.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/error/ErrorStatus.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/impl/sdkservice/IGetIsInForegroundCallback.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/impl/sdkservice/IGetIsInForegroundCallback.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/impl/sdkservice/IGetIsInForegroundCallback.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/impl/sdkservice/IGetIsInForegroundCallback.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/impl/sdkservice/IGetPermissionTokenCallback.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/impl/sdkservice/IGetPermissionTokenCallback.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/impl/sdkservice/IGetPermissionTokenCallback.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/impl/sdkservice/IGetPermissionTokenCallback.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/impl/sdkservice/IHealthDataSdkService.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/impl/sdkservice/IHealthDataSdkService.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/impl/sdkservice/IHealthDataSdkService.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/impl/sdkservice/IHealthDataSdkService.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/impl/sdkservice/ISetPermissionTokenCallback.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/impl/sdkservice/ISetPermissionTokenCallback.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/impl/sdkservice/ISetPermissionTokenCallback.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/impl/sdkservice/ISetPermissionTokenCallback.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/permission/Permission.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/permission/Permission.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/permission/Permission.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/permission/Permission.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/request/AggregateDataRequest.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/request/AggregateDataRequest.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/request/AggregateDataRequest.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/request/AggregateDataRequest.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/request/DeleteDataRangeRequest.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/request/DeleteDataRangeRequest.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/request/DeleteDataRangeRequest.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/request/DeleteDataRangeRequest.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/request/DeleteDataRequest.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/request/DeleteDataRequest.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/request/DeleteDataRequest.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/request/DeleteDataRequest.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/request/GetChangesRequest.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/request/GetChangesRequest.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/request/GetChangesRequest.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/request/GetChangesRequest.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/request/GetChangesTokenRequest.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/request/GetChangesTokenRequest.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/request/GetChangesTokenRequest.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/request/GetChangesTokenRequest.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/request/ReadDataRangeRequest.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/request/ReadDataRangeRequest.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/request/ReadDataRangeRequest.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/request/ReadDataRangeRequest.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/request/ReadDataRequest.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/request/ReadDataRequest.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/request/ReadDataRequest.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/request/ReadDataRequest.aidl
diff --git a/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/request/RegisterForDataNotificationsRequest.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/request/RegisterForDataNotificationsRequest.aidl
new file mode 100644
index 0000000..c651c5e
--- /dev/null
+++ b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/request/RegisterForDataNotificationsRequest.aidl
@@ -0,0 +1,18 @@
+/*
+ * 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.platform.client.request;
+
+parcelable RegisterForDataNotificationsRequest;
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/request/RequestContext.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/request/RequestContext.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/request/RequestContext.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/request/RequestContext.aidl
diff --git a/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/request/UnregisterFromDataNotificationsRequest.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/request/UnregisterFromDataNotificationsRequest.aidl
new file mode 100644
index 0000000..51e5ff8
--- /dev/null
+++ b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/request/UnregisterFromDataNotificationsRequest.aidl
@@ -0,0 +1,18 @@
+/*
+ * 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.platform.client.request;
+
+parcelable UnregisterFromDataNotificationsRequest;
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/request/UpsertDataRequest.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/request/UpsertDataRequest.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/request/UpsertDataRequest.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/request/UpsertDataRequest.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/response/AggregateDataResponse.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/response/AggregateDataResponse.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/response/AggregateDataResponse.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/response/AggregateDataResponse.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/response/GetChangesResponse.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/response/GetChangesResponse.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/response/GetChangesResponse.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/response/GetChangesResponse.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/response/GetChangesTokenResponse.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/response/GetChangesTokenResponse.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/response/GetChangesTokenResponse.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/response/GetChangesTokenResponse.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/response/InsertDataResponse.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/response/InsertDataResponse.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/response/InsertDataResponse.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/response/InsertDataResponse.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/response/ReadDataRangeResponse.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/response/ReadDataRangeResponse.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/response/ReadDataRangeResponse.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/response/ReadDataRangeResponse.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/response/ReadDataResponse.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/response/ReadDataResponse.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/response/ReadDataResponse.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/response/ReadDataResponse.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IAggregateDataCallback.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IAggregateDataCallback.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IAggregateDataCallback.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IAggregateDataCallback.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IClearOnChangesListenerCallback.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IClearOnChangesListenerCallback.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IClearOnChangesListenerCallback.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IClearOnChangesListenerCallback.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IDeleteDataCallback.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IDeleteDataCallback.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IDeleteDataCallback.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IDeleteDataCallback.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IDeleteDataRangeCallback.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IDeleteDataRangeCallback.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IDeleteDataRangeCallback.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IDeleteDataRangeCallback.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IGetChangesCallback.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IGetChangesCallback.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IGetChangesCallback.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IGetChangesCallback.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IGetChangesTokenCallback.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IGetChangesTokenCallback.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IGetChangesTokenCallback.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IGetChangesTokenCallback.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IGetGrantedPermissionsCallback.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IGetGrantedPermissionsCallback.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IGetGrantedPermissionsCallback.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IGetGrantedPermissionsCallback.aidl
diff --git a/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IHealthDataService.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IHealthDataService.aidl
new file mode 100644
index 0000000..263585a
--- /dev/null
+++ b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IHealthDataService.aidl
@@ -0,0 +1,88 @@
+/*
+ * 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.platform.client.service;
+
+import androidx.health.platform.client.permission.Permission;
+import androidx.health.platform.client.request.AggregateDataRequest;
+import androidx.health.platform.client.request.DeleteDataRequest;
+import androidx.health.platform.client.request.DeleteDataRangeRequest;
+import androidx.health.platform.client.request.GetChangesTokenRequest;
+import androidx.health.platform.client.request.GetChangesRequest;
+import androidx.health.platform.client.request.UpsertDataRequest;
+import androidx.health.platform.client.request.ReadDataRequest;
+import androidx.health.platform.client.request.ReadDataRangeRequest;
+import androidx.health.platform.client.request.RegisterForDataNotificationsRequest;
+import androidx.health.platform.client.request.RequestContext;
+import androidx.health.platform.client.request.UnregisterFromDataNotificationsRequest;
+import androidx.health.platform.client.service.IGetChangesCallback;
+import androidx.health.platform.client.service.IGetChangesTokenCallback;
+import androidx.health.platform.client.service.IGetGrantedPermissionsCallback;
+import androidx.health.platform.client.service.IDeleteDataCallback;
+import androidx.health.platform.client.service.IDeleteDataRangeCallback;
+import androidx.health.platform.client.service.IReadDataRangeCallback;
+import androidx.health.platform.client.service.IUpdateDataCallback;
+import androidx.health.platform.client.service.IInsertDataCallback;
+import androidx.health.platform.client.service.IReadDataCallback;
+import androidx.health.platform.client.service.IRevokeAllPermissionsCallback;
+import androidx.health.platform.client.service.IAggregateDataCallback;
+import androidx.health.platform.client.service.IRegisterForDataNotificationsCallback;
+import androidx.health.platform.client.service.IUnregisterFromDataNotificationsCallback;
+
+interface IHealthDataService {
+  /**
+   * API version of the AIDL interface. Should be incremented every time a new
+   * method is added.
+   */
+  const int CURRENT_API_VERSION = 2;
+
+  const int MIN_API_VERSION = 1;
+
+  // Next Id: 20
+
+  /**
+   * Returns version of this AIDL interface.
+   *
+   * <p> Can be used by client to detect version of the API on the service
+   * side. Should always return CURRENT_API_VERSION.
+   */
+  int getApiVersion() = 0;
+
+  void getGrantedPermissions(in RequestContext context, in List<Permission> permissions, in IGetGrantedPermissionsCallback callback) = 3;
+
+  void revokeAllPermissions(in RequestContext context, in IRevokeAllPermissionsCallback callback) = 8;
+
+  void insertData(in RequestContext context, in UpsertDataRequest request, in IInsertDataCallback callback) = 9;
+
+  void deleteData(in RequestContext context, in DeleteDataRequest request, in IDeleteDataCallback callback) = 10;
+
+  void deleteDataRange(in RequestContext context, in DeleteDataRangeRequest request, in IDeleteDataRangeCallback callback) = 13;
+
+  void readData(in RequestContext context, in ReadDataRequest request, in IReadDataCallback callback) = 11;
+
+  void readDataRange(in RequestContext context, in ReadDataRangeRequest request, in IReadDataRangeCallback callback) = 15;
+
+  void updateData(in RequestContext context, in UpsertDataRequest request, in IUpdateDataCallback callback) = 12;
+
+  void aggregate(in RequestContext context, in AggregateDataRequest request, in IAggregateDataCallback callback) = 14;
+
+  void getChangesToken(in RequestContext context, in GetChangesTokenRequest request, in IGetChangesTokenCallback callback) = 16;
+
+  void getChanges(in RequestContext context, in GetChangesRequest request, in IGetChangesCallback callback) = 17;
+
+  void registerForDataNotifications(in RequestContext context, in RegisterForDataNotificationsRequest request, in IRegisterForDataNotificationsCallback callback) = 18;
+
+  void unregisterFromDataNotifications(in RequestContext context, in UnregisterFromDataNotificationsRequest request, in IUnregisterFromDataNotificationsCallback callback) = 19;
+}
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IInsertDataCallback.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IInsertDataCallback.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IInsertDataCallback.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IInsertDataCallback.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IOnChangesListener.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IOnChangesListener.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IOnChangesListener.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IOnChangesListener.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IReadDataCallback.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IReadDataCallback.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IReadDataCallback.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IReadDataCallback.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IReadDataRangeCallback.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IReadDataRangeCallback.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IReadDataRangeCallback.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IReadDataRangeCallback.aidl
diff --git a/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IRegisterForDataNotificationsCallback.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IRegisterForDataNotificationsCallback.aidl
new file mode 100644
index 0000000..e83ff27
--- /dev/null
+++ b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IRegisterForDataNotificationsCallback.aidl
@@ -0,0 +1,24 @@
+/*
+ * 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.platform.client.service;
+
+import androidx.health.platform.client.error.ErrorStatus;
+import androidx.health.platform.client.response.ReadDataRangeResponse;
+
+oneway interface IRegisterForDataNotificationsCallback {
+  void onSuccess() = 0;
+  void onError(in ErrorStatus status) = 1;
+}
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IRevokeAllPermissionsCallback.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IRevokeAllPermissionsCallback.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IRevokeAllPermissionsCallback.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IRevokeAllPermissionsCallback.aidl
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/ISetOnChangesListenerCallback.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/ISetOnChangesListenerCallback.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/ISetOnChangesListenerCallback.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/ISetOnChangesListenerCallback.aidl
diff --git a/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IUnregisterFromDataNotificationsCallback.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IUnregisterFromDataNotificationsCallback.aidl
new file mode 100644
index 0000000..f3974db
--- /dev/null
+++ b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IUnregisterFromDataNotificationsCallback.aidl
@@ -0,0 +1,24 @@
+/*
+ * 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.platform.client.service;
+
+import androidx.health.platform.client.error.ErrorStatus;
+import androidx.health.platform.client.response.ReadDataRangeResponse;
+
+oneway interface IUnregisterFromDataNotificationsCallback {
+  void onSuccess() = 0;
+  void onError(in ErrorStatus status) = 1;
+}
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IUpdateDataCallback.aidl b/health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IUpdateDataCallback.aidl
similarity index 100%
rename from health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IUpdateDataCallback.aidl
rename to health/connect/connect-client/src/main/aidl/androidx/health/platform/client/service/IUpdateDataCallback.aidl
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
new file mode 100644
index 0000000..61e9f8d
--- /dev/null
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/HealthConnectClient.kt
@@ -0,0 +1,387 @@
+/*
+ * 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
+
+import android.content.Context
+import android.content.Intent
+import android.content.pm.PackageManager
+import android.os.Build
+import android.os.RemoteException
+import androidx.annotation.ChecksSdkIntAtLeast
+import androidx.annotation.RestrictTo
+import androidx.health.connect.client.aggregate.AggregateMetric
+import androidx.health.connect.client.aggregate.AggregationResult
+import androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration
+import androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod
+import androidx.health.connect.client.impl.HealthConnectClientImpl
+import androidx.health.connect.client.records.Record
+import androidx.health.connect.client.records.metadata.DataOrigin
+import androidx.health.connect.client.request.AggregateGroupByDurationRequest
+import androidx.health.connect.client.request.AggregateGroupByPeriodRequest
+import androidx.health.connect.client.request.AggregateRequest
+import androidx.health.connect.client.request.ChangesTokenRequest
+import androidx.health.connect.client.request.ReadRecordsRequest
+import androidx.health.connect.client.response.ChangesResponse
+import androidx.health.connect.client.response.InsertRecordsResponse
+import androidx.health.connect.client.response.ReadRecordResponse
+import androidx.health.connect.client.response.ReadRecordsResponse
+import androidx.health.connect.client.time.TimeRangeFilter
+import androidx.health.platform.client.HealthDataService
+import java.io.IOException
+import java.lang.IllegalStateException
+import kotlin.reflect.KClass
+
+/** Interface to access health and fitness records. */
+interface HealthConnectClient {
+
+    /** Access operations related to permissions. */
+    val permissionController: PermissionController
+
+    /**
+     * Inserts one or more [Record] and returns newly assigned
+     * [androidx.health.connect.client.records.metadata.Metadata.uid] generated. Insertion of
+     * multiple [records] is executed in a transaction - if one fails, none is inserted.
+     *
+     * 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
+     * deduplicate data with a client provided unique identifier. When a subsequent [insertRecords]
+     * is called with the same [androidx.health.connect.client.records.metadata.Metadata.clientRecordId],
+     * whichever [Record] 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
+
+    /**
+     * Updates one or more [Record] of given UIDs to newly specified values. Update of multiple
+     * [records] is executed in a transaction - if one fails, none is inserted.
+     *
+     * @param records List of records to update
+     * @throws RemoteException For any IPC transportation failures. Update with invalid identifiers
+     * 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.
+     */
+    suspend fun updateRecords(records: List<Record>)
+
+    /**
+     * 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 uidsList List of uids of [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.
+     * @throws SecurityException For requests with unpermitted access.
+     * @throws IOException For any disk I/O issues.
+     * @throws IllegalStateException If service is not available.
+     */
+    suspend fun deleteRecords(
+        recordType: KClass<out Record>,
+        uidsList: List<String>,
+        clientRecordIdsList: List<String>,
+    )
+
+    /**
+     * Deletes any [Record] of the given [recordType] in the given [timeRangeFilter] (automatically
+     * 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.
+     */
+    suspend fun deleteRecords(recordType: KClass<out Record>, timeRangeFilter: TimeRangeFilter)
+
+    /**
+     * Reads one [Record] point with its [recordType] and [uid].
+     *
+     * @param recordType Which type of [Record] to read, such as `Steps::class`
+     * @param uid Uid of [Record] to read
+     * @return The [Record] data point.
+     * @throws RemoteException For any IPC transportation failures. Update with invalid identifiers
+     * 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.
+     */
+    suspend fun <T : Record> readRecord(recordType: KClass<T>, uid: String): ReadRecordResponse<T>
+
+    /**
+     * 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.
+     */
+    suspend fun <T : Record> readRecords(request: ReadRecordsRequest<T>): ReadRecordsResponse<T>
+
+    /**
+     * 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.
+     *
+     * @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.
+     */
+    suspend fun aggregate(request: AggregateRequest): AggregationResult
+
+    /**
+     * Reads [AggregateMetric]s according to requested read criteria specified in
+     * [AggregateGroupByDurationRequest].
+     *
+     * This method is similar to [aggregate] but instead of returning one [AggregationResult] for
+     * the entire query's time interval, it returns a list of [AggregationResultGroupedByDuration],
+     * with each row keyed by start and end time. For example: steps for today bucketed by hours.
+     *
+     * 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.
+     *
+     * @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.
+     * @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 aggregateGroupByDuration(
+        request: AggregateGroupByDurationRequest,
+    ): List<AggregationResultGroupedByDuration>
+
+    /**
+     * Reads [AggregateMetric]s according to requested read criteria specified in
+     * [AggregateGroupByPeriodRequest].
+     *
+     * This method is similar to [aggregate] but instead of returning one [AggregationResult] for
+     * the entire query's time interval, it returns a list of [AggregationResultGroupedByPeriod],
+     * with each row keyed by start and end time. For example: steps for this month bucketed by day.
+     *
+     * 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.
+     *
+     * @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.
+     * @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 aggregateGroupByPeriod(
+        request: AggregateGroupByPeriodRequest,
+    ): List<AggregationResultGroupedByPeriod>
+
+    /**
+     * Retrieves a changes-token, representing a point in time in the underlying Android Health
+     * Platform for a given [ChangesTokenRequest]. Changes-tokens are used in [getChanges] to
+     * retrieve changes since that point in time.
+     *
+     * Changes-tokens represent a point in time after which the client is interested in knowing the
+     * changes for a set of interested types of [Record] and optional [DataOrigin] filters.
+     *
+     * Changes-tokens are only valid for 30 days after they're generated. Calls to [getChanges] with
+     * an expired changes-token will lead to [ChangesResponse.changesTokenExpired]
+     *
+     * @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
+
+    /**
+     * Retrieves changes in Android Health Platform, from a specific point in time represented by
+     * provided [changesToken].
+     *
+     * The response returned may not provide all the changes due to IPC or memory limits, see
+     * [ChangesResponse.hasMore]. Clients can make more api calls to fetch more changes from the
+     * Android Health Platform with updated [ChangesResponse.nextChangesToken].
+     *
+     * Provided [changesToken] may have expired if clients have not synced for extended period of
+     * time (such as a month). In this case [ChangesResponse.changesTokenExpired] will be set, and
+     * clients should generate a new changes-token via [getChangesToken].
+     *
+     * ```
+     * val response = client.getChanges(changesToken)
+     * if (response.changesTokenExpired) {
+     *   // Consider re-sync and fetch new changes token.
+     * } else {
+     *   // Process new insertion/deletions, either update local storage or upload to backends.
+     * }
+     * ```
+     *
+     * @param changesToken A Changes-Token that represents a specific point in time in Android
+     * 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
+
+    companion object {
+        @RestrictTo(RestrictTo.Scope.LIBRARY)
+        internal const val DEFAULT_PROVIDER_PACKAGE_NAME = "com.google.android.apps.healthdata"
+
+        /**
+         * Determines whether an implementation of [HealthConnectClient] is available on this device
+         * at the moment.
+         *
+         * @param packageNames optional package provider to choose implementation from
+         * @return whether the api is available
+         */
+        @JvmOverloads
+        @JvmStatic
+        public fun isAvailable(
+            context: Context,
+            packageNames: List<String> = listOf(DEFAULT_PROVIDER_PACKAGE_NAME),
+        ): Boolean {
+            if (!isSdkVersionSufficient()) {
+                return false
+            }
+            return packageNames.any { isPackageInstalled(context.packageManager, it) }
+        }
+
+        /**
+         * Retrieves an IPC-backed [HealthConnectClient] instance binding to an available
+         * implementation.
+         *
+         * @param packageNames optional package provider to choose implementation from
+         * @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 isAvailable
+         */
+        @JvmOverloads
+        @JvmStatic
+        public fun getOrCreate(
+            context: Context,
+            packageNames: List<String> = listOf(DEFAULT_PROVIDER_PACKAGE_NAME),
+        ): HealthConnectClient {
+            if (!isSdkVersionSufficient()) {
+                throw UnsupportedOperationException("SDK version too low")
+            }
+            if (!isAvailable(context, packageNames)) {
+                throw IllegalStateException("Service not available")
+            }
+            val enabledPackage =
+                packageNames.first { isPackageInstalled(context.packageManager, it) }
+            return HealthConnectClientImpl(
+                enabledPackage,
+                HealthDataService.getClient(context, enabledPackage)
+            )
+        }
+
+        @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.P)
+        internal fun isSdkVersionSufficient() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.P
+
+        internal fun isPackageInstalled(
+            packageManager: PackageManager,
+            packageName: String,
+        ): Boolean {
+            val isPackageInstalledAndEnabled =
+                try {
+                    @Suppress("Deprecation") // getApplicationInfo deprecated in T
+                    packageManager.getApplicationInfo(packageName, /* flags= */ 0).enabled
+                } catch (e: PackageManager.NameNotFoundException) {
+                    false
+                }
+            return isPackageInstalledAndEnabled && hasBindableService(packageManager, packageName)
+        }
+
+        internal fun hasBindableService(
+            packageManager: PackageManager,
+            packageName: String
+        ): Boolean {
+            val bindIntent = Intent()
+            bindIntent.setPackage(packageName)
+            bindIntent.setAction(HealthDataService.ANDROID_HEALTH_PLATFORM_SERVICE_BIND_ACTION)
+            @Suppress("Deprecation") // deprecated in T
+            return packageManager.queryIntentServices(bindIntent, 0).isNotEmpty()
+        }
+
+        /**
+         * Tag used in SDK debug logs.
+         * @suppress
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY)
+        internal const val HEALTH_CONNECT_CLIENT_TAG = "HealthConnectClient"
+    }
+}
diff --git a/health/health-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
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/PermissionController.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/PermissionController.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/aggregate/AggregateMetric.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/aggregate/AggregateMetric.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/aggregate/AggregateMetric.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/aggregate/AggregateMetric.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/aggregate/AggregationResult.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/aggregate/AggregationResult.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/aggregate/AggregationResult.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/aggregate/AggregationResult.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/aggregate/AggregationResultGroupedByDuration.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/aggregate/AggregationResultGroupedByDuration.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/aggregate/AggregationResultGroupedByDuration.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/aggregate/AggregationResultGroupedByDuration.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/aggregate/AggregationResultGroupedByPeriod.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/aggregate/AggregationResultGroupedByPeriod.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/aggregate/AggregationResultGroupedByPeriod.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/aggregate/AggregationResultGroupedByPeriod.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/changes/Change.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/changes/Change.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/changes/Change.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/changes/Change.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/changes/ChangesEvent.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/changes/ChangesEvent.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/changes/ChangesEvent.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/changes/ChangesEvent.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/changes/DeletionChange.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/changes/DeletionChange.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/changes/DeletionChange.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/changes/DeletionChange.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/changes/UpsertionChange.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/changes/UpsertionChange.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/changes/UpsertionChange.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/changes/UpsertionChange.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/health-data-client-documentation.md b/health/connect/connect-client/src/main/java/androidx/health/connect/client/health-data-client-documentation.md
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/health-data-client-documentation.md
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/health-data-client-documentation.md
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
new file mode 100644
index 0000000..4140dce
--- /dev/null
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/HealthConnectClientImpl.kt
@@ -0,0 +1,228 @@
+/*
+ * 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.impl
+
+import androidx.activity.result.contract.ActivityResultContract
+import androidx.health.connect.client.HealthConnectClient
+import androidx.health.connect.client.HealthConnectClient.Companion.HEALTH_CONNECT_CLIENT_TAG
+import androidx.health.connect.client.PermissionController
+import androidx.health.connect.client.aggregate.AggregationResult
+import androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration
+import androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod
+import androidx.health.connect.client.impl.converters.aggregate.retrieveAggregateDataRow
+import androidx.health.connect.client.impl.converters.aggregate.toAggregateDataRowGroupByDuration
+import androidx.health.connect.client.impl.converters.aggregate.toAggregateDataRowGroupByPeriod
+import androidx.health.connect.client.impl.converters.datatype.toDataTypeIdPairProtoList
+import androidx.health.connect.client.impl.converters.datatype.toDataTypeName
+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
+import androidx.health.connect.client.impl.converters.request.toProto
+import androidx.health.connect.client.impl.converters.request.toReadDataRangeRequestProto
+import androidx.health.connect.client.impl.converters.request.toReadDataRequestProto
+import androidx.health.connect.client.impl.converters.response.toChangesResponse
+import androidx.health.connect.client.impl.converters.response.toReadRecordsResponse
+import androidx.health.connect.client.permission.HealthPermission
+import androidx.health.connect.client.permission.createHealthDataRequestPermissions
+import androidx.health.connect.client.records.Record
+import androidx.health.connect.client.request.AggregateGroupByDurationRequest
+import androidx.health.connect.client.request.AggregateGroupByPeriodRequest
+import androidx.health.connect.client.request.AggregateRequest
+import androidx.health.connect.client.request.ChangesTokenRequest
+import androidx.health.connect.client.request.ReadRecordsRequest
+import androidx.health.connect.client.response.ChangesResponse
+import androidx.health.connect.client.response.InsertRecordsResponse
+import androidx.health.connect.client.response.ReadRecordResponse
+import androidx.health.connect.client.response.ReadRecordsResponse
+import androidx.health.connect.client.time.TimeRangeFilter
+import androidx.health.platform.client.HealthDataAsyncClient
+import androidx.health.platform.client.impl.logger.Logger
+import androidx.health.platform.client.proto.DataProto
+import androidx.health.platform.client.proto.RequestProto
+import kotlin.reflect.KClass
+import kotlinx.coroutines.guava.await
+
+/**
+ * Kotlin extension implementation that exposes kotlin coroutines rather than guava
+ * ListenableFutures.
+ *
+ * @suppress
+ */
+class HealthConnectClientImpl
+internal constructor(
+    private val providerPackageName: String,
+    private val delegate: HealthDataAsyncClient,
+) : HealthConnectClient, PermissionController {
+
+    override fun createRequestPermissionActivityContract():
+        ActivityResultContract<Set<HealthPermission>, Set<HealthPermission>> =
+        createHealthDataRequestPermissions(providerPackageName = providerPackageName)
+
+    override suspend fun getGrantedPermissions(
+        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 revokeAllPermissions() {
+        delegate.revokeAllPermissions().await()
+        Logger.debug(HEALTH_CONNECT_CLIENT_TAG, "Revoked all permissions.")
+    }
+
+    override val permissionController: PermissionController
+        get() = this
+
+    override suspend fun insertRecords(records: List<Record>): InsertRecordsResponse {
+        val uidList = delegate.insertData(records.map { it.toProto() }).await()
+        Logger.debug(HEALTH_CONNECT_CLIENT_TAG, "${records.size} records inserted.")
+        return InsertRecordsResponse(recordUidsList = uidList)
+    }
+
+    override suspend fun updateRecords(records: List<Record>) {
+        delegate.updateData(records.map { it.toProto() }).await()
+        Logger.debug(HEALTH_CONNECT_CLIENT_TAG, "${records.size} records updated.")
+    }
+
+    override suspend fun deleteRecords(
+        recordType: KClass<out Record>,
+        uidsList: List<String>,
+        clientRecordIdsList: List<String>,
+    ) {
+        delegate
+            .deleteData(
+                toDataTypeIdPairProtoList(recordType, uidsList),
+                toDataTypeIdPairProtoList(recordType, clientRecordIdsList)
+            )
+            .await()
+        Logger.debug(
+            HEALTH_CONNECT_CLIENT_TAG,
+            "${uidsList.size + clientRecordIdsList.size} records deleted."
+        )
+    }
+
+    override suspend fun deleteRecords(
+        recordType: KClass<out Record>,
+        timeRangeFilter: TimeRangeFilter,
+    ) {
+        delegate.deleteDataRange(toDeleteDataRangeRequestProto(recordType, timeRangeFilter)).await()
+        Logger.debug(HEALTH_CONNECT_CLIENT_TAG, "Records deletion successful.")
+    }
+
+    @Suppress("UNCHECKED_CAST") // Safe to cast as the type should match
+    override suspend fun <T : Record> readRecord(
+        recordType: KClass<T>,
+        uid: String,
+    ): ReadRecordResponse<T> {
+        val proto = delegate.readData(toReadDataRequestProto(recordType, uid)).await()
+        val response = ReadRecordResponse(toRecord(proto) as T)
+        Logger.debug(HEALTH_CONNECT_CLIENT_TAG, "Reading record of $uid successful.")
+        return response
+    }
+
+    override suspend fun getChangesToken(request: ChangesTokenRequest): String {
+        val proto =
+            delegate
+                .getChangesToken(
+                    RequestProto.GetChangesTokenRequest.newBuilder()
+                        .addAllDataType(
+                            request.recordTypes.map {
+                                DataProto.DataType.newBuilder().setName(it.toDataTypeName()).build()
+                            }
+                        )
+                        .addAllDataOriginFilters(
+                            request.dataOriginFilters.map {
+                                DataProto.DataOrigin.newBuilder()
+                                    .setApplicationId(it.packageName)
+                                    .build()
+                            }
+                        )
+                        .build()
+                )
+                .await()
+        val changeToken = proto.changesToken
+        Logger.debug(HEALTH_CONNECT_CLIENT_TAG, "Retrieved change token $changeToken.")
+        return changeToken
+    }
+
+    override suspend fun getChanges(changesToken: String): ChangesResponse {
+        val proto =
+            delegate
+                .getChanges(
+                    RequestProto.GetChangesRequest.newBuilder()
+                        .setChangesToken(changesToken)
+                        .build()
+                )
+                .await()
+        val nextToken = proto.nextChangesToken
+        Logger.debug(
+            HEALTH_CONNECT_CLIENT_TAG,
+            "Retrieved changes successful with $changesToken, next token $nextToken."
+        )
+        return toChangesResponse(proto)
+    }
+
+    override suspend fun <T : Record> readRecords(
+        request: ReadRecordsRequest<T>,
+    ): ReadRecordsResponse<T> {
+        val proto = delegate.readDataRange(toReadDataRangeRequestProto(request)).await()
+        val response = toReadRecordsResponse<T>(proto)
+        Logger.debug(HEALTH_CONNECT_CLIENT_TAG, "Retrieve records successful.")
+        return response
+    }
+
+    override suspend fun aggregate(request: AggregateRequest): AggregationResult {
+        val responseProto = delegate.aggregate(request.toProto()).await()
+        val result = responseProto.rowsList.first().retrieveAggregateDataRow()
+        val numberOfMetrics = result.longValues.size + result.doubleValues.size
+        Logger.debug(HEALTH_CONNECT_CLIENT_TAG, "Retrieved $numberOfMetrics metrics.")
+        return result
+    }
+
+    override suspend fun aggregateGroupByDuration(
+        request: AggregateGroupByDurationRequest,
+    ): List<AggregationResultGroupedByDuration> {
+        val responseProto = delegate.aggregate(request.toProto()).await()
+        val result = responseProto.rowsList.map { it.toAggregateDataRowGroupByDuration() }.toList()
+        Logger.debug(
+            HEALTH_CONNECT_CLIENT_TAG,
+            "Retrieved ${result.size} duration aggregation buckets."
+        )
+        return result
+    }
+
+    override suspend fun aggregateGroupByPeriod(
+        request: AggregateGroupByPeriodRequest
+    ): List<AggregationResultGroupedByPeriod> {
+        val responseProto = delegate.aggregate(request.toProto()).await()
+        val result = responseProto.rowsList.map { it.toAggregateDataRowGroupByPeriod() }.toList()
+        Logger.debug(
+            HEALTH_CONNECT_CLIENT_TAG,
+            "Retrieved ${result.size} period aggregation buckets."
+        )
+        return result
+    }
+}
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/aggregate/AggregateMetricToProto.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/aggregate/AggregateMetricToProto.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/aggregate/AggregateMetricToProto.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/aggregate/AggregateMetricToProto.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/aggregate/ProtoToAggregateDataRow.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/aggregate/ProtoToAggregateDataRow.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/aggregate/ProtoToAggregateDataRow.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/aggregate/ProtoToAggregateDataRow.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/changes/ChangesEventConverter.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/changes/ChangesEventConverter.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/changes/ChangesEventConverter.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/changes/ChangesEventConverter.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/datatype/DataTypeConverter.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/datatype/DataTypeConverter.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/datatype/DataTypeConverter.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/datatype/DataTypeConverter.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/datatype/DataTypeIdPairConverter.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/datatype/DataTypeIdPairConverter.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/datatype/DataTypeIdPairConverter.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/datatype/DataTypeIdPairConverter.kt
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/datatype/RecordsTypeNameMap.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/datatype/RecordsTypeNameMap.kt
new file mode 100644
index 0000000..f5a6f70
--- /dev/null
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/datatype/RecordsTypeNameMap.kt
@@ -0,0 +1,133 @@
+/*
+ * 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.
+ */
+@file:RestrictTo(RestrictTo.Scope.LIBRARY)
+
+package androidx.health.connect.client.impl.converters.datatype
+
+import androidx.annotation.RestrictTo
+import androidx.health.connect.client.records.ActiveCaloriesBurnedRecord
+import androidx.health.connect.client.records.BasalBodyTemperatureRecord
+import androidx.health.connect.client.records.BasalMetabolicRateRecord
+import androidx.health.connect.client.records.BloodGlucoseRecord
+import androidx.health.connect.client.records.BloodPressureRecord
+import androidx.health.connect.client.records.BodyFatRecord
+import androidx.health.connect.client.records.BodyTemperatureRecord
+import androidx.health.connect.client.records.BodyWaterMassRecord
+import androidx.health.connect.client.records.BoneMassRecord
+import androidx.health.connect.client.records.CervicalMucusRecord
+import androidx.health.connect.client.records.CyclingPedalingCadenceRecord
+import androidx.health.connect.client.records.DistanceRecord
+import androidx.health.connect.client.records.ElevationGainedRecord
+import androidx.health.connect.client.records.ExerciseEventRecord
+import androidx.health.connect.client.records.ExerciseLapRecord
+import androidx.health.connect.client.records.ExerciseRepetitionsRecord
+import androidx.health.connect.client.records.ExerciseSessionRecord
+import androidx.health.connect.client.records.FloorsClimbedRecord
+import androidx.health.connect.client.records.HeartRateRecord
+import androidx.health.connect.client.records.HeartRateVariabilityDifferentialIndexRecord
+import androidx.health.connect.client.records.HeartRateVariabilityRmssdRecord
+import androidx.health.connect.client.records.HeartRateVariabilitySRecord
+import androidx.health.connect.client.records.HeartRateVariabilitySd2Record
+import androidx.health.connect.client.records.HeartRateVariabilitySdannRecord
+import androidx.health.connect.client.records.HeartRateVariabilitySdnnIndexRecord
+import androidx.health.connect.client.records.HeartRateVariabilitySdnnRecord
+import androidx.health.connect.client.records.HeartRateVariabilitySdsdRecord
+import androidx.health.connect.client.records.HeartRateVariabilityTinnRecord
+import androidx.health.connect.client.records.HeightRecord
+import androidx.health.connect.client.records.HipCircumferenceRecord
+import androidx.health.connect.client.records.HydrationRecord
+import androidx.health.connect.client.records.LeanBodyMassRecord
+import androidx.health.connect.client.records.MenstruationFlowRecord
+import androidx.health.connect.client.records.NutritionRecord
+import androidx.health.connect.client.records.OvulationTestRecord
+import androidx.health.connect.client.records.OxygenSaturationRecord
+import androidx.health.connect.client.records.PowerRecord
+import androidx.health.connect.client.records.Record
+import androidx.health.connect.client.records.RespiratoryRateRecord
+import androidx.health.connect.client.records.RestingHeartRateRecord
+import androidx.health.connect.client.records.SexualActivityRecord
+import androidx.health.connect.client.records.SleepSessionRecord
+import androidx.health.connect.client.records.SleepStageRecord
+import androidx.health.connect.client.records.SpeedRecord
+import androidx.health.connect.client.records.StepsCadenceRecord
+import androidx.health.connect.client.records.StepsRecord
+import androidx.health.connect.client.records.SwimmingStrokesRecord
+import androidx.health.connect.client.records.TotalCaloriesBurnedRecord
+import androidx.health.connect.client.records.Vo2MaxRecord
+import androidx.health.connect.client.records.WaistCircumferenceRecord
+import androidx.health.connect.client.records.WeightRecord
+import androidx.health.connect.client.records.WheelchairPushesRecord
+import kotlin.reflect.KClass
+
+val RECORDS_TYPE_NAME_MAP: Map<String, KClass<out Record>> =
+    mapOf(
+        "ActiveCaloriesBurned" to ActiveCaloriesBurnedRecord::class,
+        "ActivityEvent" to ExerciseEventRecord::class, // Keep legacy Activity name
+        "ActivityLap" to ExerciseLapRecord::class, // Keep legacy Activity name
+        "ActivitySession" to ExerciseSessionRecord::class, // Keep legacy Activity name
+        "BasalBodyTemperature" to BasalBodyTemperatureRecord::class,
+        "BasalMetabolicRate" to BasalMetabolicRateRecord::class,
+        "BloodGlucose" to BloodGlucoseRecord::class,
+        "BloodPressure" to BloodPressureRecord::class,
+        "BodyFat" to BodyFatRecord::class,
+        "BodyTemperature" to BodyTemperatureRecord::class,
+        "BodyWaterMass" to BodyWaterMassRecord::class,
+        "BoneMass" to BoneMassRecord::class,
+        "CervicalMucus" to CervicalMucusRecord::class,
+        "CyclingPedalingCadenceSeries" to
+            CyclingPedalingCadenceRecord::class, // Keep legacy Series suffix
+        "Distance" to DistanceRecord::class,
+        "ElevationGained" to ElevationGainedRecord::class,
+        "FloorsClimbed" to FloorsClimbedRecord::class,
+        "HeartRateSeries" to HeartRateRecord::class, // Keep legacy Series suffix
+        "HeartRateVariabilityDifferentialIndex" to
+            HeartRateVariabilityDifferentialIndexRecord::class,
+        "HeartRateVariabilityRmssd" to HeartRateVariabilityRmssdRecord::class,
+        "HeartRateVariabilityS" to HeartRateVariabilitySRecord::class,
+        "HeartRateVariabilitySd2" to HeartRateVariabilitySd2Record::class,
+        "HeartRateVariabilitySdann" to HeartRateVariabilitySdannRecord::class,
+        "HeartRateVariabilitySdnn" to HeartRateVariabilitySdnnRecord::class,
+        "HeartRateVariabilitySdnnIndex" to HeartRateVariabilitySdnnIndexRecord::class,
+        "HeartRateVariabilitySdsd" to HeartRateVariabilitySdsdRecord::class,
+        "HeartRateVariabilityTinn" to HeartRateVariabilityTinnRecord::class,
+        "Height" to HeightRecord::class,
+        "HipCircumference" to HipCircumferenceRecord::class,
+        "Hydration" to HydrationRecord::class,
+        "LeanBodyMass" to LeanBodyMassRecord::class,
+        "Menstruation" to MenstruationFlowRecord::class,
+        "Nutrition" to NutritionRecord::class,
+        "OvulationTest" to OvulationTestRecord::class,
+        "OxygenSaturation" to OxygenSaturationRecord::class,
+        "PowerSeries" to PowerRecord::class, // Keep legacy Series suffix
+        "Repetitions" to ExerciseRepetitionsRecord::class, // Keep legacy Repetitions name
+        "RespiratoryRate" to RespiratoryRateRecord::class,
+        "RestingHeartRate" to RestingHeartRateRecord::class,
+        "SexualActivity" to SexualActivityRecord::class,
+        "SleepSession" to SleepSessionRecord::class,
+        "SleepStage" to SleepStageRecord::class,
+        "SpeedSeries" to SpeedRecord::class, // Keep legacy Series suffix
+        "Steps" to StepsRecord::class,
+        "StepsCadenceSeries" to StepsCadenceRecord::class, // Keep legacy Series suffix
+        "SwimmingStrokes" to SwimmingStrokesRecord::class,
+        "TotalCaloriesBurned" to TotalCaloriesBurnedRecord::class,
+        "Vo2Max" to Vo2MaxRecord::class,
+        "WaistCircumference" to WaistCircumferenceRecord::class,
+        "WheelchairPushes" to WheelchairPushesRecord::class,
+        "Weight" to WeightRecord::class,
+    )
+
+val RECORDS_CLASS_NAME_MAP: Map<KClass<out Record>, String> =
+    RECORDS_TYPE_NAME_MAP.entries.associate { it.value to it.key }
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/permission/PermissionConverter.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/permission/PermissionConverter.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/permission/PermissionConverter.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/permission/PermissionConverter.kt
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/records/ProtoToRecordConverters.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/records/ProtoToRecordConverters.kt
new file mode 100644
index 0000000..3b457de
--- /dev/null
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/records/ProtoToRecordConverters.kt
@@ -0,0 +1,580 @@
+/*
+ * 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.
+ */
+@file:RestrictTo(RestrictTo.Scope.LIBRARY)
+
+package androidx.health.connect.client.impl.converters.records
+
+import androidx.annotation.RestrictTo
+import androidx.health.connect.client.records.ActiveCaloriesBurnedRecord
+import androidx.health.connect.client.records.BasalBodyTemperatureRecord
+import androidx.health.connect.client.records.BasalMetabolicRateRecord
+import androidx.health.connect.client.records.BloodGlucoseRecord
+import androidx.health.connect.client.records.BloodPressureRecord
+import androidx.health.connect.client.records.BodyFatRecord
+import androidx.health.connect.client.records.BodyTemperatureRecord
+import androidx.health.connect.client.records.BodyWaterMassRecord
+import androidx.health.connect.client.records.BoneMassRecord
+import androidx.health.connect.client.records.CervicalMucusRecord
+import androidx.health.connect.client.records.CyclingPedalingCadenceRecord
+import androidx.health.connect.client.records.DistanceRecord
+import androidx.health.connect.client.records.ElevationGainedRecord
+import androidx.health.connect.client.records.ExerciseEventRecord
+import androidx.health.connect.client.records.ExerciseLapRecord
+import androidx.health.connect.client.records.ExerciseRepetitionsRecord
+import androidx.health.connect.client.records.ExerciseSessionRecord
+import androidx.health.connect.client.records.FloorsClimbedRecord
+import androidx.health.connect.client.records.HeartRateRecord
+import androidx.health.connect.client.records.HeartRateVariabilityDifferentialIndexRecord
+import androidx.health.connect.client.records.HeartRateVariabilityRmssdRecord
+import androidx.health.connect.client.records.HeartRateVariabilitySRecord
+import androidx.health.connect.client.records.HeartRateVariabilitySd2Record
+import androidx.health.connect.client.records.HeartRateVariabilitySdannRecord
+import androidx.health.connect.client.records.HeartRateVariabilitySdnnIndexRecord
+import androidx.health.connect.client.records.HeartRateVariabilitySdnnRecord
+import androidx.health.connect.client.records.HeartRateVariabilitySdsdRecord
+import androidx.health.connect.client.records.HeartRateVariabilityTinnRecord
+import androidx.health.connect.client.records.MenstruationFlowRecord
+import androidx.health.connect.client.records.HeightRecord
+import androidx.health.connect.client.records.HipCircumferenceRecord
+import androidx.health.connect.client.records.HydrationRecord
+import androidx.health.connect.client.records.LeanBodyMassRecord
+import androidx.health.connect.client.records.NutritionRecord
+import androidx.health.connect.client.records.OvulationTestRecord
+import androidx.health.connect.client.records.OxygenSaturationRecord
+import androidx.health.connect.client.records.PowerRecord
+import androidx.health.connect.client.records.Record
+import androidx.health.connect.client.records.RespiratoryRateRecord
+import androidx.health.connect.client.records.RestingHeartRateRecord
+import androidx.health.connect.client.records.SexualActivityRecord
+import androidx.health.connect.client.records.SleepSessionRecord
+import androidx.health.connect.client.records.SleepStageRecord
+import androidx.health.connect.client.records.SpeedRecord
+import androidx.health.connect.client.records.StepsCadenceRecord
+import androidx.health.connect.client.records.StepsRecord
+import androidx.health.connect.client.records.SwimmingStrokesRecord
+import androidx.health.connect.client.records.TotalCaloriesBurnedRecord
+import androidx.health.connect.client.records.Vo2MaxRecord
+import androidx.health.connect.client.records.WaistCircumferenceRecord
+import androidx.health.connect.client.records.WeightRecord
+import androidx.health.connect.client.records.WheelchairPushesRecord
+import androidx.health.connect.client.units.celsius
+import androidx.health.connect.client.units.grams
+import androidx.health.connect.client.units.kilocalories
+import androidx.health.connect.client.units.kilocaloriesPerDay
+import androidx.health.connect.client.units.kilograms
+import androidx.health.connect.client.units.liters
+import androidx.health.connect.client.units.meters
+import androidx.health.connect.client.units.metersPerSecond
+import androidx.health.connect.client.units.millimetersOfMercury
+import androidx.health.connect.client.units.percent
+import androidx.health.connect.client.units.watts
+import androidx.health.platform.client.proto.DataProto
+import java.time.Instant
+
+/** Converts public API object into internal proto for ipc. */
+fun toRecord(proto: DataProto.DataPoint): Record =
+    with(proto) {
+        when (dataType.name) {
+            "BasalBodyTemperature" ->
+                BasalBodyTemperatureRecord(
+                    temperature = getDouble("temperature").celsius,
+                    measurementLocation = getEnum("measurementLocation"),
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "BasalMetabolicRate" ->
+                BasalMetabolicRateRecord(
+                    basalMetabolicRate = getDouble("bmr").kilocaloriesPerDay,
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "BloodGlucose" ->
+                BloodGlucoseRecord(
+                    levelMillimolesPerLiter = getDouble("level"),
+                    specimenSource = getEnum("specimenSource"),
+                    mealType = getEnum("mealType"),
+                    relationToMeal = getEnum("relationToMeal"),
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "BloodPressure" ->
+                BloodPressureRecord(
+                    systolic = getDouble("systolic").millimetersOfMercury,
+                    diastolic = getDouble("diastolic").millimetersOfMercury,
+                    bodyPosition = getEnum("bodyPosition"),
+                    measurementLocation = getEnum("measurementLocation"),
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "BodyFat" ->
+                BodyFatRecord(
+                    percentage = getDouble("percentage").percent,
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "BodyTemperature" ->
+                BodyTemperatureRecord(
+                    temperature = getDouble("temperature").celsius,
+                    measurementLocation = getEnum("measurementLocation"),
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "BodyWaterMass" ->
+                BodyWaterMassRecord(
+                    mass = getDouble("mass").kilograms,
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "BoneMass" ->
+                BoneMassRecord(
+                    mass = getDouble("mass").kilograms,
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "CervicalMucus" ->
+                CervicalMucusRecord(
+                    appearance = getEnum("texture"),
+                    sensation = getEnum("amount"),
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "CyclingPedalingCadenceSeries" ->
+                CyclingPedalingCadenceRecord(
+                    startTime = startTime,
+                    startZoneOffset = startZoneOffset,
+                    endTime = endTime,
+                    endZoneOffset = endZoneOffset,
+                    samples =
+                        seriesValuesList.map { value ->
+                            CyclingPedalingCadenceRecord.Sample(
+                                time = Instant.ofEpochMilli(value.instantTimeMillis),
+                                revolutionsPerMinute = value.getDouble("rpm"),
+                            )
+                        },
+                    metadata = metadata,
+                )
+            "HeartRateSeries" ->
+                HeartRateRecord(
+                    startTime = startTime,
+                    startZoneOffset = startZoneOffset,
+                    endTime = endTime,
+                    endZoneOffset = endZoneOffset,
+                    samples =
+                        seriesValuesList.map { value ->
+                            HeartRateRecord.Sample(
+                                time = Instant.ofEpochMilli(value.instantTimeMillis),
+                                beatsPerMinute = value.getLong("bpm"),
+                            )
+                        },
+                    metadata = metadata,
+                )
+            "Height" ->
+                HeightRecord(
+                    height = getDouble("height").meters,
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "HipCircumference" ->
+                HipCircumferenceRecord(
+                    circumference = getDouble("circumference").meters,
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "HeartRateVariabilityDifferentialIndex" ->
+                HeartRateVariabilityDifferentialIndexRecord(
+                    heartRateVariabilityMillis = getDouble("heartRateVariability"),
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "HeartRateVariabilityRmssd" ->
+                HeartRateVariabilityRmssdRecord(
+                    heartRateVariabilityMillis = getDouble("heartRateVariability"),
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "HeartRateVariabilityS" ->
+                HeartRateVariabilitySRecord(
+                    heartRateVariabilityMillis = getDouble("heartRateVariability"),
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "HeartRateVariabilitySd2" ->
+                HeartRateVariabilitySd2Record(
+                    heartRateVariabilityMillis = getDouble("heartRateVariability"),
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "HeartRateVariabilitySdann" ->
+                HeartRateVariabilitySdannRecord(
+                    heartRateVariabilityMillis = getDouble("heartRateVariability"),
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "HeartRateVariabilitySdnnIndex" ->
+                HeartRateVariabilitySdnnIndexRecord(
+                    heartRateVariabilityMillis = getDouble("heartRateVariability"),
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "HeartRateVariabilitySdnn" ->
+                HeartRateVariabilitySdnnRecord(
+                    heartRateVariabilityMillis = getDouble("heartRateVariability"),
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "HeartRateVariabilitySdsd" ->
+                HeartRateVariabilitySdsdRecord(
+                    heartRateVariabilityMillis = getDouble("heartRateVariability"),
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "HeartRateVariabilityTinn" ->
+                HeartRateVariabilityTinnRecord(
+                    heartRateVariabilityMillis = getDouble("heartRateVariability"),
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "LeanBodyMass" ->
+                LeanBodyMassRecord(
+                    mass = getDouble("mass").kilograms,
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "Menstruation" ->
+                MenstruationFlowRecord(
+                    flow = getEnum("flow"),
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "OvulationTest" ->
+                OvulationTestRecord(
+                    result = getEnum("result") ?: "",
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "OxygenSaturation" ->
+                OxygenSaturationRecord(
+                    percentage = getDouble("percentage").percent,
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "PowerSeries" ->
+                PowerRecord(
+                    startTime = startTime,
+                    startZoneOffset = startZoneOffset,
+                    endTime = endTime,
+                    endZoneOffset = endZoneOffset,
+                    samples =
+                        seriesValuesList.map { value ->
+                            PowerRecord.Sample(
+                                time = Instant.ofEpochMilli(value.instantTimeMillis),
+                                power = value.getDouble("power").watts,
+                            )
+                        },
+                    metadata = metadata,
+                )
+            "RespiratoryRate" ->
+                RespiratoryRateRecord(
+                    rate = getDouble("rate"),
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "RestingHeartRate" ->
+                RestingHeartRateRecord(
+                    beatsPerMinute = getLong("bpm"),
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "SexualActivity" ->
+                SexualActivityRecord(
+                    protectionUsed = getEnum("protectionUsed"),
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "SpeedSeries" ->
+                SpeedRecord(
+                    startTime = startTime,
+                    startZoneOffset = startZoneOffset,
+                    endTime = endTime,
+                    endZoneOffset = endZoneOffset,
+                    samples =
+                        seriesValuesList.map { value ->
+                            SpeedRecord.Sample(
+                                time = Instant.ofEpochMilli(value.instantTimeMillis),
+                                speed = value.getDouble("speed").metersPerSecond,
+                            )
+                        },
+                    metadata = metadata,
+                )
+            "StepsCadenceSeries" ->
+                StepsCadenceRecord(
+                    startTime = startTime,
+                    startZoneOffset = startZoneOffset,
+                    endTime = endTime,
+                    endZoneOffset = endZoneOffset,
+                    samples =
+                        seriesValuesList.map { value ->
+                            StepsCadenceRecord.Sample(
+                                time = Instant.ofEpochMilli(value.instantTimeMillis),
+                                rate = value.getDouble("rate"),
+                            )
+                        },
+                    metadata = metadata,
+                )
+            "Vo2Max" ->
+                Vo2MaxRecord(
+                    vo2MillilitersPerMinuteKilogram = getDouble("vo2"),
+                    measurementMethod = getEnum("measurementMethod"),
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "WaistCircumference" ->
+                WaistCircumferenceRecord(
+                    circumference = getDouble("circumference").meters,
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "Weight" ->
+                WeightRecord(
+                    weight = getDouble("weight").kilograms,
+                    time = time,
+                    zoneOffset = zoneOffset,
+                    metadata = metadata
+                )
+            "ActiveCaloriesBurned" ->
+                ActiveCaloriesBurnedRecord(
+                    energy = getDouble("energy").kilocalories,
+                    startTime = startTime,
+                    startZoneOffset = startZoneOffset,
+                    endTime = endTime,
+                    endZoneOffset = endZoneOffset,
+                    metadata = metadata
+                )
+            "ActivityEvent" ->
+                ExerciseEventRecord(
+                    eventType = getEnum("eventType") ?: "",
+                    startTime = startTime,
+                    startZoneOffset = startZoneOffset,
+                    endTime = endTime,
+                    endZoneOffset = endZoneOffset,
+                    metadata = metadata
+                )
+            "ActivityLap" ->
+                ExerciseLapRecord(
+                    length = getDouble("length").meters,
+                    startTime = startTime,
+                    startZoneOffset = startZoneOffset,
+                    endTime = endTime,
+                    endZoneOffset = endZoneOffset,
+                    metadata = metadata
+                )
+            "ActivitySession" ->
+                ExerciseSessionRecord(
+                    exerciseType = getEnum("activityType") ?: "",
+                    title = getString("title"),
+                    notes = getString("notes"),
+                    startTime = startTime,
+                    startZoneOffset = startZoneOffset,
+                    endTime = endTime,
+                    endZoneOffset = endZoneOffset,
+                    metadata = metadata
+                )
+            "Distance" ->
+                DistanceRecord(
+                    distance = getDouble("distance").meters,
+                    startTime = startTime,
+                    startZoneOffset = startZoneOffset,
+                    endTime = endTime,
+                    endZoneOffset = endZoneOffset,
+                    metadata = metadata
+                )
+            "ElevationGained" ->
+                ElevationGainedRecord(
+                    elevation = getDouble("elevation").meters,
+                    startTime = startTime,
+                    startZoneOffset = startZoneOffset,
+                    endTime = endTime,
+                    endZoneOffset = endZoneOffset,
+                    metadata = metadata
+                )
+            "FloorsClimbed" ->
+                FloorsClimbedRecord(
+                    floors = getDouble("floors"),
+                    startTime = startTime,
+                    startZoneOffset = startZoneOffset,
+                    endTime = endTime,
+                    endZoneOffset = endZoneOffset,
+                    metadata = metadata
+                )
+            "Hydration" ->
+                HydrationRecord(
+                    volume = getDouble("volume").liters,
+                    startTime = startTime,
+                    startZoneOffset = startZoneOffset,
+                    endTime = endTime,
+                    endZoneOffset = endZoneOffset,
+                    metadata = metadata
+                )
+            "Nutrition" ->
+                NutritionRecord(
+                    biotin = valuesMap["biotin"]?.doubleVal?.grams,
+                    caffeine = valuesMap["caffeine"]?.doubleVal?.grams,
+                    calcium = valuesMap["calcium"]?.doubleVal?.grams,
+                    energy = valuesMap["calories"]?.doubleVal?.kilocalories,
+                    energyFromFat = valuesMap["caloriesFromFat"]?.doubleVal?.kilocalories,
+                    chloride = valuesMap["chloride"]?.doubleVal?.grams,
+                    cholesterol = valuesMap["cholesterol"]?.doubleVal?.grams,
+                    chromium = valuesMap["chromium"]?.doubleVal?.grams,
+                    copper = valuesMap["copper"]?.doubleVal?.grams,
+                    dietaryFiber = valuesMap["dietaryFiber"]?.doubleVal?.grams,
+                    folate = valuesMap["folate"]?.doubleVal?.grams,
+                    folicAcid = valuesMap["folicAcid"]?.doubleVal?.grams,
+                    iodine = valuesMap["iodine"]?.doubleVal?.grams,
+                    iron = valuesMap["iron"]?.doubleVal?.grams,
+                    magnesium = valuesMap["magnesium"]?.doubleVal?.grams,
+                    manganese = valuesMap["manganese"]?.doubleVal?.grams,
+                    molybdenum = valuesMap["molybdenum"]?.doubleVal?.grams,
+                    monounsaturatedFat = valuesMap["monounsaturatedFat"]?.doubleVal?.grams,
+                    niacin = valuesMap["niacin"]?.doubleVal?.grams,
+                    pantothenicAcid = valuesMap["pantothenicAcid"]?.doubleVal?.grams,
+                    phosphorus = valuesMap["phosphorus"]?.doubleVal?.grams,
+                    polyunsaturatedFat = valuesMap["polyunsaturatedFat"]?.doubleVal?.grams,
+                    potassium = valuesMap["potassium"]?.doubleVal?.grams,
+                    protein = valuesMap["protein"]?.doubleVal?.grams,
+                    riboflavin = valuesMap["riboflavin"]?.doubleVal?.grams,
+                    saturatedFat = valuesMap["saturatedFat"]?.doubleVal?.grams,
+                    selenium = valuesMap["selenium"]?.doubleVal?.grams,
+                    sodium = valuesMap["sodium"]?.doubleVal?.grams,
+                    sugar = valuesMap["sugar"]?.doubleVal?.grams,
+                    thiamin = valuesMap["thiamin"]?.doubleVal?.grams,
+                    totalCarbohydrate = valuesMap["totalCarbohydrate"]?.doubleVal?.grams,
+                    totalFat = valuesMap["totalFat"]?.doubleVal?.grams,
+                    transFat = valuesMap["transFat"]?.doubleVal?.grams,
+                    unsaturatedFat = valuesMap["unsaturatedFat"]?.doubleVal?.grams,
+                    vitaminA = valuesMap["vitaminA"]?.doubleVal?.grams,
+                    vitaminB12 = valuesMap["vitaminB12"]?.doubleVal?.grams,
+                    vitaminB6 = valuesMap["vitaminB6"]?.doubleVal?.grams,
+                    vitaminC = valuesMap["vitaminC"]?.doubleVal?.grams,
+                    vitaminD = valuesMap["vitaminD"]?.doubleVal?.grams,
+                    vitaminE = valuesMap["vitaminE"]?.doubleVal?.grams,
+                    vitaminK = valuesMap["vitaminK"]?.doubleVal?.grams,
+                    zinc = valuesMap["zinc"]?.doubleVal?.grams,
+                    mealType = getEnum("mealType"),
+                    name = getString("name"),
+                    startTime = startTime,
+                    startZoneOffset = startZoneOffset,
+                    endTime = endTime,
+                    endZoneOffset = endZoneOffset,
+                    metadata = metadata
+                )
+            "Repetitions" ->
+                ExerciseRepetitionsRecord(
+                    count = getLong("count"),
+                    type = getEnum("type") ?: "",
+                    startTime = startTime,
+                    startZoneOffset = startZoneOffset,
+                    endTime = endTime,
+                    endZoneOffset = endZoneOffset,
+                    metadata = metadata
+                )
+            "SleepSession" ->
+                SleepSessionRecord(
+                    title = getString("title"),
+                    notes = getString("notes"),
+                    startTime = startTime,
+                    startZoneOffset = startZoneOffset,
+                    endTime = endTime,
+                    endZoneOffset = endZoneOffset,
+                    metadata = metadata
+                )
+            "SleepStage" ->
+                SleepStageRecord(
+                    stage = getEnum("stage") ?: "",
+                    startTime = startTime,
+                    startZoneOffset = startZoneOffset,
+                    endTime = endTime,
+                    endZoneOffset = endZoneOffset,
+                    metadata = metadata
+                )
+            "Steps" ->
+                StepsRecord(
+                    count = getLong("count"),
+                    startTime = startTime,
+                    startZoneOffset = startZoneOffset,
+                    endTime = endTime,
+                    endZoneOffset = endZoneOffset,
+                    metadata = metadata
+                )
+            "SwimmingStrokes" ->
+                SwimmingStrokesRecord(
+                    count = getLong("count"),
+                    type = getEnum("type") ?: "",
+                    startTime = startTime,
+                    startZoneOffset = startZoneOffset,
+                    endTime = endTime,
+                    endZoneOffset = endZoneOffset,
+                    metadata = metadata
+                )
+            "TotalCaloriesBurned" ->
+                TotalCaloriesBurnedRecord(
+                    energy = getDouble("energy").kilocalories,
+                    startTime = startTime,
+                    startZoneOffset = startZoneOffset,
+                    endTime = endTime,
+                    endZoneOffset = endZoneOffset,
+                    metadata = metadata
+                )
+            "WheelchairPushes" ->
+                WheelchairPushesRecord(
+                    count = getLong("count"),
+                    startTime = startTime,
+                    startZoneOffset = startZoneOffset,
+                    endTime = endTime,
+                    endZoneOffset = endZoneOffset,
+                    metadata = metadata
+                )
+            else -> throw RuntimeException("Unknown data type ${dataType.name}")
+        }
+    }
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/records/ProtoToRecordUtils.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/records/ProtoToRecordUtils.kt
new file mode 100644
index 0000000..afcfac2
--- /dev/null
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/records/ProtoToRecordUtils.kt
@@ -0,0 +1,98 @@
+/*
+ * 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.
+ */
+@file:RestrictTo(RestrictTo.Scope.LIBRARY)
+
+package androidx.health.connect.client.impl.converters.records
+
+import androidx.annotation.RestrictTo
+import androidx.health.connect.client.records.metadata.DataOrigin
+import androidx.health.connect.client.records.metadata.Device
+import androidx.health.connect.client.records.metadata.Metadata
+import androidx.health.platform.client.proto.DataProto
+import androidx.health.platform.client.proto.DataProto.DataPointOrBuilder
+import androidx.health.platform.client.proto.DataProto.SeriesValueOrBuilder
+import java.time.Instant
+import java.time.ZoneOffset
+
+/** Internal helper functions to convert proto to records. */
+@get:SuppressWarnings("GoodTime") // Safe to use for deserialization
+internal val DataProto.DataPoint.startTime: Instant
+    get() = Instant.ofEpochMilli(startTimeMillis)
+
+@get:SuppressWarnings("GoodTime") // Safe to use for deserialization
+internal val DataProto.DataPoint.endTime: Instant
+    get() = Instant.ofEpochMilli(endTimeMillis)
+
+@get:SuppressWarnings("GoodTime") // Safe to use for deserialization
+internal val DataProto.DataPoint.time: Instant
+    get() = Instant.ofEpochMilli(instantTimeMillis)
+
+@get:SuppressWarnings("GoodTime") // Safe to use for deserialization
+internal val DataProto.DataPoint.startZoneOffset: ZoneOffset?
+    get() =
+        if (hasStartZoneOffsetSeconds()) ZoneOffset.ofTotalSeconds(startZoneOffsetSeconds) else null
+
+@get:SuppressWarnings("GoodTime") // Safe to use for deserialization
+internal val DataProto.DataPoint.endZoneOffset: ZoneOffset?
+    get() = if (hasEndZoneOffsetSeconds()) ZoneOffset.ofTotalSeconds(endZoneOffsetSeconds) else null
+
+@get:SuppressWarnings("GoodTime") // HealthDataClientImplSafe to use for deserialization
+internal val DataProto.DataPoint.zoneOffset: ZoneOffset?
+    get() = if (hasZoneOffsetSeconds()) ZoneOffset.ofTotalSeconds(zoneOffsetSeconds) else null
+
+internal fun DataPointOrBuilder.getLong(key: String, defaultVal: Long = 0): Long =
+    valuesMap[key]?.longVal ?: defaultVal
+
+internal fun DataPointOrBuilder.getDouble(key: String, defaultVal: Double = 0.0): Double =
+    valuesMap[key]?.doubleVal ?: defaultVal
+
+internal fun DataPointOrBuilder.getString(key: String): String? = valuesMap[key]?.stringVal
+
+internal fun DataPointOrBuilder.getEnum(key: String): String? {
+    return valuesMap[key]?.enumVal
+}
+
+internal fun SeriesValueOrBuilder.getLong(key: String, defaultVal: Long = 0): Long =
+    valuesMap[key]?.longVal ?: defaultVal
+
+internal fun SeriesValueOrBuilder.getDouble(key: String, defaultVal: Double = 0.0): Double =
+    valuesMap[key]?.doubleVal ?: defaultVal
+
+internal fun SeriesValueOrBuilder.getString(key: String): String? = valuesMap[key]?.stringVal
+
+internal fun SeriesValueOrBuilder.getEnum(key: String): String? = valuesMap[key]?.enumVal
+
+@get:SuppressWarnings("GoodTime") // Safe to use for deserialization
+internal val DataProto.DataPoint.metadata: Metadata
+    get() =
+        Metadata(
+            uid = if (hasUid()) uid else Metadata.EMPTY_UID,
+            dataOrigin = DataOrigin(dataOrigin.applicationId),
+            lastModifiedTime = Instant.ofEpochMilli(updateTimeMillis),
+            clientRecordId = if (hasClientId()) clientId else null,
+            clientRecordVersion = clientVersion,
+            device = toDevice(device)
+        )
+
+private fun toDevice(proto: DataProto.Device): Device {
+    return with(proto) {
+        Device(
+            manufacturer = if (hasManufacturer()) manufacturer else null,
+            model = if (hasModel()) model else null,
+            type = if (hasType()) type else null
+        )
+    }
+}
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/records/RecordToProtoConverters.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/records/RecordToProtoConverters.kt
new file mode 100644
index 0000000..86d406c
--- /dev/null
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/records/RecordToProtoConverters.kt
@@ -0,0 +1,528 @@
+/*
+ * 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.
+ */
+@file:RestrictTo(RestrictTo.Scope.LIBRARY)
+
+package androidx.health.connect.client.impl.converters.records
+
+import androidx.annotation.RestrictTo
+import androidx.health.connect.client.records.ActiveCaloriesBurnedRecord
+import androidx.health.connect.client.records.BasalBodyTemperatureRecord
+import androidx.health.connect.client.records.BasalMetabolicRateRecord
+import androidx.health.connect.client.records.BloodGlucoseRecord
+import androidx.health.connect.client.records.BloodPressureRecord
+import androidx.health.connect.client.records.BodyFatRecord
+import androidx.health.connect.client.records.BodyTemperatureRecord
+import androidx.health.connect.client.records.BodyWaterMassRecord
+import androidx.health.connect.client.records.BoneMassRecord
+import androidx.health.connect.client.records.CervicalMucusRecord
+import androidx.health.connect.client.records.CyclingPedalingCadenceRecord
+import androidx.health.connect.client.records.DistanceRecord
+import androidx.health.connect.client.records.ElevationGainedRecord
+import androidx.health.connect.client.records.ExerciseEventRecord
+import androidx.health.connect.client.records.ExerciseLapRecord
+import androidx.health.connect.client.records.ExerciseRepetitionsRecord
+import androidx.health.connect.client.records.ExerciseSessionRecord
+import androidx.health.connect.client.records.FloorsClimbedRecord
+import androidx.health.connect.client.records.HeartRateRecord
+import androidx.health.connect.client.records.HeartRateVariabilityDifferentialIndexRecord
+import androidx.health.connect.client.records.HeartRateVariabilityRmssdRecord
+import androidx.health.connect.client.records.HeartRateVariabilitySRecord
+import androidx.health.connect.client.records.HeartRateVariabilitySd2Record
+import androidx.health.connect.client.records.HeartRateVariabilitySdannRecord
+import androidx.health.connect.client.records.HeartRateVariabilitySdnnIndexRecord
+import androidx.health.connect.client.records.HeartRateVariabilitySdnnRecord
+import androidx.health.connect.client.records.HeartRateVariabilitySdsdRecord
+import androidx.health.connect.client.records.HeartRateVariabilityTinnRecord
+import androidx.health.connect.client.records.HeightRecord
+import androidx.health.connect.client.records.HipCircumferenceRecord
+import androidx.health.connect.client.records.HydrationRecord
+import androidx.health.connect.client.records.LeanBodyMassRecord
+import androidx.health.connect.client.records.MenstruationFlowRecord
+import androidx.health.connect.client.records.NutritionRecord
+import androidx.health.connect.client.records.OvulationTestRecord
+import androidx.health.connect.client.records.OxygenSaturationRecord
+import androidx.health.connect.client.records.PowerRecord
+import androidx.health.connect.client.records.Record
+import androidx.health.connect.client.records.RespiratoryRateRecord
+import androidx.health.connect.client.records.RestingHeartRateRecord
+import androidx.health.connect.client.records.SeriesRecord
+import androidx.health.connect.client.records.SexualActivityRecord
+import androidx.health.connect.client.records.SleepSessionRecord
+import androidx.health.connect.client.records.SleepStageRecord
+import androidx.health.connect.client.records.SpeedRecord
+import androidx.health.connect.client.records.StepsCadenceRecord
+import androidx.health.connect.client.records.StepsRecord
+import androidx.health.connect.client.records.SwimmingStrokesRecord
+import androidx.health.connect.client.records.TotalCaloriesBurnedRecord
+import androidx.health.connect.client.records.Vo2MaxRecord
+import androidx.health.connect.client.records.WaistCircumferenceRecord
+import androidx.health.connect.client.records.WeightRecord
+import androidx.health.connect.client.records.WheelchairPushesRecord
+import androidx.health.platform.client.proto.DataProto
+
+/** Converts public API object into internal proto for ipc. */
+fun Record.toProto(): DataProto.DataPoint =
+    when (this) {
+        is BasalBodyTemperatureRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("BasalBodyTemperature"))
+                .apply {
+                    putValues("temperature", doubleVal(temperature.inCelsius))
+                    measurementLocation?.let { putValues("measurementLocation", enumVal(it)) }
+                }
+                .build()
+        is BasalMetabolicRateRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("BasalMetabolicRate"))
+                .apply { putValues("bmr", doubleVal(basalMetabolicRate.inKilocaloriesPerDay)) }
+                .build()
+        is BloodGlucoseRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("BloodGlucose"))
+                .apply {
+                    putValues("level", doubleVal(levelMillimolesPerLiter))
+                    specimenSource?.let { putValues("specimenSource", enumVal(it)) }
+                    mealType?.let { putValues("mealType", enumVal(it)) }
+                    relationToMeal?.let { putValues("relationToMeal", enumVal(it)) }
+                }
+                .build()
+        is BloodPressureRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("BloodPressure"))
+                .apply {
+                    putValues("systolic", doubleVal(systolic.inMillimetersOfMercury))
+                    putValues("diastolic", doubleVal(diastolic.inMillimetersOfMercury))
+                    bodyPosition?.let { putValues("bodyPosition", enumVal(it)) }
+                    measurementLocation?.let { putValues("measurementLocation", enumVal(it)) }
+                }
+                .build()
+        is BodyFatRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("BodyFat"))
+                .apply { putValues("percentage", doubleVal(percentage.value)) }
+                .build()
+        is BodyTemperatureRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("BodyTemperature"))
+                .apply {
+                    putValues("temperature", doubleVal(temperature.inCelsius))
+                    measurementLocation?.let { putValues("measurementLocation", enumVal(it)) }
+                }
+                .build()
+        is BodyWaterMassRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("BodyWaterMass"))
+                .apply { putValues("mass", doubleVal(mass.inKilograms)) }
+                .build()
+        is BoneMassRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("BoneMass"))
+                .apply { putValues("mass", doubleVal(mass.inKilograms)) }
+                .build()
+        is CervicalMucusRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("CervicalMucus"))
+                .apply {
+                    appearance?.let { putValues("texture", enumVal(it)) }
+                    sensation?.let { putValues("amount", enumVal(it)) }
+                }
+                .build()
+        is CyclingPedalingCadenceRecord ->
+            toProto(dataTypeName = "CyclingPedalingCadenceSeries") { sample ->
+                DataProto.SeriesValue.newBuilder()
+                    .putValues("rpm", doubleVal(sample.revolutionsPerMinute))
+                    .setInstantTimeMillis(sample.time.toEpochMilli())
+                    .build()
+            }
+        is HeartRateRecord ->
+            toProto(dataTypeName = "HeartRateSeries") { sample ->
+                DataProto.SeriesValue.newBuilder()
+                    .putValues("bpm", longVal(sample.beatsPerMinute))
+                    .setInstantTimeMillis(sample.time.toEpochMilli())
+                    .build()
+            }
+        is HeightRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("Height"))
+                .apply { putValues("height", doubleVal(height.inMeters)) }
+                .build()
+        is HipCircumferenceRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("HipCircumference"))
+                .apply { putValues("circumference", doubleVal(circumference.inMeters)) }
+                .build()
+        is HeartRateVariabilityDifferentialIndexRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("HeartRateVariabilityDifferentialIndex"))
+                .apply { putValues("heartRateVariability", doubleVal(heartRateVariabilityMillis)) }
+                .build()
+        is HeartRateVariabilityRmssdRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("HeartRateVariabilityRmssd"))
+                .apply { putValues("heartRateVariability", doubleVal(heartRateVariabilityMillis)) }
+                .build()
+        is HeartRateVariabilitySRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("HeartRateVariabilityS"))
+                .apply { putValues("heartRateVariability", doubleVal(heartRateVariabilityMillis)) }
+                .build()
+        is HeartRateVariabilitySd2Record ->
+            instantaneousProto()
+                .setDataType(protoDataType("HeartRateVariabilitySd2"))
+                .apply { putValues("heartRateVariability", doubleVal(heartRateVariabilityMillis)) }
+                .build()
+        is HeartRateVariabilitySdannRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("HeartRateVariabilitySdann"))
+                .apply { putValues("heartRateVariability", doubleVal(heartRateVariabilityMillis)) }
+                .build()
+        is HeartRateVariabilitySdnnIndexRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("HeartRateVariabilitySdnnIndex"))
+                .apply { putValues("heartRateVariability", doubleVal(heartRateVariabilityMillis)) }
+                .build()
+        is HeartRateVariabilitySdnnRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("HeartRateVariabilitySdnn"))
+                .apply { putValues("heartRateVariability", doubleVal(heartRateVariabilityMillis)) }
+                .build()
+        is HeartRateVariabilitySdsdRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("HeartRateVariabilitySdsd"))
+                .apply { putValues("heartRateVariability", doubleVal(heartRateVariabilityMillis)) }
+                .build()
+        is HeartRateVariabilityTinnRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("HeartRateVariabilityTinn"))
+                .apply { putValues("heartRateVariability", doubleVal(heartRateVariabilityMillis)) }
+                .build()
+        is LeanBodyMassRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("LeanBodyMass"))
+                .apply { putValues("mass", doubleVal(mass.inKilograms)) }
+                .build()
+        is MenstruationFlowRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("Menstruation"))
+                .apply { flow?.let { putValues("flow", enumVal(it)) } }
+                .build()
+        is OvulationTestRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("OvulationTest"))
+                .apply { putValues("result", enumVal(result)) }
+                .build()
+        is OxygenSaturationRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("OxygenSaturation"))
+                .apply { putValues("percentage", doubleVal(percentage.value)) }
+                .build()
+        is PowerRecord ->
+            toProto(dataTypeName = "PowerSeries") { sample ->
+                DataProto.SeriesValue.newBuilder()
+                    .putValues("power", doubleVal(sample.power.inWatts))
+                    .setInstantTimeMillis(sample.time.toEpochMilli())
+                    .build()
+            }
+        is RespiratoryRateRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("RespiratoryRate"))
+                .apply { putValues("rate", doubleVal(rate)) }
+                .build()
+        is RestingHeartRateRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("RestingHeartRate"))
+                .apply { putValues("bpm", longVal(beatsPerMinute)) }
+                .build()
+        is SexualActivityRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("SexualActivity"))
+                .apply { protectionUsed?.let { putValues("protectionUsed", enumVal(it)) } }
+                .build()
+        is SpeedRecord ->
+            toProto(dataTypeName = "SpeedSeries") { sample ->
+                DataProto.SeriesValue.newBuilder()
+                    .putValues("speed", doubleVal(sample.speed.inMetersPerSecond))
+                    .setInstantTimeMillis(sample.time.toEpochMilli())
+                    .build()
+            }
+        is StepsCadenceRecord ->
+            toProto(dataTypeName = "StepsCadenceSeries") { sample ->
+                DataProto.SeriesValue.newBuilder()
+                    .putValues("rate", doubleVal(sample.rate))
+                    .setInstantTimeMillis(sample.time.toEpochMilli())
+                    .build()
+            }
+        is Vo2MaxRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("Vo2Max"))
+                .apply {
+                    putValues("vo2", doubleVal(vo2MillilitersPerMinuteKilogram))
+                    measurementMethod?.let { putValues("measurementMethod", enumVal(it)) }
+                }
+                .build()
+        is WaistCircumferenceRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("WaistCircumference"))
+                .apply { putValues("circumference", doubleVal(circumference.inMeters)) }
+                .build()
+        is WeightRecord ->
+            instantaneousProto()
+                .setDataType(protoDataType("Weight"))
+                .apply { putValues("weight", doubleVal(weight.inKilograms)) }
+                .build()
+        is ActiveCaloriesBurnedRecord ->
+            intervalProto()
+                .setDataType(protoDataType("ActiveCaloriesBurned"))
+                .apply { putValues("energy", doubleVal(energy.inKilocalories)) }
+                .build()
+        is ExerciseEventRecord ->
+            intervalProto()
+                .setDataType(protoDataType("ActivityEvent"))
+                .apply { putValues("eventType", enumVal(eventType)) }
+                .build()
+        is ExerciseLapRecord ->
+            intervalProto()
+                .setDataType(protoDataType("ActivityLap"))
+                .apply {
+                    if (length != null) {
+                        putValues("length", doubleVal(length.inMeters))
+                    }
+                }
+                .build()
+        is ExerciseSessionRecord ->
+            intervalProto()
+                .setDataType(protoDataType("ActivitySession"))
+                .apply {
+                    putValues("activityType", enumVal(exerciseType))
+                    title?.let { putValues("title", stringVal(it)) }
+                    notes?.let { putValues("notes", stringVal(it)) }
+                }
+                .build()
+        is DistanceRecord ->
+            intervalProto()
+                .setDataType(protoDataType("Distance"))
+                .apply { putValues("distance", doubleVal(distance.inMeters)) }
+                .build()
+        is ElevationGainedRecord ->
+            intervalProto()
+                .setDataType(protoDataType("ElevationGained"))
+                .apply { putValues("elevation", doubleVal(elevation.inMeters)) }
+                .build()
+        is FloorsClimbedRecord ->
+            intervalProto()
+                .setDataType(protoDataType("FloorsClimbed"))
+                .apply { putValues("floors", doubleVal(floors)) }
+                .build()
+        is HydrationRecord ->
+            intervalProto()
+                .setDataType(protoDataType("Hydration"))
+                .apply { putValues("volume", doubleVal(volume.inLiters)) }
+                .build()
+        is NutritionRecord ->
+            intervalProto()
+                .setDataType(protoDataType("Nutrition"))
+                .apply {
+                    if (biotin != null) {
+                        putValues("biotin", doubleVal(biotin.inGrams))
+                    }
+                    if (caffeine != null) {
+                        putValues("caffeine", doubleVal(caffeine.inGrams))
+                    }
+                    if (calcium != null) {
+                        putValues("calcium", doubleVal(calcium.inGrams))
+                    }
+                    if (energy != null) {
+                        putValues("calories", doubleVal(energy.inKilocalories))
+                    }
+                    if (energyFromFat != null) {
+                        putValues("caloriesFromFat", doubleVal(energyFromFat.inKilocalories))
+                    }
+                    if (chloride != null) {
+                        putValues("chloride", doubleVal(chloride.inGrams))
+                    }
+                    if (cholesterol != null) {
+                        putValues("cholesterol", doubleVal(cholesterol.inGrams))
+                    }
+                    if (chromium != null) {
+                        putValues("chromium", doubleVal(chromium.inGrams))
+                    }
+                    if (copper != null) {
+                        putValues("copper", doubleVal(copper.inGrams))
+                    }
+                    if (dietaryFiber != null) {
+                        putValues("dietaryFiber", doubleVal(dietaryFiber.inGrams))
+                    }
+                    if (folate != null) {
+                        putValues("folate", doubleVal(folate.inGrams))
+                    }
+                    if (folicAcid != null) {
+                        putValues("folicAcid", doubleVal(folicAcid.inGrams))
+                    }
+                    if (iodine != null) {
+                        putValues("iodine", doubleVal(iodine.inGrams))
+                    }
+                    if (iron != null) {
+                        putValues("iron", doubleVal(iron.inGrams))
+                    }
+                    if (magnesium != null) {
+                        putValues("magnesium", doubleVal(magnesium.inGrams))
+                    }
+                    if (manganese != null) {
+                        putValues("manganese", doubleVal(manganese.inGrams))
+                    }
+                    if (molybdenum != null) {
+                        putValues("molybdenum", doubleVal(molybdenum.inGrams))
+                    }
+                    if (monounsaturatedFat != null) {
+                        putValues("monounsaturatedFat", doubleVal(monounsaturatedFat.inGrams))
+                    }
+                    if (niacin != null) {
+                        putValues("niacin", doubleVal(niacin.inGrams))
+                    }
+                    if (pantothenicAcid != null) {
+                        putValues("pantothenicAcid", doubleVal(pantothenicAcid.inGrams))
+                    }
+                    if (phosphorus != null) {
+                        putValues("phosphorus", doubleVal(phosphorus.inGrams))
+                    }
+                    if (polyunsaturatedFat != null) {
+                        putValues("polyunsaturatedFat", doubleVal(polyunsaturatedFat.inGrams))
+                    }
+                    if (potassium != null) {
+                        putValues("potassium", doubleVal(potassium.inGrams))
+                    }
+                    if (protein != null) {
+                        putValues("protein", doubleVal(protein.inGrams))
+                    }
+                    if (riboflavin != null) {
+                        putValues("riboflavin", doubleVal(riboflavin.inGrams))
+                    }
+                    if (saturatedFat != null) {
+                        putValues("saturatedFat", doubleVal(saturatedFat.inGrams))
+                    }
+                    if (selenium != null) {
+                        putValues("selenium", doubleVal(selenium.inGrams))
+                    }
+                    if (sodium != null) {
+                        putValues("sodium", doubleVal(sodium.inGrams))
+                    }
+                    if (sugar != null) {
+                        putValues("sugar", doubleVal(sugar.inGrams))
+                    }
+                    if (thiamin != null) {
+                        putValues("thiamin", doubleVal(thiamin.inGrams))
+                    }
+                    if (totalCarbohydrate != null) {
+                        putValues("totalCarbohydrate", doubleVal(totalCarbohydrate.inGrams))
+                    }
+                    if (totalFat != null) {
+                        putValues("totalFat", doubleVal(totalFat.inGrams))
+                    }
+                    if (transFat != null) {
+                        putValues("transFat", doubleVal(transFat.inGrams))
+                    }
+                    if (unsaturatedFat != null) {
+                        putValues("unsaturatedFat", doubleVal(unsaturatedFat.inGrams))
+                    }
+                    if (vitaminA != null) {
+                        putValues("vitaminA", doubleVal(vitaminA.inGrams))
+                    }
+                    if (vitaminB12 != null) {
+                        putValues("vitaminB12", doubleVal(vitaminB12.inGrams))
+                    }
+                    if (vitaminB6 != null) {
+                        putValues("vitaminB6", doubleVal(vitaminB6.inGrams))
+                    }
+                    if (vitaminC != null) {
+                        putValues("vitaminC", doubleVal(vitaminC.inGrams))
+                    }
+                    if (vitaminD != null) {
+                        putValues("vitaminD", doubleVal(vitaminD.inGrams))
+                    }
+                    if (vitaminE != null) {
+                        putValues("vitaminE", doubleVal(vitaminE.inGrams))
+                    }
+                    if (vitaminK != null) {
+                        putValues("vitaminK", doubleVal(vitaminK.inGrams))
+                    }
+                    if (zinc != null) {
+                        putValues("zinc", doubleVal(zinc.inGrams))
+                    }
+                    mealType?.let { putValues("mealType", enumVal(it)) }
+                    name?.let { putValues("name", stringVal(it)) }
+                }
+                .build()
+        is ExerciseRepetitionsRecord ->
+            intervalProto()
+                .setDataType(protoDataType("Repetitions"))
+                .apply {
+                    putValues("count", longVal(count))
+                    putValues("type", enumVal(type))
+                }
+                .build()
+        is SleepSessionRecord ->
+            intervalProto()
+                .setDataType(protoDataType("SleepSession"))
+                .apply {
+                    title?.let { putValues("title", stringVal(it)) }
+                    notes?.let { putValues("notes", stringVal(it)) }
+                }
+                .build()
+        is SleepStageRecord ->
+            intervalProto()
+                .setDataType(protoDataType("SleepStage"))
+                .apply { putValues("stage", enumVal(stage)) }
+                .build()
+        is StepsRecord ->
+            intervalProto()
+                .setDataType(protoDataType("Steps"))
+                .apply { putValues("count", longVal(count)) }
+                .build()
+        is SwimmingStrokesRecord ->
+            intervalProto()
+                .setDataType(protoDataType("SwimmingStrokes"))
+                .apply {
+                    if (count > 0) {
+                        putValues("count", longVal(count))
+                    }
+                    putValues("type", enumVal(type))
+                }
+                .build()
+        is TotalCaloriesBurnedRecord ->
+            intervalProto()
+                .setDataType(protoDataType("TotalCaloriesBurned"))
+                .apply { putValues("energy", doubleVal(energy.inKilocalories)) }
+                .build()
+        is WheelchairPushesRecord ->
+            intervalProto()
+                .setDataType(protoDataType("WheelchairPushes"))
+                .apply { putValues("count", longVal(count)) }
+                .build()
+        else -> throw RuntimeException("Unsupported yet!")
+    }
+
+private fun <T : Any> SeriesRecord<T>.toProto(
+    dataTypeName: String,
+    getSeriesValue: (sample: T) -> DataProto.SeriesValue,
+): DataProto.DataPoint =
+    intervalProto()
+        .setDataType(protoDataType(dataTypeName = dataTypeName))
+        .apply {
+            for (sample in samples) {
+                addSeriesValues(getSeriesValue(sample))
+            }
+        }
+        .build()
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/records/RecordToProtoUtils.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/records/RecordToProtoUtils.kt
new file mode 100644
index 0000000..7ced9bd
--- /dev/null
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/records/RecordToProtoUtils.kt
@@ -0,0 +1,86 @@
+/*
+ * 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.
+ */
+@file:RestrictTo(RestrictTo.Scope.LIBRARY)
+
+package androidx.health.connect.client.impl.converters.records
+
+import androidx.annotation.RestrictTo
+import androidx.health.connect.client.records.InstantaneousRecord
+import androidx.health.connect.client.records.IntervalRecord
+import androidx.health.connect.client.records.metadata.Device
+import androidx.health.connect.client.records.metadata.Metadata
+import androidx.health.platform.client.proto.DataProto
+import java.time.Instant
+
+internal fun protoDataType(dataTypeName: String): DataProto.DataType =
+    DataProto.DataType.newBuilder().setName(dataTypeName).build()
+
+@SuppressWarnings("GoodTime") // Suppress GoodTime for serialize/de-serialize.
+internal fun InstantaneousRecord.instantaneousProto(): DataProto.DataPoint.Builder {
+    val builder =
+        DataProto.DataPoint.newBuilder()
+            .setMetadata(metadata)
+            .setInstantTimeMillis(time.toEpochMilli())
+    zoneOffset?.let { builder.setZoneOffsetSeconds(it.totalSeconds) }
+    return builder
+}
+
+@SuppressWarnings("GoodTime") // Suppress GoodTime for serialize/de-serialize.
+internal fun IntervalRecord.intervalProto(): DataProto.DataPoint.Builder {
+    val builder =
+        DataProto.DataPoint.newBuilder()
+            .setMetadata(metadata)
+            .setStartTimeMillis(startTime.toEpochMilli())
+            .setEndTimeMillis(endTime.toEpochMilli())
+    startZoneOffset?.let { builder.setStartZoneOffsetSeconds(it.totalSeconds) }
+    endZoneOffset?.let { builder.setEndZoneOffsetSeconds(it.totalSeconds) }
+    return builder
+}
+
+@SuppressWarnings("GoodTime") // Suppress GoodTime for serialize/de-serialize.
+private fun DataProto.DataPoint.Builder.setMetadata(metadata: Metadata) = apply {
+    if (metadata.uid != Metadata.EMPTY_UID) {
+        setUid(metadata.uid)
+    }
+    if (metadata.dataOrigin.packageName.isNotEmpty()) {
+        setDataOrigin(
+            DataProto.DataOrigin.newBuilder()
+                .setApplicationId(metadata.dataOrigin.packageName)
+                .build()
+        )
+    }
+
+    if (metadata.lastModifiedTime.isAfter(Instant.EPOCH)) {
+        setUpdateTimeMillis(metadata.lastModifiedTime.toEpochMilli())
+    }
+
+    metadata.clientRecordId?.let { setClientId(it) }
+    if (metadata.clientRecordVersion > 0) {
+        metadata.clientRecordVersion.let { setClientVersion(it) }
+    }
+    metadata.device?.let { setDevice(it.toProto()) }
+}
+
+private fun Device.toProto(): DataProto.Device {
+    val obj = this
+    return DataProto.Device.newBuilder()
+        .apply {
+            obj.manufacturer?.let { setManufacturer(it) }
+            obj.model?.let { setModel(it) }
+            obj.type?.let { setType(it) }
+        }
+        .build()
+}
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/records/ValueExt.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/records/ValueExt.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/records/ValueExt.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/records/ValueExt.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/request/AggregateRequestToProto.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/request/AggregateRequestToProto.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/request/AggregateRequestToProto.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/request/AggregateRequestToProto.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/request/DeleteDataRangeRequestToProto.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/request/DeleteDataRangeRequestToProto.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/request/DeleteDataRangeRequestToProto.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/request/DeleteDataRangeRequestToProto.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/request/ReadDataRangeRequestToProto.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/request/ReadDataRangeRequestToProto.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/request/ReadDataRangeRequestToProto.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/request/ReadDataRangeRequestToProto.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/request/ReadDataRequestToProto.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/request/ReadDataRequestToProto.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/request/ReadDataRequestToProto.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/request/ReadDataRequestToProto.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/response/ProtoToChangesResponse.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/response/ProtoToChangesResponse.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/response/ProtoToChangesResponse.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/response/ProtoToChangesResponse.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/response/ProtoToReadRecordsResponse.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/response/ProtoToReadRecordsResponse.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/response/ProtoToReadRecordsResponse.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/response/ProtoToReadRecordsResponse.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/time/TimeRangeFilterConverter.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/time/TimeRangeFilterConverter.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/time/TimeRangeFilterConverter.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/time/TimeRangeFilterConverter.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/package-info.java b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/package-info.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/impl/package-info.java
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/package-info.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/package-info.java b/health/connect/connect-client/src/main/java/androidx/health/connect/client/package-info.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/package-info.java
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/package-info.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/permission/AccessTypes.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/permission/AccessTypes.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/permission/AccessTypes.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/permission/AccessTypes.kt
diff --git a/health/health-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
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/permission/HealthDataRequestPermissions.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/permission/HealthDataRequestPermissions.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/permission/HealthPermission.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/permission/HealthPermission.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/permission/HealthPermission.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/permission/HealthPermission.kt
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/ActiveCaloriesBurnedRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/ActiveCaloriesBurnedRecord.kt
new file mode 100644
index 0000000..a7d2825
--- /dev/null
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/ActiveCaloriesBurnedRecord.kt
@@ -0,0 +1,90 @@
+/*
+ * 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.records
+
+import androidx.health.connect.client.aggregate.AggregateMetric
+import androidx.health.connect.client.records.metadata.Metadata
+import androidx.health.connect.client.units.Energy
+import java.time.Instant
+import java.time.ZoneOffset
+
+/**
+ * Captures the estimated active energy burned by the user (in kilocalories), excluding basal
+ * metabolic rate (BMR). Each record represents the total kilocalories burned over a time interval,
+ * so both the start and end times should be set.
+ */
+public class ActiveCaloriesBurnedRecord(
+    /** Energy in [Energy] unit. Required field. Valid range: 0-1000000 kcal. */
+    public val energy: Energy,
+    override val startTime: Instant,
+    override val startZoneOffset: ZoneOffset?,
+    override val endTime: Instant,
+    override val endZoneOffset: ZoneOffset?,
+    override val metadata: Metadata = Metadata.EMPTY,
+) : IntervalRecord {
+
+    init {
+        energy.requireNotLess(other = energy.zero(), "energy")
+    }
+
+    /*
+     * Generated by the IDE: Code -> Generate -> "equals() and hashCode()".
+     */
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other !is ActiveCaloriesBurnedRecord) return false
+
+        if (energy != other.energy) return false
+        if (startTime != other.startTime) return false
+        if (startZoneOffset != other.startZoneOffset) return false
+        if (endTime != other.endTime) return false
+        if (endZoneOffset != other.endZoneOffset) return false
+        if (metadata != other.metadata) return false
+
+        return true
+    }
+
+    /*
+     * Generated by the IDE: Code -> Generate -> "equals() and hashCode()".
+     */
+    override fun hashCode(): Int {
+        var result = energy.hashCode()
+        result = 31 * result + startTime.hashCode()
+        result = 31 * result + (startZoneOffset?.hashCode() ?: 0)
+        result = 31 * result + endTime.hashCode()
+        result = 31 * result + (endZoneOffset?.hashCode() ?: 0)
+        result = 31 * result + metadata.hashCode()
+        return result
+    }
+
+    companion object {
+        private const val TYPE_NAME = "ActiveCaloriesBurned"
+        private const val ENERGY_FIELD_NAME = "energy"
+
+        /**
+         * Metric identifier to retrieve total active calories burned from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val ACTIVE_CALORIES_TOTAL: AggregateMetric<Energy> =
+            AggregateMetric.doubleMetric(
+                dataTypeName = TYPE_NAME,
+                aggregationType = AggregateMetric.AggregationType.TOTAL,
+                fieldName = ENERGY_FIELD_NAME,
+                mapper = Energy::kilocalories,
+            )
+    }
+}
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/BasalBodyTemperatureRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/BasalBodyTemperatureRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/BasalBodyTemperatureRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/BasalBodyTemperatureRecord.kt
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/BasalMetabolicRateRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/BasalMetabolicRateRecord.kt
new file mode 100644
index 0000000..d7f938b
--- /dev/null
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/BasalMetabolicRateRecord.kt
@@ -0,0 +1,78 @@
+/*
+ * 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.records
+
+import androidx.health.connect.client.aggregate.AggregateMetric
+import androidx.health.connect.client.records.metadata.Metadata
+import androidx.health.connect.client.units.Energy
+import androidx.health.connect.client.units.Power
+import java.time.Instant
+import java.time.ZoneOffset
+
+/**
+ * Captures the BMR of a user. Each record represents the energy a user would burn if at rest all
+ * day, based on their height and weight.
+ */
+public class BasalMetabolicRateRecord(
+    /** Basal metabolic rate, in [Power] unit. Required field. Valid range: 0-10000 kcal/day. */
+    public val basalMetabolicRate: Power,
+    override val time: Instant,
+    override val zoneOffset: ZoneOffset?,
+    override val metadata: Metadata = Metadata.EMPTY,
+) : InstantaneousRecord {
+
+    init {
+        basalMetabolicRate.requireNotLess(other = basalMetabolicRate.zero(), name = "bmr")
+    }
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other !is BasalMetabolicRateRecord) return false
+
+        if (basalMetabolicRate != other.basalMetabolicRate) return false
+        if (time != other.time) return false
+        if (zoneOffset != other.zoneOffset) return false
+        if (metadata != other.metadata) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = basalMetabolicRate.hashCode()
+        result = 31 * result + time.hashCode()
+        result = 31 * result + (zoneOffset?.hashCode() ?: 0)
+        result = 31 * result + metadata.hashCode()
+        return result
+    }
+
+    companion object {
+        private const val BASAL_CALORIES_TYPE_NAME = "BasalCaloriesBurned"
+        private const val ENERGY_FIELD_NAME = "energy"
+
+        /**
+         * Metric identifier to retrieve the total basal calories burned from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val BASAL_CALORIES_TOTAL: AggregateMetric<Energy> =
+            AggregateMetric.doubleMetric(
+                dataTypeName = BASAL_CALORIES_TYPE_NAME,
+                aggregationType = AggregateMetric.AggregationType.TOTAL,
+                fieldName = ENERGY_FIELD_NAME,
+                mapper = Energy::kilocalories,
+            )
+    }
+}
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/BloodGlucoseRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/BloodGlucoseRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/BloodGlucoseRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/BloodGlucoseRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/BloodPressureRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/BloodPressureRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/BloodPressureRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/BloodPressureRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/BodyFatRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/BodyFatRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/BodyFatRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/BodyFatRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/BodyPosition.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/BodyPosition.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/BodyPosition.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/BodyPosition.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/BodyTemperatureMeasurementLocation.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/BodyTemperatureMeasurementLocation.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/BodyTemperatureMeasurementLocation.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/BodyTemperatureMeasurementLocation.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/BodyTemperatureRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/BodyTemperatureRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/BodyTemperatureRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/BodyTemperatureRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/BodyWaterMassRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/BodyWaterMassRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/BodyWaterMassRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/BodyWaterMassRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/BoneMassRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/BoneMassRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/BoneMassRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/BoneMassRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/CervicalMucusRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/CervicalMucusRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/CervicalMucusRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/CervicalMucusRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/CyclingPedalingCadenceRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/CyclingPedalingCadenceRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/CyclingPedalingCadenceRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/CyclingPedalingCadenceRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/DistanceRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/DistanceRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/DistanceRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/DistanceRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/ElevationGainedRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/ElevationGainedRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/ElevationGainedRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/ElevationGainedRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/ExerciseEventRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/ExerciseEventRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/ExerciseEventRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/ExerciseEventRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/ExerciseLapRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/ExerciseLapRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/ExerciseLapRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/ExerciseLapRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/ExerciseRepetitionsRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/ExerciseRepetitionsRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/ExerciseRepetitionsRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/ExerciseRepetitionsRecord.kt
diff --git a/health/health-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
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/ExerciseSessionRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/ExerciseSessionRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/FloorsClimbedRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/FloorsClimbedRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/FloorsClimbedRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/FloorsClimbedRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/HeartRateRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/HeartRateRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/HeartRateRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/HeartRateRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilityDifferentialIndexRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilityDifferentialIndexRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilityDifferentialIndexRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilityDifferentialIndexRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilityRmssdRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilityRmssdRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilityRmssdRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilityRmssdRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilitySRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilitySRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilitySRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilitySRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilitySd2Record.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilitySd2Record.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilitySd2Record.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilitySd2Record.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilitySdannRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilitySdannRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilitySdannRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilitySdannRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilitySdnnIndexRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilitySdnnIndexRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilitySdnnIndexRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilitySdnnIndexRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilitySdnnRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilitySdnnRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilitySdnnRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilitySdnnRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilitySdsdRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilitySdsdRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilitySdsdRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilitySdsdRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilityTinnRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilityTinnRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilityTinnRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/HeartRateVariabilityTinnRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/HeightRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/HeightRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/HeightRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/HeightRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/HipCircumferenceRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/HipCircumferenceRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/HipCircumferenceRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/HipCircumferenceRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/HydrationRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/HydrationRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/HydrationRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/HydrationRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/InstantaneousRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/InstantaneousRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/InstantaneousRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/InstantaneousRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/IntervalRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/IntervalRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/IntervalRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/IntervalRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/LeanBodyMassRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/LeanBodyMassRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/LeanBodyMassRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/LeanBodyMassRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/MealType.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/MealType.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/MealType.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/MealType.kt
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/MenstruationFlowRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/MenstruationFlowRecord.kt
new file mode 100644
index 0000000..d78319f
--- /dev/null
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/MenstruationFlowRecord.kt
@@ -0,0 +1,84 @@
+/*
+ * 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.records
+
+import androidx.annotation.RestrictTo
+import androidx.annotation.StringDef
+import androidx.health.connect.client.records.metadata.Metadata
+import java.time.Instant
+import java.time.ZoneOffset
+
+/**
+ * Captures a description of how heavy a user's menstrual flow was (spotting, light, medium, or
+ * heavy). Each record represents a description of how heavy the user's menstrual bleeding was.
+ */
+public class MenstruationFlowRecord(
+    /**
+     * How heavy the user's menstrual flow was. Optional field. Allowed values: [Flow].
+     *
+     * @see Flow
+     */
+    @property:Flows public val flow: String? = null,
+    override val time: Instant,
+    override val zoneOffset: ZoneOffset?,
+    override val metadata: Metadata = Metadata.EMPTY,
+) : InstantaneousRecord {
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other !is MenstruationFlowRecord) return false
+
+        if (flow != other.flow) return false
+        if (time != other.time) return false
+        if (zoneOffset != other.zoneOffset) return false
+        if (metadata != other.metadata) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = 0
+        result = 31 * result + flow.hashCode()
+        result = 31 * result + time.hashCode()
+        result = 31 * result + (zoneOffset?.hashCode() ?: 0)
+        result = 31 * result + metadata.hashCode()
+        return result
+    }
+
+    /** How heavy the user's menstruation flow was. */
+    public object Flow {
+        const val SPOTTING = "spotting"
+        const val LIGHT = "light"
+        const val MEDIUM = "medium"
+        const val HEAVY = "heavy"
+    }
+
+    /**
+     * How heavy the user's menstruation flow was.
+     * @suppress
+     */
+    @Retention(AnnotationRetention.SOURCE)
+    @StringDef(
+        value =
+            [
+                MenstruationFlowRecord.Flow.SPOTTING,
+                MenstruationFlowRecord.Flow.LIGHT,
+                MenstruationFlowRecord.Flow.MEDIUM,
+                MenstruationFlowRecord.Flow.HEAVY,
+            ]
+    )
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    annotation class Flows
+}
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/NutritionRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/NutritionRecord.kt
new file mode 100644
index 0000000..50056de
--- /dev/null
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/NutritionRecord.kt
@@ -0,0 +1,584 @@
+/*
+ * 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.records
+
+import androidx.health.connect.client.aggregate.AggregateMetric
+import androidx.health.connect.client.aggregate.AggregateMetric.AggregationType
+import androidx.health.connect.client.aggregate.AggregateMetric.Companion.doubleMetric
+import androidx.health.connect.client.records.metadata.Metadata
+import androidx.health.connect.client.units.Energy
+import androidx.health.connect.client.units.Mass
+import java.time.Instant
+import java.time.ZoneOffset
+
+/** Captures what nutrients were consumed as part of a meal or a food item. */
+public class NutritionRecord(
+    /** Biotin in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val biotin: Mass? = null,
+    /** Caffeine in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val caffeine: Mass? = null,
+    /** Calcium in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val calcium: Mass? = null,
+    /** Energy in [Energy] unit. Optional field. Valid range: 0-100000 kcal. */
+    public val energy: Energy? = null,
+    /** Energy from fat in [Energy] unit. Optional field. Valid range: 0-100000 kcal. */
+    public val energyFromFat: Energy? = null,
+    /** Chloride in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val chloride: Mass? = null,
+    /** Cholesterol in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val cholesterol: Mass? = null,
+    /** Chromium in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val chromium: Mass? = null,
+    /** Copper in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val copper: Mass? = null,
+    /** Dietary fiber in [Mass] unit. Optional field. Valid range: 0-100000 grams. */
+    public val dietaryFiber: Mass? = null,
+    /** Folate in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val folate: Mass? = null,
+    /** Folic acid in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val folicAcid: Mass? = null,
+    /** Iodine in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val iodine: Mass? = null,
+    /** Iron in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val iron: Mass? = null,
+    /** Magnesium in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val magnesium: Mass? = null,
+    /** Manganese in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val manganese: Mass? = null,
+    /** Molybdenum in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val molybdenum: Mass? = null,
+    /** Monounsaturated fat in [Mass] unit. Optional field. Valid range: 0-100000 grams. */
+    public val monounsaturatedFat: Mass? = null,
+    /** Niacin in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val niacin: Mass? = null,
+    /** Pantothenic acid in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val pantothenicAcid: Mass? = null,
+    /** Phosphorus in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val phosphorus: Mass? = null,
+    /** Polyunsaturated fat in [Mass] unit. Optional field. Valid range: 0-100000 grams. */
+    public val polyunsaturatedFat: Mass? = null,
+    /** Potassium in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val potassium: Mass? = null,
+    /** Protein in [Mass] unit. Optional field. Valid range: 0-100000 grams. */
+    public val protein: Mass? = null,
+    /** Riboflavin in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val riboflavin: Mass? = null,
+    /** Saturated fat in [Mass] unit. Optional field. Valid range: 0-100000 grams. */
+    public val saturatedFat: Mass? = null,
+    /** Selenium in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val selenium: Mass? = null,
+    /** Sodium in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val sodium: Mass? = null,
+    /** Sugar in [Mass] unit. Optional field. Valid range: 0-100000 grams. */
+    public val sugar: Mass? = null,
+    /** Thiamin in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val thiamin: Mass? = null,
+    /** Total carbohydrate in [Mass] unit. Optional field. Valid range: 0-100000 grams. */
+    public val totalCarbohydrate: Mass? = null,
+    /** Total fat in [Mass] unit. Optional field. Valid range: 0-100000 grams. */
+    public val totalFat: Mass? = null,
+    /** Trans fat in [Mass] unit. Optional field. Valid range: 0-100000 grams. */
+    public val transFat: Mass? = null,
+    /** Unsaturated fat in [Mass] unit. Optional field. Valid range: 0-100000 grams. */
+    public val unsaturatedFat: Mass? = null,
+    /** Vitamin A in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val vitaminA: Mass? = null,
+    /** Vitamin B12 in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val vitaminB12: Mass? = null,
+    /** Vitamin B6 in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val vitaminB6: Mass? = null,
+    /** Vitamin C in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val vitaminC: Mass? = null,
+    /** Vitamin D in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val vitaminD: Mass? = null,
+    /** Vitamin E in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val vitaminE: Mass? = null,
+    /** Vitamin K in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val vitaminK: Mass? = null,
+    /** Zinc in [Mass] unit. Optional field. Valid range: 0-100 grams. */
+    public val zinc: Mass? = null,
+    /** Name for food or drink, provided by the user. Optional field. */
+    public val name: String? = null,
+    /**
+     * Type of meal related to the nutrients consumed. Optional, enum field. Allowed values:
+     * [MealType].
+     *
+     * @see MealType
+     */
+    @property:MealTypes public val mealType: String? = null,
+    override val startTime: Instant,
+    override val startZoneOffset: ZoneOffset?,
+    override val endTime: Instant,
+    override val endZoneOffset: ZoneOffset?,
+    override val metadata: Metadata = Metadata.EMPTY,
+) : IntervalRecord {
+
+    /*
+     * Generated by the IDE: Code -> Generate -> "equals() and hashCode()".
+     */
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other !is NutritionRecord) return false
+
+        if (biotin != other.biotin) return false
+        if (caffeine != other.caffeine) return false
+        if (calcium != other.calcium) return false
+        if (energy != other.energy) return false
+        if (energyFromFat != other.energyFromFat) return false
+        if (chloride != other.chloride) return false
+        if (cholesterol != other.cholesterol) return false
+        if (chromium != other.chromium) return false
+        if (copper != other.copper) return false
+        if (dietaryFiber != other.dietaryFiber) return false
+        if (folate != other.folate) return false
+        if (folicAcid != other.folicAcid) return false
+        if (iodine != other.iodine) return false
+        if (iron != other.iron) return false
+        if (magnesium != other.magnesium) return false
+        if (manganese != other.manganese) return false
+        if (molybdenum != other.molybdenum) return false
+        if (monounsaturatedFat != other.monounsaturatedFat) return false
+        if (niacin != other.niacin) return false
+        if (pantothenicAcid != other.pantothenicAcid) return false
+        if (phosphorus != other.phosphorus) return false
+        if (polyunsaturatedFat != other.polyunsaturatedFat) return false
+        if (potassium != other.potassium) return false
+        if (protein != other.protein) return false
+        if (riboflavin != other.riboflavin) return false
+        if (saturatedFat != other.saturatedFat) return false
+        if (selenium != other.selenium) return false
+        if (sodium != other.sodium) return false
+        if (sugar != other.sugar) return false
+        if (thiamin != other.thiamin) return false
+        if (totalCarbohydrate != other.totalCarbohydrate) return false
+        if (totalFat != other.totalFat) return false
+        if (transFat != other.transFat) return false
+        if (unsaturatedFat != other.unsaturatedFat) return false
+        if (vitaminA != other.vitaminA) return false
+        if (vitaminB12 != other.vitaminB12) return false
+        if (vitaminB6 != other.vitaminB6) return false
+        if (vitaminC != other.vitaminC) return false
+        if (vitaminD != other.vitaminD) return false
+        if (vitaminE != other.vitaminE) return false
+        if (vitaminK != other.vitaminK) return false
+        if (zinc != other.zinc) return false
+        if (name != other.name) return false
+        if (mealType != other.mealType) return false
+        if (startTime != other.startTime) return false
+        if (startZoneOffset != other.startZoneOffset) return false
+        if (endTime != other.endTime) return false
+        if (endZoneOffset != other.endZoneOffset) return false
+        if (metadata != other.metadata) return false
+
+        return true
+    }
+
+    /*
+     * Generated by the IDE: Code -> Generate -> "equals() and hashCode()".
+     */
+    override fun hashCode(): Int {
+        var result = biotin.hashCode()
+        result = 31 * result + caffeine.hashCode()
+        result = 31 * result + calcium.hashCode()
+        result = 31 * result + energy.hashCode()
+        result = 31 * result + energyFromFat.hashCode()
+        result = 31 * result + chloride.hashCode()
+        result = 31 * result + cholesterol.hashCode()
+        result = 31 * result + chromium.hashCode()
+        result = 31 * result + copper.hashCode()
+        result = 31 * result + dietaryFiber.hashCode()
+        result = 31 * result + folate.hashCode()
+        result = 31 * result + folicAcid.hashCode()
+        result = 31 * result + iodine.hashCode()
+        result = 31 * result + iron.hashCode()
+        result = 31 * result + magnesium.hashCode()
+        result = 31 * result + manganese.hashCode()
+        result = 31 * result + molybdenum.hashCode()
+        result = 31 * result + monounsaturatedFat.hashCode()
+        result = 31 * result + niacin.hashCode()
+        result = 31 * result + pantothenicAcid.hashCode()
+        result = 31 * result + phosphorus.hashCode()
+        result = 31 * result + polyunsaturatedFat.hashCode()
+        result = 31 * result + potassium.hashCode()
+        result = 31 * result + protein.hashCode()
+        result = 31 * result + riboflavin.hashCode()
+        result = 31 * result + saturatedFat.hashCode()
+        result = 31 * result + selenium.hashCode()
+        result = 31 * result + sodium.hashCode()
+        result = 31 * result + sugar.hashCode()
+        result = 31 * result + thiamin.hashCode()
+        result = 31 * result + totalCarbohydrate.hashCode()
+        result = 31 * result + totalFat.hashCode()
+        result = 31 * result + transFat.hashCode()
+        result = 31 * result + unsaturatedFat.hashCode()
+        result = 31 * result + vitaminA.hashCode()
+        result = 31 * result + vitaminB12.hashCode()
+        result = 31 * result + vitaminB6.hashCode()
+        result = 31 * result + vitaminC.hashCode()
+        result = 31 * result + vitaminD.hashCode()
+        result = 31 * result + vitaminE.hashCode()
+        result = 31 * result + vitaminK.hashCode()
+        result = 31 * result + zinc.hashCode()
+        result = 31 * result + (name?.hashCode() ?: 0)
+        result = 31 * result + (mealType?.hashCode() ?: 0)
+        result = 31 * result + startTime.hashCode()
+        result = 31 * result + (startZoneOffset?.hashCode() ?: 0)
+        result = 31 * result + endTime.hashCode()
+        result = 31 * result + (endZoneOffset?.hashCode() ?: 0)
+        result = 31 * result + metadata.hashCode()
+        return result
+    }
+
+    companion object {
+        private const val TYPE_NAME = "Nutrition"
+
+        /**
+         * Metric identifier to retrieve the total biotin from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val BIOTIN_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "biotin", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total caffeine from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val CAFFEINE_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "caffeine", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total calcium from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val CALCIUM_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "calcium", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total energy from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val ENERGY_TOTAL: AggregateMetric<Energy> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "calories", Energy::kilocalories)
+
+        /**
+         * Metric identifier to retrieve the total energy from fat from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val ENERGY_FROM_FAT_TOTAL: AggregateMetric<Energy> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "caloriesFromFat", Energy::kilocalories)
+
+        /**
+         * Metric identifier to retrieve the total chloride from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val CHLORIDE_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "chloride", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total cholesterol from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val CHOLESTEROL_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "cholesterol", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total chromium from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val CHROMIUM_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "chromium", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total copper from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val COPPER_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "copper", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total dietary fiber from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val DIETARY_FIBER_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "dietaryFiber", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total folate from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val FOLATE_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "folate", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total folic acid from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val FOLIC_ACID_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "folicAcid", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total iodine from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val IODINE_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "iodine", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total iron from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val IRON_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "iron", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total magnesium from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val MAGNESIUM_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "magnesium", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total manganese from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val MANGANESE_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "manganese", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total molybdenum from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val MOLYBDENUM_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "molybdenum", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total monounsaturated fat from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val MONOUNSATURATED_FAT_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "monounsaturatedFat", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total niacin from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val NIACIN_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "niacin", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total pantothenic acid from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val PANTOTHENIC_ACID_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "pantothenicAcid", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total phosphorus from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val PHOSPHORUS_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "phosphorus", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total polyunsaturated fat from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val POLYUNSATURATED_FAT_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "polyunsaturatedFat", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total potassium from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val POTASSIUM_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "potassium", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total protein from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val PROTEIN_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "protein", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total riboflavin from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val RIBOFLAVIN_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "riboflavin", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total saturated fat from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val SATURATED_FAT_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "saturatedFat", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total selenium from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val SELENIUM_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "selenium", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total sodium from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val SODIUM_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "sodium", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total sugar from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val SUGAR_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "sugar", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total thiamin from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val THIAMIN_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "thiamin", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total total carbohydrate from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val TOTAL_CARBOHYDRATE_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "totalCarbohydrate", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total total fat from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val TOTAL_FAT_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "totalFat", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total trans fat from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val TRANS_FAT_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "transFat", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total unsaturated fat from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val UNSATURATED_FAT_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "unsaturatedFat", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total vitamin a from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val VITAMIN_A_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "vitaminA", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total vitamin b12 from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val VITAMIN_B12_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "vitaminB12", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total vitamin b6 from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val VITAMIN_B6_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "vitaminB6", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total vitamin c from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val VITAMIN_C_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "vitaminC", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total vitamin d from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val VITAMIN_D_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "vitaminD", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total vitamin e from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val VITAMIN_E_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "vitaminE", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total vitamin k from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val VITAMIN_K_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "vitaminK", Mass::grams)
+
+        /**
+         * Metric identifier to retrieve the total zinc from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val ZINC_TOTAL: AggregateMetric<Mass> =
+            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "zinc", Mass::grams)
+    }
+}
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/OvulationTestRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/OvulationTestRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/OvulationTestRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/OvulationTestRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/OxygenSaturationRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/OxygenSaturationRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/OxygenSaturationRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/OxygenSaturationRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/PowerRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/PowerRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/PowerRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/PowerRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/Record.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/Record.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/Record.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/Record.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/RelationToMeal.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/RelationToMeal.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/RelationToMeal.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/RelationToMeal.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/RespiratoryRateRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/RespiratoryRateRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/RespiratoryRateRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/RespiratoryRateRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/RestingHeartRateRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/RestingHeartRateRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/RestingHeartRateRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/RestingHeartRateRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/SeriesRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/SeriesRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/SeriesRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/SeriesRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/SexualActivityRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/SexualActivityRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/SexualActivityRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/SexualActivityRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/SleepSessionRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/SleepSessionRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/SleepSessionRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/SleepSessionRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/SleepStageRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/SleepStageRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/SleepStageRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/SleepStageRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/SpeedRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/SpeedRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/SpeedRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/SpeedRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/StepsCadenceRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/StepsCadenceRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/StepsCadenceRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/StepsCadenceRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/StepsRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/StepsRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/StepsRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/StepsRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/SwimmingStrokesRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/SwimmingStrokesRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/SwimmingStrokesRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/SwimmingStrokesRecord.kt
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/TotalCaloriesBurnedRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/TotalCaloriesBurnedRecord.kt
new file mode 100644
index 0000000..19e9159
--- /dev/null
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/TotalCaloriesBurnedRecord.kt
@@ -0,0 +1,86 @@
+/*
+ * 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.records
+
+import androidx.health.connect.client.aggregate.AggregateMetric
+import androidx.health.connect.client.records.metadata.Metadata
+import androidx.health.connect.client.units.Energy
+import java.time.Instant
+import java.time.ZoneOffset
+
+/**
+ * Total energy burned by the user (in kilocalories), including active & basal energy burned (BMR).
+ * Each record represents the total kilocalories burned over a time interval.
+ */
+public class TotalCaloriesBurnedRecord(
+    /** Energy in [Energy] unit. Required field. Valid range: 0-1000000 kcal. */
+    public val energy: Energy,
+    override val startTime: Instant,
+    override val startZoneOffset: ZoneOffset?,
+    override val endTime: Instant,
+    override val endZoneOffset: ZoneOffset?,
+    override val metadata: Metadata = Metadata.EMPTY,
+) : IntervalRecord {
+
+    init {
+        energy.requireNotLess(other = energy.zero(), "energy")
+    }
+
+    /*
+     * Generated by the IDE: Code -> Generate -> "equals() and hashCode()".
+     */
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other !is TotalCaloriesBurnedRecord) return false
+
+        if (energy != other.energy) return false
+        if (startTime != other.startTime) return false
+        if (startZoneOffset != other.startZoneOffset) return false
+        if (endTime != other.endTime) return false
+        if (endZoneOffset != other.endZoneOffset) return false
+        if (metadata != other.metadata) return false
+
+        return true
+    }
+
+    /*
+     * Generated by the IDE: Code -> Generate -> "equals() and hashCode()".
+     */
+    override fun hashCode(): Int {
+        var result = energy.hashCode()
+        result = 31 * result + startTime.hashCode()
+        result = 31 * result + (startZoneOffset?.hashCode() ?: 0)
+        result = 31 * result + endTime.hashCode()
+        result = 31 * result + (endZoneOffset?.hashCode() ?: 0)
+        result = 31 * result + metadata.hashCode()
+        return result
+    }
+
+    companion object {
+        /**
+         * Metric identifier to retrieve total energy from
+         * [androidx.health.connect.client.aggregate.AggregationResult].
+         */
+        @JvmField
+        val ENERGY_TOTAL: AggregateMetric<Energy> =
+            AggregateMetric.doubleMetric(
+                dataTypeName = "TotalCaloriesBurned",
+                aggregationType = AggregateMetric.AggregationType.TOTAL,
+                fieldName = "energy",
+                mapper = Energy::kilocalories,
+            )
+    }
+}
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/Utils.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/Utils.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/Utils.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/Utils.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/Vo2MaxRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/Vo2MaxRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/Vo2MaxRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/Vo2MaxRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/WaistCircumferenceRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/WaistCircumferenceRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/WaistCircumferenceRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/WaistCircumferenceRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/WeightRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/WeightRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/WeightRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/WeightRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/WheelchairPushesRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/WheelchairPushesRecord.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/WheelchairPushesRecord.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/WheelchairPushesRecord.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/metadata/DataOrigin.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/metadata/DataOrigin.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/metadata/DataOrigin.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/metadata/DataOrigin.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/metadata/Device.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/metadata/Device.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/metadata/Device.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/metadata/Device.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/metadata/DeviceType.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/metadata/DeviceType.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/metadata/DeviceType.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/metadata/DeviceType.kt
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/metadata/Metadata.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/metadata/Metadata.kt
new file mode 100644
index 0000000..2861b86
--- /dev/null
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/metadata/Metadata.kt
@@ -0,0 +1,100 @@
+/*
+ * 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.health.connect.client.records.metadata
+
+import java.time.Instant
+import androidx.health.connect.client.records.Record
+
+/** Set of shared metadata fields for [Record]. */
+@SuppressWarnings("NewApi") // Temporary until we can enable java8 desugaring effectively.
+public class Metadata(
+    /**
+     * Unique identifier of this data, assigned by the Android Health Platform at insertion time.
+     * When [Record] is created before insertion, this takes a sentinel value, any assigned value
+     * will be ignored.
+     */
+    public val uid: String = EMPTY_UID,
+
+    /**
+     * Where the data comes from, such as application information originally generated this data.
+     * When [Record] is created before insertion, this contains a sentinel value, any assigned value
+     * will be ignored. After insertion, this will be populated with inserted application.
+     */
+    public val dataOrigin: DataOrigin = DataOrigin(""),
+
+    /**
+     * Automatically populated to when data was last modified (or originally created).
+     * When [Record] is created before inserted, this contains a sentinel value, any assigned value
+     * will be ignored.
+     */
+    public val lastModifiedTime: Instant = Instant.EPOCH,
+
+    /**
+     * Optional client supplied record unique data identifier associated with the data.
+     *
+     * There is guaranteed a single entry for any type of data with same client provided identifier
+     * for a given client. Any new insertions with the same client provided identifier will either
+     * replace or be ignored depending on associated [clientRecordVersion].
+     *
+     * @see clientRecordVersion
+     */
+    public val clientRecordId: String? = null,
+
+    /**
+     * Optional client supplied version associated with the data.
+     *
+     * This determines conflict resolution outcome when there are multiple insertions of the same
+     * [clientRecordId]. Data with the highest [clientRecordVersion] takes precedence.
+     * [clientRecordVersion] starts with 0.
+     *
+     * @see clientRecordId
+     */
+    public val clientRecordVersion: Long = 0,
+
+    /** Optional client supplied device information associated with the data. */
+    public val device: Device? = null,
+) {
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other !is Metadata) return false
+
+        if (uid != other.uid) return false
+        if (dataOrigin != other.dataOrigin) return false
+        if (lastModifiedTime != other.lastModifiedTime) return false
+        if (clientRecordId != other.clientRecordId) return false
+        if (clientRecordVersion != other.clientRecordVersion) return false
+        if (device != other.device) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = uid.hashCode()
+        result = 31 * result + dataOrigin.hashCode()
+        result = 31 * result + lastModifiedTime.hashCode()
+        result = 31 * result + (clientRecordId?.hashCode() ?: 0)
+        result = 31 * result + clientRecordVersion.hashCode()
+        result = 31 * result + (device?.hashCode() ?: 0)
+        return result
+    }
+
+    internal companion object {
+        internal const val EMPTY_UID: String = ""
+
+        /** A default instance of metadata with no fields initialised. */
+        @JvmField internal val EMPTY = Metadata()
+    }
+}
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/metadata/package-info.java b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/metadata/package-info.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/metadata/package-info.java
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/metadata/package-info.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/package-info.java b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/package-info.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/records/package-info.java
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/records/package-info.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/request/AggregateGroupByDurationRequest.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/request/AggregateGroupByDurationRequest.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/request/AggregateGroupByDurationRequest.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/request/AggregateGroupByDurationRequest.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/request/AggregateGroupByPeriodRequest.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/request/AggregateGroupByPeriodRequest.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/request/AggregateGroupByPeriodRequest.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/request/AggregateGroupByPeriodRequest.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/request/AggregateRequest.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/request/AggregateRequest.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/request/AggregateRequest.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/request/AggregateRequest.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/request/ChangesTokenRequest.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/request/ChangesTokenRequest.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/request/ChangesTokenRequest.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/request/ChangesTokenRequest.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/request/ReadRecordsRequest.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/request/ReadRecordsRequest.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/request/ReadRecordsRequest.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/request/ReadRecordsRequest.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/response/ChangesResponse.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/response/ChangesResponse.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/response/ChangesResponse.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/response/ChangesResponse.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/response/InsertRecordsResponse.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/response/InsertRecordsResponse.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/response/InsertRecordsResponse.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/response/InsertRecordsResponse.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/response/ReadRecordResponse.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/response/ReadRecordResponse.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/response/ReadRecordResponse.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/response/ReadRecordResponse.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/response/ReadRecordsResponse.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/response/ReadRecordsResponse.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/response/ReadRecordsResponse.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/response/ReadRecordsResponse.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/time/TimeRangeFilter.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/time/TimeRangeFilter.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/time/TimeRangeFilter.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/time/TimeRangeFilter.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/units/Energy.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/units/Energy.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/units/Energy.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/units/Energy.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/units/Length.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/units/Length.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/units/Length.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/units/Length.kt
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/units/Mass.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/units/Mass.kt
new file mode 100644
index 0000000..babdd20
--- /dev/null
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/units/Mass.kt
@@ -0,0 +1,265 @@
+/*
+ * 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.health.connect.client.units
+
+/**
+ * Represents a unit of mass. Supported units:
+ *
+ * - grams - see [Mass.grams], [Double.grams]
+ * - kilograms - see [Mass.kilograms], [Double.kilograms]
+ * - milligrams - see [Mass.milligrams], [Double.milligrams]
+ * - micrograms - see [Mass.micrograms], [Double.micrograms]
+ * - ounces - see [Mass.ounces], [Double.ounces]
+ * - pounds - see [Mass.pounds], [Double.pounds]
+ */
+class Mass private constructor(
+    private val value: Double,
+    private val type: Type,
+) : Comparable<Mass> {
+
+    /** Returns the mass in grams. */
+    @get:JvmName("getGrams")
+    val inGrams: Double
+        get() = value * type.gramsPerUnit
+
+    /** Returns the mass in kilograms. */
+    @get:JvmName("getKilograms")
+    val inKilograms: Double
+        get() = get(type = Type.KILOGRAMS)
+
+    /** Returns the mass in milligrams. */
+    @get:JvmName("getMilligrams")
+    val inMilligrams: Double
+        get() = get(type = Type.MILLIGRAMS)
+
+    /** Returns the mass in micrograms. */
+    @get:JvmName("getMicrograms")
+    val inMicrograms: Double
+        get() = get(type = Type.MICROGRAMS)
+
+    /** Returns the mass in ounces. */
+    @get:JvmName("getOunces")
+    val inOunces: Double
+        get() = get(type = Type.OUNCES)
+
+    /** Returns the mass in pounds. */
+    @get:JvmName("getPounds")
+    val inPounds: Double
+        get() = get(type = Type.POUNDS)
+
+    private fun get(type: Type): Double =
+        if (this.type == type) value else inGrams / type.gramsPerUnit
+
+    /** Returns zero [Mass] of the same [Type]. */
+    internal fun zero(): Mass = ZEROS.getValue(type)
+
+    override fun compareTo(other: Mass): Int =
+        if (type == other.type) {
+            value.compareTo(other.value)
+        } else {
+            inGrams.compareTo(other.inGrams)
+        }
+
+    /*
+     * Generated by the IDE: Code -> Generate -> "equals() and hashCode()".
+     */
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other !is Mass) return false
+
+        if (value != other.value) return false
+        if (type != other.type) return false
+
+        return true
+    }
+
+    /*
+     * Generated by the IDE: Code -> Generate -> "equals() and hashCode()".
+     */
+    override fun hashCode(): Int {
+        var result = value.hashCode()
+        result = 31 * result + type.hashCode()
+        return result
+    }
+
+    override fun toString(): String = "$value ${type.name.lowercase()}"
+
+    companion object {
+        private val ZEROS = Type.values().associateWith { Mass(value = 0.0, type = it) }
+
+        /** Creates [Mass] with the specified value in grams. */
+        @JvmStatic fun grams(value: Double): Mass = Mass(value, Type.GRAMS)
+
+        /** Creates [Mass] with the specified value in kilograms. */
+        @JvmStatic fun kilograms(value: Double): Mass = Mass(value, Type.KILOGRAMS)
+
+        /** Creates [Mass] with the specified value in milligrams. */
+        @JvmStatic fun milligrams(value: Double): Mass = Mass(value, Type.MILLIGRAMS)
+
+        /** Creates [Mass] with the specified value in micrograms. */
+        @JvmStatic fun micrograms(value: Double): Mass = Mass(value, Type.MICROGRAMS)
+
+        /** Creates [Mass] with the specified value in ounces. */
+        @JvmStatic fun ounces(value: Double): Mass = Mass(value, Type.OUNCES)
+
+        /** Creates [Mass] with the specified value in pounds. */
+        @JvmStatic fun pounds(value: Double): Mass = Mass(value, Type.POUNDS)
+    }
+
+    private enum class Type {
+        GRAMS {
+            override val gramsPerUnit: Double = 1.0
+        },
+        KILOGRAMS {
+            override val gramsPerUnit: Double = 1000.0
+        },
+        MILLIGRAMS {
+            override val gramsPerUnit: Double = 0.001
+        },
+        MICROGRAMS {
+            override val gramsPerUnit: Double = 0.000001
+        },
+        OUNCES {
+            override val gramsPerUnit: Double = 28.34952
+        },
+        POUNDS {
+            override val gramsPerUnit: Double = 453.59237
+        };
+
+        abstract val gramsPerUnit: Double
+    }
+}
+
+/** Creates [Mass] with the specified value in grams. */
+@get:JvmSynthetic
+val Double.grams: Mass
+    get() = Mass.grams(value = this)
+
+/** Creates [Mass] with the specified value in grams. */
+@get:JvmSynthetic
+val Float.grams: Mass
+    get() = toDouble().grams
+
+/** Creates [Mass] with the specified value in grams. */
+@get:JvmSynthetic
+val Long.grams: Mass
+    get() = toDouble().grams
+
+/** Creates [Mass] with the specified value in grams. */
+@get:JvmSynthetic
+val Int.grams: Mass
+    get() = toDouble().grams
+
+/** Creates [Mass] with the specified value in kilograms. */
+@get:JvmSynthetic
+val Double.kilograms: Mass
+    get() = Mass.kilograms(value = this)
+
+/** Creates [Mass] with the specified value in kilograms. */
+@get:JvmSynthetic
+val Float.kilograms: Mass
+    get() = toDouble().kilograms
+
+/** Creates [Mass] with the specified value in kilograms. */
+@get:JvmSynthetic
+val Long.kilograms: Mass
+    get() = toDouble().kilograms
+
+/** Creates [Mass] with the specified value in kilograms. */
+@get:JvmSynthetic
+val Int.kilograms: Mass
+    get() = toDouble().kilograms
+
+/** Creates [Mass] with the specified value in milligrams. */
+@get:JvmSynthetic
+val Double.milligrams: Mass
+    get() = Mass.milligrams(value = this)
+
+/** Creates [Mass] with the specified value in milligrams. */
+@get:JvmSynthetic
+val Float.milligrams: Mass
+    get() = toDouble().milligrams
+
+/** Creates [Mass] with the specified value in milligrams. */
+@get:JvmSynthetic
+val Long.milligrams: Mass
+    get() = toDouble().milligrams
+
+/** Creates [Mass] with the specified value in milligrams. */
+@get:JvmSynthetic
+val Int.milligrams: Mass
+    get() = toDouble().milligrams
+
+/** Creates [Mass] with the specified value in micrograms. */
+@get:JvmSynthetic
+val Double.micrograms: Mass
+    get() = Mass.micrograms(value = this)
+
+/** Creates [Mass] with the specified value in micrograms. */
+@get:JvmSynthetic
+val Float.micrograms: Mass
+    get() = toDouble().micrograms
+
+/** Creates [Mass] with the specified value in micrograms. */
+@get:JvmSynthetic
+val Long.micrograms: Mass
+    get() = toDouble().micrograms
+
+/** Creates [Mass] with the specified value in micrograms. */
+@get:JvmSynthetic
+val Int.micrograms: Mass
+    get() = toDouble().micrograms
+
+/** Creates [Mass] with the specified value in ounces. */
+@get:JvmSynthetic
+val Double.ounces: Mass
+    get() = Mass.ounces(value = this)
+
+/** Creates [Mass] with the specified value in ounces. */
+@get:JvmSynthetic
+val Float.ounces: Mass
+    get() = toDouble().ounces
+
+/** Creates [Mass] with the specified value in ounces. */
+@get:JvmSynthetic
+val Long.ounces: Mass
+    get() = toDouble().ounces
+
+/** Creates [Mass] with the specified value in ounces. */
+@get:JvmSynthetic
+val Int.ounces: Mass
+    get() = toDouble().ounces
+
+/** Creates [Mass] with the specified value in pounds. */
+@get:JvmSynthetic
+val Double.pounds: Mass
+    get() = Mass.pounds(value = this)
+
+/** Creates [Mass] with the specified value in pounds. */
+@get:JvmSynthetic
+val Float.pounds: Mass
+    get() = toDouble().pounds
+
+/** Creates [Mass] with the specified value in pounds. */
+@get:JvmSynthetic
+val Long.pounds: Mass
+    get() = toDouble().pounds
+
+/** Creates [Mass] with the specified value in pounds. */
+@get:JvmSynthetic
+val Int.pounds: Mass
+    get() = toDouble().pounds
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/units/Percentage.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/units/Percentage.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/units/Percentage.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/units/Percentage.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/units/Power.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/units/Power.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/units/Power.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/units/Power.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/units/Pressure.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/units/Pressure.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/units/Pressure.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/units/Pressure.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/units/Temperature.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/units/Temperature.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/units/Temperature.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/units/Temperature.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/units/Velocity.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/units/Velocity.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/units/Velocity.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/units/Velocity.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/units/Volume.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/units/Volume.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/connect/client/units/Volume.kt
rename to health/connect/connect-client/src/main/java/androidx/health/connect/client/units/Volume.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/HealthDataAsyncClient.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/HealthDataAsyncClient.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/HealthDataAsyncClient.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/HealthDataAsyncClient.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/HealthDataService.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/HealthDataService.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/HealthDataService.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/HealthDataService.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/SdkConfig.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/SdkConfig.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/SdkConfig.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/SdkConfig.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/changes/ChangesEvent.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/changes/ChangesEvent.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/changes/ChangesEvent.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/changes/ChangesEvent.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/error/ErrorCode.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/error/ErrorCode.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/error/ErrorCode.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/error/ErrorCode.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/error/ErrorStatus.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/error/ErrorStatus.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/error/ErrorStatus.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/error/ErrorStatus.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/AggregateDataCallback.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/AggregateDataCallback.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/AggregateDataCallback.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/AggregateDataCallback.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ClearOnChangesListenerCallback.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ClearOnChangesListenerCallback.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ClearOnChangesListenerCallback.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ClearOnChangesListenerCallback.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/DeleteDataCallback.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/DeleteDataCallback.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/DeleteDataCallback.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/DeleteDataCallback.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/DeleteDataRangeCallback.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/DeleteDataRangeCallback.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/DeleteDataRangeCallback.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/DeleteDataRangeCallback.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/GetChangesCallback.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/GetChangesCallback.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/GetChangesCallback.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/GetChangesCallback.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/GetChangesTokenCallback.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/GetChangesTokenCallback.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/GetChangesTokenCallback.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/GetChangesTokenCallback.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/GetGrantedPermissionsCallback.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/GetGrantedPermissionsCallback.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/GetGrantedPermissionsCallback.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/GetGrantedPermissionsCallback.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/InsertDataCallback.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/InsertDataCallback.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/InsertDataCallback.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/InsertDataCallback.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/OnChangesListenerProxy.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/OnChangesListenerProxy.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/OnChangesListenerProxy.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/OnChangesListenerProxy.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ReadDataCallback.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ReadDataCallback.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ReadDataCallback.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ReadDataCallback.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ReadDataRangeCallback.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ReadDataRangeCallback.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ReadDataRangeCallback.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ReadDataRangeCallback.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/RevokeAllPermissionsCallback.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/RevokeAllPermissionsCallback.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/RevokeAllPermissionsCallback.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/RevokeAllPermissionsCallback.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ServiceBackedHealthDataClient.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ServiceBackedHealthDataClient.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ServiceBackedHealthDataClient.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ServiceBackedHealthDataClient.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/SetOnChangesListenerCallback.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/SetOnChangesListenerCallback.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/SetOnChangesListenerCallback.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/SetOnChangesListenerCallback.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/UpdateDataCallback.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/UpdateDataCallback.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/UpdateDataCallback.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/UpdateDataCallback.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/data/ProtoData.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/data/ProtoData.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/data/ProtoData.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/data/ProtoData.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/data/ProtoParcelable.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/data/ProtoParcelable.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/data/ProtoParcelable.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/data/ProtoParcelable.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/data/SharedMemory27Impl.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/data/SharedMemory27Impl.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/data/SharedMemory27Impl.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/data/SharedMemory27Impl.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/data/package-info.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/data/package-info.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/data/package-info.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/data/package-info.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/error/ErrorStatusConverter.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/error/ErrorStatusConverter.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/error/ErrorStatusConverter.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/error/ErrorStatusConverter.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/error/package-info.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/error/package-info.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/error/package-info.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/error/package-info.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/internal/ProviderConnectionManager.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/internal/ProviderConnectionManager.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/internal/ProviderConnectionManager.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/internal/ProviderConnectionManager.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/ApiVersionException.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/ApiVersionException.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/ApiVersionException.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/ApiVersionException.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/Client.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/Client.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/Client.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/Client.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/ClientConfiguration.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/ClientConfiguration.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/ClientConfiguration.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/ClientConfiguration.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/RemoteFutureOperation.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/RemoteFutureOperation.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/RemoteFutureOperation.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/RemoteFutureOperation.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/RemoteOperation.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/RemoteOperation.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/RemoteOperation.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/RemoteOperation.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/ServiceOperation.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/ServiceOperation.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/ServiceOperation.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/ServiceOperation.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/BaseQueueOperation.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/BaseQueueOperation.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/BaseQueueOperation.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/BaseQueueOperation.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/ConnectionConfiguration.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/ConnectionConfiguration.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/ConnectionConfiguration.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/ConnectionConfiguration.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/ConnectionManager.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/ConnectionManager.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/ConnectionManager.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/ConnectionManager.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/DefaultExecutionTracker.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/DefaultExecutionTracker.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/DefaultExecutionTracker.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/DefaultExecutionTracker.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/ExecutionTracker.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/ExecutionTracker.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/ExecutionTracker.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/ExecutionTracker.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/ListenerKey.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/ListenerKey.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/ListenerKey.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/ListenerKey.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/QueueOperation.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/QueueOperation.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/QueueOperation.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/QueueOperation.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/ServiceConnection.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/ServiceConnection.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/ServiceConnection.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/ServiceConnection.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/package-info.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/package-info.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/package-info.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/ipc/package-info.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/logger/Logger.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/logger/Logger.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/logger/Logger.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/logger/Logger.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/package-info.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/package-info.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/package-info.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/package-info.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/permission/foregroundstate/ForegroundStateChecker.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/permission/foregroundstate/ForegroundStateChecker.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/permission/foregroundstate/ForegroundStateChecker.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/permission/foregroundstate/ForegroundStateChecker.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/permission/foregroundstate/package-info.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/permission/foregroundstate/package-info.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/permission/foregroundstate/package-info.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/permission/foregroundstate/package-info.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/permission/token/PermissionTokenManager.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/permission/token/PermissionTokenManager.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/permission/token/PermissionTokenManager.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/permission/token/PermissionTokenManager.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/permission/token/package-info.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/permission/token/package-info.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/permission/token/package-info.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/permission/token/package-info.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/sdkservice/HealthDataSdkService.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/sdkservice/HealthDataSdkService.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/sdkservice/HealthDataSdkService.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/sdkservice/HealthDataSdkService.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/sdkservice/HealthDataSdkServiceStubImpl.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/sdkservice/HealthDataSdkServiceStubImpl.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/sdkservice/HealthDataSdkServiceStubImpl.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/sdkservice/HealthDataSdkServiceStubImpl.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/sdkservice/package-info.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/sdkservice/package-info.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/impl/sdkservice/package-info.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/impl/sdkservice/package-info.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/package-info.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/package-info.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/package-info.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/package-info.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/permission/Permission.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/permission/Permission.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/permission/Permission.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/permission/Permission.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/permission/package-info.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/permission/package-info.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/permission/package-info.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/permission/package-info.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/proto/package-info.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/proto/package-info.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/proto/package-info.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/proto/package-info.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/request/AggregateDataRequest.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/request/AggregateDataRequest.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/request/AggregateDataRequest.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/request/AggregateDataRequest.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/request/DeleteDataRangeRequest.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/request/DeleteDataRangeRequest.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/request/DeleteDataRangeRequest.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/request/DeleteDataRangeRequest.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/request/DeleteDataRequest.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/request/DeleteDataRequest.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/request/DeleteDataRequest.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/request/DeleteDataRequest.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/request/GetChangesRequest.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/request/GetChangesRequest.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/request/GetChangesRequest.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/request/GetChangesRequest.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/request/GetChangesTokenRequest.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/request/GetChangesTokenRequest.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/request/GetChangesTokenRequest.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/request/GetChangesTokenRequest.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/request/ReadDataRangeRequest.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/request/ReadDataRangeRequest.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/request/ReadDataRangeRequest.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/request/ReadDataRangeRequest.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/request/ReadDataRequest.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/request/ReadDataRequest.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/request/ReadDataRequest.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/request/ReadDataRequest.kt
diff --git a/health/connect/connect-client/src/main/java/androidx/health/platform/client/request/RegisterForDataNotificationsRequest.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/request/RegisterForDataNotificationsRequest.kt
new file mode 100644
index 0000000..1624b3d
--- /dev/null
+++ b/health/connect/connect-client/src/main/java/androidx/health/platform/client/request/RegisterForDataNotificationsRequest.kt
@@ -0,0 +1,36 @@
+/*
+ * 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.health.platform.client.request
+
+import android.os.Parcelable
+import androidx.health.platform.client.impl.data.ProtoParcelable
+import androidx.health.platform.client.proto.RequestProto
+
+class RegisterForDataNotificationsRequest(
+    override val proto: RequestProto.RegisterForDataNotificationsRequest
+) : ProtoParcelable<RequestProto.RegisterForDataNotificationsRequest>() {
+
+    companion object {
+        @JvmField
+        val CREATOR: Parcelable.Creator<RegisterForDataNotificationsRequest> =
+            newCreator {
+                RegisterForDataNotificationsRequest(
+                    RequestProto.RegisterForDataNotificationsRequest.parseFrom(it)
+                )
+            }
+    }
+}
\ No newline at end of file
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/request/RequestContext.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/request/RequestContext.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/request/RequestContext.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/request/RequestContext.kt
diff --git a/health/connect/connect-client/src/main/java/androidx/health/platform/client/request/UnregisterFromDataNotificationsRequest.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/request/UnregisterFromDataNotificationsRequest.kt
new file mode 100644
index 0000000..f0bcc07
--- /dev/null
+++ b/health/connect/connect-client/src/main/java/androidx/health/platform/client/request/UnregisterFromDataNotificationsRequest.kt
@@ -0,0 +1,36 @@
+/*
+ * 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.health.platform.client.request
+
+import android.os.Parcelable
+import androidx.health.platform.client.impl.data.ProtoParcelable
+import androidx.health.platform.client.proto.RequestProto
+
+class UnregisterFromDataNotificationsRequest(
+    override val proto: RequestProto.UnregisterFromDataNotificationsRequest
+) : ProtoParcelable<RequestProto.UnregisterFromDataNotificationsRequest>() {
+
+    companion object {
+        @JvmField
+        val CREATOR: Parcelable.Creator<UnregisterFromDataNotificationsRequest> =
+            newCreator {
+                UnregisterFromDataNotificationsRequest(
+                    RequestProto.UnregisterFromDataNotificationsRequest.parseFrom(it)
+                )
+            }
+    }
+}
\ No newline at end of file
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/request/UpsertDataRequest.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/request/UpsertDataRequest.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/request/UpsertDataRequest.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/request/UpsertDataRequest.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/request/package-info.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/request/package-info.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/request/package-info.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/request/package-info.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/response/AggregateDataResponse.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/response/AggregateDataResponse.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/response/AggregateDataResponse.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/response/AggregateDataResponse.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/response/GetChangesResponse.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/response/GetChangesResponse.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/response/GetChangesResponse.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/response/GetChangesResponse.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/response/GetChangesTokenResponse.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/response/GetChangesTokenResponse.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/response/GetChangesTokenResponse.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/response/GetChangesTokenResponse.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/response/InsertDataResponse.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/response/InsertDataResponse.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/response/InsertDataResponse.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/response/InsertDataResponse.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/response/ReadDataRangeResponse.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/response/ReadDataRangeResponse.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/response/ReadDataRangeResponse.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/response/ReadDataRangeResponse.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/response/ReadDataResponse.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/response/ReadDataResponse.kt
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/response/ReadDataResponse.kt
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/response/ReadDataResponse.kt
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/response/package-info.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/response/package-info.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/response/package-info.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/response/package-info.java
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/service/HealthDataServiceConstants.java b/health/connect/connect-client/src/main/java/androidx/health/platform/client/service/HealthDataServiceConstants.java
similarity index 100%
rename from health/health-connect-client/src/main/java/androidx/health/platform/client/service/HealthDataServiceConstants.java
rename to health/connect/connect-client/src/main/java/androidx/health/platform/client/service/HealthDataServiceConstants.java
diff --git a/health/health-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
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/connect/client/HealthConnectClientTest.kt
rename to health/connect/connect-client/src/test/java/androidx/health/connect/client/HealthConnectClientTest.kt
diff --git a/health/health-connect-client/src/test/java/androidx/health/connect/client/aggregate/AggregationResultGroupedByPeriodTest.kt b/health/connect/connect-client/src/test/java/androidx/health/connect/client/aggregate/AggregationResultGroupedByPeriodTest.kt
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/connect/client/aggregate/AggregationResultGroupedByPeriodTest.kt
rename to health/connect/connect-client/src/test/java/androidx/health/connect/client/aggregate/AggregationResultGroupedByPeriodTest.kt
diff --git a/health/health-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
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/connect/client/impl/HealthConnectClientImplTest.kt
rename to health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/HealthConnectClientImplTest.kt
diff --git a/health/health-connect-client/src/test/java/androidx/health/connect/client/impl/converters/aggregate/AggregateMetricConverterTest.kt b/health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/converters/aggregate/AggregateMetricConverterTest.kt
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/connect/client/impl/converters/aggregate/AggregateMetricConverterTest.kt
rename to health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/converters/aggregate/AggregateMetricConverterTest.kt
diff --git a/health/health-connect-client/src/test/java/androidx/health/connect/client/impl/converters/aggregate/AggregationResultConverterTest.kt b/health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/converters/aggregate/AggregationResultConverterTest.kt
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/connect/client/impl/converters/aggregate/AggregationResultConverterTest.kt
rename to health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/converters/aggregate/AggregationResultConverterTest.kt
diff --git a/health/health-connect-client/src/test/java/androidx/health/connect/client/impl/converters/datatype/RecordsTypeNameMapTest.kt b/health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/converters/datatype/RecordsTypeNameMapTest.kt
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/connect/client/impl/converters/datatype/RecordsTypeNameMapTest.kt
rename to health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/converters/datatype/RecordsTypeNameMapTest.kt
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
new file mode 100644
index 0000000..2e63899
--- /dev/null
+++ b/health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/converters/records/AllRecordsConverterTest.kt
@@ -0,0 +1,1005 @@
+/*
+ * 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.impl.converters.records
+
+import androidx.health.connect.client.impl.converters.datatype.toDataTypeName
+import androidx.health.connect.client.records.ActiveCaloriesBurnedRecord
+import androidx.health.connect.client.records.BasalBodyTemperatureRecord
+import androidx.health.connect.client.records.BasalMetabolicRateRecord
+import androidx.health.connect.client.records.BloodGlucoseRecord
+import androidx.health.connect.client.records.BloodPressureRecord
+import androidx.health.connect.client.records.BodyFatRecord
+import androidx.health.connect.client.records.BodyTemperatureMeasurementLocation
+import androidx.health.connect.client.records.BodyTemperatureRecord
+import androidx.health.connect.client.records.BodyWaterMassRecord
+import androidx.health.connect.client.records.BoneMassRecord
+import androidx.health.connect.client.records.CervicalMucusRecord
+import androidx.health.connect.client.records.CervicalMucusRecord.Appearance
+import androidx.health.connect.client.records.CervicalMucusRecord.Sensation
+import androidx.health.connect.client.records.CyclingPedalingCadenceRecord
+import androidx.health.connect.client.records.DistanceRecord
+import androidx.health.connect.client.records.ElevationGainedRecord
+import androidx.health.connect.client.records.ExerciseEventRecord
+import androidx.health.connect.client.records.ExerciseEventRecord.EventType
+import androidx.health.connect.client.records.ExerciseLapRecord
+import androidx.health.connect.client.records.ExerciseRepetitionsRecord
+import androidx.health.connect.client.records.ExerciseSessionRecord
+import androidx.health.connect.client.records.ExerciseSessionRecord.ExerciseType
+import androidx.health.connect.client.records.FloorsClimbedRecord
+import androidx.health.connect.client.records.HeartRateRecord
+import androidx.health.connect.client.records.HeartRateVariabilityDifferentialIndexRecord
+import androidx.health.connect.client.records.HeartRateVariabilityRmssdRecord
+import androidx.health.connect.client.records.HeartRateVariabilitySRecord
+import androidx.health.connect.client.records.HeartRateVariabilitySd2Record
+import androidx.health.connect.client.records.HeartRateVariabilitySdannRecord
+import androidx.health.connect.client.records.HeartRateVariabilitySdnnIndexRecord
+import androidx.health.connect.client.records.HeartRateVariabilitySdnnRecord
+import androidx.health.connect.client.records.HeartRateVariabilitySdsdRecord
+import androidx.health.connect.client.records.HeartRateVariabilityTinnRecord
+import androidx.health.connect.client.records.HeightRecord
+import androidx.health.connect.client.records.HipCircumferenceRecord
+import androidx.health.connect.client.records.HydrationRecord
+import androidx.health.connect.client.records.LeanBodyMassRecord
+import androidx.health.connect.client.records.MenstruationFlowRecord
+import androidx.health.connect.client.records.MenstruationFlowRecord.Flow
+import androidx.health.connect.client.records.NutritionRecord
+import androidx.health.connect.client.records.OvulationTestRecord
+import androidx.health.connect.client.records.OvulationTestRecord.Result
+import androidx.health.connect.client.records.OxygenSaturationRecord
+import androidx.health.connect.client.records.PowerRecord
+import androidx.health.connect.client.records.Record
+import androidx.health.connect.client.records.RespiratoryRateRecord
+import androidx.health.connect.client.records.RestingHeartRateRecord
+import androidx.health.connect.client.records.SexualActivityRecord
+import androidx.health.connect.client.records.SleepSessionRecord
+import androidx.health.connect.client.records.SleepStageRecord
+import androidx.health.connect.client.records.SleepStageRecord.StageType
+import androidx.health.connect.client.records.SpeedRecord
+import androidx.health.connect.client.records.StepsCadenceRecord
+import androidx.health.connect.client.records.StepsRecord
+import androidx.health.connect.client.records.SwimmingStrokesRecord
+import androidx.health.connect.client.records.SwimmingStrokesRecord.SwimmingType
+import androidx.health.connect.client.records.TotalCaloriesBurnedRecord
+import androidx.health.connect.client.records.Vo2MaxRecord
+import androidx.health.connect.client.records.WaistCircumferenceRecord
+import androidx.health.connect.client.records.WeightRecord
+import androidx.health.connect.client.records.WheelchairPushesRecord
+import androidx.health.connect.client.records.metadata.DataOrigin
+import androidx.health.connect.client.records.metadata.Device
+import androidx.health.connect.client.records.metadata.Metadata
+import androidx.health.connect.client.units.celsius
+import androidx.health.connect.client.units.grams
+import androidx.health.connect.client.units.kilocalories
+import androidx.health.connect.client.units.kilocaloriesPerDay
+import androidx.health.connect.client.units.kilograms
+import androidx.health.connect.client.units.liters
+import androidx.health.connect.client.units.meters
+import androidx.health.connect.client.units.metersPerSecond
+import androidx.health.connect.client.units.millimetersOfMercury
+import androidx.health.connect.client.units.percent
+import androidx.health.connect.client.units.watts
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.google.common.truth.Truth.assertThat
+import java.time.Instant
+import java.time.ZoneOffset
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SuppressWarnings("GoodTime") // Safe to use in test
+private val START_TIME = Instant.ofEpochMilli(1234L)
+@SuppressWarnings("GoodTime") // Safe to use in test
+private val END_TIME = Instant.ofEpochMilli(5678L)
+@SuppressWarnings("GoodTime") // Safe to use in test
+private val START_ZONE_OFFSET = ZoneOffset.ofHours(1)
+@SuppressWarnings("GoodTime") // Safe to use in test
+private val END_ZONE_OFFSET = ZoneOffset.ofHours(2)
+private val TEST_METADATA =
+    Metadata(
+        uid = "uid",
+        clientRecordId = "clientId",
+        clientRecordVersion = 10,
+        device = Device(manufacturer = "manufacturer"),
+        lastModifiedTime = END_TIME,
+        dataOrigin = DataOrigin(packageName = "appId")
+    )
+
+// TODO(b/228314623): add tests which set optional fields
+@RunWith(AndroidJUnit4::class)
+class AllRecordsConverterTest {
+    @Test
+    fun testBasalBodyTemperature() {
+        val dataOnlyRequired =
+            BasalBodyTemperatureRecord(
+                temperature = 1.celsius,
+                measurementLocation = null,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        val dataAllFields =
+            BasalBodyTemperatureRecord(
+                temperature = 1.celsius,
+                measurementLocation = BodyTemperatureMeasurementLocation.ARMPIT,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(dataOnlyRequired)
+        assertThat(toRecord(dataOnlyRequired.toProto())).isEqualTo(dataOnlyRequired)
+        assertThat(toRecord(dataAllFields.toProto())).isEqualTo(dataAllFields)
+    }
+
+    @Test
+    fun testBasalMetabolicRate() {
+        val data =
+            BasalMetabolicRateRecord(
+                basalMetabolicRate = 1.kilocaloriesPerDay,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testBloodGlucose() {
+        val data =
+            BloodGlucoseRecord(
+                levelMillimolesPerLiter = 1.0,
+                specimenSource = null,
+                mealType = null,
+                relationToMeal = null,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testBloodPressure() {
+        val data =
+            BloodPressureRecord(
+                systolic = 20.millimetersOfMercury,
+                diastolic = 10.millimetersOfMercury,
+                bodyPosition = null,
+                measurementLocation = null,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testBodyFat() {
+        val data =
+            BodyFatRecord(
+                percentage = 1.percent,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testBodyTemperature() {
+        val data =
+            BodyTemperatureRecord(
+                temperature = 1.celsius,
+                measurementLocation = null,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testBodyWaterMass() {
+        val data =
+            BodyWaterMassRecord(
+                mass = 1.kilograms,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testBoneMass() {
+        val data =
+            BoneMassRecord(
+                mass = 1.kilograms,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testCervicalMucus() {
+        val data =
+            CervicalMucusRecord(
+                appearance = Appearance.CLEAR,
+                sensation = Sensation.HEAVY,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testCyclingPedalingCadenceSeries() {
+        val data =
+            CyclingPedalingCadenceRecord(
+                startTime = START_TIME,
+                startZoneOffset = START_ZONE_OFFSET,
+                endTime = END_TIME,
+                endZoneOffset = END_ZONE_OFFSET,
+                samples =
+                    listOf(
+                        CyclingPedalingCadenceRecord.Sample(
+                            time = START_TIME,
+                            revolutionsPerMinute = 1.0,
+                        ),
+                        CyclingPedalingCadenceRecord.Sample(
+                            time = START_TIME,
+                            revolutionsPerMinute = 2.0,
+                        ),
+                    ),
+                metadata = TEST_METADATA,
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testHeartRateSeries() {
+        val data =
+            HeartRateRecord(
+                startTime = START_TIME,
+                startZoneOffset = START_ZONE_OFFSET,
+                endTime = END_TIME,
+                endZoneOffset = END_ZONE_OFFSET,
+                samples =
+                    listOf(
+                        HeartRateRecord.Sample(
+                            time = START_TIME,
+                            beatsPerMinute = 100L,
+                        ),
+                        HeartRateRecord.Sample(
+                            time = START_TIME,
+                            beatsPerMinute = 110L,
+                        ),
+                        HeartRateRecord.Sample(
+                            time = START_TIME,
+                            beatsPerMinute = 120L,
+                        ),
+                    ),
+                metadata = TEST_METADATA,
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testHeight() {
+        val data =
+            HeightRecord(
+                height = 1.meters,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testHipCircumference() {
+        val data =
+            HipCircumferenceRecord(
+                circumference = 1.meters,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testHeartRateVariabilityDifferentialIndex() {
+        val data =
+            HeartRateVariabilityDifferentialIndexRecord(
+                heartRateVariabilityMillis = 1.0,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testHeartRateVariabilityRmssd() {
+        val data =
+            HeartRateVariabilityRmssdRecord(
+                heartRateVariabilityMillis = 1.0,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testHeartRateVariabilityS() {
+        val data =
+            HeartRateVariabilitySRecord(
+                heartRateVariabilityMillis = 1.0,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testHeartRateVariabilitySd2() {
+        val data =
+            HeartRateVariabilitySd2Record(
+                heartRateVariabilityMillis = 1.0,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testHeartRateVariabilitySdann() {
+        val data =
+            HeartRateVariabilitySdannRecord(
+                heartRateVariabilityMillis = 1.0,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testHeartRateVariabilitySdnnIndex() {
+        val data =
+            HeartRateVariabilitySdnnIndexRecord(
+                heartRateVariabilityMillis = 1.0,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testHeartRateVariabilitySdnn() {
+        val data =
+            HeartRateVariabilitySdnnRecord(
+                heartRateVariabilityMillis = 1.0,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testHeartRateVariabilitySdsd() {
+        val data =
+            HeartRateVariabilitySdsdRecord(
+                heartRateVariabilityMillis = 1.0,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testHeartRateVariabilityTinn() {
+        val data =
+            HeartRateVariabilityTinnRecord(
+                heartRateVariabilityMillis = 1.0,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testLeanBodyMass() {
+        val data =
+            LeanBodyMassRecord(
+                mass = 1.kilograms,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testMenstruation() {
+        val data =
+            MenstruationFlowRecord(
+                flow = Flow.HEAVY,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testOvulationTest() {
+        val data =
+            OvulationTestRecord(
+                result = Result.NEGATIVE,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testOxygenSaturation() {
+        val data =
+            OxygenSaturationRecord(
+                percentage = 1.percent,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testPowerSeries() {
+        val data =
+            PowerRecord(
+                startTime = START_TIME,
+                startZoneOffset = START_ZONE_OFFSET,
+                endTime = END_TIME,
+                endZoneOffset = END_ZONE_OFFSET,
+                samples =
+                    listOf(
+                        PowerRecord.Sample(
+                            time = START_TIME,
+                            power = 1.watts,
+                        ),
+                        PowerRecord.Sample(
+                            time = START_TIME,
+                            power = 2.watts,
+                        ),
+                    ),
+                metadata = TEST_METADATA,
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testRespiratoryRate() {
+        val data =
+            RespiratoryRateRecord(
+                rate = 1.0,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testRestingHeartRate() {
+        val data =
+            RestingHeartRateRecord(
+                beatsPerMinute = 1,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testSexualActivity() {
+        val data =
+            SexualActivityRecord(
+                protectionUsed = null,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testSpeedSeries() {
+        val data =
+            SpeedRecord(
+                startTime = START_TIME,
+                startZoneOffset = START_ZONE_OFFSET,
+                endTime = END_TIME,
+                endZoneOffset = END_ZONE_OFFSET,
+                samples =
+                    listOf(
+                        SpeedRecord.Sample(
+                            time = START_TIME,
+                            speed = 1.metersPerSecond,
+                        ),
+                        SpeedRecord.Sample(
+                            time = START_TIME,
+                            speed = 2.metersPerSecond,
+                        ),
+                    ),
+                metadata = TEST_METADATA,
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testStepsCadenceSeries() {
+        val data =
+            StepsCadenceRecord(
+                startTime = START_TIME,
+                startZoneOffset = START_ZONE_OFFSET,
+                endTime = END_TIME,
+                endZoneOffset = END_ZONE_OFFSET,
+                samples =
+                    listOf(
+                        StepsCadenceRecord.Sample(
+                            time = START_TIME,
+                            rate = 1.0,
+                        ),
+                        StepsCadenceRecord.Sample(
+                            time = START_TIME,
+                            rate = 2.0,
+                        ),
+                    ),
+                metadata = TEST_METADATA,
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testVo2Max() {
+        val data =
+            Vo2MaxRecord(
+                vo2MillilitersPerMinuteKilogram = 1.0,
+                measurementMethod = null,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testWaistCircumference() {
+        val data =
+            WaistCircumferenceRecord(
+                circumference = 1.meters,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testWeight() {
+        val data =
+            WeightRecord(
+                weight = 1.kilograms,
+                time = START_TIME,
+                zoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testActiveCaloriesBurned() {
+        val data =
+            ActiveCaloriesBurnedRecord(
+                energy = 1.kilocalories,
+                startTime = START_TIME,
+                startZoneOffset = START_ZONE_OFFSET,
+                endTime = END_TIME,
+                endZoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testActivityEvent() {
+        val data =
+            ExerciseEventRecord(
+                eventType = EventType.PAUSE,
+                startTime = START_TIME,
+                startZoneOffset = START_ZONE_OFFSET,
+                endTime = END_TIME,
+                endZoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testActivityLap() {
+        val data =
+            ExerciseLapRecord(
+                length = 1.meters,
+                startTime = START_TIME,
+                startZoneOffset = START_ZONE_OFFSET,
+                endTime = END_TIME,
+                endZoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testActivitySession() {
+        val data =
+            ExerciseSessionRecord(
+                exerciseType = ExerciseType.BACK_EXTENSION,
+                title = null,
+                notes = null,
+                startTime = START_TIME,
+                startZoneOffset = START_ZONE_OFFSET,
+                endTime = END_TIME,
+                endZoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testDistance() {
+        val data =
+            DistanceRecord(
+                distance = 1.meters,
+                startTime = START_TIME,
+                startZoneOffset = START_ZONE_OFFSET,
+                endTime = END_TIME,
+                endZoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testElevationGained() {
+        val data =
+            ElevationGainedRecord(
+                elevation = 1.meters,
+                startTime = START_TIME,
+                startZoneOffset = START_ZONE_OFFSET,
+                endTime = END_TIME,
+                endZoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testFloorsClimbed() {
+        val data =
+            FloorsClimbedRecord(
+                floors = 1.0,
+                startTime = START_TIME,
+                startZoneOffset = START_ZONE_OFFSET,
+                endTime = END_TIME,
+                endZoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testHydration() {
+        val data =
+            HydrationRecord(
+                volume = 1.liters,
+                startTime = START_TIME,
+                startZoneOffset = START_ZONE_OFFSET,
+                endTime = END_TIME,
+                endZoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testNutrition() {
+        val data =
+            NutritionRecord(
+                biotin = 1.grams,
+                caffeine = 1.grams,
+                calcium = 1.grams,
+                energy = 1.kilocalories,
+                energyFromFat = 1.kilocalories,
+                chloride = 1.grams,
+                cholesterol = 1.grams,
+                chromium = 1.grams,
+                copper = 1.grams,
+                dietaryFiber = 1.grams,
+                folate = 1.grams,
+                folicAcid = 1.grams,
+                iodine = 1.grams,
+                iron = 1.grams,
+                magnesium = 1.grams,
+                manganese = 1.grams,
+                molybdenum = 1.grams,
+                monounsaturatedFat = 1.grams,
+                niacin = 1.grams,
+                pantothenicAcid = 1.grams,
+                phosphorus = 1.grams,
+                polyunsaturatedFat = 1.grams,
+                potassium = 1.grams,
+                protein = 1.grams,
+                riboflavin = 1.grams,
+                saturatedFat = 1.grams,
+                selenium = 1.grams,
+                sodium = 1.grams,
+                sugar = 1.grams,
+                thiamin = 1.grams,
+                totalCarbohydrate = 1.grams,
+                totalFat = 1.grams,
+                transFat = 1.grams,
+                unsaturatedFat = 1.grams,
+                vitaminA = 1.grams,
+                vitaminB12 = 1.grams,
+                vitaminB6 = 1.grams,
+                vitaminC = 1.grams,
+                vitaminD = 1.grams,
+                vitaminE = 1.grams,
+                vitaminK = 1.grams,
+                zinc = 1.grams,
+                mealType = null,
+                name = null,
+                startTime = START_TIME,
+                startZoneOffset = START_ZONE_OFFSET,
+                endTime = END_TIME,
+                endZoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testRepetitions() {
+        val data =
+            ExerciseRepetitionsRecord(
+                count = 1,
+                type = ExerciseType.JUMPING_JACK,
+                startTime = START_TIME,
+                startZoneOffset = START_ZONE_OFFSET,
+                endTime = END_TIME,
+                endZoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testSleepSession() {
+        val data =
+            SleepSessionRecord(
+                title = null,
+                notes = null,
+                startTime = START_TIME,
+                startZoneOffset = START_ZONE_OFFSET,
+                endTime = END_TIME,
+                endZoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testSleepStage() {
+        val data =
+            SleepStageRecord(
+                stage = StageType.AWAKE,
+                startTime = START_TIME,
+                startZoneOffset = START_ZONE_OFFSET,
+                endTime = END_TIME,
+                endZoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testSteps() {
+        val data =
+            StepsRecord(
+                count = 1,
+                startTime = START_TIME,
+                startZoneOffset = START_ZONE_OFFSET,
+                endTime = END_TIME,
+                endZoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testSwimmingStrokes() {
+        val data =
+            SwimmingStrokesRecord(
+                count = 1,
+                type = SwimmingType.BACKSTROKE,
+                startTime = START_TIME,
+                startZoneOffset = START_ZONE_OFFSET,
+                endTime = END_TIME,
+                endZoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testTotalCaloriesBurned() {
+        val data =
+            TotalCaloriesBurnedRecord(
+                energy = 1.kilocalories,
+                startTime = START_TIME,
+                startZoneOffset = START_ZONE_OFFSET,
+                endTime = END_TIME,
+                endZoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    @Test
+    fun testWheelchairPushes() {
+        val data =
+            WheelchairPushesRecord(
+                count = 1,
+                startTime = START_TIME,
+                startZoneOffset = START_ZONE_OFFSET,
+                endTime = END_TIME,
+                endZoneOffset = END_ZONE_OFFSET,
+                metadata = TEST_METADATA
+            )
+
+        checkProtoAndRecordTypeNameMatch(data)
+        assertThat(toRecord(data.toProto())).isEqualTo(data)
+    }
+
+    private inline fun <reified T : Record> checkProtoAndRecordTypeNameMatch(record: T) {
+        val serializedTypeName = record.toProto().dataType.name
+
+        assertThat(T::class.toDataTypeName()).isEqualTo(serializedTypeName)
+    }
+}
diff --git a/health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/converters/records/RecordAggregationsTest.kt b/health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/converters/records/RecordAggregationsTest.kt
new file mode 100644
index 0000000..7f21813
--- /dev/null
+++ b/health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/converters/records/RecordAggregationsTest.kt
@@ -0,0 +1,162 @@
+/*
+ * 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.health.connect.client.impl.converters.records
+
+import androidx.health.connect.client.aggregate.AggregateMetric
+import androidx.health.connect.client.aggregate.AggregationResult
+import androidx.health.connect.client.records.ActiveCaloriesBurnedRecord
+import androidx.health.connect.client.records.BasalMetabolicRateRecord
+import androidx.health.connect.client.records.NutritionRecord
+import androidx.health.connect.client.records.Record
+import androidx.health.connect.client.records.TotalCaloriesBurnedRecord
+import androidx.health.connect.client.units.kilocalories
+import androidx.health.connect.client.units.kilocaloriesPerDay
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import java.time.Instant
+import kotlin.test.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class RecordAggregationsTest {
+
+    @Test
+    fun totalCaloriesBurned_energyTotalAggregates() {
+        val total =
+            aggregate(
+                metric = TotalCaloriesBurnedRecord.ENERGY_TOTAL,
+                records = listOf(
+                    TotalCaloriesBurnedRecord(
+                        energy = 1.kilocalories,
+                        startTime = START_TIME,
+                        startZoneOffset = null,
+                        endTime = END_TIME,
+                        endZoneOffset = null,
+                    )
+                )
+            )
+
+        assertEquals(1.kilocalories, total)
+    }
+
+    @Test
+    fun basalMetabolicRate_basalCaloriesTotalAggregates() {
+        val total =
+            aggregate(
+                metric = BasalMetabolicRateRecord.BASAL_CALORIES_TOTAL,
+                records = listOf(
+                    BasalMetabolicRateRecord(
+                        basalMetabolicRate = 1.kilocaloriesPerDay,
+                        time = START_TIME,
+                        zoneOffset = null,
+                    )
+                ),
+                fieldName = "bmr",
+            )
+
+        assertEquals(1.kilocalories, total)
+    }
+
+    @Test
+    fun nutrition_energyTotalAggregates() {
+        val total =
+            aggregate(
+                metric = NutritionRecord.ENERGY_TOTAL,
+                records = listOf(
+                    NutritionRecord(
+                        energy = 1.kilocalories,
+                        startTime = START_TIME,
+                        startZoneOffset = null,
+                        endTime = END_TIME,
+                        endZoneOffset = null,
+                    )
+                ),
+            )
+
+        assertEquals(1.kilocalories, total)
+    }
+
+    @Test
+    fun nutrition_energyFromFatTotalAggregates() {
+        val total =
+            aggregate(
+                metric = NutritionRecord.ENERGY_FROM_FAT_TOTAL,
+                records = listOf(
+                    NutritionRecord(
+                        energyFromFat = 1.kilocalories,
+                        startTime = START_TIME,
+                        startZoneOffset = null,
+                        endTime = END_TIME,
+                        endZoneOffset = null,
+                    )
+                ),
+            )
+
+        assertEquals(1.kilocalories, total)
+    }
+
+    @Test
+    fun activeCaloriesBurned_activeCaloriesTotalAggregates() {
+        val total =
+            aggregate(
+                metric = ActiveCaloriesBurnedRecord.ACTIVE_CALORIES_TOTAL,
+                records = listOf(
+                    ActiveCaloriesBurnedRecord(
+                        energy = 1.kilocalories,
+                        startTime = START_TIME,
+                        startZoneOffset = null,
+                        endTime = END_TIME,
+                        endZoneOffset = null,
+                    )
+                ),
+            )
+
+        assertEquals(1.kilocalories, total)
+    }
+
+    private fun <T : Any> aggregate(
+        metric: AggregateMetric<T>,
+        records: Iterable<Record>,
+        fieldName: String = requireNotNull(metric.aggregationField),
+    ): T? {
+        val metricKey = metric.metricKey
+        val doubleValues = HashMap<String, Double>()
+        val longValues = HashMap<String, Long>()
+
+        for (record in records) {
+            val value = record.toProto().valuesMap.getValue(fieldName)
+            when {
+                value.hasDoubleVal() -> doubleValues.merge(metricKey, value.doubleVal, Double::plus)
+                value.hasLongVal() -> longValues.merge(metricKey, value.longVal, Long::plus)
+            }
+        }
+
+        return AggregationResult(
+            longValues = longValues,
+            doubleValues = doubleValues,
+            dataOrigins = emptySet(),
+        )[metric]
+    }
+
+    private companion object {
+        @SuppressWarnings("GoodTime") // Safe to use in test
+        private val START_TIME = Instant.ofEpochMilli(1234L)
+
+        @SuppressWarnings("GoodTime") // Safe to use in test
+        private val END_TIME = Instant.ofEpochMilli(5678L)
+    }
+}
\ No newline at end of file
diff --git a/health/health-connect-client/src/test/java/androidx/health/connect/client/impl/converters/records/RecordsTest.kt b/health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/converters/records/RecordsTest.kt
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/connect/client/impl/converters/records/RecordsTest.kt
rename to health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/converters/records/RecordsTest.kt
diff --git a/health/health-connect-client/src/test/java/androidx/health/connect/client/impl/converters/request/AggregateRequestConverterTest.kt b/health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/converters/request/AggregateRequestConverterTest.kt
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/connect/client/impl/converters/request/AggregateRequestConverterTest.kt
rename to health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/converters/request/AggregateRequestConverterTest.kt
diff --git a/health/health-connect-client/src/test/java/androidx/health/connect/client/impl/converters/response/ChangesResponseConverterTest.kt b/health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/converters/response/ChangesResponseConverterTest.kt
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/connect/client/impl/converters/response/ChangesResponseConverterTest.kt
rename to health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/converters/response/ChangesResponseConverterTest.kt
diff --git a/health/health-connect-client/src/test/java/androidx/health/connect/client/metadata/DeviceTypeTest.java b/health/connect/connect-client/src/test/java/androidx/health/connect/client/metadata/DeviceTypeTest.java
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/connect/client/metadata/DeviceTypeTest.java
rename to health/connect/connect-client/src/test/java/androidx/health/connect/client/metadata/DeviceTypeTest.java
diff --git a/health/health-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
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/connect/client/permission/HealthDataRequestPermissionsTest.kt
rename to health/connect/connect-client/src/test/java/androidx/health/connect/client/permission/HealthDataRequestPermissionsTest.kt
diff --git a/health/health-connect-client/src/test/java/androidx/health/connect/client/permission/HealthPermissionTest.kt b/health/connect/connect-client/src/test/java/androidx/health/connect/client/permission/HealthPermissionTest.kt
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/connect/client/permission/HealthPermissionTest.kt
rename to health/connect/connect-client/src/test/java/androidx/health/connect/client/permission/HealthPermissionTest.kt
diff --git a/health/health-connect-client/src/test/java/androidx/health/connect/client/request/ReadRecordsRequestTest.kt b/health/connect/connect-client/src/test/java/androidx/health/connect/client/request/ReadRecordsRequestTest.kt
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/connect/client/request/ReadRecordsRequestTest.kt
rename to health/connect/connect-client/src/test/java/androidx/health/connect/client/request/ReadRecordsRequestTest.kt
diff --git a/health/health-connect-client/src/test/java/androidx/health/connect/client/time/TimeRangeFilterTest.kt b/health/connect/connect-client/src/test/java/androidx/health/connect/client/time/TimeRangeFilterTest.kt
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/connect/client/time/TimeRangeFilterTest.kt
rename to health/connect/connect-client/src/test/java/androidx/health/connect/client/time/TimeRangeFilterTest.kt
diff --git a/health/health-connect-client/src/test/java/androidx/health/platform/client/error/ErrorStatusTest.kt b/health/connect/connect-client/src/test/java/androidx/health/platform/client/error/ErrorStatusTest.kt
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/platform/client/error/ErrorStatusTest.kt
rename to health/connect/connect-client/src/test/java/androidx/health/platform/client/error/ErrorStatusTest.kt
diff --git a/health/health-connect-client/src/test/java/androidx/health/platform/client/impl/ServiceBackedHealthDataClientTest.kt b/health/connect/connect-client/src/test/java/androidx/health/platform/client/impl/ServiceBackedHealthDataClientTest.kt
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/platform/client/impl/ServiceBackedHealthDataClientTest.kt
rename to health/connect/connect-client/src/test/java/androidx/health/platform/client/impl/ServiceBackedHealthDataClientTest.kt
diff --git a/health/health-connect-client/src/test/java/androidx/health/platform/client/impl/converters/permission/PermissionConverterTest.kt b/health/connect/connect-client/src/test/java/androidx/health/platform/client/impl/converters/permission/PermissionConverterTest.kt
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/platform/client/impl/converters/permission/PermissionConverterTest.kt
rename to health/connect/connect-client/src/test/java/androidx/health/platform/client/impl/converters/permission/PermissionConverterTest.kt
diff --git a/health/health-connect-client/src/test/java/androidx/health/platform/client/impl/data/ProtoParcelableTest.kt b/health/connect/connect-client/src/test/java/androidx/health/platform/client/impl/data/ProtoParcelableTest.kt
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/platform/client/impl/data/ProtoParcelableTest.kt
rename to health/connect/connect-client/src/test/java/androidx/health/platform/client/impl/data/ProtoParcelableTest.kt
diff --git a/health/health-connect-client/src/test/java/androidx/health/platform/client/impl/ipc/internal/ServiceConnectionTest.java b/health/connect/connect-client/src/test/java/androidx/health/platform/client/impl/ipc/internal/ServiceConnectionTest.java
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/platform/client/impl/ipc/internal/ServiceConnectionTest.java
rename to health/connect/connect-client/src/test/java/androidx/health/platform/client/impl/ipc/internal/ServiceConnectionTest.java
diff --git a/health/health-connect-client/src/test/java/androidx/health/platform/client/impl/permission/token/PermissionTokenManagerTest.java b/health/connect/connect-client/src/test/java/androidx/health/platform/client/impl/permission/token/PermissionTokenManagerTest.java
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/platform/client/impl/permission/token/PermissionTokenManagerTest.java
rename to health/connect/connect-client/src/test/java/androidx/health/platform/client/impl/permission/token/PermissionTokenManagerTest.java
diff --git a/health/health-connect-client/src/test/java/androidx/health/platform/client/impl/sdkservice/HealthDataSdkServiceStubImplTest.java b/health/connect/connect-client/src/test/java/androidx/health/platform/client/impl/sdkservice/HealthDataSdkServiceStubImplTest.java
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/platform/client/impl/sdkservice/HealthDataSdkServiceStubImplTest.java
rename to health/connect/connect-client/src/test/java/androidx/health/platform/client/impl/sdkservice/HealthDataSdkServiceStubImplTest.java
diff --git a/health/health-connect-client/src/test/java/androidx/health/platform/client/impl/sdkservice/HealthDataSdkServiceTest.java b/health/connect/connect-client/src/test/java/androidx/health/platform/client/impl/sdkservice/HealthDataSdkServiceTest.java
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/platform/client/impl/sdkservice/HealthDataSdkServiceTest.java
rename to health/connect/connect-client/src/test/java/androidx/health/platform/client/impl/sdkservice/HealthDataSdkServiceTest.java
diff --git a/health/connect/connect-client/src/test/java/androidx/health/platform/client/impl/testing/FakeHealthDataService.kt b/health/connect/connect-client/src/test/java/androidx/health/platform/client/impl/testing/FakeHealthDataService.kt
new file mode 100644
index 0000000..34e554e6
--- /dev/null
+++ b/health/connect/connect-client/src/test/java/androidx/health/platform/client/impl/testing/FakeHealthDataService.kt
@@ -0,0 +1,247 @@
+/*
+ * 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.platform.client.impl.testing
+
+import androidx.annotation.RestrictTo
+import androidx.health.platform.client.error.ErrorCode
+import androidx.health.platform.client.error.ErrorStatus
+import androidx.health.platform.client.permission.Permission
+import androidx.health.platform.client.request.AggregateDataRequest
+import androidx.health.platform.client.request.DeleteDataRangeRequest
+import androidx.health.platform.client.request.DeleteDataRequest
+import androidx.health.platform.client.request.GetChangesRequest
+import androidx.health.platform.client.request.GetChangesTokenRequest
+import androidx.health.platform.client.request.ReadDataRangeRequest
+import androidx.health.platform.client.request.ReadDataRequest
+import androidx.health.platform.client.request.RegisterForDataNotificationsRequest
+import androidx.health.platform.client.request.RequestContext
+import androidx.health.platform.client.request.UpsertDataRequest
+import androidx.health.platform.client.response.AggregateDataResponse
+import androidx.health.platform.client.response.GetChangesResponse
+import androidx.health.platform.client.response.GetChangesTokenResponse
+import androidx.health.platform.client.response.InsertDataResponse
+import androidx.health.platform.client.response.ReadDataRangeResponse
+import androidx.health.platform.client.response.ReadDataResponse
+import androidx.health.platform.client.service.IAggregateDataCallback
+import androidx.health.platform.client.service.IDeleteDataCallback
+import androidx.health.platform.client.service.IDeleteDataRangeCallback
+import androidx.health.platform.client.service.IGetChangesCallback
+import androidx.health.platform.client.service.IGetChangesTokenCallback
+import androidx.health.platform.client.service.IGetGrantedPermissionsCallback
+import androidx.health.platform.client.service.IHealthDataService
+import androidx.health.platform.client.service.IInsertDataCallback
+import androidx.health.platform.client.service.IReadDataCallback
+import androidx.health.platform.client.service.IReadDataRangeCallback
+import androidx.health.platform.client.service.IRegisterForDataNotificationsCallback
+import androidx.health.platform.client.service.IRevokeAllPermissionsCallback
+import androidx.health.platform.client.service.IUnregisterFromDataNotificationsCallback
+import androidx.health.platform.client.service.IUpdateDataCallback
+import androidx.health.platform.client.request.UnregisterFromDataNotificationsRequest
+
+/** Fake {@link IHealthDataService} implementation for unit testing. */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+class FakeHealthDataService : IHealthDataService.Stub() {
+    /** Change this state to control permission responses. Not thread safe */
+    val grantedPermissions: MutableSet<Permission> = mutableSetOf()
+
+    /** State retaining last requested parameters. */
+    var lastUpsertDataRequest: UpsertDataRequest? = null
+    var lastReadDataRequest: ReadDataRequest? = null
+    var lastReadDataRangeRequest: ReadDataRangeRequest? = null
+    var lastDeleteDataRequest: DeleteDataRequest? = null
+    var lastDeleteDataRangeRequest: DeleteDataRangeRequest? = null
+    var lastAggregateRequest: AggregateDataRequest? = null
+    var lastGetChangesTokenRequest: GetChangesTokenRequest? = null
+    var lastGetChangesRequest: GetChangesRequest? = null
+
+    /** State for returned responses. */
+    var insertDataResponse: InsertDataResponse? = null
+    var readDataResponse: ReadDataResponse? = null
+    var readDataRangeResponse: ReadDataRangeResponse? = null
+    var aggregateDataResponse: AggregateDataResponse? = null
+    var changesTokenResponse: GetChangesTokenResponse? = null
+    var changesResponse: GetChangesResponse? = null
+
+    /** Set this to control error responses. Not thread safe. */
+    @ErrorCode var errorCode: Int? = null
+
+    override fun getApiVersion(): Int {
+        return 42
+    }
+
+    override fun getGrantedPermissions(
+        context: RequestContext,
+        permissions: List<Permission>,
+        callback: IGetGrantedPermissionsCallback,
+    ) {
+        errorCode?.let {
+            callback.onError(ErrorStatus.create(it, "" + it))
+            return@getGrantedPermissions
+        }
+
+        val granted = permissions.filter { it in grantedPermissions }.toList()
+        callback.onSuccess(granted)
+    }
+
+    override fun revokeAllPermissions(
+        context: RequestContext,
+        callback: IRevokeAllPermissionsCallback,
+    ) {
+        errorCode?.let {
+            callback.onError(ErrorStatus.create(it, "" + it))
+            return@revokeAllPermissions
+        }
+        grantedPermissions.clear()
+        callback.onSuccess()
+    }
+
+    fun addGrantedPermission(permission: Permission) {
+        grantedPermissions.add(permission)
+    }
+
+    override fun insertData(
+        context: RequestContext,
+        request: UpsertDataRequest,
+        callback: IInsertDataCallback,
+    ) {
+        lastUpsertDataRequest = request
+        errorCode?.let {
+            callback.onError(ErrorStatus.create(it, "" + it))
+            return@insertData
+        }
+        callback.onSuccess(insertDataResponse)
+    }
+
+    override fun updateData(
+        context: RequestContext,
+        request: UpsertDataRequest,
+        callback: IUpdateDataCallback,
+    ) {
+        lastUpsertDataRequest = request
+        errorCode?.let {
+            callback.onError(ErrorStatus.create(it, "" + it))
+            return@updateData
+        }
+        callback.onSuccess()
+    }
+
+    override fun deleteData(
+        context: RequestContext,
+        request: DeleteDataRequest,
+        callback: IDeleteDataCallback,
+    ) {
+        lastDeleteDataRequest = request
+        errorCode?.let {
+            callback.onError(ErrorStatus.create(it, "" + it))
+            return@deleteData
+        }
+        callback.onSuccess()
+    }
+
+    override fun deleteDataRange(
+        context: RequestContext,
+        request: DeleteDataRangeRequest,
+        callback: IDeleteDataRangeCallback,
+    ) {
+        lastDeleteDataRangeRequest = request
+        errorCode?.let {
+            callback.onError(ErrorStatus.create(it, "" + it))
+            return@deleteDataRange
+        }
+        callback.onSuccess()
+    }
+
+    override fun readData(
+        context: RequestContext,
+        request: ReadDataRequest,
+        callback: IReadDataCallback,
+    ) {
+        lastReadDataRequest = request
+        errorCode?.let {
+            callback.onError(ErrorStatus.create(it, "" + it))
+            return@readData
+        }
+        callback.onSuccess(checkNotNull(readDataResponse))
+    }
+
+    override fun readDataRange(
+        context: RequestContext,
+        request: ReadDataRangeRequest,
+        callback: IReadDataRangeCallback,
+    ) {
+        lastReadDataRangeRequest = request
+        errorCode?.let {
+            callback.onError(ErrorStatus.create(it, "" + it))
+            return@readDataRange
+        }
+        callback.onSuccess(checkNotNull(readDataRangeResponse))
+    }
+
+    override fun aggregate(
+        context: RequestContext,
+        request: AggregateDataRequest,
+        callback: IAggregateDataCallback,
+    ) {
+        lastAggregateRequest = request
+        errorCode?.let {
+            callback.onError(ErrorStatus.create(it, "" + it))
+            return@aggregate
+        }
+        callback.onSuccess(aggregateDataResponse)
+    }
+
+    override fun getChangesToken(
+        context: RequestContext,
+        request: GetChangesTokenRequest,
+        callback: IGetChangesTokenCallback,
+    ) {
+        lastGetChangesTokenRequest = request
+        errorCode?.let {
+            callback.onError(ErrorStatus.create(it, "" + it))
+            return@getChangesToken
+        }
+        callback.onSuccess(changesTokenResponse)
+    }
+
+    override fun getChanges(
+        context: RequestContext,
+        request: GetChangesRequest,
+        callback: IGetChangesCallback,
+    ) {
+        lastGetChangesRequest = request
+        errorCode?.let {
+            callback.onError(ErrorStatus.create(it, "" + it))
+            return@getChanges
+        }
+        callback.onSuccess(changesResponse)
+    }
+
+    override fun registerForDataNotifications(
+        context: RequestContext,
+        request: RegisterForDataNotificationsRequest,
+        callback: IRegisterForDataNotificationsCallback,
+    ) {
+        TODO("Implement when needed")
+    }
+
+    override fun unregisterFromDataNotifications(
+        context: RequestContext,
+        request: UnregisterFromDataNotificationsRequest,
+        callback: IUnregisterFromDataNotificationsCallback,
+    ) {
+        TODO("Implement when needed")
+    }
+}
diff --git a/health/health-connect-client/src/test/java/androidx/health/platform/client/permission/PermissionTest.kt b/health/connect/connect-client/src/test/java/androidx/health/platform/client/permission/PermissionTest.kt
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/platform/client/permission/PermissionTest.kt
rename to health/connect/connect-client/src/test/java/androidx/health/platform/client/permission/PermissionTest.kt
diff --git a/health/health-connect-client/src/test/java/androidx/health/platform/client/request/DeleteDataRangeRequestTest.kt b/health/connect/connect-client/src/test/java/androidx/health/platform/client/request/DeleteDataRangeRequestTest.kt
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/platform/client/request/DeleteDataRangeRequestTest.kt
rename to health/connect/connect-client/src/test/java/androidx/health/platform/client/request/DeleteDataRangeRequestTest.kt
diff --git a/health/health-connect-client/src/test/java/androidx/health/platform/client/request/DeleteDataRequestTest.kt b/health/connect/connect-client/src/test/java/androidx/health/platform/client/request/DeleteDataRequestTest.kt
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/platform/client/request/DeleteDataRequestTest.kt
rename to health/connect/connect-client/src/test/java/androidx/health/platform/client/request/DeleteDataRequestTest.kt
diff --git a/health/health-connect-client/src/test/java/androidx/health/platform/client/request/ReadDataRangeRequestTest.kt b/health/connect/connect-client/src/test/java/androidx/health/platform/client/request/ReadDataRangeRequestTest.kt
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/platform/client/request/ReadDataRangeRequestTest.kt
rename to health/connect/connect-client/src/test/java/androidx/health/platform/client/request/ReadDataRangeRequestTest.kt
diff --git a/health/health-connect-client/src/test/java/androidx/health/platform/client/request/ReadDataRequestTest.kt b/health/connect/connect-client/src/test/java/androidx/health/platform/client/request/ReadDataRequestTest.kt
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/platform/client/request/ReadDataRequestTest.kt
rename to health/connect/connect-client/src/test/java/androidx/health/platform/client/request/ReadDataRequestTest.kt
diff --git a/health/health-connect-client/src/test/java/androidx/health/platform/client/request/RequestContextTest.kt b/health/connect/connect-client/src/test/java/androidx/health/platform/client/request/RequestContextTest.kt
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/platform/client/request/RequestContextTest.kt
rename to health/connect/connect-client/src/test/java/androidx/health/platform/client/request/RequestContextTest.kt
diff --git a/health/health-connect-client/src/test/java/androidx/health/platform/client/request/UpsertDataRequestTest.kt b/health/connect/connect-client/src/test/java/androidx/health/platform/client/request/UpsertDataRequestTest.kt
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/platform/client/request/UpsertDataRequestTest.kt
rename to health/connect/connect-client/src/test/java/androidx/health/platform/client/request/UpsertDataRequestTest.kt
diff --git a/health/health-connect-client/src/test/java/androidx/health/platform/client/response/InsertDataResponseTest.kt b/health/connect/connect-client/src/test/java/androidx/health/platform/client/response/InsertDataResponseTest.kt
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/platform/client/response/InsertDataResponseTest.kt
rename to health/connect/connect-client/src/test/java/androidx/health/platform/client/response/InsertDataResponseTest.kt
diff --git a/health/health-connect-client/src/test/java/androidx/health/platform/client/response/ReadDataRangeResponseTest.kt b/health/connect/connect-client/src/test/java/androidx/health/platform/client/response/ReadDataRangeResponseTest.kt
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/platform/client/response/ReadDataRangeResponseTest.kt
rename to health/connect/connect-client/src/test/java/androidx/health/platform/client/response/ReadDataRangeResponseTest.kt
diff --git a/health/health-connect-client/src/test/java/androidx/health/platform/client/response/ReadDataResponseTest.kt b/health/connect/connect-client/src/test/java/androidx/health/platform/client/response/ReadDataResponseTest.kt
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/platform/client/response/ReadDataResponseTest.kt
rename to health/connect/connect-client/src/test/java/androidx/health/platform/client/response/ReadDataResponseTest.kt
diff --git a/health/health-connect-client/src/test/java/androidx/health/platform/client/testing/TestConstants.kt b/health/connect/connect-client/src/test/java/androidx/health/platform/client/testing/TestConstants.kt
similarity index 100%
rename from health/health-connect-client/src/test/java/androidx/health/platform/client/testing/TestConstants.kt
rename to health/connect/connect-client/src/test/java/androidx/health/platform/client/testing/TestConstants.kt
diff --git a/health/health-connect-client-proto/build.gradle b/health/health-connect-client-proto/build.gradle
deleted file mode 100644
index a234b6f..0000000
--- a/health/health-connect-client-proto/build.gradle
+++ /dev/null
@@ -1,92 +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.
- */
-
-import androidx.build.Publish
-
-/*
- * All the following content was derived from :datastore:datastore-core.
- */
-
-plugins {
-    id("AndroidXPlugin")
-    id("java-library")
-    id("com.google.protobuf")
-}
-
-dependencies {
-    implementation(libs.protobufLite)
-}
-
-sourceSets {
-    main.java.srcDirs += "$buildDir/generated/source/proto"
-}
-
-protobuf {
-    protoc {
-        artifact = libs.protobufCompiler.get()
-    }
-
-    // Generates the java proto-lite code for the protos in this project. See
-    // https://github.com/google/protobuf-gradle-plugin#customizing-protobuf-compilation
-    // for more information.
-    generateProtoTasks {
-        all().each { task ->
-            project.tasks.named("sourceJar").configure {
-                it.dependsOn(task)
-            }
-            project.tasks.named("runErrorProne").configure {
-                it.dependsOn(task)
-            }
-            project.tasks.named("lint").configure {
-                it.dependsOn(task)
-                it.enabled = false
-            }
-            project.tasks.named("lintAnalyze").configure {
-                it.dependsOn(task)
-                it.enabled = false
-            }
-            task.builtins {
-                java {
-                    option "lite"
-                }
-            }
-        }
-    }
-}
-
-// Create export artifact for for JarJaring
-def preferencesProtoJarJarTask = tasks.register("exportJar", Jar) {
-    archiveBaseName.set("export")
-    from(sourceSets.main.output)
-    // The proto-lite dependency includes .proto files, which are not used by datastore. When apps
-    // depend on datastore as well as proto-lite directly, these files conflict since jarjar only
-    // renames the java classes. Remove them here since they are unused.
-    exclude("**/*.proto")
-
-    from(zipTree(configurations.detachedConfiguration(
-            dependencies.create(libs.protobufLite.get())).getSingleFile()))
-}
-
-def jarjarConf = configurations.register("export")
-artifacts.add(jarjarConf.name, preferencesProtoJarJarTask.flatMap { it.archiveFile })
-
-androidx {
-    name = "AndroidX Health Connect Client Proto"
-    publish = Publish.NONE
-    mavenGroup = LibraryGroups.HEALTH
-    inceptionYear = "2022"
-    description = "Proto files for health-connect-client"
-}
diff --git a/health/health-connect-client-proto/src/main/proto/request.proto b/health/health-connect-client-proto/src/main/proto/request.proto
deleted file mode 100644
index ffd22cf..0000000
--- a/health/health-connect-client-proto/src/main/proto/request.proto
+++ /dev/null
@@ -1,99 +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.
- */
-syntax = "proto2";
-
-package androidx.health.platform.client.proto;
-
-import "data.proto";
-import "time.proto";
-
-option java_package = "androidx.health.platform.client.proto";
-option java_outer_classname = "RequestProto";
-
-message SimpleDataRequest {
-  optional DataPoint data_point = 1;
-}
-
-message ReadDataPointRequest {
-  optional DataType data_type = 1;
-  optional string uid = 2;
-  optional string client_id = 3;
-}
-
-message RequestContext {
-  optional string calling_package = 1;
-  optional int32 sdk_version = 2;
-  optional string permission_token = 3;
-  optional bool is_in_foreground = 4;
-}
-
-message UpsertDataRequest {
-  repeated DataPoint data_point = 1;
-}
-
-message DataTypeIdPair {
-  optional DataType data_type = 1;
-  optional string id = 2;
-}
-
-message DeleteDataRequest {
-  repeated DataTypeIdPair uids = 1;
-  repeated DataTypeIdPair client_ids = 2;
-}
-
-message DeleteDataRangeRequest {
-  optional TimeSpec time_spec = 1;
-  repeated DataType data_type = 2;
-}
-
-message ReadDataRequest {
-  optional DataTypeIdPair data_type_id_pair = 1;
-}
-
-message ReadDataRangeRequest {
-  optional TimeSpec time_spec = 1;
-  optional DataType data_type = 2;
-  repeated DataOrigin data_origin_filters = 3;
-  optional bool asc_ordering = 7 [default = true];
-  optional int32 limit = 4;
-  optional int32 page_size = 5;
-  optional string page_token = 6;
-}
-
-message AggregateMetricSpec {
-  optional string data_type_name = 1;
-  // count, duration, etc
-  optional string aggregation_type = 2;
-  optional string field_name = 3;
-}
-
-// Flattened aggregation
-message AggregateDataRequest {
-  optional TimeSpec time_spec = 1;
-  repeated AggregateMetricSpec metric_spec = 2;
-  repeated DataOrigin data_origin = 3;
-  optional int64 slice_duration_millis = 4;
-  optional string slice_period = 5;
-}
-
-message GetChangesTokenRequest {
-  repeated DataType data_type = 1;
-  repeated DataOrigin data_origin_filters = 2;
-}
-
-message GetChangesRequest {
-  optional string changes_token = 1;
-}
\ No newline at end of file
diff --git a/health/health-connect-client/api/current.txt b/health/health-connect-client/api/current.txt
deleted file mode 100644
index 177a7c2..0000000
--- a/health/health-connect-client/api/current.txt
+++ /dev/null
@@ -1,1603 +0,0 @@
-// Signature format: 4.0
-package androidx.health.connect.client {
-
-  public interface HealthConnectClient {
-    method public suspend Object? aggregate(androidx.health.connect.client.request.AggregateRequest request, kotlin.coroutines.Continuation<? super androidx.health.connect.client.aggregate.AggregationResult>);
-    method public suspend Object? aggregateGroupByDuration(androidx.health.connect.client.request.AggregateGroupByDurationRequest request, kotlin.coroutines.Continuation<? super java.util.List<? extends androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration>>);
-    method public suspend Object? aggregateGroupByPeriod(androidx.health.connect.client.request.AggregateGroupByPeriodRequest request, kotlin.coroutines.Continuation<? super java.util.List<? extends androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod>>);
-    method public suspend Object? deleteRecords(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType, java.util.List<java.lang.String> uidsList, java.util.List<java.lang.String> clientIdsList, kotlin.coroutines.Continuation<? super kotlin.Unit>);
-    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 androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context, optional java.util.List<java.lang.String> packageNames);
-    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 isAvailable(android.content.Context context, optional java.util.List<java.lang.String> packageNames);
-    method public default static boolean isAvailable(android.content.Context context);
-    method public suspend <T extends androidx.health.connect.client.records.Record> Object? readRecord(kotlin.reflect.KClass<T> recordType, String uid, 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 suspend Object? updateRecords(java.util.List<? extends androidx.health.connect.client.records.Record> records, kotlin.coroutines.Continuation<? super kotlin.Unit>);
-    property public abstract androidx.health.connect.client.PermissionController permissionController;
-    field public static final androidx.health.connect.client.HealthConnectClient.Companion Companion;
-  }
-
-  public static final class HealthConnectClient.Companion {
-    method public androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context, optional java.util.List<java.lang.String> packageNames);
-    method public androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context);
-    method public boolean isAvailable(android.content.Context context, optional java.util.List<java.lang.String> packageNames);
-    method public boolean isAvailable(android.content.Context context);
-  }
-
-  public interface PermissionController {
-    method public androidx.activity.result.contract.ActivityResultContract<java.util.Set<androidx.health.connect.client.permission.HealthPermission>,java.util.Set<androidx.health.connect.client.permission.HealthPermission>> createRequestPermissionActivityContract();
-    method public suspend Object? getGrantedPermissions(java.util.Set<androidx.health.connect.client.permission.HealthPermission> permissions, kotlin.coroutines.Continuation<? super java.util.Set<? extends androidx.health.connect.client.permission.HealthPermission>>);
-    method public suspend Object? revokeAllPermissions(kotlin.coroutines.Continuation<? super kotlin.Unit>);
-  }
-
-}
-
-package androidx.health.connect.client.aggregate {
-
-  public final class AggregateMetric<T> {
-  }
-
-  public final class AggregationResult {
-    method public operator boolean contains(androidx.health.connect.client.aggregate.AggregateMetric<?> metric);
-    method public operator <T> T? get(androidx.health.connect.client.aggregate.AggregateMetric<? extends T> metric);
-    method public java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> getDataOrigins();
-    method @Deprecated public <T> T? getMetric(androidx.health.connect.client.aggregate.AggregateMetric<? extends T> metric);
-    method @Deprecated public boolean hasMetric(androidx.health.connect.client.aggregate.AggregateMetric<?> metric);
-    property public final java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOrigins;
-  }
-
-  public final class AggregationResultGroupedByDuration {
-    method public java.time.Instant getEndTime();
-    method public androidx.health.connect.client.aggregate.AggregationResult getResult();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset getZoneOffset();
-    property public final java.time.Instant endTime;
-    property public final androidx.health.connect.client.aggregate.AggregationResult result;
-    property public final java.time.Instant startTime;
-    property public final java.time.ZoneOffset zoneOffset;
-  }
-
-  public final class AggregationResultGroupedByPeriod {
-    method public java.time.LocalDateTime getEndTime();
-    method public androidx.health.connect.client.aggregate.AggregationResult getResult();
-    method public java.time.LocalDateTime getStartTime();
-    property public final java.time.LocalDateTime endTime;
-    property public final androidx.health.connect.client.aggregate.AggregationResult result;
-    property public final java.time.LocalDateTime startTime;
-  }
-
-}
-
-package androidx.health.connect.client.changes {
-
-  public interface Change {
-  }
-
-  public final class DeletionChange implements androidx.health.connect.client.changes.Change {
-    method public String getUid();
-    property public final String uid;
-  }
-
-  public final class UpsertionChange implements androidx.health.connect.client.changes.Change {
-    method public androidx.health.connect.client.records.Record getRecord();
-    property public final androidx.health.connect.client.records.Record record;
-  }
-
-}
-
-package androidx.health.connect.client.permission {
-
-  public final class HealthDataRequestPermissionsKt {
-  }
-
-  public final class HealthPermission {
-    method public static androidx.health.connect.client.permission.HealthPermission createReadPermission(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType);
-    method public static androidx.health.connect.client.permission.HealthPermission createWritePermission(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType);
-    field public static final androidx.health.connect.client.permission.HealthPermission.Companion Companion;
-  }
-
-  public static final class HealthPermission.Companion {
-    method public androidx.health.connect.client.permission.HealthPermission createReadPermission(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType);
-    method public androidx.health.connect.client.permission.HealthPermission createWritePermission(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType);
-  }
-
-}
-
-package androidx.health.connect.client.records {
-
-  public final class ActiveCaloriesBurnedRecord implements androidx.health.connect.client.records.Record {
-    ctor public ActiveCaloriesBurnedRecord(androidx.health.connect.client.units.Energy energy, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.units.Energy getEnergy();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public final androidx.health.connect.client.units.Energy energy;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> ACTIVE_CALORIES_TOTAL;
-    field public static final androidx.health.connect.client.records.ActiveCaloriesBurnedRecord.Companion Companion;
-  }
-
-  public static final class ActiveCaloriesBurnedRecord.Companion {
-  }
-
-  public final class BasalBodyTemperatureRecord implements androidx.health.connect.client.records.Record {
-    ctor public BasalBodyTemperatureRecord(androidx.health.connect.client.units.Temperature temperature, optional String? measurementLocation, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public String? getMeasurementLocation();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public androidx.health.connect.client.units.Temperature getTemperature();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final String? measurementLocation;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final androidx.health.connect.client.units.Temperature temperature;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public final class BasalMetabolicRateRecord implements androidx.health.connect.client.records.Record {
-    ctor public BasalMetabolicRateRecord(androidx.health.connect.client.units.Power basalMetabolicRate, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.units.Power getBasalMetabolicRate();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final androidx.health.connect.client.units.Power basalMetabolicRate;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> BASAL_CALORIES_TOTAL;
-    field public static final androidx.health.connect.client.records.BasalMetabolicRateRecord.Companion Companion;
-  }
-
-  public static final class BasalMetabolicRateRecord.Companion {
-  }
-
-  public final class BloodGlucoseRecord implements androidx.health.connect.client.records.Record {
-    ctor public BloodGlucoseRecord(double levelMillimolesPerLiter, optional String? specimenSource, optional String? mealType, optional String? relationToMeal, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public double getLevelMillimolesPerLiter();
-    method public String? getMealType();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public String? getRelationToMeal();
-    method public String? getSpecimenSource();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final double levelMillimolesPerLiter;
-    property public final String? mealType;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final String? relationToMeal;
-    property public final String? specimenSource;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public static final class BloodGlucoseRecord.SpecimenSource {
-    field public static final String CAPILLARY_BLOOD = "capillary_blood";
-    field public static final androidx.health.connect.client.records.BloodGlucoseRecord.SpecimenSource INSTANCE;
-    field public static final String INTERSTITIAL_FLUID = "interstitial_fluid";
-    field public static final String PLASMA = "plasma";
-    field public static final String SERUM = "serum";
-    field public static final String TEARS = "tears";
-    field public static final String WHOLE_BLOOD = "whole_blood";
-  }
-
-  public final class BloodPressureRecord implements androidx.health.connect.client.records.Record {
-    ctor public BloodPressureRecord(androidx.health.connect.client.units.Pressure systolic, androidx.health.connect.client.units.Pressure diastolic, optional String? bodyPosition, optional String? measurementLocation, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public String? getBodyPosition();
-    method public androidx.health.connect.client.units.Pressure getDiastolic();
-    method public String? getMeasurementLocation();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public androidx.health.connect.client.units.Pressure getSystolic();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final String? bodyPosition;
-    property public final androidx.health.connect.client.units.Pressure diastolic;
-    property public final String? measurementLocation;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final androidx.health.connect.client.units.Pressure systolic;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-    field public static final androidx.health.connect.client.records.BloodPressureRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> DIASTOLIC_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> DIASTOLIC_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> DIASTOLIC_MIN;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> SYSTOLIC_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> SYSTOLIC_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> SYSTOLIC_MIN;
-  }
-
-  public static final class BloodPressureRecord.Companion {
-  }
-
-  public static final class BloodPressureRecord.MeasurementLocation {
-    field public static final androidx.health.connect.client.records.BloodPressureRecord.MeasurementLocation INSTANCE;
-    field public static final String LEFT_UPPER_ARM = "left_upper_arm";
-    field public static final String LEFT_WRIST = "left_wrist";
-    field public static final String RIGHT_UPPER_ARM = "right_upper_arm";
-    field public static final String RIGHT_WRIST = "right_wrist";
-  }
-
-  public final class BodyFatRecord implements androidx.health.connect.client.records.Record {
-    ctor public BodyFatRecord(androidx.health.connect.client.units.Percentage percentage, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public androidx.health.connect.client.units.Percentage getPercentage();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final androidx.health.connect.client.units.Percentage percentage;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public final class BodyPosition {
-    field public static final androidx.health.connect.client.records.BodyPosition INSTANCE;
-    field public static final String LYING_DOWN = "lying_down";
-    field public static final String RECLINING = "reclining";
-    field public static final String SITTING_DOWN = "sitting_down";
-    field public static final String STANDING_UP = "standing_up";
-  }
-
-  public final class BodyTemperatureMeasurementLocation {
-    field public static final String ARMPIT = "armpit";
-    field public static final String EAR = "ear";
-    field public static final String FINGER = "finger";
-    field public static final String FOREHEAD = "forehead";
-    field public static final androidx.health.connect.client.records.BodyTemperatureMeasurementLocation INSTANCE;
-    field public static final String MOUTH = "mouth";
-    field public static final String RECTUM = "rectum";
-    field public static final String TEMPORAL_ARTERY = "temporal_artery";
-    field public static final String TOE = "toe";
-    field public static final String VAGINA = "vagina";
-    field public static final String WRIST = "wrist";
-  }
-
-  public final class BodyTemperatureRecord implements androidx.health.connect.client.records.Record {
-    ctor public BodyTemperatureRecord(androidx.health.connect.client.units.Temperature temperature, optional String? measurementLocation, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public String? getMeasurementLocation();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public androidx.health.connect.client.units.Temperature getTemperature();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final String? measurementLocation;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final androidx.health.connect.client.units.Temperature temperature;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public final class BoneMassRecord implements androidx.health.connect.client.records.Record {
-    ctor public BoneMassRecord(androidx.health.connect.client.units.Mass mass, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.units.Mass getMass();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final androidx.health.connect.client.units.Mass mass;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public final class CervicalMucusRecord implements androidx.health.connect.client.records.Record {
-    ctor public CervicalMucusRecord(optional String? appearance, optional String? sensation, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public String? getAppearance();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public String? getSensation();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final String? appearance;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final String? sensation;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public static final class CervicalMucusRecord.Appearance {
-    field public static final String CLEAR = "clear";
-    field public static final String CREAMY = "creamy";
-    field public static final String DRY = "dry";
-    field public static final androidx.health.connect.client.records.CervicalMucusRecord.Appearance INSTANCE;
-    field public static final String STICKY = "sticky";
-    field public static final String WATERY = "watery";
-  }
-
-  public static final class CervicalMucusRecord.Sensation {
-    field public static final String HEAVY = "heavy";
-    field public static final androidx.health.connect.client.records.CervicalMucusRecord.Sensation INSTANCE;
-    field public static final String LIGHT = "light";
-    field public static final String MEDIUM = "medium";
-  }
-
-  public final class CyclingPedalingCadenceRecord implements androidx.health.connect.client.records.Record {
-    ctor public CyclingPedalingCadenceRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.CyclingPedalingCadenceRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.util.List<androidx.health.connect.client.records.CyclingPedalingCadenceRecord.Sample> getSamples();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.util.List<androidx.health.connect.client.records.CyclingPedalingCadenceRecord.Sample> samples;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.records.CyclingPedalingCadenceRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RPM_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RPM_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RPM_MIN;
-  }
-
-  public static final class CyclingPedalingCadenceRecord.Companion {
-  }
-
-  public static final class CyclingPedalingCadenceRecord.Sample {
-    ctor public CyclingPedalingCadenceRecord.Sample(java.time.Instant time, @FloatRange(from=0.0, to=10000.0) double revolutionsPerMinute);
-    method public double getRevolutionsPerMinute();
-    method public java.time.Instant getTime();
-    property public final double revolutionsPerMinute;
-    property public final java.time.Instant time;
-  }
-
-  public final class DistanceRecord implements androidx.health.connect.client.records.Record {
-    ctor public DistanceRecord(androidx.health.connect.client.units.Length distance, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.units.Length getDistance();
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public final androidx.health.connect.client.units.Length distance;
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.records.DistanceRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> DISTANCE_TOTAL;
-  }
-
-  public static final class DistanceRecord.Companion {
-  }
-
-  public final class ElevationGainedRecord implements androidx.health.connect.client.records.Record {
-    ctor public ElevationGainedRecord(androidx.health.connect.client.units.Length elevation, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.units.Length getElevation();
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public final androidx.health.connect.client.units.Length elevation;
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.records.ElevationGainedRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> ELEVATION_GAINED_TOTAL;
-  }
-
-  public static final class ElevationGainedRecord.Companion {
-  }
-
-  public final class ExerciseEventRecord implements androidx.health.connect.client.records.Record {
-    ctor public ExerciseEventRecord(String eventType, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public String getEventType();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public final String eventType;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-  }
-
-  public static final class ExerciseEventRecord.EventType {
-    field public static final androidx.health.connect.client.records.ExerciseEventRecord.EventType INSTANCE;
-    field public static final String PAUSE = "pause";
-    field public static final String REST = "rest";
-  }
-
-  public final class ExerciseLapRecord implements androidx.health.connect.client.records.Record {
-    ctor public ExerciseLapRecord(optional androidx.health.connect.client.units.Length? length, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.units.Length? getLength();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public final androidx.health.connect.client.units.Length? length;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-  }
-
-  public final class ExerciseRepetitionsRecord implements androidx.health.connect.client.records.Record {
-    ctor public ExerciseRepetitionsRecord(long count, String type, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public long getCount();
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    method public String getType();
-    property public final long count;
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    property public final String type;
-  }
-
-  public static final class ExerciseRepetitionsRecord.ExerciseType {
-    field public static final String ARM_CURL = "arm_curl";
-    field public static final String BACK_EXTENSION = "back_extension";
-    field public static final String BALL_SLAM = "ball_slam";
-    field public static final String BENCH_PRESS = "bench_press";
-    field public static final String BURPEE = "burpee";
-    field public static final String CRUNCH = "crunch";
-    field public static final String DEADLIFT = "deadlift";
-    field public static final String DOUBLE_ARM_TRICEPS_EXTENSION = "double_arm_triceps_extension";
-    field public static final String DUMBBELL_ROW = "dumbbell_row";
-    field public static final String FRONT_RAISE = "front_raise";
-    field public static final String HIP_THRUST = "hip_thrust";
-    field public static final String HULA_HOOP = "hula_hoop";
-    field public static final androidx.health.connect.client.records.ExerciseRepetitionsRecord.ExerciseType INSTANCE;
-    field public static final String JUMPING_JACK = "jumping_jack";
-    field public static final String JUMP_ROPE = "jump_rope";
-    field public static final String KETTLEBELL_SWING = "kettlebell_swing";
-    field public static final String LATERAL_RAISE = "lateral_raise";
-    field public static final String LAT_PULL_DOWN = "lat_pull_down";
-    field public static final String LEG_CURL = "leg_curl";
-    field public static final String LEG_EXTENSION = "leg_extension";
-    field public static final String LEG_PRESS = "leg_press";
-    field public static final String LEG_RAISE = "leg_raise";
-    field public static final String LUNGE = "lunge";
-    field public static final String MOUNTAIN_CLIMBER = "mountain_climber";
-    field public static final String PLANK = "plank";
-    field public static final String PULL_UP = "pull_up";
-    field public static final String PUNCH = "punch";
-    field public static final String SHOULDER_PRESS = "shoulder_press";
-    field public static final String SINGLE_ARM_TRICEPS_EXTENSION = "single_arm_triceps_extension";
-    field public static final String SIT_UP = "sit_up";
-    field public static final String SQUAT = "squat";
-  }
-
-  public final class ExerciseSessionRecord implements androidx.health.connect.client.records.Record {
-    ctor public ExerciseSessionRecord(String exerciseType, optional String? title, optional String? notes, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public String getExerciseType();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public String? getNotes();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    method public String? getTitle();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public final String exerciseType;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final String? notes;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    property public final String? title;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.time.Duration> ACTIVE_TIME_TOTAL;
-    field public static final androidx.health.connect.client.records.ExerciseSessionRecord.Companion Companion;
-  }
-
-  public static final class ExerciseSessionRecord.Companion {
-  }
-
-  public static final class ExerciseSessionRecord.ExerciseType {
-    field public static final String BACK_EXTENSION = "back_extension";
-    field public static final String BADMINTON = "badminton";
-    field public static final String BARBELL_SHOULDER_PRESS = "barbell_shoulder_press";
-    field public static final String BASEBALL = "baseball";
-    field public static final String BASKETBALL = "basketball";
-    field public static final String BENCH_PRESS = "bench_press";
-    field public static final String BENCH_SIT_UP = "bench_sit_up";
-    field public static final String BIKING = "biking";
-    field public static final String BIKING_STATIONARY = "biking_stationary";
-    field public static final String BOOT_CAMP = "boot_camp";
-    field public static final String BOXING = "boxing";
-    field public static final String BURPEE = "burpee";
-    field public static final String CALISTHENICS = "calisthenics";
-    field public static final String CRICKET = "cricket";
-    field public static final String CRUNCH = "crunch";
-    field public static final String DANCING = "dancing";
-    field public static final String DEADLIFT = "deadlift";
-    field public static final String DUMBBELL_CURL_LEFT_ARM = "dumbbell_curl_left_arm";
-    field public static final String DUMBBELL_CURL_RIGHT_ARM = "dumbbell_curl_right_arm";
-    field public static final String DUMBBELL_FRONT_RAISE = "dumbbell_front_raise";
-    field public static final String DUMBBELL_LATERAL_RAISE = "dumbbell_lateral_raise";
-    field public static final String DUMBBELL_TRICEPS_EXTENSION_LEFT_ARM = "dumbbell_triceps_extension_left_arm";
-    field public static final String DUMBBELL_TRICEPS_EXTENSION_RIGHT_ARM = "dumbbell_triceps_extension_right_arm";
-    field public static final String DUMBBELL_TRICEPS_EXTENSION_TWO_ARM = "dumbbell_triceps_extension_two_arm";
-    field public static final String ELLIPTICAL = "elliptical";
-    field public static final String EXERCISE_CLASS = "exercise_class";
-    field public static final String FENCING = "fencing";
-    field public static final String FOOTBALL_AMERICAN = "football_american";
-    field public static final String FOOTBALL_AUSTRALIAN = "football_australian";
-    field public static final String FORWARD_TWIST = "forward_twist";
-    field public static final String FRISBEE_DISC = "frisbee_disc";
-    field public static final String GOLF = "golf";
-    field public static final String GUIDED_BREATHING = "guided_breathing";
-    field public static final String GYMNASTICS = "gymnastics";
-    field public static final String HANDBALL = "handball";
-    field public static final String HIGH_INTENSITY_INTERVAL_TRAINING = "high_intensity_interval_training";
-    field public static final String HIKING = "hiking";
-    field public static final String ICE_HOCKEY = "ice_hockey";
-    field public static final String ICE_SKATING = "ice_skating";
-    field public static final androidx.health.connect.client.records.ExerciseSessionRecord.ExerciseType INSTANCE;
-    field public static final String JUMPING_JACK = "jumping_jack";
-    field public static final String JUMP_ROPE = "jump_rope";
-    field public static final String LAT_PULL_DOWN = "lat_pull_down";
-    field public static final String LUNGE = "lunge";
-    field public static final String MARTIAL_ARTS = "martial_arts";
-    field public static final String MEDITATION = "meditation";
-    field public static final String PADDLING = "paddling";
-    field public static final String PARA_GLIDING = "para_gliding";
-    field public static final String PILATES = "pilates";
-    field public static final String PLANK = "plank";
-    field public static final String RACQUETBALL = "racquetball";
-    field public static final String ROCK_CLIMBING = "rock_climbing";
-    field public static final String ROLLER_HOCKEY = "roller_hockey";
-    field public static final String ROWING = "rowing";
-    field public static final String ROWING_MACHINE = "rowing_machine";
-    field public static final String RUGBY = "rugby";
-    field public static final String RUNNING = "running";
-    field public static final String RUNNING_TREADMILL = "running_treadmill";
-    field public static final String SAILING = "sailing";
-    field public static final String SCUBA_DIVING = "scuba_diving";
-    field public static final String SKATING = "skating";
-    field public static final String SKIING = "skiing";
-    field public static final String SNOWBOARDING = "snowboarding";
-    field public static final String SNOWSHOEING = "snowshoeing";
-    field public static final String SOCCER = "soccer";
-    field public static final String SOFTBALL = "softball";
-    field public static final String SQUASH = "squash";
-    field public static final String SQUAT = "squat";
-    field public static final String STAIR_CLIMBING = "stair_climbing";
-    field public static final String STAIR_CLIMBING_MACHINE = "stair_climbing_machine";
-    field public static final String STRENGTH_TRAINING = "strength_training";
-    field public static final String STRETCHING = "stretching";
-    field public static final String SURFING = "surfing";
-    field public static final String SWIMMING_OPEN_WATER = "swimming_open_water";
-    field public static final String SWIMMING_POOL = "swimming_pool";
-    field public static final String TABLE_TENNIS = "table_tennis";
-    field public static final String TENNIS = "tennis";
-    field public static final String UPPER_TWIST = "upper_twist";
-    field public static final String VOLLEYBALL = "volleyball";
-    field public static final String WALKING = "walking";
-    field public static final String WATER_POLO = "water_polo";
-    field public static final String WEIGHTLIFTING = "weightlifting";
-    field public static final String WHEELCHAIR = "wheelchair";
-    field public static final String WORKOUT = "workout";
-    field public static final String YOGA = "yoga";
-  }
-
-  public final class FloorsClimbedRecord implements androidx.health.connect.client.records.Record {
-    ctor public FloorsClimbedRecord(double floors, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public double getFloors();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public final double floors;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.records.FloorsClimbedRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> FLOORS_CLIMBED_TOTAL;
-  }
-
-  public static final class FloorsClimbedRecord.Companion {
-  }
-
-  public final class HeartRateRecord implements androidx.health.connect.client.records.Record {
-    ctor public HeartRateRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.HeartRateRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.util.List<androidx.health.connect.client.records.HeartRateRecord.Sample> getSamples();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.util.List<androidx.health.connect.client.records.HeartRateRecord.Sample> samples;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_MIN;
-    field public static final androidx.health.connect.client.records.HeartRateRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> MEASUREMENTS_COUNT;
-  }
-
-  public static final class HeartRateRecord.Companion {
-  }
-
-  public static final class HeartRateRecord.Sample {
-    ctor public HeartRateRecord.Sample(java.time.Instant time, @IntRange(from=1L, to=300L) long beatsPerMinute);
-    method public long getBeatsPerMinute();
-    method public java.time.Instant getTime();
-    property public final long beatsPerMinute;
-    property public final java.time.Instant time;
-  }
-
-  public final class HeightRecord implements androidx.health.connect.client.records.Record {
-    ctor public HeightRecord(androidx.health.connect.client.units.Length height, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.units.Length getHeight();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final androidx.health.connect.client.units.Length height;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-    field public static final androidx.health.connect.client.records.HeightRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> HEIGHT_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> HEIGHT_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> HEIGHT_MIN;
-  }
-
-  public static final class HeightRecord.Companion {
-  }
-
-  public final class HipCircumferenceRecord implements androidx.health.connect.client.records.Record {
-    ctor public HipCircumferenceRecord(androidx.health.connect.client.units.Length circumference, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.units.Length getCircumference();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final androidx.health.connect.client.units.Length circumference;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public final class HydrationRecord implements androidx.health.connect.client.records.Record {
-    ctor public HydrationRecord(androidx.health.connect.client.units.Volume volume, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    method public androidx.health.connect.client.units.Volume getVolume();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    property public final androidx.health.connect.client.units.Volume volume;
-    field public static final androidx.health.connect.client.records.HydrationRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Volume> VOLUME_TOTAL;
-  }
-
-  public static final class HydrationRecord.Companion {
-  }
-
-  public final class LeanBodyMassRecord implements androidx.health.connect.client.records.Record {
-    ctor public LeanBodyMassRecord(androidx.health.connect.client.units.Mass mass, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.units.Mass getMass();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final androidx.health.connect.client.units.Mass mass;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public final class MealType {
-    field public static final String BREAKFAST = "breakfast";
-    field public static final String DINNER = "dinner";
-    field public static final androidx.health.connect.client.records.MealType INSTANCE;
-    field public static final String LUNCH = "lunch";
-    field public static final String SNACK = "snack";
-    field public static final String UNKNOWN = "unknown";
-  }
-
-  public final class MenstruationRecord implements androidx.health.connect.client.records.Record {
-    ctor public MenstruationRecord(optional String? flow, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public String? getFlow();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final String? flow;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public static final class MenstruationRecord.Flow {
-    field public static final String HEAVY = "heavy";
-    field public static final androidx.health.connect.client.records.MenstruationRecord.Flow INSTANCE;
-    field public static final String LIGHT = "light";
-    field public static final String MEDIUM = "medium";
-    field public static final String SPOTTING = "spotting";
-  }
-
-  public final class NutritionRecord implements androidx.health.connect.client.records.Record {
-    ctor public NutritionRecord(optional androidx.health.connect.client.units.Mass? biotin, optional androidx.health.connect.client.units.Mass? caffeine, optional androidx.health.connect.client.units.Mass? calcium, optional androidx.health.connect.client.units.Energy? energy, optional androidx.health.connect.client.units.Energy? energyFromFat, optional androidx.health.connect.client.units.Mass? chloride, optional androidx.health.connect.client.units.Mass? cholesterol, optional androidx.health.connect.client.units.Mass? chromium, optional androidx.health.connect.client.units.Mass? copper, optional androidx.health.connect.client.units.Mass? dietaryFiber, optional androidx.health.connect.client.units.Mass? folate, optional androidx.health.connect.client.units.Mass? folicAcid, optional androidx.health.connect.client.units.Mass? iodine, optional androidx.health.connect.client.units.Mass? iron, optional androidx.health.connect.client.units.Mass? magnesium, optional androidx.health.connect.client.units.Mass? manganese, optional androidx.health.connect.client.units.Mass? molybdenum, optional androidx.health.connect.client.units.Mass? monounsaturatedFat, optional androidx.health.connect.client.units.Mass? niacin, optional androidx.health.connect.client.units.Mass? pantothenicAcid, optional androidx.health.connect.client.units.Mass? phosphorus, optional androidx.health.connect.client.units.Mass? polyunsaturatedFat, optional androidx.health.connect.client.units.Mass? potassium, optional androidx.health.connect.client.units.Mass? protein, optional androidx.health.connect.client.units.Mass? riboflavin, optional androidx.health.connect.client.units.Mass? saturatedFat, optional androidx.health.connect.client.units.Mass? selenium, optional androidx.health.connect.client.units.Mass? sodium, optional androidx.health.connect.client.units.Mass? sugar, optional androidx.health.connect.client.units.Mass? thiamin, optional androidx.health.connect.client.units.Mass? totalCarbohydrate, optional androidx.health.connect.client.units.Mass? totalFat, optional androidx.health.connect.client.units.Mass? transFat, optional androidx.health.connect.client.units.Mass? unsaturatedFat, optional androidx.health.connect.client.units.Mass? vitaminA, optional androidx.health.connect.client.units.Mass? vitaminB12, optional androidx.health.connect.client.units.Mass? vitaminB6, optional androidx.health.connect.client.units.Mass? vitaminC, optional androidx.health.connect.client.units.Mass? vitaminD, optional androidx.health.connect.client.units.Mass? vitaminE, optional androidx.health.connect.client.units.Mass? vitaminK, optional androidx.health.connect.client.units.Mass? zinc, optional String? name, optional String? mealType, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.units.Mass? getBiotin();
-    method public androidx.health.connect.client.units.Mass? getCaffeine();
-    method public androidx.health.connect.client.units.Mass? getCalcium();
-    method public androidx.health.connect.client.units.Mass? getChloride();
-    method public androidx.health.connect.client.units.Mass? getCholesterol();
-    method public androidx.health.connect.client.units.Mass? getChromium();
-    method public androidx.health.connect.client.units.Mass? getCopper();
-    method public androidx.health.connect.client.units.Mass? getDietaryFiber();
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.units.Energy? getEnergy();
-    method public androidx.health.connect.client.units.Energy? getEnergyFromFat();
-    method public androidx.health.connect.client.units.Mass? getFolate();
-    method public androidx.health.connect.client.units.Mass? getFolicAcid();
-    method public androidx.health.connect.client.units.Mass? getIodine();
-    method public androidx.health.connect.client.units.Mass? getIron();
-    method public androidx.health.connect.client.units.Mass? getMagnesium();
-    method public androidx.health.connect.client.units.Mass? getManganese();
-    method public String? getMealType();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public androidx.health.connect.client.units.Mass? getMolybdenum();
-    method public androidx.health.connect.client.units.Mass? getMonounsaturatedFat();
-    method public String? getName();
-    method public androidx.health.connect.client.units.Mass? getNiacin();
-    method public androidx.health.connect.client.units.Mass? getPantothenicAcid();
-    method public androidx.health.connect.client.units.Mass? getPhosphorus();
-    method public androidx.health.connect.client.units.Mass? getPolyunsaturatedFat();
-    method public androidx.health.connect.client.units.Mass? getPotassium();
-    method public androidx.health.connect.client.units.Mass? getProtein();
-    method public androidx.health.connect.client.units.Mass? getRiboflavin();
-    method public androidx.health.connect.client.units.Mass? getSaturatedFat();
-    method public androidx.health.connect.client.units.Mass? getSelenium();
-    method public androidx.health.connect.client.units.Mass? getSodium();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    method public androidx.health.connect.client.units.Mass? getSugar();
-    method public androidx.health.connect.client.units.Mass? getThiamin();
-    method public androidx.health.connect.client.units.Mass? getTotalCarbohydrate();
-    method public androidx.health.connect.client.units.Mass? getTotalFat();
-    method public androidx.health.connect.client.units.Mass? getTransFat();
-    method public androidx.health.connect.client.units.Mass? getUnsaturatedFat();
-    method public androidx.health.connect.client.units.Mass? getVitaminA();
-    method public androidx.health.connect.client.units.Mass? getVitaminB12();
-    method public androidx.health.connect.client.units.Mass? getVitaminB6();
-    method public androidx.health.connect.client.units.Mass? getVitaminC();
-    method public androidx.health.connect.client.units.Mass? getVitaminD();
-    method public androidx.health.connect.client.units.Mass? getVitaminE();
-    method public androidx.health.connect.client.units.Mass? getVitaminK();
-    method public androidx.health.connect.client.units.Mass? getZinc();
-    property public final androidx.health.connect.client.units.Mass? biotin;
-    property public final androidx.health.connect.client.units.Mass? caffeine;
-    property public final androidx.health.connect.client.units.Mass? calcium;
-    property public final androidx.health.connect.client.units.Mass? chloride;
-    property public final androidx.health.connect.client.units.Mass? cholesterol;
-    property public final androidx.health.connect.client.units.Mass? chromium;
-    property public final androidx.health.connect.client.units.Mass? copper;
-    property public final androidx.health.connect.client.units.Mass? dietaryFiber;
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public final androidx.health.connect.client.units.Energy? energy;
-    property public final androidx.health.connect.client.units.Energy? energyFromFat;
-    property public final androidx.health.connect.client.units.Mass? folate;
-    property public final androidx.health.connect.client.units.Mass? folicAcid;
-    property public final androidx.health.connect.client.units.Mass? iodine;
-    property public final androidx.health.connect.client.units.Mass? iron;
-    property public final androidx.health.connect.client.units.Mass? magnesium;
-    property public final androidx.health.connect.client.units.Mass? manganese;
-    property public final String? mealType;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final androidx.health.connect.client.units.Mass? molybdenum;
-    property public final androidx.health.connect.client.units.Mass? monounsaturatedFat;
-    property public final String? name;
-    property public final androidx.health.connect.client.units.Mass? niacin;
-    property public final androidx.health.connect.client.units.Mass? pantothenicAcid;
-    property public final androidx.health.connect.client.units.Mass? phosphorus;
-    property public final androidx.health.connect.client.units.Mass? polyunsaturatedFat;
-    property public final androidx.health.connect.client.units.Mass? potassium;
-    property public final androidx.health.connect.client.units.Mass? protein;
-    property public final androidx.health.connect.client.units.Mass? riboflavin;
-    property public final androidx.health.connect.client.units.Mass? saturatedFat;
-    property public final androidx.health.connect.client.units.Mass? selenium;
-    property public final androidx.health.connect.client.units.Mass? sodium;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    property public final androidx.health.connect.client.units.Mass? sugar;
-    property public final androidx.health.connect.client.units.Mass? thiamin;
-    property public final androidx.health.connect.client.units.Mass? totalCarbohydrate;
-    property public final androidx.health.connect.client.units.Mass? totalFat;
-    property public final androidx.health.connect.client.units.Mass? transFat;
-    property public final androidx.health.connect.client.units.Mass? unsaturatedFat;
-    property public final androidx.health.connect.client.units.Mass? vitaminA;
-    property public final androidx.health.connect.client.units.Mass? vitaminB12;
-    property public final androidx.health.connect.client.units.Mass? vitaminB6;
-    property public final androidx.health.connect.client.units.Mass? vitaminC;
-    property public final androidx.health.connect.client.units.Mass? vitaminD;
-    property public final androidx.health.connect.client.units.Mass? vitaminE;
-    property public final androidx.health.connect.client.units.Mass? vitaminK;
-    property public final androidx.health.connect.client.units.Mass? zinc;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> BIOTIN_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CAFFEINE_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CALCIUM_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CHLORIDE_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CHOLESTEROL_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CHROMIUM_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> COPPER_TOTAL;
-    field public static final androidx.health.connect.client.records.NutritionRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> DIETARY_FIBER_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> ENERGY_FROM_FAT_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> ENERGY_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> FOLATE_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> FOLIC_ACID_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> IODINE_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> IRON_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> MAGNESIUM_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> MANGANESE_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> MOLYBDENUM_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> MONOUNSATURATED_FAT_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> NIACIN_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> PANTOTHENIC_ACID_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> PHOSPHORUS_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> POLYUNSATURATED_FAT_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> POTASSIUM_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> PROTEIN_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> RIBOFLAVIN_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> SATURATED_FAT_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> SELENIUM_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> SODIUM_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> SUGAR_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> THIAMIN_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> TOTAL_CARBOHYDRATE_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> TOTAL_FAT_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> TRANS_FAT_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> UNSATURATED_FAT_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_A_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_B12_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_B6_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_C_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_D_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_E_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_K_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> ZINC_TOTAL;
-  }
-
-  public static final class NutritionRecord.Companion {
-  }
-
-  public final class OvulationTestRecord implements androidx.health.connect.client.records.Record {
-    ctor public OvulationTestRecord(String result, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public String getResult();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final String result;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public static final class OvulationTestRecord.Result {
-    field public static final String HIGH = "high";
-    field public static final String INCONCLUSIVE = "inconclusive";
-    field public static final androidx.health.connect.client.records.OvulationTestRecord.Result INSTANCE;
-    field public static final String NEGATIVE = "negative";
-    field public static final String POSITIVE = "positive";
-  }
-
-  public final class OxygenSaturationRecord implements androidx.health.connect.client.records.Record {
-    ctor public OxygenSaturationRecord(androidx.health.connect.client.units.Percentage percentage, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public androidx.health.connect.client.units.Percentage getPercentage();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final androidx.health.connect.client.units.Percentage percentage;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public final class PowerRecord implements androidx.health.connect.client.records.Record {
-    ctor public PowerRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.PowerRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.util.List<androidx.health.connect.client.records.PowerRecord.Sample> getSamples();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.util.List<androidx.health.connect.client.records.PowerRecord.Sample> samples;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.records.PowerRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Power> POWER_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Power> POWER_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Power> POWER_MIN;
-  }
-
-  public static final class PowerRecord.Companion {
-  }
-
-  public static final class PowerRecord.Sample {
-    ctor public PowerRecord.Sample(java.time.Instant time, androidx.health.connect.client.units.Power power);
-    method public androidx.health.connect.client.units.Power getPower();
-    method public java.time.Instant getTime();
-    property public final androidx.health.connect.client.units.Power power;
-    property public final java.time.Instant time;
-  }
-
-  public interface Record {
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    property public abstract androidx.health.connect.client.records.metadata.Metadata metadata;
-  }
-
-  public final class RelationToMeal {
-    field public static final String AFTER_MEAL = "after_meal";
-    field public static final String BEFORE_MEAL = "before_meal";
-    field public static final String FASTING = "fasting";
-    field public static final String GENERAL = "general";
-    field public static final androidx.health.connect.client.records.RelationToMeal INSTANCE;
-  }
-
-  public final class RespiratoryRateRecord implements androidx.health.connect.client.records.Record {
-    ctor public RespiratoryRateRecord(double rate, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public double getRate();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final double rate;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public final class RestingHeartRateRecord implements androidx.health.connect.client.records.Record {
-    ctor public RestingHeartRateRecord(long beatsPerMinute, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public long getBeatsPerMinute();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final long beatsPerMinute;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_MIN;
-    field public static final androidx.health.connect.client.records.RestingHeartRateRecord.Companion Companion;
-  }
-
-  public static final class RestingHeartRateRecord.Companion {
-  }
-
-  public final class SexualActivityRecord implements androidx.health.connect.client.records.Record {
-    ctor public SexualActivityRecord(optional String? protectionUsed, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public String? getProtectionUsed();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final String? protectionUsed;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public static final class SexualActivityRecord.Protection {
-    field public static final androidx.health.connect.client.records.SexualActivityRecord.Protection INSTANCE;
-    field public static final String PROTECTED = "protected";
-    field public static final String UNPROTECTED = "unprotected";
-  }
-
-  public final class SleepSessionRecord implements androidx.health.connect.client.records.Record {
-    ctor public SleepSessionRecord(optional String? title, optional String? notes, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public String? getNotes();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    method public String? getTitle();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final String? notes;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    property public final String? title;
-    field public static final androidx.health.connect.client.records.SleepSessionRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.time.Duration> SLEEP_DURATION_TOTAL;
-  }
-
-  public static final class SleepSessionRecord.Companion {
-  }
-
-  public final class SleepStageRecord implements androidx.health.connect.client.records.Record {
-    ctor public SleepStageRecord(String stage, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public String getStage();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final String stage;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-  }
-
-  public static final class SleepStageRecord.StageType {
-    field public static final String AWAKE = "awake";
-    field public static final String DEEP = "deep";
-    field public static final androidx.health.connect.client.records.SleepStageRecord.StageType INSTANCE;
-    field public static final String LIGHT = "light";
-    field public static final String OUT_OF_BED = "out_of_bed";
-    field public static final String REM = "rem";
-    field public static final String SLEEPING = "sleeping";
-    field public static final String UNKNOWN = "unknown";
-  }
-
-  public final class SpeedRecord implements androidx.health.connect.client.records.Record {
-    ctor public SpeedRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.SpeedRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.util.List<androidx.health.connect.client.records.SpeedRecord.Sample> getSamples();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.util.List<androidx.health.connect.client.records.SpeedRecord.Sample> samples;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.records.SpeedRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Velocity> SPEED_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Velocity> SPEED_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Velocity> SPEED_MIN;
-  }
-
-  public static final class SpeedRecord.Companion {
-  }
-
-  public static final class SpeedRecord.Sample {
-    ctor public SpeedRecord.Sample(java.time.Instant time, androidx.health.connect.client.units.Velocity speed);
-    method public androidx.health.connect.client.units.Velocity getSpeed();
-    method public java.time.Instant getTime();
-    property public final androidx.health.connect.client.units.Velocity speed;
-    property public final java.time.Instant time;
-  }
-
-  public final class StepsCadenceRecord implements androidx.health.connect.client.records.Record {
-    ctor public StepsCadenceRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.StepsCadenceRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.util.List<androidx.health.connect.client.records.StepsCadenceRecord.Sample> getSamples();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.util.List<androidx.health.connect.client.records.StepsCadenceRecord.Sample> samples;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.records.StepsCadenceRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RATE_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RATE_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RATE_MIN;
-  }
-
-  public static final class StepsCadenceRecord.Companion {
-  }
-
-  public static final class StepsCadenceRecord.Sample {
-    ctor public StepsCadenceRecord.Sample(java.time.Instant time, @FloatRange(from=0.0, to=10000.0) double rate);
-    method public double getRate();
-    method public java.time.Instant getTime();
-    property public final double rate;
-    property public final java.time.Instant time;
-  }
-
-  public final class StepsRecord implements androidx.health.connect.client.records.Record {
-    ctor public StepsRecord(long count, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public long getCount();
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public final long count;
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> COUNT_TOTAL;
-    field public static final androidx.health.connect.client.records.StepsRecord.Companion Companion;
-  }
-
-  public static final class StepsRecord.Companion {
-  }
-
-  public final class SwimmingStrokesRecord implements androidx.health.connect.client.records.Record {
-    ctor public SwimmingStrokesRecord(optional long count, String type, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public long getCount();
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    method public String getType();
-    property public final long count;
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    property public final String type;
-  }
-
-  public static final class SwimmingStrokesRecord.SwimmingType {
-    field public static final String BACKSTROKE = "backstroke";
-    field public static final String BREASTSTROKE = "breaststroke";
-    field public static final String BUTTERFLY = "butterfly";
-    field public static final String FREESTYLE = "freestyle";
-    field public static final androidx.health.connect.client.records.SwimmingStrokesRecord.SwimmingType INSTANCE;
-    field public static final String MIXED = "mixed";
-    field public static final String OTHER = "other";
-  }
-
-  public final class TotalCaloriesBurnedRecord implements androidx.health.connect.client.records.Record {
-    ctor public TotalCaloriesBurnedRecord(androidx.health.connect.client.units.Energy energy, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.units.Energy getEnergy();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public final androidx.health.connect.client.units.Energy energy;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.records.TotalCaloriesBurnedRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> ENERGY_TOTAL;
-  }
-
-  public static final class TotalCaloriesBurnedRecord.Companion {
-  }
-
-  public final class Vo2MaxRecord implements androidx.health.connect.client.records.Record {
-    ctor public Vo2MaxRecord(double vo2MillilitersPerMinuteKilogram, optional String? measurementMethod, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public String? getMeasurementMethod();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public double getVo2MillilitersPerMinuteKilogram();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final String? measurementMethod;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public final double vo2MillilitersPerMinuteKilogram;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public static final class Vo2MaxRecord.MeasurementMethod {
-    field public static final String COOPER_TEST = "cooper_test";
-    field public static final String HEART_RATE_RATIO = "heart_rate_ratio";
-    field public static final androidx.health.connect.client.records.Vo2MaxRecord.MeasurementMethod INSTANCE;
-    field public static final String METABOLIC_CART = "metabolic_cart";
-    field public static final String MULTISTAGE_FITNESS_TEST = "multistage_fitness_test";
-    field public static final String OTHER = "other";
-    field public static final String ROCKPORT_FITNESS_TEST = "rockport_fitness_test";
-  }
-
-  public final class WaistCircumferenceRecord implements androidx.health.connect.client.records.Record {
-    ctor public WaistCircumferenceRecord(androidx.health.connect.client.units.Length circumference, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.units.Length getCircumference();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final androidx.health.connect.client.units.Length circumference;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public final class WeightRecord implements androidx.health.connect.client.records.Record {
-    ctor public WeightRecord(androidx.health.connect.client.units.Mass weight, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public androidx.health.connect.client.units.Mass getWeight();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public final androidx.health.connect.client.units.Mass weight;
-    property public java.time.ZoneOffset? zoneOffset;
-    field public static final androidx.health.connect.client.records.WeightRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> WEIGHT_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> WEIGHT_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> WEIGHT_MIN;
-  }
-
-  public static final class WeightRecord.Companion {
-  }
-
-  public final class WheelchairPushesRecord implements androidx.health.connect.client.records.Record {
-    ctor public WheelchairPushesRecord(long count, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public long getCount();
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public final long count;
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> COUNT_TOTAL;
-    field public static final androidx.health.connect.client.records.WheelchairPushesRecord.Companion Companion;
-  }
-
-  public static final class WheelchairPushesRecord.Companion {
-  }
-
-}
-
-package androidx.health.connect.client.records.metadata {
-
-  public final class DataOrigin {
-    ctor public DataOrigin(String packageName);
-    method public String getPackageName();
-    property public final String packageName;
-  }
-
-  public final class Device {
-    ctor public Device(optional String? manufacturer, optional String? model, optional String? type);
-    method public String? getManufacturer();
-    method public String? getModel();
-    method public String? getType();
-    property public final String? manufacturer;
-    property public final String? model;
-    property public final String? type;
-  }
-
-  public final class DeviceTypes {
-    field public static final String CHEST_STRAP = "CHEST_STRAP";
-    field public static final String FITNESS_BAND = "FITNESS_BAND";
-    field public static final String HEAD_MOUNTED = "HEAD_MOUNTED";
-    field public static final androidx.health.connect.client.records.metadata.DeviceTypes INSTANCE;
-    field public static final String PHONE = "PHONE";
-    field public static final String RING = "RING";
-    field public static final String SCALE = "SCALE";
-    field public static final String SMART_DISPLAY = "SMART_DISPLAY";
-    field public static final String UNKNOWN = "UNKNOWN";
-    field public static final String WATCH = "WATCH";
-  }
-
-  public final class Metadata {
-    ctor public Metadata(optional String? uid, optional androidx.health.connect.client.records.metadata.DataOrigin dataOrigin, optional java.time.Instant lastModifiedTime, optional String? clientId, optional long clientVersion, optional androidx.health.connect.client.records.metadata.Device? device);
-    method public String? getClientId();
-    method public long getClientVersion();
-    method public androidx.health.connect.client.records.metadata.DataOrigin getDataOrigin();
-    method public androidx.health.connect.client.records.metadata.Device? getDevice();
-    method public java.time.Instant getLastModifiedTime();
-    method public String? getUid();
-    property public final String? clientId;
-    property public final long clientVersion;
-    property public final androidx.health.connect.client.records.metadata.DataOrigin dataOrigin;
-    property public final androidx.health.connect.client.records.metadata.Device? device;
-    property public final java.time.Instant lastModifiedTime;
-    property public final String? uid;
-  }
-
-}
-
-package androidx.health.connect.client.request {
-
-  public final class AggregateGroupByDurationRequest {
-    ctor public AggregateGroupByDurationRequest(java.util.Set<? extends androidx.health.connect.client.aggregate.AggregateMetric<?>> metrics, androidx.health.connect.client.time.TimeRangeFilter timeRangeFilter, java.time.Duration timeRangeSlicer, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilter);
-  }
-
-  public final class AggregateGroupByPeriodRequest {
-    ctor public AggregateGroupByPeriodRequest(java.util.Set<? extends androidx.health.connect.client.aggregate.AggregateMetric<?>> metrics, androidx.health.connect.client.time.TimeRangeFilter timeRangeFilter, java.time.Period timeRangeSlicer, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilter);
-  }
-
-  public final class AggregateRequest {
-    ctor public AggregateRequest(java.util.Set<? extends androidx.health.connect.client.aggregate.AggregateMetric<?>> metrics, androidx.health.connect.client.time.TimeRangeFilter timeRangeFilter, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilter);
-  }
-
-  public final class ChangesTokenRequest {
-    ctor public ChangesTokenRequest(java.util.Set<? extends kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record>> recordTypes, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilters);
-  }
-
-  public final class ReadRecordsRequest<T extends androidx.health.connect.client.records.Record> {
-    ctor public ReadRecordsRequest(kotlin.reflect.KClass<T> recordType, androidx.health.connect.client.time.TimeRangeFilter timeRangeFilter, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilter, optional boolean ascendingOrder, optional int pageSize, optional String? pageToken);
-  }
-
-}
-
-package androidx.health.connect.client.response {
-
-  public final class ChangesResponse {
-    method public java.util.List<androidx.health.connect.client.changes.Change> getChanges();
-    method public boolean getChangesTokenExpired();
-    method public boolean getHasMore();
-    method public String getNextChangesToken();
-    property public final java.util.List<androidx.health.connect.client.changes.Change> changes;
-    property public final boolean changesTokenExpired;
-    property public final boolean hasMore;
-    property public final String nextChangesToken;
-  }
-
-  public final class InsertRecordsResponse {
-    method public java.util.List<java.lang.String> getRecordUidsList();
-    property public final java.util.List<java.lang.String> recordUidsList;
-  }
-
-  public final class ReadRecordResponse<T extends androidx.health.connect.client.records.Record> {
-    method public T getRecord();
-    property public final T record;
-  }
-
-  public final class ReadRecordsResponse<T extends androidx.health.connect.client.records.Record> {
-    method public String? getPageToken();
-    method public java.util.List<T> getRecords();
-    property public final String? pageToken;
-    property public final java.util.List<T> records;
-  }
-
-}
-
-package androidx.health.connect.client.time {
-
-  public final class TimeRangeFilter {
-    method public static androidx.health.connect.client.time.TimeRangeFilter after(java.time.Instant startTime);
-    method public static androidx.health.connect.client.time.TimeRangeFilter after(java.time.LocalDateTime startTime);
-    method public static androidx.health.connect.client.time.TimeRangeFilter before(java.time.Instant endTime);
-    method public static androidx.health.connect.client.time.TimeRangeFilter before(java.time.LocalDateTime endTime);
-    method public static androidx.health.connect.client.time.TimeRangeFilter between(java.time.Instant startTime, java.time.Instant endTime);
-    method public static androidx.health.connect.client.time.TimeRangeFilter between(java.time.LocalDateTime startTime, java.time.LocalDateTime endTime);
-    field public static final androidx.health.connect.client.time.TimeRangeFilter.Companion Companion;
-  }
-
-  public static final class TimeRangeFilter.Companion {
-    method public androidx.health.connect.client.time.TimeRangeFilter after(java.time.Instant startTime);
-    method public androidx.health.connect.client.time.TimeRangeFilter after(java.time.LocalDateTime startTime);
-    method public androidx.health.connect.client.time.TimeRangeFilter before(java.time.Instant endTime);
-    method public androidx.health.connect.client.time.TimeRangeFilter before(java.time.LocalDateTime endTime);
-    method public androidx.health.connect.client.time.TimeRangeFilter between(java.time.Instant startTime, java.time.Instant endTime);
-    method public androidx.health.connect.client.time.TimeRangeFilter between(java.time.LocalDateTime startTime, java.time.LocalDateTime endTime);
-  }
-
-}
-
-package androidx.health.connect.client.units {
-
-  public final class Energy implements java.lang.Comparable<androidx.health.connect.client.units.Energy> {
-    method public static androidx.health.connect.client.units.Energy calories(double value);
-    method public int compareTo(androidx.health.connect.client.units.Energy other);
-    method public double getCalories();
-    method public double getJoules();
-    method public double getKilocalories();
-    method public double getKilojoules();
-    method public static androidx.health.connect.client.units.Energy joules(double value);
-    method public static androidx.health.connect.client.units.Energy kilocalories(double value);
-    method public static androidx.health.connect.client.units.Energy kilojoules(double value);
-    property public final double inCalories;
-    property public final double inJoules;
-    property public final double inKilocalories;
-    property public final double inKilojoules;
-    field public static final androidx.health.connect.client.units.Energy.Companion Companion;
-  }
-
-  public static final class Energy.Companion {
-    method public androidx.health.connect.client.units.Energy calories(double value);
-    method public androidx.health.connect.client.units.Energy joules(double value);
-    method public androidx.health.connect.client.units.Energy kilocalories(double value);
-    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);
-    method public double getFeet();
-    method public double getInches();
-    method public double getKilometers();
-    method public double getMeters();
-    method public double getMiles();
-    method public static androidx.health.connect.client.units.Length inches(double value);
-    method public static androidx.health.connect.client.units.Length kilometers(double value);
-    method public static androidx.health.connect.client.units.Length meters(double value);
-    method public static androidx.health.connect.client.units.Length miles(double value);
-    property public final double inFeet;
-    property public final double inInches;
-    property public final double inKilometers;
-    property public final double inMeters;
-    property public final double inMiles;
-    field public static final androidx.health.connect.client.units.Length.Companion Companion;
-  }
-
-  public static final class Length.Companion {
-    method public androidx.health.connect.client.units.Length feet(double value);
-    method public androidx.health.connect.client.units.Length inches(double value);
-    method public androidx.health.connect.client.units.Length kilometers(double value);
-    method public androidx.health.connect.client.units.Length meters(double value);
-    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();
-    method public double getKilograms();
-    method public double getMicrograms();
-    method public double getMilligrams();
-    method public double getOunces();
-    method public static androidx.health.connect.client.units.Mass grams(double value);
-    method public static androidx.health.connect.client.units.Mass kilograms(double value);
-    method public static androidx.health.connect.client.units.Mass micrograms(double value);
-    method public static androidx.health.connect.client.units.Mass milligrams(double value);
-    method public static androidx.health.connect.client.units.Mass ounces(double value);
-    property public final double inGrams;
-    property public final double inKilograms;
-    property public final double inMicrograms;
-    property public final double inMilligrams;
-    property public final double inOunces;
-    field public static final androidx.health.connect.client.units.Mass.Companion Companion;
-  }
-
-  public static final class Mass.Companion {
-    method public androidx.health.connect.client.units.Mass grams(double value);
-    method public androidx.health.connect.client.units.Mass kilograms(double value);
-    method public androidx.health.connect.client.units.Mass micrograms(double value);
-    method public androidx.health.connect.client.units.Mass milligrams(double value);
-    method public androidx.health.connect.client.units.Mass ounces(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);
-    method public double getValue();
-    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();
-    method public double getWatts();
-    method public static androidx.health.connect.client.units.Power kilocaloriesPerDay(double value);
-    method public static androidx.health.connect.client.units.Power watts(double value);
-    property public final double inKilocaloriesPerDay;
-    property public final double inWatts;
-    field public static final androidx.health.connect.client.units.Power.Companion Companion;
-  }
-
-  public static final class Power.Companion {
-    method public androidx.health.connect.client.units.Power kilocaloriesPerDay(double value);
-    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();
-    method public static androidx.health.connect.client.units.Pressure millimetersOfMercury(double value);
-    property public final double inMillimetersOfMercury;
-    field public static final androidx.health.connect.client.units.Pressure.Companion Companion;
-  }
-
-  public static final class Pressure.Companion {
-    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);
-    method public static androidx.health.connect.client.units.Temperature fahrenheit(double value);
-    method public double getCelsius();
-    method public double getFahrenheit();
-    property public final double inCelsius;
-    property public final double inFahrenheit;
-    field public static final androidx.health.connect.client.units.Temperature.Companion Companion;
-  }
-
-  public static final class Temperature.Companion {
-    method public androidx.health.connect.client.units.Temperature celsius(double value);
-    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();
-    method public double getMetersPerSecond();
-    method public double getMilesPerHour();
-    method public static androidx.health.connect.client.units.Velocity kilometersPerHour(double value);
-    method public static androidx.health.connect.client.units.Velocity metersPerSecond(double value);
-    method public static androidx.health.connect.client.units.Velocity milesPerHour(double value);
-    property public final double inKilometersPerHour;
-    property public final double inMetersPerSecond;
-    property public final double inMilesPerHour;
-    field public static final androidx.health.connect.client.units.Velocity.Companion Companion;
-  }
-
-  public static final class Velocity.Companion {
-    method public androidx.health.connect.client.units.Velocity kilometersPerHour(double value);
-    method public androidx.health.connect.client.units.Velocity metersPerSecond(double value);
-    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);
-    method public double getFluidOuncesUs();
-    method public double getLiters();
-    method public double getMilliliters();
-    method public static androidx.health.connect.client.units.Volume liters(double value);
-    method public static androidx.health.connect.client.units.Volume milliliters(double value);
-    property public final double inFluidOuncesUs;
-    property public final double inLiters;
-    property public final double inMilliliters;
-    field public static final androidx.health.connect.client.units.Volume.Companion Companion;
-  }
-
-  public static final class Volume.Companion {
-    method public androidx.health.connect.client.units.Volume fluidOuncesUs(double value);
-    method public androidx.health.connect.client.units.Volume liters(double value);
-    method public androidx.health.connect.client.units.Volume milliliters(double value);
-  }
-
-  public final class VolumeKt {
-  }
-
-}
-
diff --git a/health/health-connect-client/api/public_plus_experimental_current.txt b/health/health-connect-client/api/public_plus_experimental_current.txt
deleted file mode 100644
index 177a7c2..0000000
--- a/health/health-connect-client/api/public_plus_experimental_current.txt
+++ /dev/null
@@ -1,1603 +0,0 @@
-// Signature format: 4.0
-package androidx.health.connect.client {
-
-  public interface HealthConnectClient {
-    method public suspend Object? aggregate(androidx.health.connect.client.request.AggregateRequest request, kotlin.coroutines.Continuation<? super androidx.health.connect.client.aggregate.AggregationResult>);
-    method public suspend Object? aggregateGroupByDuration(androidx.health.connect.client.request.AggregateGroupByDurationRequest request, kotlin.coroutines.Continuation<? super java.util.List<? extends androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration>>);
-    method public suspend Object? aggregateGroupByPeriod(androidx.health.connect.client.request.AggregateGroupByPeriodRequest request, kotlin.coroutines.Continuation<? super java.util.List<? extends androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod>>);
-    method public suspend Object? deleteRecords(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType, java.util.List<java.lang.String> uidsList, java.util.List<java.lang.String> clientIdsList, kotlin.coroutines.Continuation<? super kotlin.Unit>);
-    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 androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context, optional java.util.List<java.lang.String> packageNames);
-    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 isAvailable(android.content.Context context, optional java.util.List<java.lang.String> packageNames);
-    method public default static boolean isAvailable(android.content.Context context);
-    method public suspend <T extends androidx.health.connect.client.records.Record> Object? readRecord(kotlin.reflect.KClass<T> recordType, String uid, 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 suspend Object? updateRecords(java.util.List<? extends androidx.health.connect.client.records.Record> records, kotlin.coroutines.Continuation<? super kotlin.Unit>);
-    property public abstract androidx.health.connect.client.PermissionController permissionController;
-    field public static final androidx.health.connect.client.HealthConnectClient.Companion Companion;
-  }
-
-  public static final class HealthConnectClient.Companion {
-    method public androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context, optional java.util.List<java.lang.String> packageNames);
-    method public androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context);
-    method public boolean isAvailable(android.content.Context context, optional java.util.List<java.lang.String> packageNames);
-    method public boolean isAvailable(android.content.Context context);
-  }
-
-  public interface PermissionController {
-    method public androidx.activity.result.contract.ActivityResultContract<java.util.Set<androidx.health.connect.client.permission.HealthPermission>,java.util.Set<androidx.health.connect.client.permission.HealthPermission>> createRequestPermissionActivityContract();
-    method public suspend Object? getGrantedPermissions(java.util.Set<androidx.health.connect.client.permission.HealthPermission> permissions, kotlin.coroutines.Continuation<? super java.util.Set<? extends androidx.health.connect.client.permission.HealthPermission>>);
-    method public suspend Object? revokeAllPermissions(kotlin.coroutines.Continuation<? super kotlin.Unit>);
-  }
-
-}
-
-package androidx.health.connect.client.aggregate {
-
-  public final class AggregateMetric<T> {
-  }
-
-  public final class AggregationResult {
-    method public operator boolean contains(androidx.health.connect.client.aggregate.AggregateMetric<?> metric);
-    method public operator <T> T? get(androidx.health.connect.client.aggregate.AggregateMetric<? extends T> metric);
-    method public java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> getDataOrigins();
-    method @Deprecated public <T> T? getMetric(androidx.health.connect.client.aggregate.AggregateMetric<? extends T> metric);
-    method @Deprecated public boolean hasMetric(androidx.health.connect.client.aggregate.AggregateMetric<?> metric);
-    property public final java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOrigins;
-  }
-
-  public final class AggregationResultGroupedByDuration {
-    method public java.time.Instant getEndTime();
-    method public androidx.health.connect.client.aggregate.AggregationResult getResult();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset getZoneOffset();
-    property public final java.time.Instant endTime;
-    property public final androidx.health.connect.client.aggregate.AggregationResult result;
-    property public final java.time.Instant startTime;
-    property public final java.time.ZoneOffset zoneOffset;
-  }
-
-  public final class AggregationResultGroupedByPeriod {
-    method public java.time.LocalDateTime getEndTime();
-    method public androidx.health.connect.client.aggregate.AggregationResult getResult();
-    method public java.time.LocalDateTime getStartTime();
-    property public final java.time.LocalDateTime endTime;
-    property public final androidx.health.connect.client.aggregate.AggregationResult result;
-    property public final java.time.LocalDateTime startTime;
-  }
-
-}
-
-package androidx.health.connect.client.changes {
-
-  public interface Change {
-  }
-
-  public final class DeletionChange implements androidx.health.connect.client.changes.Change {
-    method public String getUid();
-    property public final String uid;
-  }
-
-  public final class UpsertionChange implements androidx.health.connect.client.changes.Change {
-    method public androidx.health.connect.client.records.Record getRecord();
-    property public final androidx.health.connect.client.records.Record record;
-  }
-
-}
-
-package androidx.health.connect.client.permission {
-
-  public final class HealthDataRequestPermissionsKt {
-  }
-
-  public final class HealthPermission {
-    method public static androidx.health.connect.client.permission.HealthPermission createReadPermission(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType);
-    method public static androidx.health.connect.client.permission.HealthPermission createWritePermission(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType);
-    field public static final androidx.health.connect.client.permission.HealthPermission.Companion Companion;
-  }
-
-  public static final class HealthPermission.Companion {
-    method public androidx.health.connect.client.permission.HealthPermission createReadPermission(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType);
-    method public androidx.health.connect.client.permission.HealthPermission createWritePermission(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType);
-  }
-
-}
-
-package androidx.health.connect.client.records {
-
-  public final class ActiveCaloriesBurnedRecord implements androidx.health.connect.client.records.Record {
-    ctor public ActiveCaloriesBurnedRecord(androidx.health.connect.client.units.Energy energy, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.units.Energy getEnergy();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public final androidx.health.connect.client.units.Energy energy;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> ACTIVE_CALORIES_TOTAL;
-    field public static final androidx.health.connect.client.records.ActiveCaloriesBurnedRecord.Companion Companion;
-  }
-
-  public static final class ActiveCaloriesBurnedRecord.Companion {
-  }
-
-  public final class BasalBodyTemperatureRecord implements androidx.health.connect.client.records.Record {
-    ctor public BasalBodyTemperatureRecord(androidx.health.connect.client.units.Temperature temperature, optional String? measurementLocation, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public String? getMeasurementLocation();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public androidx.health.connect.client.units.Temperature getTemperature();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final String? measurementLocation;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final androidx.health.connect.client.units.Temperature temperature;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public final class BasalMetabolicRateRecord implements androidx.health.connect.client.records.Record {
-    ctor public BasalMetabolicRateRecord(androidx.health.connect.client.units.Power basalMetabolicRate, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.units.Power getBasalMetabolicRate();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final androidx.health.connect.client.units.Power basalMetabolicRate;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> BASAL_CALORIES_TOTAL;
-    field public static final androidx.health.connect.client.records.BasalMetabolicRateRecord.Companion Companion;
-  }
-
-  public static final class BasalMetabolicRateRecord.Companion {
-  }
-
-  public final class BloodGlucoseRecord implements androidx.health.connect.client.records.Record {
-    ctor public BloodGlucoseRecord(double levelMillimolesPerLiter, optional String? specimenSource, optional String? mealType, optional String? relationToMeal, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public double getLevelMillimolesPerLiter();
-    method public String? getMealType();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public String? getRelationToMeal();
-    method public String? getSpecimenSource();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final double levelMillimolesPerLiter;
-    property public final String? mealType;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final String? relationToMeal;
-    property public final String? specimenSource;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public static final class BloodGlucoseRecord.SpecimenSource {
-    field public static final String CAPILLARY_BLOOD = "capillary_blood";
-    field public static final androidx.health.connect.client.records.BloodGlucoseRecord.SpecimenSource INSTANCE;
-    field public static final String INTERSTITIAL_FLUID = "interstitial_fluid";
-    field public static final String PLASMA = "plasma";
-    field public static final String SERUM = "serum";
-    field public static final String TEARS = "tears";
-    field public static final String WHOLE_BLOOD = "whole_blood";
-  }
-
-  public final class BloodPressureRecord implements androidx.health.connect.client.records.Record {
-    ctor public BloodPressureRecord(androidx.health.connect.client.units.Pressure systolic, androidx.health.connect.client.units.Pressure diastolic, optional String? bodyPosition, optional String? measurementLocation, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public String? getBodyPosition();
-    method public androidx.health.connect.client.units.Pressure getDiastolic();
-    method public String? getMeasurementLocation();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public androidx.health.connect.client.units.Pressure getSystolic();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final String? bodyPosition;
-    property public final androidx.health.connect.client.units.Pressure diastolic;
-    property public final String? measurementLocation;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final androidx.health.connect.client.units.Pressure systolic;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-    field public static final androidx.health.connect.client.records.BloodPressureRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> DIASTOLIC_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> DIASTOLIC_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> DIASTOLIC_MIN;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> SYSTOLIC_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> SYSTOLIC_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> SYSTOLIC_MIN;
-  }
-
-  public static final class BloodPressureRecord.Companion {
-  }
-
-  public static final class BloodPressureRecord.MeasurementLocation {
-    field public static final androidx.health.connect.client.records.BloodPressureRecord.MeasurementLocation INSTANCE;
-    field public static final String LEFT_UPPER_ARM = "left_upper_arm";
-    field public static final String LEFT_WRIST = "left_wrist";
-    field public static final String RIGHT_UPPER_ARM = "right_upper_arm";
-    field public static final String RIGHT_WRIST = "right_wrist";
-  }
-
-  public final class BodyFatRecord implements androidx.health.connect.client.records.Record {
-    ctor public BodyFatRecord(androidx.health.connect.client.units.Percentage percentage, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public androidx.health.connect.client.units.Percentage getPercentage();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final androidx.health.connect.client.units.Percentage percentage;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public final class BodyPosition {
-    field public static final androidx.health.connect.client.records.BodyPosition INSTANCE;
-    field public static final String LYING_DOWN = "lying_down";
-    field public static final String RECLINING = "reclining";
-    field public static final String SITTING_DOWN = "sitting_down";
-    field public static final String STANDING_UP = "standing_up";
-  }
-
-  public final class BodyTemperatureMeasurementLocation {
-    field public static final String ARMPIT = "armpit";
-    field public static final String EAR = "ear";
-    field public static final String FINGER = "finger";
-    field public static final String FOREHEAD = "forehead";
-    field public static final androidx.health.connect.client.records.BodyTemperatureMeasurementLocation INSTANCE;
-    field public static final String MOUTH = "mouth";
-    field public static final String RECTUM = "rectum";
-    field public static final String TEMPORAL_ARTERY = "temporal_artery";
-    field public static final String TOE = "toe";
-    field public static final String VAGINA = "vagina";
-    field public static final String WRIST = "wrist";
-  }
-
-  public final class BodyTemperatureRecord implements androidx.health.connect.client.records.Record {
-    ctor public BodyTemperatureRecord(androidx.health.connect.client.units.Temperature temperature, optional String? measurementLocation, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public String? getMeasurementLocation();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public androidx.health.connect.client.units.Temperature getTemperature();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final String? measurementLocation;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final androidx.health.connect.client.units.Temperature temperature;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public final class BoneMassRecord implements androidx.health.connect.client.records.Record {
-    ctor public BoneMassRecord(androidx.health.connect.client.units.Mass mass, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.units.Mass getMass();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final androidx.health.connect.client.units.Mass mass;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public final class CervicalMucusRecord implements androidx.health.connect.client.records.Record {
-    ctor public CervicalMucusRecord(optional String? appearance, optional String? sensation, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public String? getAppearance();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public String? getSensation();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final String? appearance;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final String? sensation;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public static final class CervicalMucusRecord.Appearance {
-    field public static final String CLEAR = "clear";
-    field public static final String CREAMY = "creamy";
-    field public static final String DRY = "dry";
-    field public static final androidx.health.connect.client.records.CervicalMucusRecord.Appearance INSTANCE;
-    field public static final String STICKY = "sticky";
-    field public static final String WATERY = "watery";
-  }
-
-  public static final class CervicalMucusRecord.Sensation {
-    field public static final String HEAVY = "heavy";
-    field public static final androidx.health.connect.client.records.CervicalMucusRecord.Sensation INSTANCE;
-    field public static final String LIGHT = "light";
-    field public static final String MEDIUM = "medium";
-  }
-
-  public final class CyclingPedalingCadenceRecord implements androidx.health.connect.client.records.Record {
-    ctor public CyclingPedalingCadenceRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.CyclingPedalingCadenceRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.util.List<androidx.health.connect.client.records.CyclingPedalingCadenceRecord.Sample> getSamples();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.util.List<androidx.health.connect.client.records.CyclingPedalingCadenceRecord.Sample> samples;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.records.CyclingPedalingCadenceRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RPM_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RPM_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RPM_MIN;
-  }
-
-  public static final class CyclingPedalingCadenceRecord.Companion {
-  }
-
-  public static final class CyclingPedalingCadenceRecord.Sample {
-    ctor public CyclingPedalingCadenceRecord.Sample(java.time.Instant time, @FloatRange(from=0.0, to=10000.0) double revolutionsPerMinute);
-    method public double getRevolutionsPerMinute();
-    method public java.time.Instant getTime();
-    property public final double revolutionsPerMinute;
-    property public final java.time.Instant time;
-  }
-
-  public final class DistanceRecord implements androidx.health.connect.client.records.Record {
-    ctor public DistanceRecord(androidx.health.connect.client.units.Length distance, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.units.Length getDistance();
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public final androidx.health.connect.client.units.Length distance;
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.records.DistanceRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> DISTANCE_TOTAL;
-  }
-
-  public static final class DistanceRecord.Companion {
-  }
-
-  public final class ElevationGainedRecord implements androidx.health.connect.client.records.Record {
-    ctor public ElevationGainedRecord(androidx.health.connect.client.units.Length elevation, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.units.Length getElevation();
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public final androidx.health.connect.client.units.Length elevation;
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.records.ElevationGainedRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> ELEVATION_GAINED_TOTAL;
-  }
-
-  public static final class ElevationGainedRecord.Companion {
-  }
-
-  public final class ExerciseEventRecord implements androidx.health.connect.client.records.Record {
-    ctor public ExerciseEventRecord(String eventType, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public String getEventType();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public final String eventType;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-  }
-
-  public static final class ExerciseEventRecord.EventType {
-    field public static final androidx.health.connect.client.records.ExerciseEventRecord.EventType INSTANCE;
-    field public static final String PAUSE = "pause";
-    field public static final String REST = "rest";
-  }
-
-  public final class ExerciseLapRecord implements androidx.health.connect.client.records.Record {
-    ctor public ExerciseLapRecord(optional androidx.health.connect.client.units.Length? length, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.units.Length? getLength();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public final androidx.health.connect.client.units.Length? length;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-  }
-
-  public final class ExerciseRepetitionsRecord implements androidx.health.connect.client.records.Record {
-    ctor public ExerciseRepetitionsRecord(long count, String type, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public long getCount();
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    method public String getType();
-    property public final long count;
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    property public final String type;
-  }
-
-  public static final class ExerciseRepetitionsRecord.ExerciseType {
-    field public static final String ARM_CURL = "arm_curl";
-    field public static final String BACK_EXTENSION = "back_extension";
-    field public static final String BALL_SLAM = "ball_slam";
-    field public static final String BENCH_PRESS = "bench_press";
-    field public static final String BURPEE = "burpee";
-    field public static final String CRUNCH = "crunch";
-    field public static final String DEADLIFT = "deadlift";
-    field public static final String DOUBLE_ARM_TRICEPS_EXTENSION = "double_arm_triceps_extension";
-    field public static final String DUMBBELL_ROW = "dumbbell_row";
-    field public static final String FRONT_RAISE = "front_raise";
-    field public static final String HIP_THRUST = "hip_thrust";
-    field public static final String HULA_HOOP = "hula_hoop";
-    field public static final androidx.health.connect.client.records.ExerciseRepetitionsRecord.ExerciseType INSTANCE;
-    field public static final String JUMPING_JACK = "jumping_jack";
-    field public static final String JUMP_ROPE = "jump_rope";
-    field public static final String KETTLEBELL_SWING = "kettlebell_swing";
-    field public static final String LATERAL_RAISE = "lateral_raise";
-    field public static final String LAT_PULL_DOWN = "lat_pull_down";
-    field public static final String LEG_CURL = "leg_curl";
-    field public static final String LEG_EXTENSION = "leg_extension";
-    field public static final String LEG_PRESS = "leg_press";
-    field public static final String LEG_RAISE = "leg_raise";
-    field public static final String LUNGE = "lunge";
-    field public static final String MOUNTAIN_CLIMBER = "mountain_climber";
-    field public static final String PLANK = "plank";
-    field public static final String PULL_UP = "pull_up";
-    field public static final String PUNCH = "punch";
-    field public static final String SHOULDER_PRESS = "shoulder_press";
-    field public static final String SINGLE_ARM_TRICEPS_EXTENSION = "single_arm_triceps_extension";
-    field public static final String SIT_UP = "sit_up";
-    field public static final String SQUAT = "squat";
-  }
-
-  public final class ExerciseSessionRecord implements androidx.health.connect.client.records.Record {
-    ctor public ExerciseSessionRecord(String exerciseType, optional String? title, optional String? notes, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public String getExerciseType();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public String? getNotes();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    method public String? getTitle();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public final String exerciseType;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final String? notes;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    property public final String? title;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.time.Duration> ACTIVE_TIME_TOTAL;
-    field public static final androidx.health.connect.client.records.ExerciseSessionRecord.Companion Companion;
-  }
-
-  public static final class ExerciseSessionRecord.Companion {
-  }
-
-  public static final class ExerciseSessionRecord.ExerciseType {
-    field public static final String BACK_EXTENSION = "back_extension";
-    field public static final String BADMINTON = "badminton";
-    field public static final String BARBELL_SHOULDER_PRESS = "barbell_shoulder_press";
-    field public static final String BASEBALL = "baseball";
-    field public static final String BASKETBALL = "basketball";
-    field public static final String BENCH_PRESS = "bench_press";
-    field public static final String BENCH_SIT_UP = "bench_sit_up";
-    field public static final String BIKING = "biking";
-    field public static final String BIKING_STATIONARY = "biking_stationary";
-    field public static final String BOOT_CAMP = "boot_camp";
-    field public static final String BOXING = "boxing";
-    field public static final String BURPEE = "burpee";
-    field public static final String CALISTHENICS = "calisthenics";
-    field public static final String CRICKET = "cricket";
-    field public static final String CRUNCH = "crunch";
-    field public static final String DANCING = "dancing";
-    field public static final String DEADLIFT = "deadlift";
-    field public static final String DUMBBELL_CURL_LEFT_ARM = "dumbbell_curl_left_arm";
-    field public static final String DUMBBELL_CURL_RIGHT_ARM = "dumbbell_curl_right_arm";
-    field public static final String DUMBBELL_FRONT_RAISE = "dumbbell_front_raise";
-    field public static final String DUMBBELL_LATERAL_RAISE = "dumbbell_lateral_raise";
-    field public static final String DUMBBELL_TRICEPS_EXTENSION_LEFT_ARM = "dumbbell_triceps_extension_left_arm";
-    field public static final String DUMBBELL_TRICEPS_EXTENSION_RIGHT_ARM = "dumbbell_triceps_extension_right_arm";
-    field public static final String DUMBBELL_TRICEPS_EXTENSION_TWO_ARM = "dumbbell_triceps_extension_two_arm";
-    field public static final String ELLIPTICAL = "elliptical";
-    field public static final String EXERCISE_CLASS = "exercise_class";
-    field public static final String FENCING = "fencing";
-    field public static final String FOOTBALL_AMERICAN = "football_american";
-    field public static final String FOOTBALL_AUSTRALIAN = "football_australian";
-    field public static final String FORWARD_TWIST = "forward_twist";
-    field public static final String FRISBEE_DISC = "frisbee_disc";
-    field public static final String GOLF = "golf";
-    field public static final String GUIDED_BREATHING = "guided_breathing";
-    field public static final String GYMNASTICS = "gymnastics";
-    field public static final String HANDBALL = "handball";
-    field public static final String HIGH_INTENSITY_INTERVAL_TRAINING = "high_intensity_interval_training";
-    field public static final String HIKING = "hiking";
-    field public static final String ICE_HOCKEY = "ice_hockey";
-    field public static final String ICE_SKATING = "ice_skating";
-    field public static final androidx.health.connect.client.records.ExerciseSessionRecord.ExerciseType INSTANCE;
-    field public static final String JUMPING_JACK = "jumping_jack";
-    field public static final String JUMP_ROPE = "jump_rope";
-    field public static final String LAT_PULL_DOWN = "lat_pull_down";
-    field public static final String LUNGE = "lunge";
-    field public static final String MARTIAL_ARTS = "martial_arts";
-    field public static final String MEDITATION = "meditation";
-    field public static final String PADDLING = "paddling";
-    field public static final String PARA_GLIDING = "para_gliding";
-    field public static final String PILATES = "pilates";
-    field public static final String PLANK = "plank";
-    field public static final String RACQUETBALL = "racquetball";
-    field public static final String ROCK_CLIMBING = "rock_climbing";
-    field public static final String ROLLER_HOCKEY = "roller_hockey";
-    field public static final String ROWING = "rowing";
-    field public static final String ROWING_MACHINE = "rowing_machine";
-    field public static final String RUGBY = "rugby";
-    field public static final String RUNNING = "running";
-    field public static final String RUNNING_TREADMILL = "running_treadmill";
-    field public static final String SAILING = "sailing";
-    field public static final String SCUBA_DIVING = "scuba_diving";
-    field public static final String SKATING = "skating";
-    field public static final String SKIING = "skiing";
-    field public static final String SNOWBOARDING = "snowboarding";
-    field public static final String SNOWSHOEING = "snowshoeing";
-    field public static final String SOCCER = "soccer";
-    field public static final String SOFTBALL = "softball";
-    field public static final String SQUASH = "squash";
-    field public static final String SQUAT = "squat";
-    field public static final String STAIR_CLIMBING = "stair_climbing";
-    field public static final String STAIR_CLIMBING_MACHINE = "stair_climbing_machine";
-    field public static final String STRENGTH_TRAINING = "strength_training";
-    field public static final String STRETCHING = "stretching";
-    field public static final String SURFING = "surfing";
-    field public static final String SWIMMING_OPEN_WATER = "swimming_open_water";
-    field public static final String SWIMMING_POOL = "swimming_pool";
-    field public static final String TABLE_TENNIS = "table_tennis";
-    field public static final String TENNIS = "tennis";
-    field public static final String UPPER_TWIST = "upper_twist";
-    field public static final String VOLLEYBALL = "volleyball";
-    field public static final String WALKING = "walking";
-    field public static final String WATER_POLO = "water_polo";
-    field public static final String WEIGHTLIFTING = "weightlifting";
-    field public static final String WHEELCHAIR = "wheelchair";
-    field public static final String WORKOUT = "workout";
-    field public static final String YOGA = "yoga";
-  }
-
-  public final class FloorsClimbedRecord implements androidx.health.connect.client.records.Record {
-    ctor public FloorsClimbedRecord(double floors, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public double getFloors();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public final double floors;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.records.FloorsClimbedRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> FLOORS_CLIMBED_TOTAL;
-  }
-
-  public static final class FloorsClimbedRecord.Companion {
-  }
-
-  public final class HeartRateRecord implements androidx.health.connect.client.records.Record {
-    ctor public HeartRateRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.HeartRateRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.util.List<androidx.health.connect.client.records.HeartRateRecord.Sample> getSamples();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.util.List<androidx.health.connect.client.records.HeartRateRecord.Sample> samples;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_MIN;
-    field public static final androidx.health.connect.client.records.HeartRateRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> MEASUREMENTS_COUNT;
-  }
-
-  public static final class HeartRateRecord.Companion {
-  }
-
-  public static final class HeartRateRecord.Sample {
-    ctor public HeartRateRecord.Sample(java.time.Instant time, @IntRange(from=1L, to=300L) long beatsPerMinute);
-    method public long getBeatsPerMinute();
-    method public java.time.Instant getTime();
-    property public final long beatsPerMinute;
-    property public final java.time.Instant time;
-  }
-
-  public final class HeightRecord implements androidx.health.connect.client.records.Record {
-    ctor public HeightRecord(androidx.health.connect.client.units.Length height, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.units.Length getHeight();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final androidx.health.connect.client.units.Length height;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-    field public static final androidx.health.connect.client.records.HeightRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> HEIGHT_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> HEIGHT_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> HEIGHT_MIN;
-  }
-
-  public static final class HeightRecord.Companion {
-  }
-
-  public final class HipCircumferenceRecord implements androidx.health.connect.client.records.Record {
-    ctor public HipCircumferenceRecord(androidx.health.connect.client.units.Length circumference, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.units.Length getCircumference();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final androidx.health.connect.client.units.Length circumference;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public final class HydrationRecord implements androidx.health.connect.client.records.Record {
-    ctor public HydrationRecord(androidx.health.connect.client.units.Volume volume, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    method public androidx.health.connect.client.units.Volume getVolume();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    property public final androidx.health.connect.client.units.Volume volume;
-    field public static final androidx.health.connect.client.records.HydrationRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Volume> VOLUME_TOTAL;
-  }
-
-  public static final class HydrationRecord.Companion {
-  }
-
-  public final class LeanBodyMassRecord implements androidx.health.connect.client.records.Record {
-    ctor public LeanBodyMassRecord(androidx.health.connect.client.units.Mass mass, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.units.Mass getMass();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final androidx.health.connect.client.units.Mass mass;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public final class MealType {
-    field public static final String BREAKFAST = "breakfast";
-    field public static final String DINNER = "dinner";
-    field public static final androidx.health.connect.client.records.MealType INSTANCE;
-    field public static final String LUNCH = "lunch";
-    field public static final String SNACK = "snack";
-    field public static final String UNKNOWN = "unknown";
-  }
-
-  public final class MenstruationRecord implements androidx.health.connect.client.records.Record {
-    ctor public MenstruationRecord(optional String? flow, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public String? getFlow();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final String? flow;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public static final class MenstruationRecord.Flow {
-    field public static final String HEAVY = "heavy";
-    field public static final androidx.health.connect.client.records.MenstruationRecord.Flow INSTANCE;
-    field public static final String LIGHT = "light";
-    field public static final String MEDIUM = "medium";
-    field public static final String SPOTTING = "spotting";
-  }
-
-  public final class NutritionRecord implements androidx.health.connect.client.records.Record {
-    ctor public NutritionRecord(optional androidx.health.connect.client.units.Mass? biotin, optional androidx.health.connect.client.units.Mass? caffeine, optional androidx.health.connect.client.units.Mass? calcium, optional androidx.health.connect.client.units.Energy? energy, optional androidx.health.connect.client.units.Energy? energyFromFat, optional androidx.health.connect.client.units.Mass? chloride, optional androidx.health.connect.client.units.Mass? cholesterol, optional androidx.health.connect.client.units.Mass? chromium, optional androidx.health.connect.client.units.Mass? copper, optional androidx.health.connect.client.units.Mass? dietaryFiber, optional androidx.health.connect.client.units.Mass? folate, optional androidx.health.connect.client.units.Mass? folicAcid, optional androidx.health.connect.client.units.Mass? iodine, optional androidx.health.connect.client.units.Mass? iron, optional androidx.health.connect.client.units.Mass? magnesium, optional androidx.health.connect.client.units.Mass? manganese, optional androidx.health.connect.client.units.Mass? molybdenum, optional androidx.health.connect.client.units.Mass? monounsaturatedFat, optional androidx.health.connect.client.units.Mass? niacin, optional androidx.health.connect.client.units.Mass? pantothenicAcid, optional androidx.health.connect.client.units.Mass? phosphorus, optional androidx.health.connect.client.units.Mass? polyunsaturatedFat, optional androidx.health.connect.client.units.Mass? potassium, optional androidx.health.connect.client.units.Mass? protein, optional androidx.health.connect.client.units.Mass? riboflavin, optional androidx.health.connect.client.units.Mass? saturatedFat, optional androidx.health.connect.client.units.Mass? selenium, optional androidx.health.connect.client.units.Mass? sodium, optional androidx.health.connect.client.units.Mass? sugar, optional androidx.health.connect.client.units.Mass? thiamin, optional androidx.health.connect.client.units.Mass? totalCarbohydrate, optional androidx.health.connect.client.units.Mass? totalFat, optional androidx.health.connect.client.units.Mass? transFat, optional androidx.health.connect.client.units.Mass? unsaturatedFat, optional androidx.health.connect.client.units.Mass? vitaminA, optional androidx.health.connect.client.units.Mass? vitaminB12, optional androidx.health.connect.client.units.Mass? vitaminB6, optional androidx.health.connect.client.units.Mass? vitaminC, optional androidx.health.connect.client.units.Mass? vitaminD, optional androidx.health.connect.client.units.Mass? vitaminE, optional androidx.health.connect.client.units.Mass? vitaminK, optional androidx.health.connect.client.units.Mass? zinc, optional String? name, optional String? mealType, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.units.Mass? getBiotin();
-    method public androidx.health.connect.client.units.Mass? getCaffeine();
-    method public androidx.health.connect.client.units.Mass? getCalcium();
-    method public androidx.health.connect.client.units.Mass? getChloride();
-    method public androidx.health.connect.client.units.Mass? getCholesterol();
-    method public androidx.health.connect.client.units.Mass? getChromium();
-    method public androidx.health.connect.client.units.Mass? getCopper();
-    method public androidx.health.connect.client.units.Mass? getDietaryFiber();
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.units.Energy? getEnergy();
-    method public androidx.health.connect.client.units.Energy? getEnergyFromFat();
-    method public androidx.health.connect.client.units.Mass? getFolate();
-    method public androidx.health.connect.client.units.Mass? getFolicAcid();
-    method public androidx.health.connect.client.units.Mass? getIodine();
-    method public androidx.health.connect.client.units.Mass? getIron();
-    method public androidx.health.connect.client.units.Mass? getMagnesium();
-    method public androidx.health.connect.client.units.Mass? getManganese();
-    method public String? getMealType();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public androidx.health.connect.client.units.Mass? getMolybdenum();
-    method public androidx.health.connect.client.units.Mass? getMonounsaturatedFat();
-    method public String? getName();
-    method public androidx.health.connect.client.units.Mass? getNiacin();
-    method public androidx.health.connect.client.units.Mass? getPantothenicAcid();
-    method public androidx.health.connect.client.units.Mass? getPhosphorus();
-    method public androidx.health.connect.client.units.Mass? getPolyunsaturatedFat();
-    method public androidx.health.connect.client.units.Mass? getPotassium();
-    method public androidx.health.connect.client.units.Mass? getProtein();
-    method public androidx.health.connect.client.units.Mass? getRiboflavin();
-    method public androidx.health.connect.client.units.Mass? getSaturatedFat();
-    method public androidx.health.connect.client.units.Mass? getSelenium();
-    method public androidx.health.connect.client.units.Mass? getSodium();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    method public androidx.health.connect.client.units.Mass? getSugar();
-    method public androidx.health.connect.client.units.Mass? getThiamin();
-    method public androidx.health.connect.client.units.Mass? getTotalCarbohydrate();
-    method public androidx.health.connect.client.units.Mass? getTotalFat();
-    method public androidx.health.connect.client.units.Mass? getTransFat();
-    method public androidx.health.connect.client.units.Mass? getUnsaturatedFat();
-    method public androidx.health.connect.client.units.Mass? getVitaminA();
-    method public androidx.health.connect.client.units.Mass? getVitaminB12();
-    method public androidx.health.connect.client.units.Mass? getVitaminB6();
-    method public androidx.health.connect.client.units.Mass? getVitaminC();
-    method public androidx.health.connect.client.units.Mass? getVitaminD();
-    method public androidx.health.connect.client.units.Mass? getVitaminE();
-    method public androidx.health.connect.client.units.Mass? getVitaminK();
-    method public androidx.health.connect.client.units.Mass? getZinc();
-    property public final androidx.health.connect.client.units.Mass? biotin;
-    property public final androidx.health.connect.client.units.Mass? caffeine;
-    property public final androidx.health.connect.client.units.Mass? calcium;
-    property public final androidx.health.connect.client.units.Mass? chloride;
-    property public final androidx.health.connect.client.units.Mass? cholesterol;
-    property public final androidx.health.connect.client.units.Mass? chromium;
-    property public final androidx.health.connect.client.units.Mass? copper;
-    property public final androidx.health.connect.client.units.Mass? dietaryFiber;
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public final androidx.health.connect.client.units.Energy? energy;
-    property public final androidx.health.connect.client.units.Energy? energyFromFat;
-    property public final androidx.health.connect.client.units.Mass? folate;
-    property public final androidx.health.connect.client.units.Mass? folicAcid;
-    property public final androidx.health.connect.client.units.Mass? iodine;
-    property public final androidx.health.connect.client.units.Mass? iron;
-    property public final androidx.health.connect.client.units.Mass? magnesium;
-    property public final androidx.health.connect.client.units.Mass? manganese;
-    property public final String? mealType;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final androidx.health.connect.client.units.Mass? molybdenum;
-    property public final androidx.health.connect.client.units.Mass? monounsaturatedFat;
-    property public final String? name;
-    property public final androidx.health.connect.client.units.Mass? niacin;
-    property public final androidx.health.connect.client.units.Mass? pantothenicAcid;
-    property public final androidx.health.connect.client.units.Mass? phosphorus;
-    property public final androidx.health.connect.client.units.Mass? polyunsaturatedFat;
-    property public final androidx.health.connect.client.units.Mass? potassium;
-    property public final androidx.health.connect.client.units.Mass? protein;
-    property public final androidx.health.connect.client.units.Mass? riboflavin;
-    property public final androidx.health.connect.client.units.Mass? saturatedFat;
-    property public final androidx.health.connect.client.units.Mass? selenium;
-    property public final androidx.health.connect.client.units.Mass? sodium;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    property public final androidx.health.connect.client.units.Mass? sugar;
-    property public final androidx.health.connect.client.units.Mass? thiamin;
-    property public final androidx.health.connect.client.units.Mass? totalCarbohydrate;
-    property public final androidx.health.connect.client.units.Mass? totalFat;
-    property public final androidx.health.connect.client.units.Mass? transFat;
-    property public final androidx.health.connect.client.units.Mass? unsaturatedFat;
-    property public final androidx.health.connect.client.units.Mass? vitaminA;
-    property public final androidx.health.connect.client.units.Mass? vitaminB12;
-    property public final androidx.health.connect.client.units.Mass? vitaminB6;
-    property public final androidx.health.connect.client.units.Mass? vitaminC;
-    property public final androidx.health.connect.client.units.Mass? vitaminD;
-    property public final androidx.health.connect.client.units.Mass? vitaminE;
-    property public final androidx.health.connect.client.units.Mass? vitaminK;
-    property public final androidx.health.connect.client.units.Mass? zinc;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> BIOTIN_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CAFFEINE_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CALCIUM_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CHLORIDE_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CHOLESTEROL_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CHROMIUM_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> COPPER_TOTAL;
-    field public static final androidx.health.connect.client.records.NutritionRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> DIETARY_FIBER_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> ENERGY_FROM_FAT_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> ENERGY_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> FOLATE_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> FOLIC_ACID_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> IODINE_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> IRON_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> MAGNESIUM_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> MANGANESE_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> MOLYBDENUM_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> MONOUNSATURATED_FAT_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> NIACIN_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> PANTOTHENIC_ACID_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> PHOSPHORUS_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> POLYUNSATURATED_FAT_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> POTASSIUM_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> PROTEIN_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> RIBOFLAVIN_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> SATURATED_FAT_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> SELENIUM_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> SODIUM_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> SUGAR_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> THIAMIN_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> TOTAL_CARBOHYDRATE_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> TOTAL_FAT_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> TRANS_FAT_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> UNSATURATED_FAT_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_A_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_B12_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_B6_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_C_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_D_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_E_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_K_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> ZINC_TOTAL;
-  }
-
-  public static final class NutritionRecord.Companion {
-  }
-
-  public final class OvulationTestRecord implements androidx.health.connect.client.records.Record {
-    ctor public OvulationTestRecord(String result, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public String getResult();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final String result;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public static final class OvulationTestRecord.Result {
-    field public static final String HIGH = "high";
-    field public static final String INCONCLUSIVE = "inconclusive";
-    field public static final androidx.health.connect.client.records.OvulationTestRecord.Result INSTANCE;
-    field public static final String NEGATIVE = "negative";
-    field public static final String POSITIVE = "positive";
-  }
-
-  public final class OxygenSaturationRecord implements androidx.health.connect.client.records.Record {
-    ctor public OxygenSaturationRecord(androidx.health.connect.client.units.Percentage percentage, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public androidx.health.connect.client.units.Percentage getPercentage();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final androidx.health.connect.client.units.Percentage percentage;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public final class PowerRecord implements androidx.health.connect.client.records.Record {
-    ctor public PowerRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.PowerRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.util.List<androidx.health.connect.client.records.PowerRecord.Sample> getSamples();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.util.List<androidx.health.connect.client.records.PowerRecord.Sample> samples;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.records.PowerRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Power> POWER_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Power> POWER_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Power> POWER_MIN;
-  }
-
-  public static final class PowerRecord.Companion {
-  }
-
-  public static final class PowerRecord.Sample {
-    ctor public PowerRecord.Sample(java.time.Instant time, androidx.health.connect.client.units.Power power);
-    method public androidx.health.connect.client.units.Power getPower();
-    method public java.time.Instant getTime();
-    property public final androidx.health.connect.client.units.Power power;
-    property public final java.time.Instant time;
-  }
-
-  public interface Record {
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    property public abstract androidx.health.connect.client.records.metadata.Metadata metadata;
-  }
-
-  public final class RelationToMeal {
-    field public static final String AFTER_MEAL = "after_meal";
-    field public static final String BEFORE_MEAL = "before_meal";
-    field public static final String FASTING = "fasting";
-    field public static final String GENERAL = "general";
-    field public static final androidx.health.connect.client.records.RelationToMeal INSTANCE;
-  }
-
-  public final class RespiratoryRateRecord implements androidx.health.connect.client.records.Record {
-    ctor public RespiratoryRateRecord(double rate, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public double getRate();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final double rate;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public final class RestingHeartRateRecord implements androidx.health.connect.client.records.Record {
-    ctor public RestingHeartRateRecord(long beatsPerMinute, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public long getBeatsPerMinute();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final long beatsPerMinute;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_MIN;
-    field public static final androidx.health.connect.client.records.RestingHeartRateRecord.Companion Companion;
-  }
-
-  public static final class RestingHeartRateRecord.Companion {
-  }
-
-  public final class SexualActivityRecord implements androidx.health.connect.client.records.Record {
-    ctor public SexualActivityRecord(optional String? protectionUsed, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public String? getProtectionUsed();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final String? protectionUsed;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public static final class SexualActivityRecord.Protection {
-    field public static final androidx.health.connect.client.records.SexualActivityRecord.Protection INSTANCE;
-    field public static final String PROTECTED = "protected";
-    field public static final String UNPROTECTED = "unprotected";
-  }
-
-  public final class SleepSessionRecord implements androidx.health.connect.client.records.Record {
-    ctor public SleepSessionRecord(optional String? title, optional String? notes, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public String? getNotes();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    method public String? getTitle();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final String? notes;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    property public final String? title;
-    field public static final androidx.health.connect.client.records.SleepSessionRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.time.Duration> SLEEP_DURATION_TOTAL;
-  }
-
-  public static final class SleepSessionRecord.Companion {
-  }
-
-  public final class SleepStageRecord implements androidx.health.connect.client.records.Record {
-    ctor public SleepStageRecord(String stage, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public String getStage();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final String stage;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-  }
-
-  public static final class SleepStageRecord.StageType {
-    field public static final String AWAKE = "awake";
-    field public static final String DEEP = "deep";
-    field public static final androidx.health.connect.client.records.SleepStageRecord.StageType INSTANCE;
-    field public static final String LIGHT = "light";
-    field public static final String OUT_OF_BED = "out_of_bed";
-    field public static final String REM = "rem";
-    field public static final String SLEEPING = "sleeping";
-    field public static final String UNKNOWN = "unknown";
-  }
-
-  public final class SpeedRecord implements androidx.health.connect.client.records.Record {
-    ctor public SpeedRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.SpeedRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.util.List<androidx.health.connect.client.records.SpeedRecord.Sample> getSamples();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.util.List<androidx.health.connect.client.records.SpeedRecord.Sample> samples;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.records.SpeedRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Velocity> SPEED_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Velocity> SPEED_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Velocity> SPEED_MIN;
-  }
-
-  public static final class SpeedRecord.Companion {
-  }
-
-  public static final class SpeedRecord.Sample {
-    ctor public SpeedRecord.Sample(java.time.Instant time, androidx.health.connect.client.units.Velocity speed);
-    method public androidx.health.connect.client.units.Velocity getSpeed();
-    method public java.time.Instant getTime();
-    property public final androidx.health.connect.client.units.Velocity speed;
-    property public final java.time.Instant time;
-  }
-
-  public final class StepsCadenceRecord implements androidx.health.connect.client.records.Record {
-    ctor public StepsCadenceRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.StepsCadenceRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.util.List<androidx.health.connect.client.records.StepsCadenceRecord.Sample> getSamples();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.util.List<androidx.health.connect.client.records.StepsCadenceRecord.Sample> samples;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.records.StepsCadenceRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RATE_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RATE_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RATE_MIN;
-  }
-
-  public static final class StepsCadenceRecord.Companion {
-  }
-
-  public static final class StepsCadenceRecord.Sample {
-    ctor public StepsCadenceRecord.Sample(java.time.Instant time, @FloatRange(from=0.0, to=10000.0) double rate);
-    method public double getRate();
-    method public java.time.Instant getTime();
-    property public final double rate;
-    property public final java.time.Instant time;
-  }
-
-  public final class StepsRecord implements androidx.health.connect.client.records.Record {
-    ctor public StepsRecord(long count, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public long getCount();
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public final long count;
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> COUNT_TOTAL;
-    field public static final androidx.health.connect.client.records.StepsRecord.Companion Companion;
-  }
-
-  public static final class StepsRecord.Companion {
-  }
-
-  public final class SwimmingStrokesRecord implements androidx.health.connect.client.records.Record {
-    ctor public SwimmingStrokesRecord(optional long count, String type, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public long getCount();
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    method public String getType();
-    property public final long count;
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    property public final String type;
-  }
-
-  public static final class SwimmingStrokesRecord.SwimmingType {
-    field public static final String BACKSTROKE = "backstroke";
-    field public static final String BREASTSTROKE = "breaststroke";
-    field public static final String BUTTERFLY = "butterfly";
-    field public static final String FREESTYLE = "freestyle";
-    field public static final androidx.health.connect.client.records.SwimmingStrokesRecord.SwimmingType INSTANCE;
-    field public static final String MIXED = "mixed";
-    field public static final String OTHER = "other";
-  }
-
-  public final class TotalCaloriesBurnedRecord implements androidx.health.connect.client.records.Record {
-    ctor public TotalCaloriesBurnedRecord(androidx.health.connect.client.units.Energy energy, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.units.Energy getEnergy();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public final androidx.health.connect.client.units.Energy energy;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.records.TotalCaloriesBurnedRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> ENERGY_TOTAL;
-  }
-
-  public static final class TotalCaloriesBurnedRecord.Companion {
-  }
-
-  public final class Vo2MaxRecord implements androidx.health.connect.client.records.Record {
-    ctor public Vo2MaxRecord(double vo2MillilitersPerMinuteKilogram, optional String? measurementMethod, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public String? getMeasurementMethod();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public double getVo2MillilitersPerMinuteKilogram();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final String? measurementMethod;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public final double vo2MillilitersPerMinuteKilogram;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public static final class Vo2MaxRecord.MeasurementMethod {
-    field public static final String COOPER_TEST = "cooper_test";
-    field public static final String HEART_RATE_RATIO = "heart_rate_ratio";
-    field public static final androidx.health.connect.client.records.Vo2MaxRecord.MeasurementMethod INSTANCE;
-    field public static final String METABOLIC_CART = "metabolic_cart";
-    field public static final String MULTISTAGE_FITNESS_TEST = "multistage_fitness_test";
-    field public static final String OTHER = "other";
-    field public static final String ROCKPORT_FITNESS_TEST = "rockport_fitness_test";
-  }
-
-  public final class WaistCircumferenceRecord implements androidx.health.connect.client.records.Record {
-    ctor public WaistCircumferenceRecord(androidx.health.connect.client.units.Length circumference, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.units.Length getCircumference();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final androidx.health.connect.client.units.Length circumference;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public final class WeightRecord implements androidx.health.connect.client.records.Record {
-    ctor public WeightRecord(androidx.health.connect.client.units.Mass weight, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public androidx.health.connect.client.units.Mass getWeight();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public final androidx.health.connect.client.units.Mass weight;
-    property public java.time.ZoneOffset? zoneOffset;
-    field public static final androidx.health.connect.client.records.WeightRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> WEIGHT_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> WEIGHT_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> WEIGHT_MIN;
-  }
-
-  public static final class WeightRecord.Companion {
-  }
-
-  public final class WheelchairPushesRecord implements androidx.health.connect.client.records.Record {
-    ctor public WheelchairPushesRecord(long count, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public long getCount();
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public final long count;
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> COUNT_TOTAL;
-    field public static final androidx.health.connect.client.records.WheelchairPushesRecord.Companion Companion;
-  }
-
-  public static final class WheelchairPushesRecord.Companion {
-  }
-
-}
-
-package androidx.health.connect.client.records.metadata {
-
-  public final class DataOrigin {
-    ctor public DataOrigin(String packageName);
-    method public String getPackageName();
-    property public final String packageName;
-  }
-
-  public final class Device {
-    ctor public Device(optional String? manufacturer, optional String? model, optional String? type);
-    method public String? getManufacturer();
-    method public String? getModel();
-    method public String? getType();
-    property public final String? manufacturer;
-    property public final String? model;
-    property public final String? type;
-  }
-
-  public final class DeviceTypes {
-    field public static final String CHEST_STRAP = "CHEST_STRAP";
-    field public static final String FITNESS_BAND = "FITNESS_BAND";
-    field public static final String HEAD_MOUNTED = "HEAD_MOUNTED";
-    field public static final androidx.health.connect.client.records.metadata.DeviceTypes INSTANCE;
-    field public static final String PHONE = "PHONE";
-    field public static final String RING = "RING";
-    field public static final String SCALE = "SCALE";
-    field public static final String SMART_DISPLAY = "SMART_DISPLAY";
-    field public static final String UNKNOWN = "UNKNOWN";
-    field public static final String WATCH = "WATCH";
-  }
-
-  public final class Metadata {
-    ctor public Metadata(optional String? uid, optional androidx.health.connect.client.records.metadata.DataOrigin dataOrigin, optional java.time.Instant lastModifiedTime, optional String? clientId, optional long clientVersion, optional androidx.health.connect.client.records.metadata.Device? device);
-    method public String? getClientId();
-    method public long getClientVersion();
-    method public androidx.health.connect.client.records.metadata.DataOrigin getDataOrigin();
-    method public androidx.health.connect.client.records.metadata.Device? getDevice();
-    method public java.time.Instant getLastModifiedTime();
-    method public String? getUid();
-    property public final String? clientId;
-    property public final long clientVersion;
-    property public final androidx.health.connect.client.records.metadata.DataOrigin dataOrigin;
-    property public final androidx.health.connect.client.records.metadata.Device? device;
-    property public final java.time.Instant lastModifiedTime;
-    property public final String? uid;
-  }
-
-}
-
-package androidx.health.connect.client.request {
-
-  public final class AggregateGroupByDurationRequest {
-    ctor public AggregateGroupByDurationRequest(java.util.Set<? extends androidx.health.connect.client.aggregate.AggregateMetric<?>> metrics, androidx.health.connect.client.time.TimeRangeFilter timeRangeFilter, java.time.Duration timeRangeSlicer, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilter);
-  }
-
-  public final class AggregateGroupByPeriodRequest {
-    ctor public AggregateGroupByPeriodRequest(java.util.Set<? extends androidx.health.connect.client.aggregate.AggregateMetric<?>> metrics, androidx.health.connect.client.time.TimeRangeFilter timeRangeFilter, java.time.Period timeRangeSlicer, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilter);
-  }
-
-  public final class AggregateRequest {
-    ctor public AggregateRequest(java.util.Set<? extends androidx.health.connect.client.aggregate.AggregateMetric<?>> metrics, androidx.health.connect.client.time.TimeRangeFilter timeRangeFilter, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilter);
-  }
-
-  public final class ChangesTokenRequest {
-    ctor public ChangesTokenRequest(java.util.Set<? extends kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record>> recordTypes, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilters);
-  }
-
-  public final class ReadRecordsRequest<T extends androidx.health.connect.client.records.Record> {
-    ctor public ReadRecordsRequest(kotlin.reflect.KClass<T> recordType, androidx.health.connect.client.time.TimeRangeFilter timeRangeFilter, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilter, optional boolean ascendingOrder, optional int pageSize, optional String? pageToken);
-  }
-
-}
-
-package androidx.health.connect.client.response {
-
-  public final class ChangesResponse {
-    method public java.util.List<androidx.health.connect.client.changes.Change> getChanges();
-    method public boolean getChangesTokenExpired();
-    method public boolean getHasMore();
-    method public String getNextChangesToken();
-    property public final java.util.List<androidx.health.connect.client.changes.Change> changes;
-    property public final boolean changesTokenExpired;
-    property public final boolean hasMore;
-    property public final String nextChangesToken;
-  }
-
-  public final class InsertRecordsResponse {
-    method public java.util.List<java.lang.String> getRecordUidsList();
-    property public final java.util.List<java.lang.String> recordUidsList;
-  }
-
-  public final class ReadRecordResponse<T extends androidx.health.connect.client.records.Record> {
-    method public T getRecord();
-    property public final T record;
-  }
-
-  public final class ReadRecordsResponse<T extends androidx.health.connect.client.records.Record> {
-    method public String? getPageToken();
-    method public java.util.List<T> getRecords();
-    property public final String? pageToken;
-    property public final java.util.List<T> records;
-  }
-
-}
-
-package androidx.health.connect.client.time {
-
-  public final class TimeRangeFilter {
-    method public static androidx.health.connect.client.time.TimeRangeFilter after(java.time.Instant startTime);
-    method public static androidx.health.connect.client.time.TimeRangeFilter after(java.time.LocalDateTime startTime);
-    method public static androidx.health.connect.client.time.TimeRangeFilter before(java.time.Instant endTime);
-    method public static androidx.health.connect.client.time.TimeRangeFilter before(java.time.LocalDateTime endTime);
-    method public static androidx.health.connect.client.time.TimeRangeFilter between(java.time.Instant startTime, java.time.Instant endTime);
-    method public static androidx.health.connect.client.time.TimeRangeFilter between(java.time.LocalDateTime startTime, java.time.LocalDateTime endTime);
-    field public static final androidx.health.connect.client.time.TimeRangeFilter.Companion Companion;
-  }
-
-  public static final class TimeRangeFilter.Companion {
-    method public androidx.health.connect.client.time.TimeRangeFilter after(java.time.Instant startTime);
-    method public androidx.health.connect.client.time.TimeRangeFilter after(java.time.LocalDateTime startTime);
-    method public androidx.health.connect.client.time.TimeRangeFilter before(java.time.Instant endTime);
-    method public androidx.health.connect.client.time.TimeRangeFilter before(java.time.LocalDateTime endTime);
-    method public androidx.health.connect.client.time.TimeRangeFilter between(java.time.Instant startTime, java.time.Instant endTime);
-    method public androidx.health.connect.client.time.TimeRangeFilter between(java.time.LocalDateTime startTime, java.time.LocalDateTime endTime);
-  }
-
-}
-
-package androidx.health.connect.client.units {
-
-  public final class Energy implements java.lang.Comparable<androidx.health.connect.client.units.Energy> {
-    method public static androidx.health.connect.client.units.Energy calories(double value);
-    method public int compareTo(androidx.health.connect.client.units.Energy other);
-    method public double getCalories();
-    method public double getJoules();
-    method public double getKilocalories();
-    method public double getKilojoules();
-    method public static androidx.health.connect.client.units.Energy joules(double value);
-    method public static androidx.health.connect.client.units.Energy kilocalories(double value);
-    method public static androidx.health.connect.client.units.Energy kilojoules(double value);
-    property public final double inCalories;
-    property public final double inJoules;
-    property public final double inKilocalories;
-    property public final double inKilojoules;
-    field public static final androidx.health.connect.client.units.Energy.Companion Companion;
-  }
-
-  public static final class Energy.Companion {
-    method public androidx.health.connect.client.units.Energy calories(double value);
-    method public androidx.health.connect.client.units.Energy joules(double value);
-    method public androidx.health.connect.client.units.Energy kilocalories(double value);
-    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);
-    method public double getFeet();
-    method public double getInches();
-    method public double getKilometers();
-    method public double getMeters();
-    method public double getMiles();
-    method public static androidx.health.connect.client.units.Length inches(double value);
-    method public static androidx.health.connect.client.units.Length kilometers(double value);
-    method public static androidx.health.connect.client.units.Length meters(double value);
-    method public static androidx.health.connect.client.units.Length miles(double value);
-    property public final double inFeet;
-    property public final double inInches;
-    property public final double inKilometers;
-    property public final double inMeters;
-    property public final double inMiles;
-    field public static final androidx.health.connect.client.units.Length.Companion Companion;
-  }
-
-  public static final class Length.Companion {
-    method public androidx.health.connect.client.units.Length feet(double value);
-    method public androidx.health.connect.client.units.Length inches(double value);
-    method public androidx.health.connect.client.units.Length kilometers(double value);
-    method public androidx.health.connect.client.units.Length meters(double value);
-    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();
-    method public double getKilograms();
-    method public double getMicrograms();
-    method public double getMilligrams();
-    method public double getOunces();
-    method public static androidx.health.connect.client.units.Mass grams(double value);
-    method public static androidx.health.connect.client.units.Mass kilograms(double value);
-    method public static androidx.health.connect.client.units.Mass micrograms(double value);
-    method public static androidx.health.connect.client.units.Mass milligrams(double value);
-    method public static androidx.health.connect.client.units.Mass ounces(double value);
-    property public final double inGrams;
-    property public final double inKilograms;
-    property public final double inMicrograms;
-    property public final double inMilligrams;
-    property public final double inOunces;
-    field public static final androidx.health.connect.client.units.Mass.Companion Companion;
-  }
-
-  public static final class Mass.Companion {
-    method public androidx.health.connect.client.units.Mass grams(double value);
-    method public androidx.health.connect.client.units.Mass kilograms(double value);
-    method public androidx.health.connect.client.units.Mass micrograms(double value);
-    method public androidx.health.connect.client.units.Mass milligrams(double value);
-    method public androidx.health.connect.client.units.Mass ounces(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);
-    method public double getValue();
-    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();
-    method public double getWatts();
-    method public static androidx.health.connect.client.units.Power kilocaloriesPerDay(double value);
-    method public static androidx.health.connect.client.units.Power watts(double value);
-    property public final double inKilocaloriesPerDay;
-    property public final double inWatts;
-    field public static final androidx.health.connect.client.units.Power.Companion Companion;
-  }
-
-  public static final class Power.Companion {
-    method public androidx.health.connect.client.units.Power kilocaloriesPerDay(double value);
-    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();
-    method public static androidx.health.connect.client.units.Pressure millimetersOfMercury(double value);
-    property public final double inMillimetersOfMercury;
-    field public static final androidx.health.connect.client.units.Pressure.Companion Companion;
-  }
-
-  public static final class Pressure.Companion {
-    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);
-    method public static androidx.health.connect.client.units.Temperature fahrenheit(double value);
-    method public double getCelsius();
-    method public double getFahrenheit();
-    property public final double inCelsius;
-    property public final double inFahrenheit;
-    field public static final androidx.health.connect.client.units.Temperature.Companion Companion;
-  }
-
-  public static final class Temperature.Companion {
-    method public androidx.health.connect.client.units.Temperature celsius(double value);
-    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();
-    method public double getMetersPerSecond();
-    method public double getMilesPerHour();
-    method public static androidx.health.connect.client.units.Velocity kilometersPerHour(double value);
-    method public static androidx.health.connect.client.units.Velocity metersPerSecond(double value);
-    method public static androidx.health.connect.client.units.Velocity milesPerHour(double value);
-    property public final double inKilometersPerHour;
-    property public final double inMetersPerSecond;
-    property public final double inMilesPerHour;
-    field public static final androidx.health.connect.client.units.Velocity.Companion Companion;
-  }
-
-  public static final class Velocity.Companion {
-    method public androidx.health.connect.client.units.Velocity kilometersPerHour(double value);
-    method public androidx.health.connect.client.units.Velocity metersPerSecond(double value);
-    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);
-    method public double getFluidOuncesUs();
-    method public double getLiters();
-    method public double getMilliliters();
-    method public static androidx.health.connect.client.units.Volume liters(double value);
-    method public static androidx.health.connect.client.units.Volume milliliters(double value);
-    property public final double inFluidOuncesUs;
-    property public final double inLiters;
-    property public final double inMilliliters;
-    field public static final androidx.health.connect.client.units.Volume.Companion Companion;
-  }
-
-  public static final class Volume.Companion {
-    method public androidx.health.connect.client.units.Volume fluidOuncesUs(double value);
-    method public androidx.health.connect.client.units.Volume liters(double value);
-    method public androidx.health.connect.client.units.Volume milliliters(double value);
-  }
-
-  public final class VolumeKt {
-  }
-
-}
-
diff --git a/health/health-connect-client/api/restricted_current.txt b/health/health-connect-client/api/restricted_current.txt
deleted file mode 100644
index 0902c22..0000000
--- a/health/health-connect-client/api/restricted_current.txt
+++ /dev/null
@@ -1,1626 +0,0 @@
-// Signature format: 4.0
-package androidx.health.connect.client {
-
-  public interface HealthConnectClient {
-    method public suspend Object? aggregate(androidx.health.connect.client.request.AggregateRequest request, kotlin.coroutines.Continuation<? super androidx.health.connect.client.aggregate.AggregationResult>);
-    method public suspend Object? aggregateGroupByDuration(androidx.health.connect.client.request.AggregateGroupByDurationRequest request, kotlin.coroutines.Continuation<? super java.util.List<? extends androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration>>);
-    method public suspend Object? aggregateGroupByPeriod(androidx.health.connect.client.request.AggregateGroupByPeriodRequest request, kotlin.coroutines.Continuation<? super java.util.List<? extends androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod>>);
-    method public suspend Object? deleteRecords(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType, java.util.List<java.lang.String> uidsList, java.util.List<java.lang.String> clientIdsList, kotlin.coroutines.Continuation<? super kotlin.Unit>);
-    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 androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context, optional java.util.List<java.lang.String> packageNames);
-    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 isAvailable(android.content.Context context, optional java.util.List<java.lang.String> packageNames);
-    method public default static boolean isAvailable(android.content.Context context);
-    method public suspend <T extends androidx.health.connect.client.records.Record> Object? readRecord(kotlin.reflect.KClass<T> recordType, String uid, 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 suspend Object? updateRecords(java.util.List<? extends androidx.health.connect.client.records.Record> records, kotlin.coroutines.Continuation<? super kotlin.Unit>);
-    property public abstract androidx.health.connect.client.PermissionController permissionController;
-    field public static final androidx.health.connect.client.HealthConnectClient.Companion Companion;
-  }
-
-  public static final class HealthConnectClient.Companion {
-    method public androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context, optional java.util.List<java.lang.String> packageNames);
-    method public androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context);
-    method public boolean isAvailable(android.content.Context context, optional java.util.List<java.lang.String> packageNames);
-    method public boolean isAvailable(android.content.Context context);
-  }
-
-  public interface PermissionController {
-    method public androidx.activity.result.contract.ActivityResultContract<java.util.Set<androidx.health.connect.client.permission.HealthPermission>,java.util.Set<androidx.health.connect.client.permission.HealthPermission>> createRequestPermissionActivityContract();
-    method public suspend Object? getGrantedPermissions(java.util.Set<androidx.health.connect.client.permission.HealthPermission> permissions, kotlin.coroutines.Continuation<? super java.util.Set<? extends androidx.health.connect.client.permission.HealthPermission>>);
-    method public suspend Object? revokeAllPermissions(kotlin.coroutines.Continuation<? super kotlin.Unit>);
-  }
-
-}
-
-package androidx.health.connect.client.aggregate {
-
-  public final class AggregateMetric<T> {
-  }
-
-  public final class AggregationResult {
-    method public operator boolean contains(androidx.health.connect.client.aggregate.AggregateMetric<?> metric);
-    method public operator <T> T? get(androidx.health.connect.client.aggregate.AggregateMetric<? extends T> metric);
-    method public java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> getDataOrigins();
-    method @Deprecated public <T> T? getMetric(androidx.health.connect.client.aggregate.AggregateMetric<? extends T> metric);
-    method @Deprecated public boolean hasMetric(androidx.health.connect.client.aggregate.AggregateMetric<?> metric);
-    property public final java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOrigins;
-  }
-
-  public final class AggregationResultGroupedByDuration {
-    method public java.time.Instant getEndTime();
-    method public androidx.health.connect.client.aggregate.AggregationResult getResult();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset getZoneOffset();
-    property public final java.time.Instant endTime;
-    property public final androidx.health.connect.client.aggregate.AggregationResult result;
-    property public final java.time.Instant startTime;
-    property public final java.time.ZoneOffset zoneOffset;
-  }
-
-  public final class AggregationResultGroupedByPeriod {
-    method public java.time.LocalDateTime getEndTime();
-    method public androidx.health.connect.client.aggregate.AggregationResult getResult();
-    method public java.time.LocalDateTime getStartTime();
-    property public final java.time.LocalDateTime endTime;
-    property public final androidx.health.connect.client.aggregate.AggregationResult result;
-    property public final java.time.LocalDateTime startTime;
-  }
-
-}
-
-package androidx.health.connect.client.changes {
-
-  public interface Change {
-  }
-
-  public final class DeletionChange implements androidx.health.connect.client.changes.Change {
-    method public String getUid();
-    property public final String uid;
-  }
-
-  public final class UpsertionChange implements androidx.health.connect.client.changes.Change {
-    method public androidx.health.connect.client.records.Record getRecord();
-    property public final androidx.health.connect.client.records.Record record;
-  }
-
-}
-
-package androidx.health.connect.client.permission {
-
-  public final class HealthDataRequestPermissionsKt {
-  }
-
-  public final class HealthPermission {
-    method public static androidx.health.connect.client.permission.HealthPermission createReadPermission(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType);
-    method public static androidx.health.connect.client.permission.HealthPermission createWritePermission(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType);
-    field public static final androidx.health.connect.client.permission.HealthPermission.Companion Companion;
-  }
-
-  public static final class HealthPermission.Companion {
-    method public androidx.health.connect.client.permission.HealthPermission createReadPermission(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType);
-    method public androidx.health.connect.client.permission.HealthPermission createWritePermission(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType);
-  }
-
-}
-
-package androidx.health.connect.client.records {
-
-  public final class ActiveCaloriesBurnedRecord implements androidx.health.connect.client.records.IntervalRecord {
-    ctor public ActiveCaloriesBurnedRecord(androidx.health.connect.client.units.Energy energy, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.units.Energy getEnergy();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public final androidx.health.connect.client.units.Energy energy;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> ACTIVE_CALORIES_TOTAL;
-    field public static final androidx.health.connect.client.records.ActiveCaloriesBurnedRecord.Companion Companion;
-  }
-
-  public static final class ActiveCaloriesBurnedRecord.Companion {
-  }
-
-  public final class BasalBodyTemperatureRecord implements androidx.health.connect.client.records.InstantaneousRecord {
-    ctor public BasalBodyTemperatureRecord(androidx.health.connect.client.units.Temperature temperature, optional String? measurementLocation, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public String? getMeasurementLocation();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public androidx.health.connect.client.units.Temperature getTemperature();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final String? measurementLocation;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final androidx.health.connect.client.units.Temperature temperature;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public final class BasalMetabolicRateRecord implements androidx.health.connect.client.records.InstantaneousRecord {
-    ctor public BasalMetabolicRateRecord(androidx.health.connect.client.units.Power basalMetabolicRate, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.units.Power getBasalMetabolicRate();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final androidx.health.connect.client.units.Power basalMetabolicRate;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> BASAL_CALORIES_TOTAL;
-    field public static final androidx.health.connect.client.records.BasalMetabolicRateRecord.Companion Companion;
-  }
-
-  public static final class BasalMetabolicRateRecord.Companion {
-  }
-
-  public final class BloodGlucoseRecord implements androidx.health.connect.client.records.InstantaneousRecord {
-    ctor public BloodGlucoseRecord(double levelMillimolesPerLiter, optional String? specimenSource, optional String? mealType, optional String? relationToMeal, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public double getLevelMillimolesPerLiter();
-    method public String? getMealType();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public String? getRelationToMeal();
-    method public String? getSpecimenSource();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final double levelMillimolesPerLiter;
-    property public final String? mealType;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final String? relationToMeal;
-    property public final String? specimenSource;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public static final class BloodGlucoseRecord.SpecimenSource {
-    field public static final String CAPILLARY_BLOOD = "capillary_blood";
-    field public static final androidx.health.connect.client.records.BloodGlucoseRecord.SpecimenSource INSTANCE;
-    field public static final String INTERSTITIAL_FLUID = "interstitial_fluid";
-    field public static final String PLASMA = "plasma";
-    field public static final String SERUM = "serum";
-    field public static final String TEARS = "tears";
-    field public static final String WHOLE_BLOOD = "whole_blood";
-  }
-
-  public final class BloodPressureRecord implements androidx.health.connect.client.records.InstantaneousRecord {
-    ctor public BloodPressureRecord(androidx.health.connect.client.units.Pressure systolic, androidx.health.connect.client.units.Pressure diastolic, optional String? bodyPosition, optional String? measurementLocation, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public String? getBodyPosition();
-    method public androidx.health.connect.client.units.Pressure getDiastolic();
-    method public String? getMeasurementLocation();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public androidx.health.connect.client.units.Pressure getSystolic();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final String? bodyPosition;
-    property public final androidx.health.connect.client.units.Pressure diastolic;
-    property public final String? measurementLocation;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final androidx.health.connect.client.units.Pressure systolic;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-    field public static final androidx.health.connect.client.records.BloodPressureRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> DIASTOLIC_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> DIASTOLIC_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> DIASTOLIC_MIN;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> SYSTOLIC_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> SYSTOLIC_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Pressure> SYSTOLIC_MIN;
-  }
-
-  public static final class BloodPressureRecord.Companion {
-  }
-
-  public static final class BloodPressureRecord.MeasurementLocation {
-    field public static final androidx.health.connect.client.records.BloodPressureRecord.MeasurementLocation INSTANCE;
-    field public static final String LEFT_UPPER_ARM = "left_upper_arm";
-    field public static final String LEFT_WRIST = "left_wrist";
-    field public static final String RIGHT_UPPER_ARM = "right_upper_arm";
-    field public static final String RIGHT_WRIST = "right_wrist";
-  }
-
-  public final class BodyFatRecord implements androidx.health.connect.client.records.InstantaneousRecord {
-    ctor public BodyFatRecord(androidx.health.connect.client.units.Percentage percentage, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public androidx.health.connect.client.units.Percentage getPercentage();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final androidx.health.connect.client.units.Percentage percentage;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public final class BodyPosition {
-    field public static final androidx.health.connect.client.records.BodyPosition INSTANCE;
-    field public static final String LYING_DOWN = "lying_down";
-    field public static final String RECLINING = "reclining";
-    field public static final String SITTING_DOWN = "sitting_down";
-    field public static final String STANDING_UP = "standing_up";
-  }
-
-  public final class BodyTemperatureMeasurementLocation {
-    field public static final String ARMPIT = "armpit";
-    field public static final String EAR = "ear";
-    field public static final String FINGER = "finger";
-    field public static final String FOREHEAD = "forehead";
-    field public static final androidx.health.connect.client.records.BodyTemperatureMeasurementLocation INSTANCE;
-    field public static final String MOUTH = "mouth";
-    field public static final String RECTUM = "rectum";
-    field public static final String TEMPORAL_ARTERY = "temporal_artery";
-    field public static final String TOE = "toe";
-    field public static final String VAGINA = "vagina";
-    field public static final String WRIST = "wrist";
-  }
-
-  public final class BodyTemperatureRecord implements androidx.health.connect.client.records.InstantaneousRecord {
-    ctor public BodyTemperatureRecord(androidx.health.connect.client.units.Temperature temperature, optional String? measurementLocation, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public String? getMeasurementLocation();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public androidx.health.connect.client.units.Temperature getTemperature();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final String? measurementLocation;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final androidx.health.connect.client.units.Temperature temperature;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public final class BoneMassRecord implements androidx.health.connect.client.records.InstantaneousRecord {
-    ctor public BoneMassRecord(androidx.health.connect.client.units.Mass mass, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.units.Mass getMass();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final androidx.health.connect.client.units.Mass mass;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public final class CervicalMucusRecord implements androidx.health.connect.client.records.InstantaneousRecord {
-    ctor public CervicalMucusRecord(optional String? appearance, optional String? sensation, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public String? getAppearance();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public String? getSensation();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final String? appearance;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final String? sensation;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public static final class CervicalMucusRecord.Appearance {
-    field public static final String CLEAR = "clear";
-    field public static final String CREAMY = "creamy";
-    field public static final String DRY = "dry";
-    field public static final androidx.health.connect.client.records.CervicalMucusRecord.Appearance INSTANCE;
-    field public static final String STICKY = "sticky";
-    field public static final String WATERY = "watery";
-  }
-
-  public static final class CervicalMucusRecord.Sensation {
-    field public static final String HEAVY = "heavy";
-    field public static final androidx.health.connect.client.records.CervicalMucusRecord.Sensation INSTANCE;
-    field public static final String LIGHT = "light";
-    field public static final String MEDIUM = "medium";
-  }
-
-  public final class CyclingPedalingCadenceRecord implements androidx.health.connect.client.records.SeriesRecord<androidx.health.connect.client.records.CyclingPedalingCadenceRecord.Sample> {
-    ctor public CyclingPedalingCadenceRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.CyclingPedalingCadenceRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.util.List<androidx.health.connect.client.records.CyclingPedalingCadenceRecord.Sample> getSamples();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.util.List<androidx.health.connect.client.records.CyclingPedalingCadenceRecord.Sample> samples;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.records.CyclingPedalingCadenceRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RPM_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RPM_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RPM_MIN;
-  }
-
-  public static final class CyclingPedalingCadenceRecord.Companion {
-  }
-
-  public static final class CyclingPedalingCadenceRecord.Sample {
-    ctor public CyclingPedalingCadenceRecord.Sample(java.time.Instant time, @FloatRange(from=0.0, to=10000.0) double revolutionsPerMinute);
-    method public double getRevolutionsPerMinute();
-    method public java.time.Instant getTime();
-    property public final double revolutionsPerMinute;
-    property public final java.time.Instant time;
-  }
-
-  public final class DistanceRecord implements androidx.health.connect.client.records.IntervalRecord {
-    ctor public DistanceRecord(androidx.health.connect.client.units.Length distance, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.units.Length getDistance();
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public final androidx.health.connect.client.units.Length distance;
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.records.DistanceRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> DISTANCE_TOTAL;
-  }
-
-  public static final class DistanceRecord.Companion {
-  }
-
-  public final class ElevationGainedRecord implements androidx.health.connect.client.records.IntervalRecord {
-    ctor public ElevationGainedRecord(androidx.health.connect.client.units.Length elevation, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.units.Length getElevation();
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public final androidx.health.connect.client.units.Length elevation;
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.records.ElevationGainedRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> ELEVATION_GAINED_TOTAL;
-  }
-
-  public static final class ElevationGainedRecord.Companion {
-  }
-
-  public final class ExerciseEventRecord implements androidx.health.connect.client.records.IntervalRecord {
-    ctor public ExerciseEventRecord(String eventType, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public String getEventType();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public final String eventType;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-  }
-
-  public static final class ExerciseEventRecord.EventType {
-    field public static final androidx.health.connect.client.records.ExerciseEventRecord.EventType INSTANCE;
-    field public static final String PAUSE = "pause";
-    field public static final String REST = "rest";
-  }
-
-  public final class ExerciseLapRecord implements androidx.health.connect.client.records.IntervalRecord {
-    ctor public ExerciseLapRecord(optional androidx.health.connect.client.units.Length? length, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.units.Length? getLength();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public final androidx.health.connect.client.units.Length? length;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-  }
-
-  public final class ExerciseRepetitionsRecord implements androidx.health.connect.client.records.IntervalRecord {
-    ctor public ExerciseRepetitionsRecord(long count, String type, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public long getCount();
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    method public String getType();
-    property public final long count;
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    property public final String type;
-  }
-
-  public static final class ExerciseRepetitionsRecord.ExerciseType {
-    field public static final String ARM_CURL = "arm_curl";
-    field public static final String BACK_EXTENSION = "back_extension";
-    field public static final String BALL_SLAM = "ball_slam";
-    field public static final String BENCH_PRESS = "bench_press";
-    field public static final String BURPEE = "burpee";
-    field public static final String CRUNCH = "crunch";
-    field public static final String DEADLIFT = "deadlift";
-    field public static final String DOUBLE_ARM_TRICEPS_EXTENSION = "double_arm_triceps_extension";
-    field public static final String DUMBBELL_ROW = "dumbbell_row";
-    field public static final String FRONT_RAISE = "front_raise";
-    field public static final String HIP_THRUST = "hip_thrust";
-    field public static final String HULA_HOOP = "hula_hoop";
-    field public static final androidx.health.connect.client.records.ExerciseRepetitionsRecord.ExerciseType INSTANCE;
-    field public static final String JUMPING_JACK = "jumping_jack";
-    field public static final String JUMP_ROPE = "jump_rope";
-    field public static final String KETTLEBELL_SWING = "kettlebell_swing";
-    field public static final String LATERAL_RAISE = "lateral_raise";
-    field public static final String LAT_PULL_DOWN = "lat_pull_down";
-    field public static final String LEG_CURL = "leg_curl";
-    field public static final String LEG_EXTENSION = "leg_extension";
-    field public static final String LEG_PRESS = "leg_press";
-    field public static final String LEG_RAISE = "leg_raise";
-    field public static final String LUNGE = "lunge";
-    field public static final String MOUNTAIN_CLIMBER = "mountain_climber";
-    field public static final String PLANK = "plank";
-    field public static final String PULL_UP = "pull_up";
-    field public static final String PUNCH = "punch";
-    field public static final String SHOULDER_PRESS = "shoulder_press";
-    field public static final String SINGLE_ARM_TRICEPS_EXTENSION = "single_arm_triceps_extension";
-    field public static final String SIT_UP = "sit_up";
-    field public static final String SQUAT = "squat";
-  }
-
-  public final class ExerciseSessionRecord implements androidx.health.connect.client.records.IntervalRecord {
-    ctor public ExerciseSessionRecord(String exerciseType, optional String? title, optional String? notes, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public String getExerciseType();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public String? getNotes();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    method public String? getTitle();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public final String exerciseType;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final String? notes;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    property public final String? title;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.time.Duration> ACTIVE_TIME_TOTAL;
-    field public static final androidx.health.connect.client.records.ExerciseSessionRecord.Companion Companion;
-  }
-
-  public static final class ExerciseSessionRecord.Companion {
-  }
-
-  public static final class ExerciseSessionRecord.ExerciseType {
-    field public static final String BACK_EXTENSION = "back_extension";
-    field public static final String BADMINTON = "badminton";
-    field public static final String BARBELL_SHOULDER_PRESS = "barbell_shoulder_press";
-    field public static final String BASEBALL = "baseball";
-    field public static final String BASKETBALL = "basketball";
-    field public static final String BENCH_PRESS = "bench_press";
-    field public static final String BENCH_SIT_UP = "bench_sit_up";
-    field public static final String BIKING = "biking";
-    field public static final String BIKING_STATIONARY = "biking_stationary";
-    field public static final String BOOT_CAMP = "boot_camp";
-    field public static final String BOXING = "boxing";
-    field public static final String BURPEE = "burpee";
-    field public static final String CALISTHENICS = "calisthenics";
-    field public static final String CRICKET = "cricket";
-    field public static final String CRUNCH = "crunch";
-    field public static final String DANCING = "dancing";
-    field public static final String DEADLIFT = "deadlift";
-    field public static final String DUMBBELL_CURL_LEFT_ARM = "dumbbell_curl_left_arm";
-    field public static final String DUMBBELL_CURL_RIGHT_ARM = "dumbbell_curl_right_arm";
-    field public static final String DUMBBELL_FRONT_RAISE = "dumbbell_front_raise";
-    field public static final String DUMBBELL_LATERAL_RAISE = "dumbbell_lateral_raise";
-    field public static final String DUMBBELL_TRICEPS_EXTENSION_LEFT_ARM = "dumbbell_triceps_extension_left_arm";
-    field public static final String DUMBBELL_TRICEPS_EXTENSION_RIGHT_ARM = "dumbbell_triceps_extension_right_arm";
-    field public static final String DUMBBELL_TRICEPS_EXTENSION_TWO_ARM = "dumbbell_triceps_extension_two_arm";
-    field public static final String ELLIPTICAL = "elliptical";
-    field public static final String EXERCISE_CLASS = "exercise_class";
-    field public static final String FENCING = "fencing";
-    field public static final String FOOTBALL_AMERICAN = "football_american";
-    field public static final String FOOTBALL_AUSTRALIAN = "football_australian";
-    field public static final String FORWARD_TWIST = "forward_twist";
-    field public static final String FRISBEE_DISC = "frisbee_disc";
-    field public static final String GOLF = "golf";
-    field public static final String GUIDED_BREATHING = "guided_breathing";
-    field public static final String GYMNASTICS = "gymnastics";
-    field public static final String HANDBALL = "handball";
-    field public static final String HIGH_INTENSITY_INTERVAL_TRAINING = "high_intensity_interval_training";
-    field public static final String HIKING = "hiking";
-    field public static final String ICE_HOCKEY = "ice_hockey";
-    field public static final String ICE_SKATING = "ice_skating";
-    field public static final androidx.health.connect.client.records.ExerciseSessionRecord.ExerciseType INSTANCE;
-    field public static final String JUMPING_JACK = "jumping_jack";
-    field public static final String JUMP_ROPE = "jump_rope";
-    field public static final String LAT_PULL_DOWN = "lat_pull_down";
-    field public static final String LUNGE = "lunge";
-    field public static final String MARTIAL_ARTS = "martial_arts";
-    field public static final String MEDITATION = "meditation";
-    field public static final String PADDLING = "paddling";
-    field public static final String PARA_GLIDING = "para_gliding";
-    field public static final String PILATES = "pilates";
-    field public static final String PLANK = "plank";
-    field public static final String RACQUETBALL = "racquetball";
-    field public static final String ROCK_CLIMBING = "rock_climbing";
-    field public static final String ROLLER_HOCKEY = "roller_hockey";
-    field public static final String ROWING = "rowing";
-    field public static final String ROWING_MACHINE = "rowing_machine";
-    field public static final String RUGBY = "rugby";
-    field public static final String RUNNING = "running";
-    field public static final String RUNNING_TREADMILL = "running_treadmill";
-    field public static final String SAILING = "sailing";
-    field public static final String SCUBA_DIVING = "scuba_diving";
-    field public static final String SKATING = "skating";
-    field public static final String SKIING = "skiing";
-    field public static final String SNOWBOARDING = "snowboarding";
-    field public static final String SNOWSHOEING = "snowshoeing";
-    field public static final String SOCCER = "soccer";
-    field public static final String SOFTBALL = "softball";
-    field public static final String SQUASH = "squash";
-    field public static final String SQUAT = "squat";
-    field public static final String STAIR_CLIMBING = "stair_climbing";
-    field public static final String STAIR_CLIMBING_MACHINE = "stair_climbing_machine";
-    field public static final String STRENGTH_TRAINING = "strength_training";
-    field public static final String STRETCHING = "stretching";
-    field public static final String SURFING = "surfing";
-    field public static final String SWIMMING_OPEN_WATER = "swimming_open_water";
-    field public static final String SWIMMING_POOL = "swimming_pool";
-    field public static final String TABLE_TENNIS = "table_tennis";
-    field public static final String TENNIS = "tennis";
-    field public static final String UPPER_TWIST = "upper_twist";
-    field public static final String VOLLEYBALL = "volleyball";
-    field public static final String WALKING = "walking";
-    field public static final String WATER_POLO = "water_polo";
-    field public static final String WEIGHTLIFTING = "weightlifting";
-    field public static final String WHEELCHAIR = "wheelchair";
-    field public static final String WORKOUT = "workout";
-    field public static final String YOGA = "yoga";
-  }
-
-  public final class FloorsClimbedRecord implements androidx.health.connect.client.records.IntervalRecord {
-    ctor public FloorsClimbedRecord(double floors, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public double getFloors();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public final double floors;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.records.FloorsClimbedRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> FLOORS_CLIMBED_TOTAL;
-  }
-
-  public static final class FloorsClimbedRecord.Companion {
-  }
-
-  public final class HeartRateRecord implements androidx.health.connect.client.records.SeriesRecord<androidx.health.connect.client.records.HeartRateRecord.Sample> {
-    ctor public HeartRateRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.HeartRateRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.util.List<androidx.health.connect.client.records.HeartRateRecord.Sample> getSamples();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.util.List<androidx.health.connect.client.records.HeartRateRecord.Sample> samples;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_MIN;
-    field public static final androidx.health.connect.client.records.HeartRateRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> MEASUREMENTS_COUNT;
-  }
-
-  public static final class HeartRateRecord.Companion {
-  }
-
-  public static final class HeartRateRecord.Sample {
-    ctor public HeartRateRecord.Sample(java.time.Instant time, @IntRange(from=1L, to=300L) long beatsPerMinute);
-    method public long getBeatsPerMinute();
-    method public java.time.Instant getTime();
-    property public final long beatsPerMinute;
-    property public final java.time.Instant time;
-  }
-
-  public final class HeightRecord implements androidx.health.connect.client.records.InstantaneousRecord {
-    ctor public HeightRecord(androidx.health.connect.client.units.Length height, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.units.Length getHeight();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final androidx.health.connect.client.units.Length height;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-    field public static final androidx.health.connect.client.records.HeightRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> HEIGHT_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> HEIGHT_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Length> HEIGHT_MIN;
-  }
-
-  public static final class HeightRecord.Companion {
-  }
-
-  public final class HipCircumferenceRecord implements androidx.health.connect.client.records.InstantaneousRecord {
-    ctor public HipCircumferenceRecord(androidx.health.connect.client.units.Length circumference, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.units.Length getCircumference();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final androidx.health.connect.client.units.Length circumference;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public final class HydrationRecord implements androidx.health.connect.client.records.IntervalRecord {
-    ctor public HydrationRecord(androidx.health.connect.client.units.Volume volume, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    method public androidx.health.connect.client.units.Volume getVolume();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    property public final androidx.health.connect.client.units.Volume volume;
-    field public static final androidx.health.connect.client.records.HydrationRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Volume> VOLUME_TOTAL;
-  }
-
-  public static final class HydrationRecord.Companion {
-  }
-
-  @kotlin.PublishedApi internal interface InstantaneousRecord extends androidx.health.connect.client.records.Record {
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public abstract java.time.Instant time;
-    property public abstract java.time.ZoneOffset? zoneOffset;
-  }
-
-  @kotlin.PublishedApi internal interface IntervalRecord extends androidx.health.connect.client.records.Record {
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public abstract java.time.Instant endTime;
-    property public abstract java.time.ZoneOffset? endZoneOffset;
-    property public abstract java.time.Instant startTime;
-    property public abstract java.time.ZoneOffset? startZoneOffset;
-  }
-
-  public final class LeanBodyMassRecord implements androidx.health.connect.client.records.InstantaneousRecord {
-    ctor public LeanBodyMassRecord(androidx.health.connect.client.units.Mass mass, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.units.Mass getMass();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final androidx.health.connect.client.units.Mass mass;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public final class MealType {
-    field public static final String BREAKFAST = "breakfast";
-    field public static final String DINNER = "dinner";
-    field public static final androidx.health.connect.client.records.MealType INSTANCE;
-    field public static final String LUNCH = "lunch";
-    field public static final String SNACK = "snack";
-    field public static final String UNKNOWN = "unknown";
-  }
-
-  public final class MenstruationRecord implements androidx.health.connect.client.records.InstantaneousRecord {
-    ctor public MenstruationRecord(optional String? flow, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public String? getFlow();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final String? flow;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public static final class MenstruationRecord.Flow {
-    field public static final String HEAVY = "heavy";
-    field public static final androidx.health.connect.client.records.MenstruationRecord.Flow INSTANCE;
-    field public static final String LIGHT = "light";
-    field public static final String MEDIUM = "medium";
-    field public static final String SPOTTING = "spotting";
-  }
-
-  public final class NutritionRecord implements androidx.health.connect.client.records.IntervalRecord {
-    ctor public NutritionRecord(optional androidx.health.connect.client.units.Mass? biotin, optional androidx.health.connect.client.units.Mass? caffeine, optional androidx.health.connect.client.units.Mass? calcium, optional androidx.health.connect.client.units.Energy? energy, optional androidx.health.connect.client.units.Energy? energyFromFat, optional androidx.health.connect.client.units.Mass? chloride, optional androidx.health.connect.client.units.Mass? cholesterol, optional androidx.health.connect.client.units.Mass? chromium, optional androidx.health.connect.client.units.Mass? copper, optional androidx.health.connect.client.units.Mass? dietaryFiber, optional androidx.health.connect.client.units.Mass? folate, optional androidx.health.connect.client.units.Mass? folicAcid, optional androidx.health.connect.client.units.Mass? iodine, optional androidx.health.connect.client.units.Mass? iron, optional androidx.health.connect.client.units.Mass? magnesium, optional androidx.health.connect.client.units.Mass? manganese, optional androidx.health.connect.client.units.Mass? molybdenum, optional androidx.health.connect.client.units.Mass? monounsaturatedFat, optional androidx.health.connect.client.units.Mass? niacin, optional androidx.health.connect.client.units.Mass? pantothenicAcid, optional androidx.health.connect.client.units.Mass? phosphorus, optional androidx.health.connect.client.units.Mass? polyunsaturatedFat, optional androidx.health.connect.client.units.Mass? potassium, optional androidx.health.connect.client.units.Mass? protein, optional androidx.health.connect.client.units.Mass? riboflavin, optional androidx.health.connect.client.units.Mass? saturatedFat, optional androidx.health.connect.client.units.Mass? selenium, optional androidx.health.connect.client.units.Mass? sodium, optional androidx.health.connect.client.units.Mass? sugar, optional androidx.health.connect.client.units.Mass? thiamin, optional androidx.health.connect.client.units.Mass? totalCarbohydrate, optional androidx.health.connect.client.units.Mass? totalFat, optional androidx.health.connect.client.units.Mass? transFat, optional androidx.health.connect.client.units.Mass? unsaturatedFat, optional androidx.health.connect.client.units.Mass? vitaminA, optional androidx.health.connect.client.units.Mass? vitaminB12, optional androidx.health.connect.client.units.Mass? vitaminB6, optional androidx.health.connect.client.units.Mass? vitaminC, optional androidx.health.connect.client.units.Mass? vitaminD, optional androidx.health.connect.client.units.Mass? vitaminE, optional androidx.health.connect.client.units.Mass? vitaminK, optional androidx.health.connect.client.units.Mass? zinc, optional String? name, optional String? mealType, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.units.Mass? getBiotin();
-    method public androidx.health.connect.client.units.Mass? getCaffeine();
-    method public androidx.health.connect.client.units.Mass? getCalcium();
-    method public androidx.health.connect.client.units.Mass? getChloride();
-    method public androidx.health.connect.client.units.Mass? getCholesterol();
-    method public androidx.health.connect.client.units.Mass? getChromium();
-    method public androidx.health.connect.client.units.Mass? getCopper();
-    method public androidx.health.connect.client.units.Mass? getDietaryFiber();
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.units.Energy? getEnergy();
-    method public androidx.health.connect.client.units.Energy? getEnergyFromFat();
-    method public androidx.health.connect.client.units.Mass? getFolate();
-    method public androidx.health.connect.client.units.Mass? getFolicAcid();
-    method public androidx.health.connect.client.units.Mass? getIodine();
-    method public androidx.health.connect.client.units.Mass? getIron();
-    method public androidx.health.connect.client.units.Mass? getMagnesium();
-    method public androidx.health.connect.client.units.Mass? getManganese();
-    method public String? getMealType();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public androidx.health.connect.client.units.Mass? getMolybdenum();
-    method public androidx.health.connect.client.units.Mass? getMonounsaturatedFat();
-    method public String? getName();
-    method public androidx.health.connect.client.units.Mass? getNiacin();
-    method public androidx.health.connect.client.units.Mass? getPantothenicAcid();
-    method public androidx.health.connect.client.units.Mass? getPhosphorus();
-    method public androidx.health.connect.client.units.Mass? getPolyunsaturatedFat();
-    method public androidx.health.connect.client.units.Mass? getPotassium();
-    method public androidx.health.connect.client.units.Mass? getProtein();
-    method public androidx.health.connect.client.units.Mass? getRiboflavin();
-    method public androidx.health.connect.client.units.Mass? getSaturatedFat();
-    method public androidx.health.connect.client.units.Mass? getSelenium();
-    method public androidx.health.connect.client.units.Mass? getSodium();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    method public androidx.health.connect.client.units.Mass? getSugar();
-    method public androidx.health.connect.client.units.Mass? getThiamin();
-    method public androidx.health.connect.client.units.Mass? getTotalCarbohydrate();
-    method public androidx.health.connect.client.units.Mass? getTotalFat();
-    method public androidx.health.connect.client.units.Mass? getTransFat();
-    method public androidx.health.connect.client.units.Mass? getUnsaturatedFat();
-    method public androidx.health.connect.client.units.Mass? getVitaminA();
-    method public androidx.health.connect.client.units.Mass? getVitaminB12();
-    method public androidx.health.connect.client.units.Mass? getVitaminB6();
-    method public androidx.health.connect.client.units.Mass? getVitaminC();
-    method public androidx.health.connect.client.units.Mass? getVitaminD();
-    method public androidx.health.connect.client.units.Mass? getVitaminE();
-    method public androidx.health.connect.client.units.Mass? getVitaminK();
-    method public androidx.health.connect.client.units.Mass? getZinc();
-    property public final androidx.health.connect.client.units.Mass? biotin;
-    property public final androidx.health.connect.client.units.Mass? caffeine;
-    property public final androidx.health.connect.client.units.Mass? calcium;
-    property public final androidx.health.connect.client.units.Mass? chloride;
-    property public final androidx.health.connect.client.units.Mass? cholesterol;
-    property public final androidx.health.connect.client.units.Mass? chromium;
-    property public final androidx.health.connect.client.units.Mass? copper;
-    property public final androidx.health.connect.client.units.Mass? dietaryFiber;
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public final androidx.health.connect.client.units.Energy? energy;
-    property public final androidx.health.connect.client.units.Energy? energyFromFat;
-    property public final androidx.health.connect.client.units.Mass? folate;
-    property public final androidx.health.connect.client.units.Mass? folicAcid;
-    property public final androidx.health.connect.client.units.Mass? iodine;
-    property public final androidx.health.connect.client.units.Mass? iron;
-    property public final androidx.health.connect.client.units.Mass? magnesium;
-    property public final androidx.health.connect.client.units.Mass? manganese;
-    property public final String? mealType;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final androidx.health.connect.client.units.Mass? molybdenum;
-    property public final androidx.health.connect.client.units.Mass? monounsaturatedFat;
-    property public final String? name;
-    property public final androidx.health.connect.client.units.Mass? niacin;
-    property public final androidx.health.connect.client.units.Mass? pantothenicAcid;
-    property public final androidx.health.connect.client.units.Mass? phosphorus;
-    property public final androidx.health.connect.client.units.Mass? polyunsaturatedFat;
-    property public final androidx.health.connect.client.units.Mass? potassium;
-    property public final androidx.health.connect.client.units.Mass? protein;
-    property public final androidx.health.connect.client.units.Mass? riboflavin;
-    property public final androidx.health.connect.client.units.Mass? saturatedFat;
-    property public final androidx.health.connect.client.units.Mass? selenium;
-    property public final androidx.health.connect.client.units.Mass? sodium;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    property public final androidx.health.connect.client.units.Mass? sugar;
-    property public final androidx.health.connect.client.units.Mass? thiamin;
-    property public final androidx.health.connect.client.units.Mass? totalCarbohydrate;
-    property public final androidx.health.connect.client.units.Mass? totalFat;
-    property public final androidx.health.connect.client.units.Mass? transFat;
-    property public final androidx.health.connect.client.units.Mass? unsaturatedFat;
-    property public final androidx.health.connect.client.units.Mass? vitaminA;
-    property public final androidx.health.connect.client.units.Mass? vitaminB12;
-    property public final androidx.health.connect.client.units.Mass? vitaminB6;
-    property public final androidx.health.connect.client.units.Mass? vitaminC;
-    property public final androidx.health.connect.client.units.Mass? vitaminD;
-    property public final androidx.health.connect.client.units.Mass? vitaminE;
-    property public final androidx.health.connect.client.units.Mass? vitaminK;
-    property public final androidx.health.connect.client.units.Mass? zinc;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> BIOTIN_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CAFFEINE_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CALCIUM_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CHLORIDE_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CHOLESTEROL_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> CHROMIUM_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> COPPER_TOTAL;
-    field public static final androidx.health.connect.client.records.NutritionRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> DIETARY_FIBER_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> ENERGY_FROM_FAT_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> ENERGY_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> FOLATE_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> FOLIC_ACID_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> IODINE_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> IRON_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> MAGNESIUM_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> MANGANESE_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> MOLYBDENUM_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> MONOUNSATURATED_FAT_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> NIACIN_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> PANTOTHENIC_ACID_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> PHOSPHORUS_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> POLYUNSATURATED_FAT_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> POTASSIUM_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> PROTEIN_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> RIBOFLAVIN_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> SATURATED_FAT_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> SELENIUM_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> SODIUM_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> SUGAR_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> THIAMIN_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> TOTAL_CARBOHYDRATE_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> TOTAL_FAT_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> TRANS_FAT_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> UNSATURATED_FAT_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_A_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_B12_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_B6_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_C_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_D_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_E_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> VITAMIN_K_TOTAL;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> ZINC_TOTAL;
-  }
-
-  public static final class NutritionRecord.Companion {
-  }
-
-  public final class OvulationTestRecord implements androidx.health.connect.client.records.InstantaneousRecord {
-    ctor public OvulationTestRecord(String result, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public String getResult();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final String result;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public static final class OvulationTestRecord.Result {
-    field public static final String HIGH = "high";
-    field public static final String INCONCLUSIVE = "inconclusive";
-    field public static final androidx.health.connect.client.records.OvulationTestRecord.Result INSTANCE;
-    field public static final String NEGATIVE = "negative";
-    field public static final String POSITIVE = "positive";
-  }
-
-  public final class OxygenSaturationRecord implements androidx.health.connect.client.records.InstantaneousRecord {
-    ctor public OxygenSaturationRecord(androidx.health.connect.client.units.Percentage percentage, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public androidx.health.connect.client.units.Percentage getPercentage();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final androidx.health.connect.client.units.Percentage percentage;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public final class PowerRecord implements androidx.health.connect.client.records.SeriesRecord<androidx.health.connect.client.records.PowerRecord.Sample> {
-    ctor public PowerRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.PowerRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.util.List<androidx.health.connect.client.records.PowerRecord.Sample> getSamples();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.util.List<androidx.health.connect.client.records.PowerRecord.Sample> samples;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.records.PowerRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Power> POWER_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Power> POWER_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Power> POWER_MIN;
-  }
-
-  public static final class PowerRecord.Companion {
-  }
-
-  public static final class PowerRecord.Sample {
-    ctor public PowerRecord.Sample(java.time.Instant time, androidx.health.connect.client.units.Power power);
-    method public androidx.health.connect.client.units.Power getPower();
-    method public java.time.Instant getTime();
-    property public final androidx.health.connect.client.units.Power power;
-    property public final java.time.Instant time;
-  }
-
-  public interface Record {
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    property public abstract androidx.health.connect.client.records.metadata.Metadata metadata;
-  }
-
-  public final class RelationToMeal {
-    field public static final String AFTER_MEAL = "after_meal";
-    field public static final String BEFORE_MEAL = "before_meal";
-    field public static final String FASTING = "fasting";
-    field public static final String GENERAL = "general";
-    field public static final androidx.health.connect.client.records.RelationToMeal INSTANCE;
-  }
-
-  public final class RespiratoryRateRecord implements androidx.health.connect.client.records.InstantaneousRecord {
-    ctor public RespiratoryRateRecord(double rate, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public double getRate();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final double rate;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public final class RestingHeartRateRecord implements androidx.health.connect.client.records.InstantaneousRecord {
-    ctor public RestingHeartRateRecord(long beatsPerMinute, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public long getBeatsPerMinute();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final long beatsPerMinute;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> BPM_MIN;
-    field public static final androidx.health.connect.client.records.RestingHeartRateRecord.Companion Companion;
-  }
-
-  public static final class RestingHeartRateRecord.Companion {
-  }
-
-  @kotlin.PublishedApi internal interface SeriesRecord<T> extends androidx.health.connect.client.records.IntervalRecord {
-    method public java.util.List<T> getSamples();
-    property public abstract java.util.List<T> samples;
-  }
-
-  public final class SexualActivityRecord implements androidx.health.connect.client.records.InstantaneousRecord {
-    ctor public SexualActivityRecord(optional String? protectionUsed, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public String? getProtectionUsed();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final String? protectionUsed;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public static final class SexualActivityRecord.Protection {
-    field public static final androidx.health.connect.client.records.SexualActivityRecord.Protection INSTANCE;
-    field public static final String PROTECTED = "protected";
-    field public static final String UNPROTECTED = "unprotected";
-  }
-
-  public final class SleepSessionRecord implements androidx.health.connect.client.records.IntervalRecord {
-    ctor public SleepSessionRecord(optional String? title, optional String? notes, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public String? getNotes();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    method public String? getTitle();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final String? notes;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    property public final String? title;
-    field public static final androidx.health.connect.client.records.SleepSessionRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.time.Duration> SLEEP_DURATION_TOTAL;
-  }
-
-  public static final class SleepSessionRecord.Companion {
-  }
-
-  public final class SleepStageRecord implements androidx.health.connect.client.records.IntervalRecord {
-    ctor public SleepStageRecord(String stage, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public String getStage();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public final String stage;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-  }
-
-  public static final class SleepStageRecord.StageType {
-    field public static final String AWAKE = "awake";
-    field public static final String DEEP = "deep";
-    field public static final androidx.health.connect.client.records.SleepStageRecord.StageType INSTANCE;
-    field public static final String LIGHT = "light";
-    field public static final String OUT_OF_BED = "out_of_bed";
-    field public static final String REM = "rem";
-    field public static final String SLEEPING = "sleeping";
-    field public static final String UNKNOWN = "unknown";
-  }
-
-  public final class SpeedRecord implements androidx.health.connect.client.records.SeriesRecord<androidx.health.connect.client.records.SpeedRecord.Sample> {
-    ctor public SpeedRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.SpeedRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.util.List<androidx.health.connect.client.records.SpeedRecord.Sample> getSamples();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.util.List<androidx.health.connect.client.records.SpeedRecord.Sample> samples;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.records.SpeedRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Velocity> SPEED_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Velocity> SPEED_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Velocity> SPEED_MIN;
-  }
-
-  public static final class SpeedRecord.Companion {
-  }
-
-  public static final class SpeedRecord.Sample {
-    ctor public SpeedRecord.Sample(java.time.Instant time, androidx.health.connect.client.units.Velocity speed);
-    method public androidx.health.connect.client.units.Velocity getSpeed();
-    method public java.time.Instant getTime();
-    property public final androidx.health.connect.client.units.Velocity speed;
-    property public final java.time.Instant time;
-  }
-
-  public final class StepsCadenceRecord implements androidx.health.connect.client.records.SeriesRecord<androidx.health.connect.client.records.StepsCadenceRecord.Sample> {
-    ctor public StepsCadenceRecord(java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, java.util.List<androidx.health.connect.client.records.StepsCadenceRecord.Sample> samples, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.util.List<androidx.health.connect.client.records.StepsCadenceRecord.Sample> getSamples();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.util.List<androidx.health.connect.client.records.StepsCadenceRecord.Sample> samples;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.records.StepsCadenceRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RATE_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RATE_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Double> RATE_MIN;
-  }
-
-  public static final class StepsCadenceRecord.Companion {
-  }
-
-  public static final class StepsCadenceRecord.Sample {
-    ctor public StepsCadenceRecord.Sample(java.time.Instant time, @FloatRange(from=0.0, to=10000.0) double rate);
-    method public double getRate();
-    method public java.time.Instant getTime();
-    property public final double rate;
-    property public final java.time.Instant time;
-  }
-
-  public final class StepsRecord implements androidx.health.connect.client.records.IntervalRecord {
-    ctor public StepsRecord(long count, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public long getCount();
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public final long count;
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> COUNT_TOTAL;
-    field public static final androidx.health.connect.client.records.StepsRecord.Companion Companion;
-  }
-
-  public static final class StepsRecord.Companion {
-  }
-
-  public final class SwimmingStrokesRecord implements androidx.health.connect.client.records.IntervalRecord {
-    ctor public SwimmingStrokesRecord(optional long count, String type, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public long getCount();
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    method public String getType();
-    property public final long count;
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    property public final String type;
-  }
-
-  public static final class SwimmingStrokesRecord.SwimmingType {
-    field public static final String BACKSTROKE = "backstroke";
-    field public static final String BREASTSTROKE = "breaststroke";
-    field public static final String BUTTERFLY = "butterfly";
-    field public static final String FREESTYLE = "freestyle";
-    field public static final androidx.health.connect.client.records.SwimmingStrokesRecord.SwimmingType INSTANCE;
-    field public static final String MIXED = "mixed";
-    field public static final String OTHER = "other";
-  }
-
-  public final class TotalCaloriesBurnedRecord implements androidx.health.connect.client.records.IntervalRecord {
-    ctor public TotalCaloriesBurnedRecord(androidx.health.connect.client.units.Energy energy, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.units.Energy getEnergy();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public final androidx.health.connect.client.units.Energy energy;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.records.TotalCaloriesBurnedRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Energy> ENERGY_TOTAL;
-  }
-
-  public static final class TotalCaloriesBurnedRecord.Companion {
-  }
-
-  public final class Vo2MaxRecord implements androidx.health.connect.client.records.InstantaneousRecord {
-    ctor public Vo2MaxRecord(double vo2MillilitersPerMinuteKilogram, optional String? measurementMethod, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public String? getMeasurementMethod();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public double getVo2MillilitersPerMinuteKilogram();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final String? measurementMethod;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public final double vo2MillilitersPerMinuteKilogram;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public static final class Vo2MaxRecord.MeasurementMethod {
-    field public static final String COOPER_TEST = "cooper_test";
-    field public static final String HEART_RATE_RATIO = "heart_rate_ratio";
-    field public static final androidx.health.connect.client.records.Vo2MaxRecord.MeasurementMethod INSTANCE;
-    field public static final String METABOLIC_CART = "metabolic_cart";
-    field public static final String MULTISTAGE_FITNESS_TEST = "multistage_fitness_test";
-    field public static final String OTHER = "other";
-    field public static final String ROCKPORT_FITNESS_TEST = "rockport_fitness_test";
-  }
-
-  public final class WaistCircumferenceRecord implements androidx.health.connect.client.records.InstantaneousRecord {
-    ctor public WaistCircumferenceRecord(androidx.health.connect.client.units.Length circumference, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.units.Length getCircumference();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public final androidx.health.connect.client.units.Length circumference;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public java.time.ZoneOffset? zoneOffset;
-  }
-
-  public final class WeightRecord implements androidx.health.connect.client.records.InstantaneousRecord {
-    ctor public WeightRecord(androidx.health.connect.client.units.Mass weight, java.time.Instant time, java.time.ZoneOffset? zoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getTime();
-    method public androidx.health.connect.client.units.Mass getWeight();
-    method public java.time.ZoneOffset? getZoneOffset();
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant time;
-    property public final androidx.health.connect.client.units.Mass weight;
-    property public java.time.ZoneOffset? zoneOffset;
-    field public static final androidx.health.connect.client.records.WeightRecord.Companion Companion;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> WEIGHT_AVG;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> WEIGHT_MAX;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<androidx.health.connect.client.units.Mass> WEIGHT_MIN;
-  }
-
-  public static final class WeightRecord.Companion {
-  }
-
-  public final class WheelchairPushesRecord implements androidx.health.connect.client.records.IntervalRecord {
-    ctor public WheelchairPushesRecord(long count, java.time.Instant startTime, java.time.ZoneOffset? startZoneOffset, java.time.Instant endTime, java.time.ZoneOffset? endZoneOffset, optional androidx.health.connect.client.records.metadata.Metadata metadata);
-    method public long getCount();
-    method public java.time.Instant getEndTime();
-    method public java.time.ZoneOffset? getEndZoneOffset();
-    method public androidx.health.connect.client.records.metadata.Metadata getMetadata();
-    method public java.time.Instant getStartTime();
-    method public java.time.ZoneOffset? getStartZoneOffset();
-    property public final long count;
-    property public java.time.Instant endTime;
-    property public java.time.ZoneOffset? endZoneOffset;
-    property public androidx.health.connect.client.records.metadata.Metadata metadata;
-    property public java.time.Instant startTime;
-    property public java.time.ZoneOffset? startZoneOffset;
-    field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.lang.Long> COUNT_TOTAL;
-    field public static final androidx.health.connect.client.records.WheelchairPushesRecord.Companion Companion;
-  }
-
-  public static final class WheelchairPushesRecord.Companion {
-  }
-
-}
-
-package androidx.health.connect.client.records.metadata {
-
-  public final class DataOrigin {
-    ctor public DataOrigin(String packageName);
-    method public String getPackageName();
-    property public final String packageName;
-  }
-
-  public final class Device {
-    ctor public Device(optional String? manufacturer, optional String? model, optional String? type);
-    method public String? getManufacturer();
-    method public String? getModel();
-    method public String? getType();
-    property public final String? manufacturer;
-    property public final String? model;
-    property public final String? type;
-  }
-
-  public final class DeviceTypes {
-    field public static final String CHEST_STRAP = "CHEST_STRAP";
-    field public static final String FITNESS_BAND = "FITNESS_BAND";
-    field public static final String HEAD_MOUNTED = "HEAD_MOUNTED";
-    field public static final androidx.health.connect.client.records.metadata.DeviceTypes INSTANCE;
-    field public static final String PHONE = "PHONE";
-    field public static final String RING = "RING";
-    field public static final String SCALE = "SCALE";
-    field public static final String SMART_DISPLAY = "SMART_DISPLAY";
-    field public static final String UNKNOWN = "UNKNOWN";
-    field public static final String WATCH = "WATCH";
-  }
-
-  public final class Metadata {
-    ctor public Metadata(optional String? uid, optional androidx.health.connect.client.records.metadata.DataOrigin dataOrigin, optional java.time.Instant lastModifiedTime, optional String? clientId, optional long clientVersion, optional androidx.health.connect.client.records.metadata.Device? device);
-    method public String? getClientId();
-    method public long getClientVersion();
-    method public androidx.health.connect.client.records.metadata.DataOrigin getDataOrigin();
-    method public androidx.health.connect.client.records.metadata.Device? getDevice();
-    method public java.time.Instant getLastModifiedTime();
-    method public String? getUid();
-    property public final String? clientId;
-    property public final long clientVersion;
-    property public final androidx.health.connect.client.records.metadata.DataOrigin dataOrigin;
-    property public final androidx.health.connect.client.records.metadata.Device? device;
-    property public final java.time.Instant lastModifiedTime;
-    property public final String? uid;
-  }
-
-}
-
-package androidx.health.connect.client.request {
-
-  public final class AggregateGroupByDurationRequest {
-    ctor public AggregateGroupByDurationRequest(java.util.Set<? extends androidx.health.connect.client.aggregate.AggregateMetric<?>> metrics, androidx.health.connect.client.time.TimeRangeFilter timeRangeFilter, java.time.Duration timeRangeSlicer, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilter);
-  }
-
-  public final class AggregateGroupByPeriodRequest {
-    ctor public AggregateGroupByPeriodRequest(java.util.Set<? extends androidx.health.connect.client.aggregate.AggregateMetric<?>> metrics, androidx.health.connect.client.time.TimeRangeFilter timeRangeFilter, java.time.Period timeRangeSlicer, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilter);
-  }
-
-  public final class AggregateRequest {
-    ctor public AggregateRequest(java.util.Set<? extends androidx.health.connect.client.aggregate.AggregateMetric<?>> metrics, androidx.health.connect.client.time.TimeRangeFilter timeRangeFilter, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilter);
-  }
-
-  public final class ChangesTokenRequest {
-    ctor public ChangesTokenRequest(java.util.Set<? extends kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record>> recordTypes, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilters);
-  }
-
-  public final class ReadRecordsRequest<T extends androidx.health.connect.client.records.Record> {
-    ctor public ReadRecordsRequest(kotlin.reflect.KClass<T> recordType, androidx.health.connect.client.time.TimeRangeFilter timeRangeFilter, optional java.util.Set<androidx.health.connect.client.records.metadata.DataOrigin> dataOriginFilter, optional boolean ascendingOrder, optional int pageSize, optional String? pageToken);
-  }
-
-}
-
-package androidx.health.connect.client.response {
-
-  public final class ChangesResponse {
-    method public java.util.List<androidx.health.connect.client.changes.Change> getChanges();
-    method public boolean getChangesTokenExpired();
-    method public boolean getHasMore();
-    method public String getNextChangesToken();
-    property public final java.util.List<androidx.health.connect.client.changes.Change> changes;
-    property public final boolean changesTokenExpired;
-    property public final boolean hasMore;
-    property public final String nextChangesToken;
-  }
-
-  public final class InsertRecordsResponse {
-    method public java.util.List<java.lang.String> getRecordUidsList();
-    property public final java.util.List<java.lang.String> recordUidsList;
-  }
-
-  public final class ReadRecordResponse<T extends androidx.health.connect.client.records.Record> {
-    method public T getRecord();
-    property public final T record;
-  }
-
-  public final class ReadRecordsResponse<T extends androidx.health.connect.client.records.Record> {
-    method public String? getPageToken();
-    method public java.util.List<T> getRecords();
-    property public final String? pageToken;
-    property public final java.util.List<T> records;
-  }
-
-}
-
-package androidx.health.connect.client.time {
-
-  public final class TimeRangeFilter {
-    method public static androidx.health.connect.client.time.TimeRangeFilter after(java.time.Instant startTime);
-    method public static androidx.health.connect.client.time.TimeRangeFilter after(java.time.LocalDateTime startTime);
-    method public static androidx.health.connect.client.time.TimeRangeFilter before(java.time.Instant endTime);
-    method public static androidx.health.connect.client.time.TimeRangeFilter before(java.time.LocalDateTime endTime);
-    method public static androidx.health.connect.client.time.TimeRangeFilter between(java.time.Instant startTime, java.time.Instant endTime);
-    method public static androidx.health.connect.client.time.TimeRangeFilter between(java.time.LocalDateTime startTime, java.time.LocalDateTime endTime);
-    field public static final androidx.health.connect.client.time.TimeRangeFilter.Companion Companion;
-  }
-
-  public static final class TimeRangeFilter.Companion {
-    method public androidx.health.connect.client.time.TimeRangeFilter after(java.time.Instant startTime);
-    method public androidx.health.connect.client.time.TimeRangeFilter after(java.time.LocalDateTime startTime);
-    method public androidx.health.connect.client.time.TimeRangeFilter before(java.time.Instant endTime);
-    method public androidx.health.connect.client.time.TimeRangeFilter before(java.time.LocalDateTime endTime);
-    method public androidx.health.connect.client.time.TimeRangeFilter between(java.time.Instant startTime, java.time.Instant endTime);
-    method public androidx.health.connect.client.time.TimeRangeFilter between(java.time.LocalDateTime startTime, java.time.LocalDateTime endTime);
-  }
-
-}
-
-package androidx.health.connect.client.units {
-
-  public final class Energy implements java.lang.Comparable<androidx.health.connect.client.units.Energy> {
-    method public static androidx.health.connect.client.units.Energy calories(double value);
-    method public int compareTo(androidx.health.connect.client.units.Energy other);
-    method public double getCalories();
-    method public double getJoules();
-    method public double getKilocalories();
-    method public double getKilojoules();
-    method public static androidx.health.connect.client.units.Energy joules(double value);
-    method public static androidx.health.connect.client.units.Energy kilocalories(double value);
-    method public static androidx.health.connect.client.units.Energy kilojoules(double value);
-    property public final double inCalories;
-    property public final double inJoules;
-    property public final double inKilocalories;
-    property public final double inKilojoules;
-    field public static final androidx.health.connect.client.units.Energy.Companion Companion;
-  }
-
-  public static final class Energy.Companion {
-    method public androidx.health.connect.client.units.Energy calories(double value);
-    method public androidx.health.connect.client.units.Energy joules(double value);
-    method public androidx.health.connect.client.units.Energy kilocalories(double value);
-    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);
-    method public double getFeet();
-    method public double getInches();
-    method public double getKilometers();
-    method public double getMeters();
-    method public double getMiles();
-    method public static androidx.health.connect.client.units.Length inches(double value);
-    method public static androidx.health.connect.client.units.Length kilometers(double value);
-    method public static androidx.health.connect.client.units.Length meters(double value);
-    method public static androidx.health.connect.client.units.Length miles(double value);
-    property public final double inFeet;
-    property public final double inInches;
-    property public final double inKilometers;
-    property public final double inMeters;
-    property public final double inMiles;
-    field public static final androidx.health.connect.client.units.Length.Companion Companion;
-  }
-
-  public static final class Length.Companion {
-    method public androidx.health.connect.client.units.Length feet(double value);
-    method public androidx.health.connect.client.units.Length inches(double value);
-    method public androidx.health.connect.client.units.Length kilometers(double value);
-    method public androidx.health.connect.client.units.Length meters(double value);
-    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();
-    method public double getKilograms();
-    method public double getMicrograms();
-    method public double getMilligrams();
-    method public double getOunces();
-    method public static androidx.health.connect.client.units.Mass grams(double value);
-    method public static androidx.health.connect.client.units.Mass kilograms(double value);
-    method public static androidx.health.connect.client.units.Mass micrograms(double value);
-    method public static androidx.health.connect.client.units.Mass milligrams(double value);
-    method public static androidx.health.connect.client.units.Mass ounces(double value);
-    property public final double inGrams;
-    property public final double inKilograms;
-    property public final double inMicrograms;
-    property public final double inMilligrams;
-    property public final double inOunces;
-    field public static final androidx.health.connect.client.units.Mass.Companion Companion;
-  }
-
-  public static final class Mass.Companion {
-    method public androidx.health.connect.client.units.Mass grams(double value);
-    method public androidx.health.connect.client.units.Mass kilograms(double value);
-    method public androidx.health.connect.client.units.Mass micrograms(double value);
-    method public androidx.health.connect.client.units.Mass milligrams(double value);
-    method public androidx.health.connect.client.units.Mass ounces(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);
-    method public double getValue();
-    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();
-    method public double getWatts();
-    method public static androidx.health.connect.client.units.Power kilocaloriesPerDay(double value);
-    method public static androidx.health.connect.client.units.Power watts(double value);
-    property public final double inKilocaloriesPerDay;
-    property public final double inWatts;
-    field public static final androidx.health.connect.client.units.Power.Companion Companion;
-  }
-
-  public static final class Power.Companion {
-    method public androidx.health.connect.client.units.Power kilocaloriesPerDay(double value);
-    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();
-    method public static androidx.health.connect.client.units.Pressure millimetersOfMercury(double value);
-    property public final double inMillimetersOfMercury;
-    field public static final androidx.health.connect.client.units.Pressure.Companion Companion;
-  }
-
-  public static final class Pressure.Companion {
-    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);
-    method public static androidx.health.connect.client.units.Temperature fahrenheit(double value);
-    method public double getCelsius();
-    method public double getFahrenheit();
-    property public final double inCelsius;
-    property public final double inFahrenheit;
-    field public static final androidx.health.connect.client.units.Temperature.Companion Companion;
-  }
-
-  public static final class Temperature.Companion {
-    method public androidx.health.connect.client.units.Temperature celsius(double value);
-    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();
-    method public double getMetersPerSecond();
-    method public double getMilesPerHour();
-    method public static androidx.health.connect.client.units.Velocity kilometersPerHour(double value);
-    method public static androidx.health.connect.client.units.Velocity metersPerSecond(double value);
-    method public static androidx.health.connect.client.units.Velocity milesPerHour(double value);
-    property public final double inKilometersPerHour;
-    property public final double inMetersPerSecond;
-    property public final double inMilesPerHour;
-    field public static final androidx.health.connect.client.units.Velocity.Companion Companion;
-  }
-
-  public static final class Velocity.Companion {
-    method public androidx.health.connect.client.units.Velocity kilometersPerHour(double value);
-    method public androidx.health.connect.client.units.Velocity metersPerSecond(double value);
-    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);
-    method public double getFluidOuncesUs();
-    method public double getLiters();
-    method public double getMilliliters();
-    method public static androidx.health.connect.client.units.Volume liters(double value);
-    method public static androidx.health.connect.client.units.Volume milliliters(double value);
-    property public final double inFluidOuncesUs;
-    property public final double inLiters;
-    property public final double inMilliliters;
-    field public static final androidx.health.connect.client.units.Volume.Companion Companion;
-  }
-
-  public static final class Volume.Companion {
-    method public androidx.health.connect.client.units.Volume fluidOuncesUs(double value);
-    method public androidx.health.connect.client.units.Volume liters(double value);
-    method public androidx.health.connect.client.units.Volume milliliters(double value);
-  }
-
-  public final class VolumeKt {
-  }
-
-}
-
diff --git a/health/health-connect-client/build.gradle b/health/health-connect-client/build.gradle
deleted file mode 100644
index a0550e3..0000000
--- a/health/health-connect-client/build.gradle
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import androidx.build.BundleInsideHelper
-import androidx.build.LibraryType
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
-
-plugins {
-    id("AndroidXPlugin")
-    id("com.android.library")
-    id("org.jetbrains.kotlin.android")
-}
-
-BundleInsideHelper.forInsideAar(
-        project,
-        /* from = */ "com.google.protobuf",
-        /* to =   */ "androidx.health.platform.client.proto"
-)
-
-dependencies {
-    api(libs.kotlinStdlib)
-    // Add dependencies here
-    api("androidx.activity:activity:1.2.0")
-    api("androidx.annotation:annotation:1.2.0")
-    bundleInside(project(
-            path: ":health:health-connect-client-proto",
-            configuration: "export"
-    ))
-    implementation(libs.guavaListenableFuture)
-    implementation(libs.guavaAndroid)
-    implementation(libs.kotlinCoroutinesAndroid)
-    implementation(libs.kotlinCoroutinesGuava)
-
-    testImplementation(libs.testCore)
-    testImplementation(libs.testRunner)
-    testImplementation(libs.junit)
-    testImplementation(libs.truth)
-    testImplementation(libs.kotlinCoroutinesTest)
-    androidTestImplementation(libs.testRules)
-    testImplementation(libs.mockitoCore)
-    testImplementation(libs.robolectric)
-    testImplementation(libs.testExtJunit)
-    testImplementation(libs.kotlinTest)
-    testImplementation(libs.espressoCore)
-    testImplementation(libs.espressoIntents)
-
-    samples(project(":health:health-connect-client-samples"))
-}
-
-android {
-    defaultConfig {
-        minSdkVersion 26
-    }
-    buildFeatures {
-        aidl = true
-    }
-    buildTypes.all {
-        consumerProguardFiles "proguard-rules.pro"
-    }
-    testOptions.unitTests.includeAndroidResources = true
-    namespace "androidx.health.connect.client"
-}
-
-androidx {
-    name = "AndroidX Health Connect Client Library"
-    type = LibraryType.PUBLISHED_LIBRARY
-    mavenVersion = LibraryVersions.HEALTH_CONNECT_CLIENT
-    mavenGroup = LibraryGroups.HEALTH
-    inceptionYear = "2022"
-    description = "read or write user's health and fitness records."
-}
-
-// Allow usage of Kotlin's @OptIn.
-tasks.withType(KotlinCompile).configureEach {
-    kotlinOptions {
-        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
-    }
-}
diff --git a/health/health-connect-client/samples/build.gradle b/health/health-connect-client/samples/build.gradle
deleted file mode 100644
index 1fa6318..0000000
--- a/health/health-connect-client/samples/build.gradle
+++ /dev/null
@@ -1,50 +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.
- */
-
-
-import androidx.build.Publish
-import androidx.build.LibraryType
-
-plugins {
-    id("AndroidXPlugin")
-    id("com.android.library")
-    id("org.jetbrains.kotlin.android")
-}
-
-dependencies {
-    implementation(libs.kotlinStdlib)
-
-    compileOnly projectOrArtifact(":annotation:annotation-sampled")
-    implementation project(":health:health-connect-client")
-    implementation project(":appcompat:appcompat")
-    implementation project(":activity:activity")
-}
-
-androidx {
-    name = "AndroidX Health Connect Library Samples"
-    type = LibraryType.SAMPLES
-    mavenVersion = LibraryVersions.HEALTH_CONNECT_CLIENT
-    mavenGroup = LibraryGroups.HEALTH
-    inceptionYear = "2022"
-    description = "Contains the sample code for the Androidx Health Connect Library"
-}
-
-android {
-    namespace "androidx.health.connect.client.samples"
-    defaultConfig {
-        minSdkVersion 26
-    }
-}
\ No newline at end of file
diff --git a/health/health-connect-client/samples/src/main/java/androidx/health/connect/client/samples/DeleteRecordsSamples.kt b/health/health-connect-client/samples/src/main/java/androidx/health/connect/client/samples/DeleteRecordsSamples.kt
deleted file mode 100644
index da51ac0..0000000
--- a/health/health-connect-client/samples/src/main/java/androidx/health/connect/client/samples/DeleteRecordsSamples.kt
+++ /dev/null
@@ -1,62 +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.
- */
-
-@file:Suppress("UNUSED_VARIABLE")
-
-package androidx.health.connect.client.samples
-
-import androidx.annotation.Sampled
-import androidx.health.connect.client.HealthConnectClient
-import androidx.health.connect.client.records.SleepSessionRecord
-import androidx.health.connect.client.records.SleepStageRecord
-import androidx.health.connect.client.records.StepsRecord
-import androidx.health.connect.client.time.TimeRangeFilter
-import java.time.Instant
-
-@Sampled
-suspend fun DeleteByUniqueIdentifier(
-    healthConnectClient: HealthConnectClient,
-    uid1: String,
-    uid2: String
-) {
-    healthConnectClient.deleteRecords(
-        StepsRecord::class,
-        uidsList = listOf(uid1, uid2),
-        clientIdsList = emptyList()
-    )
-}
-
-@Sampled
-suspend fun DeleteByTimeRange(
-    healthConnectClient: HealthConnectClient,
-    startTime: Instant,
-    endTime: Instant
-) {
-    healthConnectClient.deleteRecords(
-        StepsRecord::class,
-        timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
-    )
-}
-
-@Sampled
-suspend fun DeleteSleepSession(
-    healthConnectClient: HealthConnectClient,
-    sleepRecord: SleepSessionRecord,
-) {
-    val timeRangeFilter = TimeRangeFilter.between(sleepRecord.startTime, sleepRecord.endTime)
-    healthConnectClient.deleteRecords(SleepSessionRecord::class, timeRangeFilter)
-    healthConnectClient.deleteRecords(SleepStageRecord::class, timeRangeFilter)
-}
diff --git a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IHealthDataService.aidl b/health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IHealthDataService.aidl
deleted file mode 100644
index 229b6e2..0000000
--- a/health/health-connect-client/src/main/aidl/androidx/health/platform/client/service/IHealthDataService.aidl
+++ /dev/null
@@ -1,80 +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.platform.client.service;
-
-import androidx.health.platform.client.permission.Permission;
-import androidx.health.platform.client.request.AggregateDataRequest;
-import androidx.health.platform.client.request.DeleteDataRequest;
-import androidx.health.platform.client.request.DeleteDataRangeRequest;
-import androidx.health.platform.client.request.GetChangesTokenRequest;
-import androidx.health.platform.client.request.GetChangesRequest;
-import androidx.health.platform.client.request.UpsertDataRequest;
-import androidx.health.platform.client.request.ReadDataRequest;
-import androidx.health.platform.client.request.ReadDataRangeRequest;
-import androidx.health.platform.client.request.RequestContext;
-import androidx.health.platform.client.service.IGetChangesCallback;
-import androidx.health.platform.client.service.IGetChangesTokenCallback;
-import androidx.health.platform.client.service.IGetGrantedPermissionsCallback;
-import androidx.health.platform.client.service.IDeleteDataCallback;
-import androidx.health.platform.client.service.IDeleteDataRangeCallback;
-import androidx.health.platform.client.service.IReadDataRangeCallback;
-import androidx.health.platform.client.service.IUpdateDataCallback;
-import androidx.health.platform.client.service.IInsertDataCallback;
-import androidx.health.platform.client.service.IReadDataCallback;
-import androidx.health.platform.client.service.IRevokeAllPermissionsCallback;
-import androidx.health.platform.client.service.IAggregateDataCallback;
-
-interface IHealthDataService {
-  /**
-   * API version of the AIDL interface. Should be incremented every time a new
-   * method is added.
-   */
-  const int CURRENT_API_VERSION = 1;
-
-  const int MIN_API_VERSION = 1;
-
-  // Next Id: 18
-
-  /**
-   * Returns version of this AIDL interface.
-   *
-   * <p> Can be used by client to detect version of the API on the service
-   * side. Should always return CURRENT_API_VERSION.
-   */
-  int getApiVersion() = 0;
-
-  void getGrantedPermissions(in RequestContext context, in List<Permission> permissions, in IGetGrantedPermissionsCallback callback) = 3;
-
-  void revokeAllPermissions(in RequestContext context, in IRevokeAllPermissionsCallback callback) = 8;
-
-  void insertData(in RequestContext context, in UpsertDataRequest request, in IInsertDataCallback callback) = 9;
-
-  void deleteData(in RequestContext context, in DeleteDataRequest request, in IDeleteDataCallback callback) = 10;
-
-  void deleteDataRange(in RequestContext context, in DeleteDataRangeRequest request, in IDeleteDataRangeCallback callback) = 13;
-
-  void readData(in RequestContext context, in ReadDataRequest request, in IReadDataCallback callback) = 11;
-
-  void readDataRange(in RequestContext context, in ReadDataRangeRequest request, in IReadDataRangeCallback callback) = 15;
-
-  void updateData(in RequestContext context, in UpsertDataRequest request, in IUpdateDataCallback callback) = 12;
-
-  void aggregate(in RequestContext context, in AggregateDataRequest request, in IAggregateDataCallback callback) = 14;
-
-  void getChangesToken(in RequestContext context, in GetChangesTokenRequest request, in IGetChangesTokenCallback callback) = 16;
-
-  void getChanges(in RequestContext context, in GetChangesRequest request, in IGetChangesCallback callback) = 17;
-}
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/HealthConnectClient.kt b/health/health-connect-client/src/main/java/androidx/health/connect/client/HealthConnectClient.kt
deleted file mode 100644
index 1a426c1..0000000
--- a/health/health-connect-client/src/main/java/androidx/health/connect/client/HealthConnectClient.kt
+++ /dev/null
@@ -1,387 +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
-
-import android.content.Context
-import android.content.Intent
-import android.content.pm.PackageManager
-import android.os.Build
-import android.os.RemoteException
-import androidx.annotation.ChecksSdkIntAtLeast
-import androidx.annotation.RestrictTo
-import androidx.health.connect.client.aggregate.AggregateMetric
-import androidx.health.connect.client.aggregate.AggregationResult
-import androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration
-import androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod
-import androidx.health.connect.client.impl.HealthConnectClientImpl
-import androidx.health.connect.client.records.Record
-import androidx.health.connect.client.records.metadata.DataOrigin
-import androidx.health.connect.client.request.AggregateGroupByDurationRequest
-import androidx.health.connect.client.request.AggregateGroupByPeriodRequest
-import androidx.health.connect.client.request.AggregateRequest
-import androidx.health.connect.client.request.ChangesTokenRequest
-import androidx.health.connect.client.request.ReadRecordsRequest
-import androidx.health.connect.client.response.ChangesResponse
-import androidx.health.connect.client.response.InsertRecordsResponse
-import androidx.health.connect.client.response.ReadRecordResponse
-import androidx.health.connect.client.response.ReadRecordsResponse
-import androidx.health.connect.client.time.TimeRangeFilter
-import androidx.health.platform.client.HealthDataService
-import java.io.IOException
-import java.lang.IllegalStateException
-import kotlin.reflect.KClass
-
-/** Interface to access health and fitness records. */
-interface HealthConnectClient {
-
-    /** Access operations related to permissions. */
-    val permissionController: PermissionController
-
-    /**
-     * Inserts one or more [Record] and returns newly assigned
-     * [androidx.health.connect.client.records.metadata.Metadata.uid] generated. Insertion of
-     * multiple [records] is executed in a transaction - if one fails, none is inserted.
-     *
-     * 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.clientId] can be used to
-     * deduplicate data with a client provided unique identifier. When a subsequent [insertRecords]
-     * is called with the same [androidx.health.connect.client.records.metadata.Metadata.clientId],
-     * whichever [Record] with the higher [androidx.health.connect.client.records.metadata.Metadata.clientVersion]
-     * 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
-
-    /**
-     * Updates one or more [Record] of given UIDs to newly specified values. Update of multiple
-     * [records] is executed in a transaction - if one fails, none is inserted.
-     *
-     * @param records List of records to update
-     * @throws RemoteException For any IPC transportation failures. Update with invalid identifiers
-     * 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.
-     */
-    suspend fun updateRecords(records: List<Record>)
-
-    /**
-     * 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 uidsList List of uids of [Record] to delete
-     * @param clientIdsList List of client 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.
-     * @throws SecurityException For requests with unpermitted access.
-     * @throws IOException For any disk I/O issues.
-     * @throws IllegalStateException If service is not available.
-     */
-    suspend fun deleteRecords(
-        recordType: KClass<out Record>,
-        uidsList: List<String>,
-        clientIdsList: List<String>,
-    )
-
-    /**
-     * Deletes any [Record] of the given [recordType] in the given [timeRangeFilter] (automatically
-     * 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.
-     */
-    suspend fun deleteRecords(recordType: KClass<out Record>, timeRangeFilter: TimeRangeFilter)
-
-    /**
-     * Reads one [Record] point with its [recordType] and [uid].
-     *
-     * @param recordType Which type of [Record] to read, such as `Steps::class`
-     * @param uid Uid of [Record] to read
-     * @return The [Record] data point.
-     * @throws RemoteException For any IPC transportation failures. Update with invalid identifiers
-     * 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.
-     */
-    suspend fun <T : Record> readRecord(recordType: KClass<T>, uid: String): ReadRecordResponse<T>
-
-    /**
-     * 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.
-     */
-    suspend fun <T : Record> readRecords(request: ReadRecordsRequest<T>): ReadRecordsResponse<T>
-
-    /**
-     * 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.
-     *
-     * @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.
-     */
-    suspend fun aggregate(request: AggregateRequest): AggregationResult
-
-    /**
-     * Reads [AggregateMetric]s according to requested read criteria specified in
-     * [AggregateGroupByDurationRequest].
-     *
-     * This method is similar to [aggregate] but instead of returning one [AggregationResult] for
-     * the entire query's time interval, it returns a list of [AggregationResultGroupedByDuration],
-     * with each row keyed by start and end time. For example: steps for today bucketed by hours.
-     *
-     * 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.
-     *
-     * @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.
-     * @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 aggregateGroupByDuration(
-        request: AggregateGroupByDurationRequest,
-    ): List<AggregationResultGroupedByDuration>
-
-    /**
-     * Reads [AggregateMetric]s according to requested read criteria specified in
-     * [AggregateGroupByPeriodRequest].
-     *
-     * This method is similar to [aggregate] but instead of returning one [AggregationResult] for
-     * the entire query's time interval, it returns a list of [AggregationResultGroupedByPeriod],
-     * with each row keyed by start and end time. For example: steps for this month bucketed by day.
-     *
-     * 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.
-     *
-     * @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.
-     * @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 aggregateGroupByPeriod(
-        request: AggregateGroupByPeriodRequest,
-    ): List<AggregationResultGroupedByPeriod>
-
-    /**
-     * Retrieves a changes-token, representing a point in time in the underlying Android Health
-     * Platform for a given [ChangesTokenRequest]. Changes-tokens are used in [getChanges] to
-     * retrieve changes since that point in time.
-     *
-     * Changes-tokens represent a point in time after which the client is interested in knowing the
-     * changes for a set of interested types of [Record] and optional [DataOrigin] filters.
-     *
-     * Changes-tokens are only valid for 30 days after they're generated. Calls to [getChanges] with
-     * an expired changes-token will lead to [ChangesResponse.changesTokenExpired]
-     *
-     * @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
-
-    /**
-     * Retrieves changes in Android Health Platform, from a specific point in time represented by
-     * provided [changesToken].
-     *
-     * The response returned may not provide all the changes due to IPC or memory limits, see
-     * [ChangesResponse.hasMore]. Clients can make more api calls to fetch more changes from the
-     * Android Health Platform with updated [ChangesResponse.nextChangesToken].
-     *
-     * Provided [changesToken] may have expired if clients have not synced for extended period of
-     * time (such as a month). In this case [ChangesResponse.changesTokenExpired] will be set, and
-     * clients should generate a new changes-token via [getChangesToken].
-     *
-     * ```
-     * val response = client.getChanges(changesToken)
-     * if (response.changesTokenExpired) {
-     *   // Consider re-sync and fetch new changes token.
-     * } else {
-     *   // Process new insertion/deletions, either update local storage or upload to backends.
-     * }
-     * ```
-     *
-     * @param changesToken A Changes-Token that represents a specific point in time in Android
-     * 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
-
-    companion object {
-        @RestrictTo(RestrictTo.Scope.LIBRARY)
-        internal const val DEFAULT_PROVIDER_PACKAGE_NAME = "com.google.android.apps.healthdata"
-
-        /**
-         * Determines whether an implementation of [HealthConnectClient] is available on this device
-         * at the moment.
-         *
-         * @param packageNames optional package provider to choose implementation from
-         * @return whether the api is available
-         */
-        @JvmOverloads
-        @JvmStatic
-        public fun isAvailable(
-            context: Context,
-            packageNames: List<String> = listOf(DEFAULT_PROVIDER_PACKAGE_NAME),
-        ): Boolean {
-            if (!isSdkVersionSufficient()) {
-                return false
-            }
-            return packageNames.any { isPackageInstalled(context.packageManager, it) }
-        }
-
-        /**
-         * Retrieves an IPC-backed [HealthConnectClient] instance binding to an available
-         * implementation.
-         *
-         * @param packageNames optional package provider to choose implementation from
-         * @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 isAvailable
-         */
-        @JvmOverloads
-        @JvmStatic
-        public fun getOrCreate(
-            context: Context,
-            packageNames: List<String> = listOf(DEFAULT_PROVIDER_PACKAGE_NAME),
-        ): HealthConnectClient {
-            if (!isSdkVersionSufficient()) {
-                throw UnsupportedOperationException("SDK version too low")
-            }
-            if (!isAvailable(context, packageNames)) {
-                throw IllegalStateException("Service not available")
-            }
-            val enabledPackage =
-                packageNames.first { isPackageInstalled(context.packageManager, it) }
-            return HealthConnectClientImpl(
-                enabledPackage,
-                HealthDataService.getClient(context, enabledPackage)
-            )
-        }
-
-        @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.P)
-        internal fun isSdkVersionSufficient() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.P
-
-        internal fun isPackageInstalled(
-            packageManager: PackageManager,
-            packageName: String,
-        ): Boolean {
-            val isPackageInstalledAndEnabled =
-                try {
-                    @Suppress("Deprecation") // getApplicationInfo deprecated in T
-                    packageManager.getApplicationInfo(packageName, /* flags= */ 0).enabled
-                } catch (e: PackageManager.NameNotFoundException) {
-                    false
-                }
-            return isPackageInstalledAndEnabled && hasBindableService(packageManager, packageName)
-        }
-
-        internal fun hasBindableService(
-            packageManager: PackageManager,
-            packageName: String
-        ): Boolean {
-            val bindIntent = Intent()
-            bindIntent.setPackage(packageName)
-            bindIntent.setAction(HealthDataService.ANDROID_HEALTH_PLATFORM_SERVICE_BIND_ACTION)
-            @Suppress("Deprecation") // deprecated in T
-            return packageManager.queryIntentServices(bindIntent, 0).isNotEmpty()
-        }
-
-        /**
-         * Tag used in SDK debug logs.
-         * @suppress
-         */
-        @RestrictTo(RestrictTo.Scope.LIBRARY)
-        internal const val HEALTH_CONNECT_CLIENT_TAG = "HealthConnectClient"
-    }
-}
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/HealthConnectClientImpl.kt b/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/HealthConnectClientImpl.kt
deleted file mode 100644
index c8b51e8..0000000
--- a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/HealthConnectClientImpl.kt
+++ /dev/null
@@ -1,228 +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.impl
-
-import androidx.activity.result.contract.ActivityResultContract
-import androidx.health.connect.client.HealthConnectClient
-import androidx.health.connect.client.HealthConnectClient.Companion.HEALTH_CONNECT_CLIENT_TAG
-import androidx.health.connect.client.PermissionController
-import androidx.health.connect.client.aggregate.AggregationResult
-import androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration
-import androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod
-import androidx.health.connect.client.impl.converters.aggregate.retrieveAggregateDataRow
-import androidx.health.connect.client.impl.converters.aggregate.toAggregateDataRowGroupByDuration
-import androidx.health.connect.client.impl.converters.aggregate.toAggregateDataRowGroupByPeriod
-import androidx.health.connect.client.impl.converters.datatype.toDataTypeIdPairProtoList
-import androidx.health.connect.client.impl.converters.datatype.toDataTypeName
-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
-import androidx.health.connect.client.impl.converters.request.toProto
-import androidx.health.connect.client.impl.converters.request.toReadDataRangeRequestProto
-import androidx.health.connect.client.impl.converters.request.toReadDataRequestProto
-import androidx.health.connect.client.impl.converters.response.toChangesResponse
-import androidx.health.connect.client.impl.converters.response.toReadRecordsResponse
-import androidx.health.connect.client.permission.HealthPermission
-import androidx.health.connect.client.permission.createHealthDataRequestPermissions
-import androidx.health.connect.client.records.Record
-import androidx.health.connect.client.request.AggregateGroupByDurationRequest
-import androidx.health.connect.client.request.AggregateGroupByPeriodRequest
-import androidx.health.connect.client.request.AggregateRequest
-import androidx.health.connect.client.request.ChangesTokenRequest
-import androidx.health.connect.client.request.ReadRecordsRequest
-import androidx.health.connect.client.response.ChangesResponse
-import androidx.health.connect.client.response.InsertRecordsResponse
-import androidx.health.connect.client.response.ReadRecordResponse
-import androidx.health.connect.client.response.ReadRecordsResponse
-import androidx.health.connect.client.time.TimeRangeFilter
-import androidx.health.platform.client.HealthDataAsyncClient
-import androidx.health.platform.client.impl.logger.Logger
-import androidx.health.platform.client.proto.DataProto
-import androidx.health.platform.client.proto.RequestProto
-import kotlin.reflect.KClass
-import kotlinx.coroutines.guava.await
-
-/**
- * Kotlin extension implementation that exposes kotlin coroutines rather than guava
- * ListenableFutures.
- *
- * @suppress
- */
-class HealthConnectClientImpl
-internal constructor(
-    private val providerPackageName: String,
-    private val delegate: HealthDataAsyncClient,
-) : HealthConnectClient, PermissionController {
-
-    override fun createRequestPermissionActivityContract():
-        ActivityResultContract<Set<HealthPermission>, Set<HealthPermission>> =
-        createHealthDataRequestPermissions(providerPackageName = providerPackageName)
-
-    override suspend fun getGrantedPermissions(
-        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 revokeAllPermissions() {
-        delegate.revokeAllPermissions().await()
-        Logger.debug(HEALTH_CONNECT_CLIENT_TAG, "Revoked all permissions.")
-    }
-
-    override val permissionController: PermissionController
-        get() = this
-
-    override suspend fun insertRecords(records: List<Record>): InsertRecordsResponse {
-        val uidList = delegate.insertData(records.map { it.toProto() }).await()
-        Logger.debug(HEALTH_CONNECT_CLIENT_TAG, "${records.size} records inserted.")
-        return InsertRecordsResponse(recordUidsList = uidList)
-    }
-
-    override suspend fun updateRecords(records: List<Record>) {
-        delegate.updateData(records.map { it.toProto() }).await()
-        Logger.debug(HEALTH_CONNECT_CLIENT_TAG, "${records.size} records updated.")
-    }
-
-    override suspend fun deleteRecords(
-        recordType: KClass<out Record>,
-        uidsList: List<String>,
-        clientIdsList: List<String>,
-    ) {
-        delegate
-            .deleteData(
-                toDataTypeIdPairProtoList(recordType, uidsList),
-                toDataTypeIdPairProtoList(recordType, clientIdsList)
-            )
-            .await()
-        Logger.debug(
-            HEALTH_CONNECT_CLIENT_TAG,
-            "${uidsList.size + clientIdsList.size} records deleted."
-        )
-    }
-
-    override suspend fun deleteRecords(
-        recordType: KClass<out Record>,
-        timeRangeFilter: TimeRangeFilter,
-    ) {
-        delegate.deleteDataRange(toDeleteDataRangeRequestProto(recordType, timeRangeFilter)).await()
-        Logger.debug(HEALTH_CONNECT_CLIENT_TAG, "Records deletion successful.")
-    }
-
-    @Suppress("UNCHECKED_CAST") // Safe to cast as the type should match
-    override suspend fun <T : Record> readRecord(
-        recordType: KClass<T>,
-        uid: String,
-    ): ReadRecordResponse<T> {
-        val proto = delegate.readData(toReadDataRequestProto(recordType, uid)).await()
-        val response = ReadRecordResponse(toRecord(proto) as T)
-        Logger.debug(HEALTH_CONNECT_CLIENT_TAG, "Reading record of $uid successful.")
-        return response
-    }
-
-    override suspend fun getChangesToken(request: ChangesTokenRequest): String {
-        val proto =
-            delegate
-                .getChangesToken(
-                    RequestProto.GetChangesTokenRequest.newBuilder()
-                        .addAllDataType(
-                            request.recordTypes.map {
-                                DataProto.DataType.newBuilder().setName(it.toDataTypeName()).build()
-                            }
-                        )
-                        .addAllDataOriginFilters(
-                            request.dataOriginFilters.map {
-                                DataProto.DataOrigin.newBuilder()
-                                    .setApplicationId(it.packageName)
-                                    .build()
-                            }
-                        )
-                        .build()
-                )
-                .await()
-        val changeToken = proto.changesToken
-        Logger.debug(HEALTH_CONNECT_CLIENT_TAG, "Retrieved change token $changeToken.")
-        return changeToken
-    }
-
-    override suspend fun getChanges(changesToken: String): ChangesResponse {
-        val proto =
-            delegate
-                .getChanges(
-                    RequestProto.GetChangesRequest.newBuilder()
-                        .setChangesToken(changesToken)
-                        .build()
-                )
-                .await()
-        val nextToken = proto.nextChangesToken
-        Logger.debug(
-            HEALTH_CONNECT_CLIENT_TAG,
-            "Retrieved changes successful with $changesToken, next token $nextToken."
-        )
-        return toChangesResponse(proto)
-    }
-
-    override suspend fun <T : Record> readRecords(
-        request: ReadRecordsRequest<T>,
-    ): ReadRecordsResponse<T> {
-        val proto = delegate.readDataRange(toReadDataRangeRequestProto(request)).await()
-        val response = toReadRecordsResponse<T>(proto)
-        Logger.debug(HEALTH_CONNECT_CLIENT_TAG, "Retrieve records successful.")
-        return response
-    }
-
-    override suspend fun aggregate(request: AggregateRequest): AggregationResult {
-        val responseProto = delegate.aggregate(request.toProto()).await()
-        val result = responseProto.rowsList.first().retrieveAggregateDataRow()
-        val numberOfMetrics = result.longValues.size + result.doubleValues.size
-        Logger.debug(HEALTH_CONNECT_CLIENT_TAG, "Retrieved $numberOfMetrics metrics.")
-        return result
-    }
-
-    override suspend fun aggregateGroupByDuration(
-        request: AggregateGroupByDurationRequest,
-    ): List<AggregationResultGroupedByDuration> {
-        val responseProto = delegate.aggregate(request.toProto()).await()
-        val result = responseProto.rowsList.map { it.toAggregateDataRowGroupByDuration() }.toList()
-        Logger.debug(
-            HEALTH_CONNECT_CLIENT_TAG,
-            "Retrieved ${result.size} duration aggregation buckets."
-        )
-        return result
-    }
-
-    override suspend fun aggregateGroupByPeriod(
-        request: AggregateGroupByPeriodRequest
-    ): List<AggregationResultGroupedByPeriod> {
-        val responseProto = delegate.aggregate(request.toProto()).await()
-        val result = responseProto.rowsList.map { it.toAggregateDataRowGroupByPeriod() }.toList()
-        Logger.debug(
-            HEALTH_CONNECT_CLIENT_TAG,
-            "Retrieved ${result.size} period aggregation buckets."
-        )
-        return result
-    }
-}
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/datatype/RecordsTypeNameMap.kt b/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/datatype/RecordsTypeNameMap.kt
deleted file mode 100644
index 3bc468f..0000000
--- a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/datatype/RecordsTypeNameMap.kt
+++ /dev/null
@@ -1,133 +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.
- */
-@file:RestrictTo(RestrictTo.Scope.LIBRARY)
-
-package androidx.health.connect.client.impl.converters.datatype
-
-import androidx.annotation.RestrictTo
-import androidx.health.connect.client.records.ActiveCaloriesBurnedRecord
-import androidx.health.connect.client.records.BasalBodyTemperatureRecord
-import androidx.health.connect.client.records.BasalMetabolicRateRecord
-import androidx.health.connect.client.records.BloodGlucoseRecord
-import androidx.health.connect.client.records.BloodPressureRecord
-import androidx.health.connect.client.records.BodyFatRecord
-import androidx.health.connect.client.records.BodyTemperatureRecord
-import androidx.health.connect.client.records.BodyWaterMassRecord
-import androidx.health.connect.client.records.BoneMassRecord
-import androidx.health.connect.client.records.CervicalMucusRecord
-import androidx.health.connect.client.records.CyclingPedalingCadenceRecord
-import androidx.health.connect.client.records.DistanceRecord
-import androidx.health.connect.client.records.ElevationGainedRecord
-import androidx.health.connect.client.records.ExerciseEventRecord
-import androidx.health.connect.client.records.ExerciseLapRecord
-import androidx.health.connect.client.records.ExerciseRepetitionsRecord
-import androidx.health.connect.client.records.ExerciseSessionRecord
-import androidx.health.connect.client.records.FloorsClimbedRecord
-import androidx.health.connect.client.records.HeartRateRecord
-import androidx.health.connect.client.records.HeartRateVariabilityDifferentialIndexRecord
-import androidx.health.connect.client.records.HeartRateVariabilityRmssdRecord
-import androidx.health.connect.client.records.HeartRateVariabilitySRecord
-import androidx.health.connect.client.records.HeartRateVariabilitySd2Record
-import androidx.health.connect.client.records.HeartRateVariabilitySdannRecord
-import androidx.health.connect.client.records.HeartRateVariabilitySdnnIndexRecord
-import androidx.health.connect.client.records.HeartRateVariabilitySdnnRecord
-import androidx.health.connect.client.records.HeartRateVariabilitySdsdRecord
-import androidx.health.connect.client.records.HeartRateVariabilityTinnRecord
-import androidx.health.connect.client.records.HeightRecord
-import androidx.health.connect.client.records.HipCircumferenceRecord
-import androidx.health.connect.client.records.HydrationRecord
-import androidx.health.connect.client.records.LeanBodyMassRecord
-import androidx.health.connect.client.records.MenstruationRecord
-import androidx.health.connect.client.records.NutritionRecord
-import androidx.health.connect.client.records.OvulationTestRecord
-import androidx.health.connect.client.records.OxygenSaturationRecord
-import androidx.health.connect.client.records.PowerRecord
-import androidx.health.connect.client.records.Record
-import androidx.health.connect.client.records.RespiratoryRateRecord
-import androidx.health.connect.client.records.RestingHeartRateRecord
-import androidx.health.connect.client.records.SexualActivityRecord
-import androidx.health.connect.client.records.SleepSessionRecord
-import androidx.health.connect.client.records.SleepStageRecord
-import androidx.health.connect.client.records.SpeedRecord
-import androidx.health.connect.client.records.StepsCadenceRecord
-import androidx.health.connect.client.records.StepsRecord
-import androidx.health.connect.client.records.SwimmingStrokesRecord
-import androidx.health.connect.client.records.TotalCaloriesBurnedRecord
-import androidx.health.connect.client.records.Vo2MaxRecord
-import androidx.health.connect.client.records.WaistCircumferenceRecord
-import androidx.health.connect.client.records.WeightRecord
-import androidx.health.connect.client.records.WheelchairPushesRecord
-import kotlin.reflect.KClass
-
-val RECORDS_TYPE_NAME_MAP: Map<String, KClass<out Record>> =
-    mapOf(
-        "ActiveCaloriesBurned" to ActiveCaloriesBurnedRecord::class,
-        "ActivityEvent" to ExerciseEventRecord::class, // Keep legacy Activity name
-        "ActivityLap" to ExerciseLapRecord::class, // Keep legacy Activity name
-        "ActivitySession" to ExerciseSessionRecord::class, // Keep legacy Activity name
-        "BasalBodyTemperature" to BasalBodyTemperatureRecord::class,
-        "BasalMetabolicRate" to BasalMetabolicRateRecord::class,
-        "BloodGlucose" to BloodGlucoseRecord::class,
-        "BloodPressure" to BloodPressureRecord::class,
-        "BodyFat" to BodyFatRecord::class,
-        "BodyTemperature" to BodyTemperatureRecord::class,
-        "BodyWaterMass" to BodyWaterMassRecord::class,
-        "BoneMass" to BoneMassRecord::class,
-        "CervicalMucus" to CervicalMucusRecord::class,
-        "CyclingPedalingCadenceSeries" to
-            CyclingPedalingCadenceRecord::class, // Keep legacy Series suffix
-        "Distance" to DistanceRecord::class,
-        "ElevationGained" to ElevationGainedRecord::class,
-        "FloorsClimbed" to FloorsClimbedRecord::class,
-        "HeartRateSeries" to HeartRateRecord::class, // Keep legacy Series suffix
-        "HeartRateVariabilityDifferentialIndex" to
-            HeartRateVariabilityDifferentialIndexRecord::class,
-        "HeartRateVariabilityRmssd" to HeartRateVariabilityRmssdRecord::class,
-        "HeartRateVariabilityS" to HeartRateVariabilitySRecord::class,
-        "HeartRateVariabilitySd2" to HeartRateVariabilitySd2Record::class,
-        "HeartRateVariabilitySdann" to HeartRateVariabilitySdannRecord::class,
-        "HeartRateVariabilitySdnn" to HeartRateVariabilitySdnnRecord::class,
-        "HeartRateVariabilitySdnnIndex" to HeartRateVariabilitySdnnIndexRecord::class,
-        "HeartRateVariabilitySdsd" to HeartRateVariabilitySdsdRecord::class,
-        "HeartRateVariabilityTinn" to HeartRateVariabilityTinnRecord::class,
-        "Height" to HeightRecord::class,
-        "HipCircumference" to HipCircumferenceRecord::class,
-        "Hydration" to HydrationRecord::class,
-        "LeanBodyMass" to LeanBodyMassRecord::class,
-        "Menstruation" to MenstruationRecord::class,
-        "Nutrition" to NutritionRecord::class,
-        "OvulationTest" to OvulationTestRecord::class,
-        "OxygenSaturation" to OxygenSaturationRecord::class,
-        "PowerSeries" to PowerRecord::class, // Keep legacy Series suffix
-        "Repetitions" to ExerciseRepetitionsRecord::class, // Keep legacy Repetitions name
-        "RespiratoryRate" to RespiratoryRateRecord::class,
-        "RestingHeartRate" to RestingHeartRateRecord::class,
-        "SexualActivity" to SexualActivityRecord::class,
-        "SleepSession" to SleepSessionRecord::class,
-        "SleepStage" to SleepStageRecord::class,
-        "SpeedSeries" to SpeedRecord::class, // Keep legacy Series suffix
-        "Steps" to StepsRecord::class,
-        "StepsCadenceSeries" to StepsCadenceRecord::class, // Keep legacy Series suffix
-        "SwimmingStrokes" to SwimmingStrokesRecord::class,
-        "TotalCaloriesBurned" to TotalCaloriesBurnedRecord::class,
-        "Vo2Max" to Vo2MaxRecord::class,
-        "WaistCircumference" to WaistCircumferenceRecord::class,
-        "WheelchairPushes" to WheelchairPushesRecord::class,
-        "Weight" to WeightRecord::class,
-    )
-
-val RECORDS_CLASS_NAME_MAP: Map<KClass<out Record>, String> =
-    RECORDS_TYPE_NAME_MAP.entries.associate { it.value to it.key }
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/records/ProtoToRecordConverters.kt b/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/records/ProtoToRecordConverters.kt
deleted file mode 100644
index 41d9897..0000000
--- a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/records/ProtoToRecordConverters.kt
+++ /dev/null
@@ -1,580 +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.
- */
-@file:RestrictTo(RestrictTo.Scope.LIBRARY)
-
-package androidx.health.connect.client.impl.converters.records
-
-import androidx.annotation.RestrictTo
-import androidx.health.connect.client.records.ActiveCaloriesBurnedRecord
-import androidx.health.connect.client.records.BasalBodyTemperatureRecord
-import androidx.health.connect.client.records.BasalMetabolicRateRecord
-import androidx.health.connect.client.records.BloodGlucoseRecord
-import androidx.health.connect.client.records.BloodPressureRecord
-import androidx.health.connect.client.records.BodyFatRecord
-import androidx.health.connect.client.records.BodyTemperatureRecord
-import androidx.health.connect.client.records.BodyWaterMassRecord
-import androidx.health.connect.client.records.BoneMassRecord
-import androidx.health.connect.client.records.CervicalMucusRecord
-import androidx.health.connect.client.records.CyclingPedalingCadenceRecord
-import androidx.health.connect.client.records.DistanceRecord
-import androidx.health.connect.client.records.ElevationGainedRecord
-import androidx.health.connect.client.records.ExerciseEventRecord
-import androidx.health.connect.client.records.ExerciseLapRecord
-import androidx.health.connect.client.records.ExerciseRepetitionsRecord
-import androidx.health.connect.client.records.ExerciseSessionRecord
-import androidx.health.connect.client.records.FloorsClimbedRecord
-import androidx.health.connect.client.records.HeartRateRecord
-import androidx.health.connect.client.records.HeartRateVariabilityDifferentialIndexRecord
-import androidx.health.connect.client.records.HeartRateVariabilityRmssdRecord
-import androidx.health.connect.client.records.HeartRateVariabilitySRecord
-import androidx.health.connect.client.records.HeartRateVariabilitySd2Record
-import androidx.health.connect.client.records.HeartRateVariabilitySdannRecord
-import androidx.health.connect.client.records.HeartRateVariabilitySdnnIndexRecord
-import androidx.health.connect.client.records.HeartRateVariabilitySdnnRecord
-import androidx.health.connect.client.records.HeartRateVariabilitySdsdRecord
-import androidx.health.connect.client.records.HeartRateVariabilityTinnRecord
-import androidx.health.connect.client.records.HeightRecord
-import androidx.health.connect.client.records.HipCircumferenceRecord
-import androidx.health.connect.client.records.HydrationRecord
-import androidx.health.connect.client.records.LeanBodyMassRecord
-import androidx.health.connect.client.records.MenstruationRecord
-import androidx.health.connect.client.records.NutritionRecord
-import androidx.health.connect.client.records.OvulationTestRecord
-import androidx.health.connect.client.records.OxygenSaturationRecord
-import androidx.health.connect.client.records.PowerRecord
-import androidx.health.connect.client.records.Record
-import androidx.health.connect.client.records.RespiratoryRateRecord
-import androidx.health.connect.client.records.RestingHeartRateRecord
-import androidx.health.connect.client.records.SexualActivityRecord
-import androidx.health.connect.client.records.SleepSessionRecord
-import androidx.health.connect.client.records.SleepStageRecord
-import androidx.health.connect.client.records.SpeedRecord
-import androidx.health.connect.client.records.StepsCadenceRecord
-import androidx.health.connect.client.records.StepsRecord
-import androidx.health.connect.client.records.SwimmingStrokesRecord
-import androidx.health.connect.client.records.TotalCaloriesBurnedRecord
-import androidx.health.connect.client.records.Vo2MaxRecord
-import androidx.health.connect.client.records.WaistCircumferenceRecord
-import androidx.health.connect.client.records.WeightRecord
-import androidx.health.connect.client.records.WheelchairPushesRecord
-import androidx.health.connect.client.units.celsius
-import androidx.health.connect.client.units.grams
-import androidx.health.connect.client.units.kilocalories
-import androidx.health.connect.client.units.kilocaloriesPerDay
-import androidx.health.connect.client.units.kilograms
-import androidx.health.connect.client.units.liters
-import androidx.health.connect.client.units.meters
-import androidx.health.connect.client.units.metersPerSecond
-import androidx.health.connect.client.units.millimetersOfMercury
-import androidx.health.connect.client.units.percent
-import androidx.health.connect.client.units.watts
-import androidx.health.platform.client.proto.DataProto
-import java.time.Instant
-
-/** Converts public API object into internal proto for ipc. */
-fun toRecord(proto: DataProto.DataPoint): Record =
-    with(proto) {
-        when (dataType.name) {
-            "BasalBodyTemperature" ->
-                BasalBodyTemperatureRecord(
-                    temperature = getDouble("temperature").celsius,
-                    measurementLocation = getEnum("measurementLocation"),
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "BasalMetabolicRate" ->
-                BasalMetabolicRateRecord(
-                    basalMetabolicRate = getDouble("bmr").kilocaloriesPerDay,
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "BloodGlucose" ->
-                BloodGlucoseRecord(
-                    levelMillimolesPerLiter = getDouble("level"),
-                    specimenSource = getEnum("specimenSource"),
-                    mealType = getEnum("mealType"),
-                    relationToMeal = getEnum("relationToMeal"),
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "BloodPressure" ->
-                BloodPressureRecord(
-                    systolic = getDouble("systolic").millimetersOfMercury,
-                    diastolic = getDouble("diastolic").millimetersOfMercury,
-                    bodyPosition = getEnum("bodyPosition"),
-                    measurementLocation = getEnum("measurementLocation"),
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "BodyFat" ->
-                BodyFatRecord(
-                    percentage = getDouble("percentage").percent,
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "BodyTemperature" ->
-                BodyTemperatureRecord(
-                    temperature = getDouble("temperature").celsius,
-                    measurementLocation = getEnum("measurementLocation"),
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "BodyWaterMass" ->
-                BodyWaterMassRecord(
-                    mass = getDouble("mass").kilograms,
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "BoneMass" ->
-                BoneMassRecord(
-                    mass = getDouble("mass").kilograms,
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "CervicalMucus" ->
-                CervicalMucusRecord(
-                    appearance = getEnum("texture"),
-                    sensation = getEnum("amount"),
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "CyclingPedalingCadenceSeries" ->
-                CyclingPedalingCadenceRecord(
-                    startTime = startTime,
-                    startZoneOffset = startZoneOffset,
-                    endTime = endTime,
-                    endZoneOffset = endZoneOffset,
-                    samples =
-                        seriesValuesList.map { value ->
-                            CyclingPedalingCadenceRecord.Sample(
-                                time = Instant.ofEpochMilli(value.instantTimeMillis),
-                                revolutionsPerMinute = value.getDouble("rpm"),
-                            )
-                        },
-                    metadata = metadata,
-                )
-            "HeartRateSeries" ->
-                HeartRateRecord(
-                    startTime = startTime,
-                    startZoneOffset = startZoneOffset,
-                    endTime = endTime,
-                    endZoneOffset = endZoneOffset,
-                    samples =
-                        seriesValuesList.map { value ->
-                            HeartRateRecord.Sample(
-                                time = Instant.ofEpochMilli(value.instantTimeMillis),
-                                beatsPerMinute = value.getLong("bpm"),
-                            )
-                        },
-                    metadata = metadata,
-                )
-            "Height" ->
-                HeightRecord(
-                    height = getDouble("height").meters,
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "HipCircumference" ->
-                HipCircumferenceRecord(
-                    circumference = getDouble("circumference").meters,
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "HeartRateVariabilityDifferentialIndex" ->
-                HeartRateVariabilityDifferentialIndexRecord(
-                    heartRateVariabilityMillis = getDouble("heartRateVariability"),
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "HeartRateVariabilityRmssd" ->
-                HeartRateVariabilityRmssdRecord(
-                    heartRateVariabilityMillis = getDouble("heartRateVariability"),
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "HeartRateVariabilityS" ->
-                HeartRateVariabilitySRecord(
-                    heartRateVariabilityMillis = getDouble("heartRateVariability"),
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "HeartRateVariabilitySd2" ->
-                HeartRateVariabilitySd2Record(
-                    heartRateVariabilityMillis = getDouble("heartRateVariability"),
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "HeartRateVariabilitySdann" ->
-                HeartRateVariabilitySdannRecord(
-                    heartRateVariabilityMillis = getDouble("heartRateVariability"),
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "HeartRateVariabilitySdnnIndex" ->
-                HeartRateVariabilitySdnnIndexRecord(
-                    heartRateVariabilityMillis = getDouble("heartRateVariability"),
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "HeartRateVariabilitySdnn" ->
-                HeartRateVariabilitySdnnRecord(
-                    heartRateVariabilityMillis = getDouble("heartRateVariability"),
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "HeartRateVariabilitySdsd" ->
-                HeartRateVariabilitySdsdRecord(
-                    heartRateVariabilityMillis = getDouble("heartRateVariability"),
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "HeartRateVariabilityTinn" ->
-                HeartRateVariabilityTinnRecord(
-                    heartRateVariabilityMillis = getDouble("heartRateVariability"),
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "LeanBodyMass" ->
-                LeanBodyMassRecord(
-                    mass = getDouble("mass").kilograms,
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "Menstruation" ->
-                MenstruationRecord(
-                    flow = getEnum("flow"),
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "OvulationTest" ->
-                OvulationTestRecord(
-                    result = getEnum("result") ?: "",
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "OxygenSaturation" ->
-                OxygenSaturationRecord(
-                    percentage = getDouble("percentage").percent,
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "PowerSeries" ->
-                PowerRecord(
-                    startTime = startTime,
-                    startZoneOffset = startZoneOffset,
-                    endTime = endTime,
-                    endZoneOffset = endZoneOffset,
-                    samples =
-                        seriesValuesList.map { value ->
-                            PowerRecord.Sample(
-                                time = Instant.ofEpochMilli(value.instantTimeMillis),
-                                power = value.getDouble("power").watts,
-                            )
-                        },
-                    metadata = metadata,
-                )
-            "RespiratoryRate" ->
-                RespiratoryRateRecord(
-                    rate = getDouble("rate"),
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "RestingHeartRate" ->
-                RestingHeartRateRecord(
-                    beatsPerMinute = getLong("bpm"),
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "SexualActivity" ->
-                SexualActivityRecord(
-                    protectionUsed = getEnum("protectionUsed"),
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "SpeedSeries" ->
-                SpeedRecord(
-                    startTime = startTime,
-                    startZoneOffset = startZoneOffset,
-                    endTime = endTime,
-                    endZoneOffset = endZoneOffset,
-                    samples =
-                        seriesValuesList.map { value ->
-                            SpeedRecord.Sample(
-                                time = Instant.ofEpochMilli(value.instantTimeMillis),
-                                speed = value.getDouble("speed").metersPerSecond,
-                            )
-                        },
-                    metadata = metadata,
-                )
-            "StepsCadenceSeries" ->
-                StepsCadenceRecord(
-                    startTime = startTime,
-                    startZoneOffset = startZoneOffset,
-                    endTime = endTime,
-                    endZoneOffset = endZoneOffset,
-                    samples =
-                        seriesValuesList.map { value ->
-                            StepsCadenceRecord.Sample(
-                                time = Instant.ofEpochMilli(value.instantTimeMillis),
-                                rate = value.getDouble("rate"),
-                            )
-                        },
-                    metadata = metadata,
-                )
-            "Vo2Max" ->
-                Vo2MaxRecord(
-                    vo2MillilitersPerMinuteKilogram = getDouble("vo2"),
-                    measurementMethod = getEnum("measurementMethod"),
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "WaistCircumference" ->
-                WaistCircumferenceRecord(
-                    circumference = getDouble("circumference").meters,
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "Weight" ->
-                WeightRecord(
-                    weight = getDouble("weight").kilograms,
-                    time = time,
-                    zoneOffset = zoneOffset,
-                    metadata = metadata
-                )
-            "ActiveCaloriesBurned" ->
-                ActiveCaloriesBurnedRecord(
-                    energy = getDouble("energy").kilocalories,
-                    startTime = startTime,
-                    startZoneOffset = startZoneOffset,
-                    endTime = endTime,
-                    endZoneOffset = endZoneOffset,
-                    metadata = metadata
-                )
-            "ActivityEvent" ->
-                ExerciseEventRecord(
-                    eventType = getEnum("eventType") ?: "",
-                    startTime = startTime,
-                    startZoneOffset = startZoneOffset,
-                    endTime = endTime,
-                    endZoneOffset = endZoneOffset,
-                    metadata = metadata
-                )
-            "ActivityLap" ->
-                ExerciseLapRecord(
-                    length = getDouble("length").meters,
-                    startTime = startTime,
-                    startZoneOffset = startZoneOffset,
-                    endTime = endTime,
-                    endZoneOffset = endZoneOffset,
-                    metadata = metadata
-                )
-            "ActivitySession" ->
-                ExerciseSessionRecord(
-                    exerciseType = getEnum("activityType") ?: "",
-                    title = getString("title"),
-                    notes = getString("notes"),
-                    startTime = startTime,
-                    startZoneOffset = startZoneOffset,
-                    endTime = endTime,
-                    endZoneOffset = endZoneOffset,
-                    metadata = metadata
-                )
-            "Distance" ->
-                DistanceRecord(
-                    distance = getDouble("distance").meters,
-                    startTime = startTime,
-                    startZoneOffset = startZoneOffset,
-                    endTime = endTime,
-                    endZoneOffset = endZoneOffset,
-                    metadata = metadata
-                )
-            "ElevationGained" ->
-                ElevationGainedRecord(
-                    elevation = getDouble("elevation").meters,
-                    startTime = startTime,
-                    startZoneOffset = startZoneOffset,
-                    endTime = endTime,
-                    endZoneOffset = endZoneOffset,
-                    metadata = metadata
-                )
-            "FloorsClimbed" ->
-                FloorsClimbedRecord(
-                    floors = getDouble("floors"),
-                    startTime = startTime,
-                    startZoneOffset = startZoneOffset,
-                    endTime = endTime,
-                    endZoneOffset = endZoneOffset,
-                    metadata = metadata
-                )
-            "Hydration" ->
-                HydrationRecord(
-                    volume = getDouble("volume").liters,
-                    startTime = startTime,
-                    startZoneOffset = startZoneOffset,
-                    endTime = endTime,
-                    endZoneOffset = endZoneOffset,
-                    metadata = metadata
-                )
-            "Nutrition" ->
-                NutritionRecord(
-                    biotin = valuesMap["biotin"]?.doubleVal?.grams,
-                    caffeine = valuesMap["caffeine"]?.doubleVal?.grams,
-                    calcium = valuesMap["calcium"]?.doubleVal?.grams,
-                    energy = valuesMap["calories"]?.doubleVal?.kilocalories,
-                    energyFromFat = valuesMap["caloriesFromFat"]?.doubleVal?.kilocalories,
-                    chloride = valuesMap["chloride"]?.doubleVal?.grams,
-                    cholesterol = valuesMap["cholesterol"]?.doubleVal?.grams,
-                    chromium = valuesMap["chromium"]?.doubleVal?.grams,
-                    copper = valuesMap["copper"]?.doubleVal?.grams,
-                    dietaryFiber = valuesMap["dietaryFiber"]?.doubleVal?.grams,
-                    folate = valuesMap["folate"]?.doubleVal?.grams,
-                    folicAcid = valuesMap["folicAcid"]?.doubleVal?.grams,
-                    iodine = valuesMap["iodine"]?.doubleVal?.grams,
-                    iron = valuesMap["iron"]?.doubleVal?.grams,
-                    magnesium = valuesMap["magnesium"]?.doubleVal?.grams,
-                    manganese = valuesMap["manganese"]?.doubleVal?.grams,
-                    molybdenum = valuesMap["molybdenum"]?.doubleVal?.grams,
-                    monounsaturatedFat = valuesMap["monounsaturatedFat"]?.doubleVal?.grams,
-                    niacin = valuesMap["niacin"]?.doubleVal?.grams,
-                    pantothenicAcid = valuesMap["pantothenicAcid"]?.doubleVal?.grams,
-                    phosphorus = valuesMap["phosphorus"]?.doubleVal?.grams,
-                    polyunsaturatedFat = valuesMap["polyunsaturatedFat"]?.doubleVal?.grams,
-                    potassium = valuesMap["potassium"]?.doubleVal?.grams,
-                    protein = valuesMap["protein"]?.doubleVal?.grams,
-                    riboflavin = valuesMap["riboflavin"]?.doubleVal?.grams,
-                    saturatedFat = valuesMap["saturatedFat"]?.doubleVal?.grams,
-                    selenium = valuesMap["selenium"]?.doubleVal?.grams,
-                    sodium = valuesMap["sodium"]?.doubleVal?.grams,
-                    sugar = valuesMap["sugar"]?.doubleVal?.grams,
-                    thiamin = valuesMap["thiamin"]?.doubleVal?.grams,
-                    totalCarbohydrate = valuesMap["totalCarbohydrate"]?.doubleVal?.grams,
-                    totalFat = valuesMap["totalFat"]?.doubleVal?.grams,
-                    transFat = valuesMap["transFat"]?.doubleVal?.grams,
-                    unsaturatedFat = valuesMap["unsaturatedFat"]?.doubleVal?.grams,
-                    vitaminA = valuesMap["vitaminA"]?.doubleVal?.grams,
-                    vitaminB12 = valuesMap["vitaminB12"]?.doubleVal?.grams,
-                    vitaminB6 = valuesMap["vitaminB6"]?.doubleVal?.grams,
-                    vitaminC = valuesMap["vitaminC"]?.doubleVal?.grams,
-                    vitaminD = valuesMap["vitaminD"]?.doubleVal?.grams,
-                    vitaminE = valuesMap["vitaminE"]?.doubleVal?.grams,
-                    vitaminK = valuesMap["vitaminK"]?.doubleVal?.grams,
-                    zinc = valuesMap["zinc"]?.doubleVal?.grams,
-                    mealType = getEnum("mealType"),
-                    name = getString("name"),
-                    startTime = startTime,
-                    startZoneOffset = startZoneOffset,
-                    endTime = endTime,
-                    endZoneOffset = endZoneOffset,
-                    metadata = metadata
-                )
-            "Repetitions" ->
-                ExerciseRepetitionsRecord(
-                    count = getLong("count"),
-                    type = getEnum("type") ?: "",
-                    startTime = startTime,
-                    startZoneOffset = startZoneOffset,
-                    endTime = endTime,
-                    endZoneOffset = endZoneOffset,
-                    metadata = metadata
-                )
-            "SleepSession" ->
-                SleepSessionRecord(
-                    title = getString("title"),
-                    notes = getString("notes"),
-                    startTime = startTime,
-                    startZoneOffset = startZoneOffset,
-                    endTime = endTime,
-                    endZoneOffset = endZoneOffset,
-                    metadata = metadata
-                )
-            "SleepStage" ->
-                SleepStageRecord(
-                    stage = getEnum("stage") ?: "",
-                    startTime = startTime,
-                    startZoneOffset = startZoneOffset,
-                    endTime = endTime,
-                    endZoneOffset = endZoneOffset,
-                    metadata = metadata
-                )
-            "Steps" ->
-                StepsRecord(
-                    count = getLong("count"),
-                    startTime = startTime,
-                    startZoneOffset = startZoneOffset,
-                    endTime = endTime,
-                    endZoneOffset = endZoneOffset,
-                    metadata = metadata
-                )
-            "SwimmingStrokes" ->
-                SwimmingStrokesRecord(
-                    count = getLong("count"),
-                    type = getEnum("type") ?: "",
-                    startTime = startTime,
-                    startZoneOffset = startZoneOffset,
-                    endTime = endTime,
-                    endZoneOffset = endZoneOffset,
-                    metadata = metadata
-                )
-            "TotalCaloriesBurned" ->
-                TotalCaloriesBurnedRecord(
-                    energy = getDouble("energy").kilocalories,
-                    startTime = startTime,
-                    startZoneOffset = startZoneOffset,
-                    endTime = endTime,
-                    endZoneOffset = endZoneOffset,
-                    metadata = metadata
-                )
-            "WheelchairPushes" ->
-                WheelchairPushesRecord(
-                    count = getLong("count"),
-                    startTime = startTime,
-                    startZoneOffset = startZoneOffset,
-                    endTime = endTime,
-                    endZoneOffset = endZoneOffset,
-                    metadata = metadata
-                )
-            else -> throw RuntimeException("Unknown data type ${dataType.name}")
-        }
-    }
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/records/ProtoToRecordUtils.kt b/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/records/ProtoToRecordUtils.kt
deleted file mode 100644
index 4672ac8..0000000
--- a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/records/ProtoToRecordUtils.kt
+++ /dev/null
@@ -1,98 +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.
- */
-@file:RestrictTo(RestrictTo.Scope.LIBRARY)
-
-package androidx.health.connect.client.impl.converters.records
-
-import androidx.annotation.RestrictTo
-import androidx.health.connect.client.records.metadata.DataOrigin
-import androidx.health.connect.client.records.metadata.Device
-import androidx.health.connect.client.records.metadata.Metadata
-import androidx.health.platform.client.proto.DataProto
-import androidx.health.platform.client.proto.DataProto.DataPointOrBuilder
-import androidx.health.platform.client.proto.DataProto.SeriesValueOrBuilder
-import java.time.Instant
-import java.time.ZoneOffset
-
-/** Internal helper functions to convert proto to records. */
-@get:SuppressWarnings("GoodTime") // Safe to use for deserialization
-internal val DataProto.DataPoint.startTime: Instant
-    get() = Instant.ofEpochMilli(startTimeMillis)
-
-@get:SuppressWarnings("GoodTime") // Safe to use for deserialization
-internal val DataProto.DataPoint.endTime: Instant
-    get() = Instant.ofEpochMilli(endTimeMillis)
-
-@get:SuppressWarnings("GoodTime") // Safe to use for deserialization
-internal val DataProto.DataPoint.time: Instant
-    get() = Instant.ofEpochMilli(instantTimeMillis)
-
-@get:SuppressWarnings("GoodTime") // Safe to use for deserialization
-internal val DataProto.DataPoint.startZoneOffset: ZoneOffset?
-    get() =
-        if (hasStartZoneOffsetSeconds()) ZoneOffset.ofTotalSeconds(startZoneOffsetSeconds) else null
-
-@get:SuppressWarnings("GoodTime") // Safe to use for deserialization
-internal val DataProto.DataPoint.endZoneOffset: ZoneOffset?
-    get() = if (hasEndZoneOffsetSeconds()) ZoneOffset.ofTotalSeconds(endZoneOffsetSeconds) else null
-
-@get:SuppressWarnings("GoodTime") // HealthDataClientImplSafe to use for deserialization
-internal val DataProto.DataPoint.zoneOffset: ZoneOffset?
-    get() = if (hasZoneOffsetSeconds()) ZoneOffset.ofTotalSeconds(zoneOffsetSeconds) else null
-
-internal fun DataPointOrBuilder.getLong(key: String, defaultVal: Long = 0): Long =
-    valuesMap[key]?.longVal ?: defaultVal
-
-internal fun DataPointOrBuilder.getDouble(key: String, defaultVal: Double = 0.0): Double =
-    valuesMap[key]?.doubleVal ?: defaultVal
-
-internal fun DataPointOrBuilder.getString(key: String): String? = valuesMap[key]?.stringVal
-
-internal fun DataPointOrBuilder.getEnum(key: String): String? {
-    return valuesMap[key]?.enumVal
-}
-
-internal fun SeriesValueOrBuilder.getLong(key: String, defaultVal: Long = 0): Long =
-    valuesMap[key]?.longVal ?: defaultVal
-
-internal fun SeriesValueOrBuilder.getDouble(key: String, defaultVal: Double = 0.0): Double =
-    valuesMap[key]?.doubleVal ?: defaultVal
-
-internal fun SeriesValueOrBuilder.getString(key: String): String? = valuesMap[key]?.stringVal
-
-internal fun SeriesValueOrBuilder.getEnum(key: String): String? = valuesMap[key]?.enumVal
-
-@get:SuppressWarnings("GoodTime") // Safe to use for deserialization
-internal val DataProto.DataPoint.metadata: Metadata
-    get() =
-        Metadata(
-            uid = if (hasUid()) uid else null,
-            dataOrigin = DataOrigin(dataOrigin.applicationId),
-            lastModifiedTime = Instant.ofEpochMilli(updateTimeMillis),
-            clientId = if (hasClientId()) clientId else null,
-            clientVersion = clientVersion,
-            device = toDevice(device)
-        )
-
-private fun toDevice(proto: DataProto.Device): Device {
-    return with(proto) {
-        Device(
-            manufacturer = if (hasManufacturer()) manufacturer else null,
-            model = if (hasModel()) model else null,
-            type = if (hasType()) type else null
-        )
-    }
-}
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/records/RecordToProtoConverters.kt b/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/records/RecordToProtoConverters.kt
deleted file mode 100644
index 30199e8..0000000
--- a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/records/RecordToProtoConverters.kt
+++ /dev/null
@@ -1,528 +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.
- */
-@file:RestrictTo(RestrictTo.Scope.LIBRARY)
-
-package androidx.health.connect.client.impl.converters.records
-
-import androidx.annotation.RestrictTo
-import androidx.health.connect.client.records.ActiveCaloriesBurnedRecord
-import androidx.health.connect.client.records.BasalBodyTemperatureRecord
-import androidx.health.connect.client.records.BasalMetabolicRateRecord
-import androidx.health.connect.client.records.BloodGlucoseRecord
-import androidx.health.connect.client.records.BloodPressureRecord
-import androidx.health.connect.client.records.BodyFatRecord
-import androidx.health.connect.client.records.BodyTemperatureRecord
-import androidx.health.connect.client.records.BodyWaterMassRecord
-import androidx.health.connect.client.records.BoneMassRecord
-import androidx.health.connect.client.records.CervicalMucusRecord
-import androidx.health.connect.client.records.CyclingPedalingCadenceRecord
-import androidx.health.connect.client.records.DistanceRecord
-import androidx.health.connect.client.records.ElevationGainedRecord
-import androidx.health.connect.client.records.ExerciseEventRecord
-import androidx.health.connect.client.records.ExerciseLapRecord
-import androidx.health.connect.client.records.ExerciseRepetitionsRecord
-import androidx.health.connect.client.records.ExerciseSessionRecord
-import androidx.health.connect.client.records.FloorsClimbedRecord
-import androidx.health.connect.client.records.HeartRateRecord
-import androidx.health.connect.client.records.HeartRateVariabilityDifferentialIndexRecord
-import androidx.health.connect.client.records.HeartRateVariabilityRmssdRecord
-import androidx.health.connect.client.records.HeartRateVariabilitySRecord
-import androidx.health.connect.client.records.HeartRateVariabilitySd2Record
-import androidx.health.connect.client.records.HeartRateVariabilitySdannRecord
-import androidx.health.connect.client.records.HeartRateVariabilitySdnnIndexRecord
-import androidx.health.connect.client.records.HeartRateVariabilitySdnnRecord
-import androidx.health.connect.client.records.HeartRateVariabilitySdsdRecord
-import androidx.health.connect.client.records.HeartRateVariabilityTinnRecord
-import androidx.health.connect.client.records.HeightRecord
-import androidx.health.connect.client.records.HipCircumferenceRecord
-import androidx.health.connect.client.records.HydrationRecord
-import androidx.health.connect.client.records.LeanBodyMassRecord
-import androidx.health.connect.client.records.MenstruationRecord
-import androidx.health.connect.client.records.NutritionRecord
-import androidx.health.connect.client.records.OvulationTestRecord
-import androidx.health.connect.client.records.OxygenSaturationRecord
-import androidx.health.connect.client.records.PowerRecord
-import androidx.health.connect.client.records.Record
-import androidx.health.connect.client.records.RespiratoryRateRecord
-import androidx.health.connect.client.records.RestingHeartRateRecord
-import androidx.health.connect.client.records.SeriesRecord
-import androidx.health.connect.client.records.SexualActivityRecord
-import androidx.health.connect.client.records.SleepSessionRecord
-import androidx.health.connect.client.records.SleepStageRecord
-import androidx.health.connect.client.records.SpeedRecord
-import androidx.health.connect.client.records.StepsCadenceRecord
-import androidx.health.connect.client.records.StepsRecord
-import androidx.health.connect.client.records.SwimmingStrokesRecord
-import androidx.health.connect.client.records.TotalCaloriesBurnedRecord
-import androidx.health.connect.client.records.Vo2MaxRecord
-import androidx.health.connect.client.records.WaistCircumferenceRecord
-import androidx.health.connect.client.records.WeightRecord
-import androidx.health.connect.client.records.WheelchairPushesRecord
-import androidx.health.platform.client.proto.DataProto
-
-/** Converts public API object into internal proto for ipc. */
-fun Record.toProto(): DataProto.DataPoint =
-    when (this) {
-        is BasalBodyTemperatureRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("BasalBodyTemperature"))
-                .apply {
-                    putValues("temperature", doubleVal(temperature.inCelsius))
-                    measurementLocation?.let { putValues("measurementLocation", enumVal(it)) }
-                }
-                .build()
-        is BasalMetabolicRateRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("BasalMetabolicRate"))
-                .apply { putValues("bmr", doubleVal(basalMetabolicRate.inKilocaloriesPerDay)) }
-                .build()
-        is BloodGlucoseRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("BloodGlucose"))
-                .apply {
-                    putValues("level", doubleVal(levelMillimolesPerLiter))
-                    specimenSource?.let { putValues("specimenSource", enumVal(it)) }
-                    mealType?.let { putValues("mealType", enumVal(it)) }
-                    relationToMeal?.let { putValues("relationToMeal", enumVal(it)) }
-                }
-                .build()
-        is BloodPressureRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("BloodPressure"))
-                .apply {
-                    putValues("systolic", doubleVal(systolic.inMillimetersOfMercury))
-                    putValues("diastolic", doubleVal(diastolic.inMillimetersOfMercury))
-                    bodyPosition?.let { putValues("bodyPosition", enumVal(it)) }
-                    measurementLocation?.let { putValues("measurementLocation", enumVal(it)) }
-                }
-                .build()
-        is BodyFatRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("BodyFat"))
-                .apply { putValues("percentage", doubleVal(percentage.value)) }
-                .build()
-        is BodyTemperatureRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("BodyTemperature"))
-                .apply {
-                    putValues("temperature", doubleVal(temperature.inCelsius))
-                    measurementLocation?.let { putValues("measurementLocation", enumVal(it)) }
-                }
-                .build()
-        is BodyWaterMassRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("BodyWaterMass"))
-                .apply { putValues("mass", doubleVal(mass.inKilograms)) }
-                .build()
-        is BoneMassRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("BoneMass"))
-                .apply { putValues("mass", doubleVal(mass.inKilograms)) }
-                .build()
-        is CervicalMucusRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("CervicalMucus"))
-                .apply {
-                    appearance?.let { putValues("texture", enumVal(it)) }
-                    sensation?.let { putValues("amount", enumVal(it)) }
-                }
-                .build()
-        is CyclingPedalingCadenceRecord ->
-            toProto(dataTypeName = "CyclingPedalingCadenceSeries") { sample ->
-                DataProto.SeriesValue.newBuilder()
-                    .putValues("rpm", doubleVal(sample.revolutionsPerMinute))
-                    .setInstantTimeMillis(sample.time.toEpochMilli())
-                    .build()
-            }
-        is HeartRateRecord ->
-            toProto(dataTypeName = "HeartRateSeries") { sample ->
-                DataProto.SeriesValue.newBuilder()
-                    .putValues("bpm", longVal(sample.beatsPerMinute))
-                    .setInstantTimeMillis(sample.time.toEpochMilli())
-                    .build()
-            }
-        is HeightRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("Height"))
-                .apply { putValues("height", doubleVal(height.inMeters)) }
-                .build()
-        is HipCircumferenceRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("HipCircumference"))
-                .apply { putValues("circumference", doubleVal(circumference.inMeters)) }
-                .build()
-        is HeartRateVariabilityDifferentialIndexRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("HeartRateVariabilityDifferentialIndex"))
-                .apply { putValues("heartRateVariability", doubleVal(heartRateVariabilityMillis)) }
-                .build()
-        is HeartRateVariabilityRmssdRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("HeartRateVariabilityRmssd"))
-                .apply { putValues("heartRateVariability", doubleVal(heartRateVariabilityMillis)) }
-                .build()
-        is HeartRateVariabilitySRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("HeartRateVariabilityS"))
-                .apply { putValues("heartRateVariability", doubleVal(heartRateVariabilityMillis)) }
-                .build()
-        is HeartRateVariabilitySd2Record ->
-            instantaneousProto()
-                .setDataType(protoDataType("HeartRateVariabilitySd2"))
-                .apply { putValues("heartRateVariability", doubleVal(heartRateVariabilityMillis)) }
-                .build()
-        is HeartRateVariabilitySdannRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("HeartRateVariabilitySdann"))
-                .apply { putValues("heartRateVariability", doubleVal(heartRateVariabilityMillis)) }
-                .build()
-        is HeartRateVariabilitySdnnIndexRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("HeartRateVariabilitySdnnIndex"))
-                .apply { putValues("heartRateVariability", doubleVal(heartRateVariabilityMillis)) }
-                .build()
-        is HeartRateVariabilitySdnnRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("HeartRateVariabilitySdnn"))
-                .apply { putValues("heartRateVariability", doubleVal(heartRateVariabilityMillis)) }
-                .build()
-        is HeartRateVariabilitySdsdRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("HeartRateVariabilitySdsd"))
-                .apply { putValues("heartRateVariability", doubleVal(heartRateVariabilityMillis)) }
-                .build()
-        is HeartRateVariabilityTinnRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("HeartRateVariabilityTinn"))
-                .apply { putValues("heartRateVariability", doubleVal(heartRateVariabilityMillis)) }
-                .build()
-        is LeanBodyMassRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("LeanBodyMass"))
-                .apply { putValues("mass", doubleVal(mass.inKilograms)) }
-                .build()
-        is MenstruationRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("Menstruation"))
-                .apply { flow?.let { putValues("flow", enumVal(it)) } }
-                .build()
-        is OvulationTestRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("OvulationTest"))
-                .apply { putValues("result", enumVal(result)) }
-                .build()
-        is OxygenSaturationRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("OxygenSaturation"))
-                .apply { putValues("percentage", doubleVal(percentage.value)) }
-                .build()
-        is PowerRecord ->
-            toProto(dataTypeName = "PowerSeries") { sample ->
-                DataProto.SeriesValue.newBuilder()
-                    .putValues("power", doubleVal(sample.power.inWatts))
-                    .setInstantTimeMillis(sample.time.toEpochMilli())
-                    .build()
-            }
-        is RespiratoryRateRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("RespiratoryRate"))
-                .apply { putValues("rate", doubleVal(rate)) }
-                .build()
-        is RestingHeartRateRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("RestingHeartRate"))
-                .apply { putValues("bpm", longVal(beatsPerMinute)) }
-                .build()
-        is SexualActivityRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("SexualActivity"))
-                .apply { protectionUsed?.let { putValues("protectionUsed", enumVal(it)) } }
-                .build()
-        is SpeedRecord ->
-            toProto(dataTypeName = "SpeedSeries") { sample ->
-                DataProto.SeriesValue.newBuilder()
-                    .putValues("speed", doubleVal(sample.speed.inMetersPerSecond))
-                    .setInstantTimeMillis(sample.time.toEpochMilli())
-                    .build()
-            }
-        is StepsCadenceRecord ->
-            toProto(dataTypeName = "StepsCadenceSeries") { sample ->
-                DataProto.SeriesValue.newBuilder()
-                    .putValues("rate", doubleVal(sample.rate))
-                    .setInstantTimeMillis(sample.time.toEpochMilli())
-                    .build()
-            }
-        is Vo2MaxRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("Vo2Max"))
-                .apply {
-                    putValues("vo2", doubleVal(vo2MillilitersPerMinuteKilogram))
-                    measurementMethod?.let { putValues("measurementMethod", enumVal(it)) }
-                }
-                .build()
-        is WaistCircumferenceRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("WaistCircumference"))
-                .apply { putValues("circumference", doubleVal(circumference.inMeters)) }
-                .build()
-        is WeightRecord ->
-            instantaneousProto()
-                .setDataType(protoDataType("Weight"))
-                .apply { putValues("weight", doubleVal(weight.inKilograms)) }
-                .build()
-        is ActiveCaloriesBurnedRecord ->
-            intervalProto()
-                .setDataType(protoDataType("ActiveCaloriesBurned"))
-                .apply { putValues("energy", doubleVal(energy.inKilocalories)) }
-                .build()
-        is ExerciseEventRecord ->
-            intervalProto()
-                .setDataType(protoDataType("ActivityEvent"))
-                .apply { putValues("eventType", enumVal(eventType)) }
-                .build()
-        is ExerciseLapRecord ->
-            intervalProto()
-                .setDataType(protoDataType("ActivityLap"))
-                .apply {
-                    if (length != null) {
-                        putValues("length", doubleVal(length.inMeters))
-                    }
-                }
-                .build()
-        is ExerciseSessionRecord ->
-            intervalProto()
-                .setDataType(protoDataType("ActivitySession"))
-                .apply {
-                    putValues("activityType", enumVal(exerciseType))
-                    title?.let { putValues("title", stringVal(it)) }
-                    notes?.let { putValues("notes", stringVal(it)) }
-                }
-                .build()
-        is DistanceRecord ->
-            intervalProto()
-                .setDataType(protoDataType("Distance"))
-                .apply { putValues("distance", doubleVal(distance.inMeters)) }
-                .build()
-        is ElevationGainedRecord ->
-            intervalProto()
-                .setDataType(protoDataType("ElevationGained"))
-                .apply { putValues("elevation", doubleVal(elevation.inMeters)) }
-                .build()
-        is FloorsClimbedRecord ->
-            intervalProto()
-                .setDataType(protoDataType("FloorsClimbed"))
-                .apply { putValues("floors", doubleVal(floors)) }
-                .build()
-        is HydrationRecord ->
-            intervalProto()
-                .setDataType(protoDataType("Hydration"))
-                .apply { putValues("volume", doubleVal(volume.inLiters)) }
-                .build()
-        is NutritionRecord ->
-            intervalProto()
-                .setDataType(protoDataType("Nutrition"))
-                .apply {
-                    if (biotin != null) {
-                        putValues("biotin", doubleVal(biotin.inGrams))
-                    }
-                    if (caffeine != null) {
-                        putValues("caffeine", doubleVal(caffeine.inGrams))
-                    }
-                    if (calcium != null) {
-                        putValues("calcium", doubleVal(calcium.inGrams))
-                    }
-                    if (energy != null) {
-                        putValues("calories", doubleVal(energy.inKilocalories))
-                    }
-                    if (energyFromFat != null) {
-                        putValues("caloriesFromFat", doubleVal(energyFromFat.inKilocalories))
-                    }
-                    if (chloride != null) {
-                        putValues("chloride", doubleVal(chloride.inGrams))
-                    }
-                    if (cholesterol != null) {
-                        putValues("cholesterol", doubleVal(cholesterol.inGrams))
-                    }
-                    if (chromium != null) {
-                        putValues("chromium", doubleVal(chromium.inGrams))
-                    }
-                    if (copper != null) {
-                        putValues("copper", doubleVal(copper.inGrams))
-                    }
-                    if (dietaryFiber != null) {
-                        putValues("dietaryFiber", doubleVal(dietaryFiber.inGrams))
-                    }
-                    if (folate != null) {
-                        putValues("folate", doubleVal(folate.inGrams))
-                    }
-                    if (folicAcid != null) {
-                        putValues("folicAcid", doubleVal(folicAcid.inGrams))
-                    }
-                    if (iodine != null) {
-                        putValues("iodine", doubleVal(iodine.inGrams))
-                    }
-                    if (iron != null) {
-                        putValues("iron", doubleVal(iron.inGrams))
-                    }
-                    if (magnesium != null) {
-                        putValues("magnesium", doubleVal(magnesium.inGrams))
-                    }
-                    if (manganese != null) {
-                        putValues("manganese", doubleVal(manganese.inGrams))
-                    }
-                    if (molybdenum != null) {
-                        putValues("molybdenum", doubleVal(molybdenum.inGrams))
-                    }
-                    if (monounsaturatedFat != null) {
-                        putValues("monounsaturatedFat", doubleVal(monounsaturatedFat.inGrams))
-                    }
-                    if (niacin != null) {
-                        putValues("niacin", doubleVal(niacin.inGrams))
-                    }
-                    if (pantothenicAcid != null) {
-                        putValues("pantothenicAcid", doubleVal(pantothenicAcid.inGrams))
-                    }
-                    if (phosphorus != null) {
-                        putValues("phosphorus", doubleVal(phosphorus.inGrams))
-                    }
-                    if (polyunsaturatedFat != null) {
-                        putValues("polyunsaturatedFat", doubleVal(polyunsaturatedFat.inGrams))
-                    }
-                    if (potassium != null) {
-                        putValues("potassium", doubleVal(potassium.inGrams))
-                    }
-                    if (protein != null) {
-                        putValues("protein", doubleVal(protein.inGrams))
-                    }
-                    if (riboflavin != null) {
-                        putValues("riboflavin", doubleVal(riboflavin.inGrams))
-                    }
-                    if (saturatedFat != null) {
-                        putValues("saturatedFat", doubleVal(saturatedFat.inGrams))
-                    }
-                    if (selenium != null) {
-                        putValues("selenium", doubleVal(selenium.inGrams))
-                    }
-                    if (sodium != null) {
-                        putValues("sodium", doubleVal(sodium.inGrams))
-                    }
-                    if (sugar != null) {
-                        putValues("sugar", doubleVal(sugar.inGrams))
-                    }
-                    if (thiamin != null) {
-                        putValues("thiamin", doubleVal(thiamin.inGrams))
-                    }
-                    if (totalCarbohydrate != null) {
-                        putValues("totalCarbohydrate", doubleVal(totalCarbohydrate.inGrams))
-                    }
-                    if (totalFat != null) {
-                        putValues("totalFat", doubleVal(totalFat.inGrams))
-                    }
-                    if (transFat != null) {
-                        putValues("transFat", doubleVal(transFat.inGrams))
-                    }
-                    if (unsaturatedFat != null) {
-                        putValues("unsaturatedFat", doubleVal(unsaturatedFat.inGrams))
-                    }
-                    if (vitaminA != null) {
-                        putValues("vitaminA", doubleVal(vitaminA.inGrams))
-                    }
-                    if (vitaminB12 != null) {
-                        putValues("vitaminB12", doubleVal(vitaminB12.inGrams))
-                    }
-                    if (vitaminB6 != null) {
-                        putValues("vitaminB6", doubleVal(vitaminB6.inGrams))
-                    }
-                    if (vitaminC != null) {
-                        putValues("vitaminC", doubleVal(vitaminC.inGrams))
-                    }
-                    if (vitaminD != null) {
-                        putValues("vitaminD", doubleVal(vitaminD.inGrams))
-                    }
-                    if (vitaminE != null) {
-                        putValues("vitaminE", doubleVal(vitaminE.inGrams))
-                    }
-                    if (vitaminK != null) {
-                        putValues("vitaminK", doubleVal(vitaminK.inGrams))
-                    }
-                    if (zinc != null) {
-                        putValues("zinc", doubleVal(zinc.inGrams))
-                    }
-                    mealType?.let { putValues("mealType", enumVal(it)) }
-                    name?.let { putValues("name", stringVal(it)) }
-                }
-                .build()
-        is ExerciseRepetitionsRecord ->
-            intervalProto()
-                .setDataType(protoDataType("Repetitions"))
-                .apply {
-                    putValues("count", longVal(count))
-                    putValues("type", enumVal(type))
-                }
-                .build()
-        is SleepSessionRecord ->
-            intervalProto()
-                .setDataType(protoDataType("SleepSession"))
-                .apply {
-                    title?.let { putValues("title", stringVal(it)) }
-                    notes?.let { putValues("notes", stringVal(it)) }
-                }
-                .build()
-        is SleepStageRecord ->
-            intervalProto()
-                .setDataType(protoDataType("SleepStage"))
-                .apply { putValues("stage", enumVal(stage)) }
-                .build()
-        is StepsRecord ->
-            intervalProto()
-                .setDataType(protoDataType("Steps"))
-                .apply { putValues("count", longVal(count)) }
-                .build()
-        is SwimmingStrokesRecord ->
-            intervalProto()
-                .setDataType(protoDataType("SwimmingStrokes"))
-                .apply {
-                    if (count > 0) {
-                        putValues("count", longVal(count))
-                    }
-                    putValues("type", enumVal(type))
-                }
-                .build()
-        is TotalCaloriesBurnedRecord ->
-            intervalProto()
-                .setDataType(protoDataType("TotalCaloriesBurned"))
-                .apply { putValues("energy", doubleVal(energy.inKilocalories)) }
-                .build()
-        is WheelchairPushesRecord ->
-            intervalProto()
-                .setDataType(protoDataType("WheelchairPushes"))
-                .apply { putValues("count", longVal(count)) }
-                .build()
-        else -> throw RuntimeException("Unsupported yet!")
-    }
-
-private fun <T : Any> SeriesRecord<T>.toProto(
-    dataTypeName: String,
-    getSeriesValue: (sample: T) -> DataProto.SeriesValue,
-): DataProto.DataPoint =
-    intervalProto()
-        .setDataType(protoDataType(dataTypeName = dataTypeName))
-        .apply {
-            for (sample in samples) {
-                addSeriesValues(getSeriesValue(sample))
-            }
-        }
-        .build()
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/records/RecordToProtoUtils.kt b/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/records/RecordToProtoUtils.kt
deleted file mode 100644
index d870a75..0000000
--- a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/converters/records/RecordToProtoUtils.kt
+++ /dev/null
@@ -1,84 +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.
- */
-@file:RestrictTo(RestrictTo.Scope.LIBRARY)
-
-package androidx.health.connect.client.impl.converters.records
-
-import androidx.annotation.RestrictTo
-import androidx.health.connect.client.records.InstantaneousRecord
-import androidx.health.connect.client.records.IntervalRecord
-import androidx.health.connect.client.records.metadata.Device
-import androidx.health.connect.client.records.metadata.Metadata
-import androidx.health.platform.client.proto.DataProto
-import java.time.Instant
-
-internal fun protoDataType(dataTypeName: String): DataProto.DataType =
-    DataProto.DataType.newBuilder().setName(dataTypeName).build()
-
-@SuppressWarnings("GoodTime") // Suppress GoodTime for serialize/de-serialize.
-internal fun InstantaneousRecord.instantaneousProto(): DataProto.DataPoint.Builder {
-    val builder =
-        DataProto.DataPoint.newBuilder()
-            .setMetadata(metadata)
-            .setInstantTimeMillis(time.toEpochMilli())
-    zoneOffset?.let { builder.setZoneOffsetSeconds(it.totalSeconds) }
-    return builder
-}
-
-@SuppressWarnings("GoodTime") // Suppress GoodTime for serialize/de-serialize.
-internal fun IntervalRecord.intervalProto(): DataProto.DataPoint.Builder {
-    val builder =
-        DataProto.DataPoint.newBuilder()
-            .setMetadata(metadata)
-            .setStartTimeMillis(startTime.toEpochMilli())
-            .setEndTimeMillis(endTime.toEpochMilli())
-    startZoneOffset?.let { builder.setStartZoneOffsetSeconds(it.totalSeconds) }
-    endZoneOffset?.let { builder.setEndZoneOffsetSeconds(it.totalSeconds) }
-    return builder
-}
-
-@SuppressWarnings("GoodTime") // Suppress GoodTime for serialize/de-serialize.
-private fun DataProto.DataPoint.Builder.setMetadata(metadata: Metadata) = apply {
-    metadata.uid?.let { setUid(it) }
-    if (metadata.dataOrigin.packageName.isNotEmpty()) {
-        setDataOrigin(
-            DataProto.DataOrigin.newBuilder()
-                .setApplicationId(metadata.dataOrigin.packageName)
-                .build()
-        )
-    }
-
-    if (metadata.lastModifiedTime.isAfter(Instant.EPOCH)) {
-        setUpdateTimeMillis(metadata.lastModifiedTime.toEpochMilli())
-    }
-
-    metadata.clientId?.let { setClientId(it) }
-    if (metadata.clientVersion > 0) {
-        metadata.clientVersion.let { setClientVersion(it) }
-    }
-    metadata.device?.let { setDevice(it.toProto()) }
-}
-
-private fun Device.toProto(): DataProto.Device {
-    val obj = this
-    return DataProto.Device.newBuilder()
-        .apply {
-            obj.manufacturer?.let { setManufacturer(it) }
-            obj.model?.let { setModel(it) }
-            obj.type?.let { setType(it) }
-        }
-        .build()
-}
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/ActiveCaloriesBurnedRecord.kt b/health/health-connect-client/src/main/java/androidx/health/connect/client/records/ActiveCaloriesBurnedRecord.kt
deleted file mode 100644
index fcab192..0000000
--- a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/ActiveCaloriesBurnedRecord.kt
+++ /dev/null
@@ -1,90 +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.records
-
-import androidx.health.connect.client.aggregate.AggregateMetric
-import androidx.health.connect.client.records.metadata.Metadata
-import androidx.health.connect.client.units.Energy
-import java.time.Instant
-import java.time.ZoneOffset
-
-/**
- * Captures the estimated active energy burned by the user (in kilocalories), excluding basal
- * metabolic rate (BMR). Each record represents the total kilocalories burned over a time interval,
- * so both the start and end times should be set.
- */
-public class ActiveCaloriesBurnedRecord(
-    /** Energy in [Energy] unit. Required field. Valid range: 0-1000000 kcal. */
-    public val energy: Energy,
-    override val startTime: Instant,
-    override val startZoneOffset: ZoneOffset?,
-    override val endTime: Instant,
-    override val endZoneOffset: ZoneOffset?,
-    override val metadata: Metadata = Metadata.EMPTY,
-) : IntervalRecord {
-
-    init {
-        energy.requireNotLess(other = energy.zero(), "energy")
-    }
-
-    /*
-     * Generated by the IDE: Code -> Generate -> "equals() and hashCode()".
-     */
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (other !is ActiveCaloriesBurnedRecord) return false
-
-        if (energy != other.energy) return false
-        if (startTime != other.startTime) return false
-        if (startZoneOffset != other.startZoneOffset) return false
-        if (endTime != other.endTime) return false
-        if (endZoneOffset != other.endZoneOffset) return false
-        if (metadata != other.metadata) return false
-
-        return true
-    }
-
-    /*
-     * Generated by the IDE: Code -> Generate -> "equals() and hashCode()".
-     */
-    override fun hashCode(): Int {
-        var result = energy.hashCode()
-        result = 31 * result + startTime.hashCode()
-        result = 31 * result + (startZoneOffset?.hashCode() ?: 0)
-        result = 31 * result + endTime.hashCode()
-        result = 31 * result + (endZoneOffset?.hashCode() ?: 0)
-        result = 31 * result + metadata.hashCode()
-        return result
-    }
-
-    companion object {
-        private const val TYPE_NAME = "ActiveCaloriesBurned"
-        private const val ENERGY_FIELD_NAME = "energy"
-
-        /**
-         * Metric identifier to retrieve total active calories burned from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val ACTIVE_CALORIES_TOTAL: AggregateMetric<Energy> =
-            AggregateMetric.doubleMetric(
-                dataTypeName = TYPE_NAME,
-                aggregationType = AggregateMetric.AggregationType.TOTAL,
-                fieldName = ENERGY_FIELD_NAME,
-                mapper = Energy::calories,
-            )
-    }
-}
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/BasalMetabolicRateRecord.kt b/health/health-connect-client/src/main/java/androidx/health/connect/client/records/BasalMetabolicRateRecord.kt
deleted file mode 100644
index 4550a2b..0000000
--- a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/BasalMetabolicRateRecord.kt
+++ /dev/null
@@ -1,78 +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.records
-
-import androidx.health.connect.client.aggregate.AggregateMetric
-import androidx.health.connect.client.records.metadata.Metadata
-import androidx.health.connect.client.units.Energy
-import androidx.health.connect.client.units.Power
-import java.time.Instant
-import java.time.ZoneOffset
-
-/**
- * Captures the BMR of a user. Each record represents the energy a user would burn if at rest all
- * day, based on their height and weight.
- */
-public class BasalMetabolicRateRecord(
-    /** Basal metabolic rate, in [Power] unit. Required field. Valid range: 0-10000 kcal/day. */
-    public val basalMetabolicRate: Power,
-    override val time: Instant,
-    override val zoneOffset: ZoneOffset?,
-    override val metadata: Metadata = Metadata.EMPTY,
-) : InstantaneousRecord {
-
-    init {
-        basalMetabolicRate.requireNotLess(other = basalMetabolicRate.zero(), name = "bmr")
-    }
-
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (other !is BasalMetabolicRateRecord) return false
-
-        if (basalMetabolicRate != other.basalMetabolicRate) return false
-        if (time != other.time) return false
-        if (zoneOffset != other.zoneOffset) return false
-        if (metadata != other.metadata) return false
-
-        return true
-    }
-
-    override fun hashCode(): Int {
-        var result = basalMetabolicRate.hashCode()
-        result = 31 * result + time.hashCode()
-        result = 31 * result + (zoneOffset?.hashCode() ?: 0)
-        result = 31 * result + metadata.hashCode()
-        return result
-    }
-
-    companion object {
-        private const val BASAL_CALORIES_TYPE_NAME = "BasalCaloriesBurned"
-        private const val ENERGY_FIELD_NAME = "energy"
-
-        /**
-         * Metric identifier to retrieve the total basal calories burned from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val BASAL_CALORIES_TOTAL: AggregateMetric<Energy> =
-            AggregateMetric.doubleMetric(
-                dataTypeName = BASAL_CALORIES_TYPE_NAME,
-                aggregationType = AggregateMetric.AggregationType.TOTAL,
-                fieldName = ENERGY_FIELD_NAME,
-                mapper = Energy::calories,
-            )
-    }
-}
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/MenstruationRecord.kt b/health/health-connect-client/src/main/java/androidx/health/connect/client/records/MenstruationRecord.kt
deleted file mode 100644
index 4f3238e..0000000
--- a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/MenstruationRecord.kt
+++ /dev/null
@@ -1,84 +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.records
-
-import androidx.annotation.RestrictTo
-import androidx.annotation.StringDef
-import androidx.health.connect.client.records.metadata.Metadata
-import java.time.Instant
-import java.time.ZoneOffset
-
-/**
- * Captures a description of how heavy a user's menstrual flow was (spotting, light, medium, or
- * heavy). Each record represents a description of how heavy the user's menstrual bleeding was.
- */
-public class MenstruationRecord(
-    /**
-     * How heavy the user's menstrual flow was. Optional field. Allowed values: [Flow].
-     *
-     * @see Flow
-     */
-    @property:Flows public val flow: String? = null,
-    override val time: Instant,
-    override val zoneOffset: ZoneOffset?,
-    override val metadata: Metadata = Metadata.EMPTY,
-) : InstantaneousRecord {
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (other !is MenstruationRecord) return false
-
-        if (flow != other.flow) return false
-        if (time != other.time) return false
-        if (zoneOffset != other.zoneOffset) return false
-        if (metadata != other.metadata) return false
-
-        return true
-    }
-
-    override fun hashCode(): Int {
-        var result = 0
-        result = 31 * result + flow.hashCode()
-        result = 31 * result + time.hashCode()
-        result = 31 * result + (zoneOffset?.hashCode() ?: 0)
-        result = 31 * result + metadata.hashCode()
-        return result
-    }
-
-    /** How heavy the user's menstruation flow was. */
-    public object Flow {
-        const val SPOTTING = "spotting"
-        const val LIGHT = "light"
-        const val MEDIUM = "medium"
-        const val HEAVY = "heavy"
-    }
-
-    /**
-     * How heavy the user's menstruation flow was.
-     * @suppress
-     */
-    @Retention(AnnotationRetention.SOURCE)
-    @StringDef(
-        value =
-            [
-                MenstruationRecord.Flow.SPOTTING,
-                MenstruationRecord.Flow.LIGHT,
-                MenstruationRecord.Flow.MEDIUM,
-                MenstruationRecord.Flow.HEAVY,
-            ]
-    )
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
-    annotation class Flows
-}
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/NutritionRecord.kt b/health/health-connect-client/src/main/java/androidx/health/connect/client/records/NutritionRecord.kt
deleted file mode 100644
index fe3ea9fc..0000000
--- a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/NutritionRecord.kt
+++ /dev/null
@@ -1,584 +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.records
-
-import androidx.health.connect.client.aggregate.AggregateMetric
-import androidx.health.connect.client.aggregate.AggregateMetric.AggregationType
-import androidx.health.connect.client.aggregate.AggregateMetric.Companion.doubleMetric
-import androidx.health.connect.client.records.metadata.Metadata
-import androidx.health.connect.client.units.Energy
-import androidx.health.connect.client.units.Mass
-import java.time.Instant
-import java.time.ZoneOffset
-
-/** Captures what nutrients were consumed as part of a meal or a food item. */
-public class NutritionRecord(
-    /** Biotin in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val biotin: Mass? = null,
-    /** Caffeine in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val caffeine: Mass? = null,
-    /** Calcium in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val calcium: Mass? = null,
-    /** Energy in [Energy] unit. Optional field. Valid range: 0-100000 kcal. */
-    public val energy: Energy? = null,
-    /** Energy from fat in [Energy] unit. Optional field. Valid range: 0-100000 kcal. */
-    public val energyFromFat: Energy? = null,
-    /** Chloride in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val chloride: Mass? = null,
-    /** Cholesterol in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val cholesterol: Mass? = null,
-    /** Chromium in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val chromium: Mass? = null,
-    /** Copper in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val copper: Mass? = null,
-    /** Dietary fiber in [Mass] unit. Optional field. Valid range: 0-100000 grams. */
-    public val dietaryFiber: Mass? = null,
-    /** Folate in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val folate: Mass? = null,
-    /** Folic acid in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val folicAcid: Mass? = null,
-    /** Iodine in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val iodine: Mass? = null,
-    /** Iron in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val iron: Mass? = null,
-    /** Magnesium in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val magnesium: Mass? = null,
-    /** Manganese in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val manganese: Mass? = null,
-    /** Molybdenum in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val molybdenum: Mass? = null,
-    /** Monounsaturated fat in [Mass] unit. Optional field. Valid range: 0-100000 grams. */
-    public val monounsaturatedFat: Mass? = null,
-    /** Niacin in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val niacin: Mass? = null,
-    /** Pantothenic acid in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val pantothenicAcid: Mass? = null,
-    /** Phosphorus in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val phosphorus: Mass? = null,
-    /** Polyunsaturated fat in [Mass] unit. Optional field. Valid range: 0-100000 grams. */
-    public val polyunsaturatedFat: Mass? = null,
-    /** Potassium in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val potassium: Mass? = null,
-    /** Protein in [Mass] unit. Optional field. Valid range: 0-100000 grams. */
-    public val protein: Mass? = null,
-    /** Riboflavin in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val riboflavin: Mass? = null,
-    /** Saturated fat in [Mass] unit. Optional field. Valid range: 0-100000 grams. */
-    public val saturatedFat: Mass? = null,
-    /** Selenium in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val selenium: Mass? = null,
-    /** Sodium in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val sodium: Mass? = null,
-    /** Sugar in [Mass] unit. Optional field. Valid range: 0-100000 grams. */
-    public val sugar: Mass? = null,
-    /** Thiamin in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val thiamin: Mass? = null,
-    /** Total carbohydrate in [Mass] unit. Optional field. Valid range: 0-100000 grams. */
-    public val totalCarbohydrate: Mass? = null,
-    /** Total fat in [Mass] unit. Optional field. Valid range: 0-100000 grams. */
-    public val totalFat: Mass? = null,
-    /** Trans fat in [Mass] unit. Optional field. Valid range: 0-100000 grams. */
-    public val transFat: Mass? = null,
-    /** Unsaturated fat in [Mass] unit. Optional field. Valid range: 0-100000 grams. */
-    public val unsaturatedFat: Mass? = null,
-    /** Vitamin A in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val vitaminA: Mass? = null,
-    /** Vitamin B12 in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val vitaminB12: Mass? = null,
-    /** Vitamin B6 in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val vitaminB6: Mass? = null,
-    /** Vitamin C in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val vitaminC: Mass? = null,
-    /** Vitamin D in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val vitaminD: Mass? = null,
-    /** Vitamin E in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val vitaminE: Mass? = null,
-    /** Vitamin K in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val vitaminK: Mass? = null,
-    /** Zinc in [Mass] unit. Optional field. Valid range: 0-100 grams. */
-    public val zinc: Mass? = null,
-    /** Name for food or drink, provided by the user. Optional field. */
-    public val name: String? = null,
-    /**
-     * Type of meal related to the nutrients consumed. Optional, enum field. Allowed values:
-     * [MealType].
-     *
-     * @see MealType
-     */
-    @property:MealTypes public val mealType: String? = null,
-    override val startTime: Instant,
-    override val startZoneOffset: ZoneOffset?,
-    override val endTime: Instant,
-    override val endZoneOffset: ZoneOffset?,
-    override val metadata: Metadata = Metadata.EMPTY,
-) : IntervalRecord {
-
-    /*
-     * Generated by the IDE: Code -> Generate -> "equals() and hashCode()".
-     */
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (other !is NutritionRecord) return false
-
-        if (biotin != other.biotin) return false
-        if (caffeine != other.caffeine) return false
-        if (calcium != other.calcium) return false
-        if (energy != other.energy) return false
-        if (energyFromFat != other.energyFromFat) return false
-        if (chloride != other.chloride) return false
-        if (cholesterol != other.cholesterol) return false
-        if (chromium != other.chromium) return false
-        if (copper != other.copper) return false
-        if (dietaryFiber != other.dietaryFiber) return false
-        if (folate != other.folate) return false
-        if (folicAcid != other.folicAcid) return false
-        if (iodine != other.iodine) return false
-        if (iron != other.iron) return false
-        if (magnesium != other.magnesium) return false
-        if (manganese != other.manganese) return false
-        if (molybdenum != other.molybdenum) return false
-        if (monounsaturatedFat != other.monounsaturatedFat) return false
-        if (niacin != other.niacin) return false
-        if (pantothenicAcid != other.pantothenicAcid) return false
-        if (phosphorus != other.phosphorus) return false
-        if (polyunsaturatedFat != other.polyunsaturatedFat) return false
-        if (potassium != other.potassium) return false
-        if (protein != other.protein) return false
-        if (riboflavin != other.riboflavin) return false
-        if (saturatedFat != other.saturatedFat) return false
-        if (selenium != other.selenium) return false
-        if (sodium != other.sodium) return false
-        if (sugar != other.sugar) return false
-        if (thiamin != other.thiamin) return false
-        if (totalCarbohydrate != other.totalCarbohydrate) return false
-        if (totalFat != other.totalFat) return false
-        if (transFat != other.transFat) return false
-        if (unsaturatedFat != other.unsaturatedFat) return false
-        if (vitaminA != other.vitaminA) return false
-        if (vitaminB12 != other.vitaminB12) return false
-        if (vitaminB6 != other.vitaminB6) return false
-        if (vitaminC != other.vitaminC) return false
-        if (vitaminD != other.vitaminD) return false
-        if (vitaminE != other.vitaminE) return false
-        if (vitaminK != other.vitaminK) return false
-        if (zinc != other.zinc) return false
-        if (name != other.name) return false
-        if (mealType != other.mealType) return false
-        if (startTime != other.startTime) return false
-        if (startZoneOffset != other.startZoneOffset) return false
-        if (endTime != other.endTime) return false
-        if (endZoneOffset != other.endZoneOffset) return false
-        if (metadata != other.metadata) return false
-
-        return true
-    }
-
-    /*
-     * Generated by the IDE: Code -> Generate -> "equals() and hashCode()".
-     */
-    override fun hashCode(): Int {
-        var result = biotin.hashCode()
-        result = 31 * result + caffeine.hashCode()
-        result = 31 * result + calcium.hashCode()
-        result = 31 * result + energy.hashCode()
-        result = 31 * result + energyFromFat.hashCode()
-        result = 31 * result + chloride.hashCode()
-        result = 31 * result + cholesterol.hashCode()
-        result = 31 * result + chromium.hashCode()
-        result = 31 * result + copper.hashCode()
-        result = 31 * result + dietaryFiber.hashCode()
-        result = 31 * result + folate.hashCode()
-        result = 31 * result + folicAcid.hashCode()
-        result = 31 * result + iodine.hashCode()
-        result = 31 * result + iron.hashCode()
-        result = 31 * result + magnesium.hashCode()
-        result = 31 * result + manganese.hashCode()
-        result = 31 * result + molybdenum.hashCode()
-        result = 31 * result + monounsaturatedFat.hashCode()
-        result = 31 * result + niacin.hashCode()
-        result = 31 * result + pantothenicAcid.hashCode()
-        result = 31 * result + phosphorus.hashCode()
-        result = 31 * result + polyunsaturatedFat.hashCode()
-        result = 31 * result + potassium.hashCode()
-        result = 31 * result + protein.hashCode()
-        result = 31 * result + riboflavin.hashCode()
-        result = 31 * result + saturatedFat.hashCode()
-        result = 31 * result + selenium.hashCode()
-        result = 31 * result + sodium.hashCode()
-        result = 31 * result + sugar.hashCode()
-        result = 31 * result + thiamin.hashCode()
-        result = 31 * result + totalCarbohydrate.hashCode()
-        result = 31 * result + totalFat.hashCode()
-        result = 31 * result + transFat.hashCode()
-        result = 31 * result + unsaturatedFat.hashCode()
-        result = 31 * result + vitaminA.hashCode()
-        result = 31 * result + vitaminB12.hashCode()
-        result = 31 * result + vitaminB6.hashCode()
-        result = 31 * result + vitaminC.hashCode()
-        result = 31 * result + vitaminD.hashCode()
-        result = 31 * result + vitaminE.hashCode()
-        result = 31 * result + vitaminK.hashCode()
-        result = 31 * result + zinc.hashCode()
-        result = 31 * result + (name?.hashCode() ?: 0)
-        result = 31 * result + (mealType?.hashCode() ?: 0)
-        result = 31 * result + startTime.hashCode()
-        result = 31 * result + (startZoneOffset?.hashCode() ?: 0)
-        result = 31 * result + endTime.hashCode()
-        result = 31 * result + (endZoneOffset?.hashCode() ?: 0)
-        result = 31 * result + metadata.hashCode()
-        return result
-    }
-
-    companion object {
-        private const val TYPE_NAME = "Nutrition"
-
-        /**
-         * Metric identifier to retrieve the total biotin from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val BIOTIN_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "biotin", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total caffeine from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val CAFFEINE_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "caffeine", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total calcium from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val CALCIUM_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "calcium", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total energy from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val ENERGY_TOTAL: AggregateMetric<Energy> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "calories", Energy::calories)
-
-        /**
-         * Metric identifier to retrieve the total energy from fat from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val ENERGY_FROM_FAT_TOTAL: AggregateMetric<Energy> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "caloriesFromFat", Energy::calories)
-
-        /**
-         * Metric identifier to retrieve the total chloride from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val CHLORIDE_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "chloride", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total cholesterol from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val CHOLESTEROL_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "cholesterol", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total chromium from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val CHROMIUM_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "chromium", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total copper from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val COPPER_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "copper", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total dietary fiber from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val DIETARY_FIBER_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "dietaryFiber", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total folate from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val FOLATE_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "folate", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total folic acid from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val FOLIC_ACID_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "folicAcid", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total iodine from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val IODINE_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "iodine", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total iron from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val IRON_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "iron", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total magnesium from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val MAGNESIUM_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "magnesium", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total manganese from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val MANGANESE_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "manganese", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total molybdenum from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val MOLYBDENUM_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "molybdenum", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total monounsaturated fat from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val MONOUNSATURATED_FAT_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "monounsaturatedFat", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total niacin from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val NIACIN_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "niacin", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total pantothenic acid from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val PANTOTHENIC_ACID_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "pantothenicAcid", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total phosphorus from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val PHOSPHORUS_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "phosphorus", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total polyunsaturated fat from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val POLYUNSATURATED_FAT_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "polyunsaturatedFat", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total potassium from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val POTASSIUM_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "potassium", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total protein from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val PROTEIN_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "protein", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total riboflavin from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val RIBOFLAVIN_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "riboflavin", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total saturated fat from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val SATURATED_FAT_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "saturatedFat", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total selenium from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val SELENIUM_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "selenium", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total sodium from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val SODIUM_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "sodium", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total sugar from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val SUGAR_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "sugar", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total thiamin from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val THIAMIN_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "thiamin", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total total carbohydrate from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val TOTAL_CARBOHYDRATE_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "totalCarbohydrate", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total total fat from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val TOTAL_FAT_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "totalFat", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total trans fat from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val TRANS_FAT_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "transFat", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total unsaturated fat from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val UNSATURATED_FAT_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "unsaturatedFat", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total vitamin a from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val VITAMIN_A_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "vitaminA", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total vitamin b12 from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val VITAMIN_B12_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "vitaminB12", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total vitamin b6 from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val VITAMIN_B6_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "vitaminB6", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total vitamin c from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val VITAMIN_C_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "vitaminC", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total vitamin d from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val VITAMIN_D_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "vitaminD", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total vitamin e from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val VITAMIN_E_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "vitaminE", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total vitamin k from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val VITAMIN_K_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "vitaminK", Mass::grams)
-
-        /**
-         * Metric identifier to retrieve the total zinc from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val ZINC_TOTAL: AggregateMetric<Mass> =
-            doubleMetric(TYPE_NAME, AggregationType.TOTAL, "zinc", Mass::grams)
-    }
-}
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/TotalCaloriesBurnedRecord.kt b/health/health-connect-client/src/main/java/androidx/health/connect/client/records/TotalCaloriesBurnedRecord.kt
deleted file mode 100644
index 3c2c286..0000000
--- a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/TotalCaloriesBurnedRecord.kt
+++ /dev/null
@@ -1,86 +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.records
-
-import androidx.health.connect.client.aggregate.AggregateMetric
-import androidx.health.connect.client.records.metadata.Metadata
-import androidx.health.connect.client.units.Energy
-import java.time.Instant
-import java.time.ZoneOffset
-
-/**
- * Total energy burned by the user (in kilocalories), including active & basal energy burned (BMR).
- * Each record represents the total kilocalories burned over a time interval.
- */
-public class TotalCaloriesBurnedRecord(
-    /** Energy in [Energy] unit. Required field. Valid range: 0-1000000 kcal. */
-    public val energy: Energy,
-    override val startTime: Instant,
-    override val startZoneOffset: ZoneOffset?,
-    override val endTime: Instant,
-    override val endZoneOffset: ZoneOffset?,
-    override val metadata: Metadata = Metadata.EMPTY,
-) : IntervalRecord {
-
-    init {
-        energy.requireNotLess(other = energy.zero(), "energy")
-    }
-
-    /*
-     * Generated by the IDE: Code -> Generate -> "equals() and hashCode()".
-     */
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (other !is TotalCaloriesBurnedRecord) return false
-
-        if (energy != other.energy) return false
-        if (startTime != other.startTime) return false
-        if (startZoneOffset != other.startZoneOffset) return false
-        if (endTime != other.endTime) return false
-        if (endZoneOffset != other.endZoneOffset) return false
-        if (metadata != other.metadata) return false
-
-        return true
-    }
-
-    /*
-     * Generated by the IDE: Code -> Generate -> "equals() and hashCode()".
-     */
-    override fun hashCode(): Int {
-        var result = energy.hashCode()
-        result = 31 * result + startTime.hashCode()
-        result = 31 * result + (startZoneOffset?.hashCode() ?: 0)
-        result = 31 * result + endTime.hashCode()
-        result = 31 * result + (endZoneOffset?.hashCode() ?: 0)
-        result = 31 * result + metadata.hashCode()
-        return result
-    }
-
-    companion object {
-        /**
-         * Metric identifier to retrieve total energy from
-         * [androidx.health.connect.client.aggregate.AggregationResult].
-         */
-        @JvmField
-        val ENERGY_TOTAL: AggregateMetric<Energy> =
-            AggregateMetric.doubleMetric(
-                dataTypeName = "TotalCaloriesBurned",
-                aggregationType = AggregateMetric.AggregationType.TOTAL,
-                fieldName = "energy",
-                mapper = Energy::calories,
-            )
-    }
-}
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/metadata/Metadata.kt b/health/health-connect-client/src/main/java/androidx/health/connect/client/records/metadata/Metadata.kt
deleted file mode 100644
index 25c27a7..0000000
--- a/health/health-connect-client/src/main/java/androidx/health/connect/client/records/metadata/Metadata.kt
+++ /dev/null
@@ -1,89 +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.health.connect.client.records.metadata
-
-import java.time.Instant
-
-/** Set of shared metadata fields for [androidx.health.data.client.records.Record]. */
-@SuppressWarnings("NewApi") // Temporary until we can enable java8 desugaring effectively.
-public class Metadata(
-    /**
-     * Unique identifier of this data, assigned by the Android Health Platform at insertion time.
-     */
-    public val uid: String? = null,
-
-    /**
-     * Where the data comes from, such as application information originally generated this data.
-     */
-    public val dataOrigin: DataOrigin = DataOrigin(""),
-
-    /** Automatically populated to when data was last modified (or originally created). */
-    public val lastModifiedTime: Instant = Instant.EPOCH,
-
-    /**
-     * Optional client supplied unique data identifier associated with the data.
-     *
-     * There is guaranteed a single entry for any type of data with same client provided identifier
-     * for a given client. Any new insertions with the same client provided identifier will either
-     * replace or be ignored depending on associated [clientVersion].
-     *
-     * @see clientVersion
-     */
-    public val clientId: String? = null,
-
-    /**
-     * Optional client supplied version associated with the data.
-     *
-     * This determines conflict resolution outcome when there are multiple insertions of the same
-     * [clientId]. Data with the highest [clientVersion] takes precedence. [clientVersion] starts
-     * with 0.
-     *
-     * @see clientId
-     */
-    public val clientVersion: Long = 0,
-
-    /** Optional client supplied device information associated with the data. */
-    public val device: Device? = null,
-) {
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (other !is Metadata) return false
-
-        if (uid != other.uid) return false
-        if (dataOrigin != other.dataOrigin) return false
-        if (lastModifiedTime != other.lastModifiedTime) return false
-        if (clientId != other.clientId) return false
-        if (clientVersion != other.clientVersion) return false
-        if (device != other.device) return false
-
-        return true
-    }
-
-    override fun hashCode(): Int {
-        var result = uid?.hashCode() ?: 0
-        result = 31 * result + dataOrigin.hashCode()
-        result = 31 * result + lastModifiedTime.hashCode()
-        result = 31 * result + (clientId?.hashCode() ?: 0)
-        result = 31 * result + clientVersion.hashCode()
-        result = 31 * result + (device?.hashCode() ?: 0)
-        return result
-    }
-
-    internal companion object {
-        /** A default instance of metadata with no fields initialised. */
-        @JvmField internal val EMPTY = Metadata()
-    }
-}
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/units/Mass.kt b/health/health-connect-client/src/main/java/androidx/health/connect/client/units/Mass.kt
deleted file mode 100644
index eef031b..0000000
--- a/health/health-connect-client/src/main/java/androidx/health/connect/client/units/Mass.kt
+++ /dev/null
@@ -1,233 +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.health.connect.client.units
-
-/**
- * Represents a unit of mass. Supported units:
- *
- * - grams - see [Mass.grams], [Double.grams]
- * - kilograms - see [Mass.kilograms], [Double.kilograms]
- * - milligrams - see [Mass.milligrams], [Double.milligrams]
- * - micrograms - see [Mass.micrograms], [Double.micrograms]
- * - ounces - see [Mass.ounces], [Double.ounces]
- */
-class Mass private constructor(
-    private val value: Double,
-    private val type: Type,
-) : Comparable<Mass> {
-
-    /** Returns the mass in grams. */
-    @get:JvmName("getGrams")
-    val inGrams: Double
-        get() = value * type.gramsPerUnit
-
-    /** Returns the mass in kilograms. */
-    @get:JvmName("getKilograms")
-    val inKilograms: Double
-        get() = get(type = Type.KILOGRAMS)
-
-    /** Returns the mass in milligrams. */
-    @get:JvmName("getMilligrams")
-    val inMilligrams: Double
-        get() = get(type = Type.MILLIGRAMS)
-
-    /** Returns the mass in micrograms. */
-    @get:JvmName("getMicrograms")
-    val inMicrograms: Double
-        get() = get(type = Type.MICROGRAMS)
-
-    /** Returns the mass in ounces. */
-    @get:JvmName("getOunces")
-    val inOunces: Double
-        get() = get(type = Type.OUNCES)
-
-    private fun get(type: Type): Double =
-        if (this.type == type) value else inGrams / type.gramsPerUnit
-
-    /** Returns zero [Mass] of the same [Type]. */
-    internal fun zero(): Mass = ZEROS.getValue(type)
-
-    override fun compareTo(other: Mass): Int =
-        if (type == other.type) {
-            value.compareTo(other.value)
-        } else {
-            inGrams.compareTo(other.inGrams)
-        }
-
-    /*
-     * Generated by the IDE: Code -> Generate -> "equals() and hashCode()".
-     */
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (other !is Mass) return false
-
-        if (value != other.value) return false
-        if (type != other.type) return false
-
-        return true
-    }
-
-    /*
-     * Generated by the IDE: Code -> Generate -> "equals() and hashCode()".
-     */
-    override fun hashCode(): Int {
-        var result = value.hashCode()
-        result = 31 * result + type.hashCode()
-        return result
-    }
-
-    override fun toString(): String = "$value ${type.name.lowercase()}"
-
-    companion object {
-        private val ZEROS = Type.values().associateWith { Mass(value = 0.0, type = it) }
-
-        /** Creates [Mass] with the specified value in grams. */
-        @JvmStatic fun grams(value: Double): Mass = Mass(value, Type.GRAMS)
-
-        /** Creates [Mass] with the specified value in kilograms. */
-        @JvmStatic fun kilograms(value: Double): Mass = Mass(value, Type.KILOGRAMS)
-
-        /** Creates [Mass] with the specified value in milligrams. */
-        @JvmStatic fun milligrams(value: Double): Mass = Mass(value, Type.MILLIGRAMS)
-
-        /** Creates [Mass] with the specified value in micrograms. */
-        @JvmStatic fun micrograms(value: Double): Mass = Mass(value, Type.MICROGRAMS)
-
-        /** Creates [Mass] with the specified value in ounces. */
-        @JvmStatic fun ounces(value: Double): Mass = Mass(value, Type.OUNCES)
-    }
-
-    private enum class Type {
-        GRAMS {
-            override val gramsPerUnit: Double = 1.0
-        },
-        KILOGRAMS {
-            override val gramsPerUnit: Double = 1000.0
-        },
-        MILLIGRAMS {
-            override val gramsPerUnit: Double = 0.001
-        },
-        MICROGRAMS {
-            override val gramsPerUnit: Double = 0.000001
-        },
-        OUNCES {
-            override val gramsPerUnit: Double = 28.34952
-        };
-
-        abstract val gramsPerUnit: Double
-    }
-}
-
-/** Creates [Mass] with the specified value in grams. */
-@get:JvmSynthetic
-val Double.grams: Mass
-    get() = Mass.grams(value = this)
-
-/** Creates [Mass] with the specified value in grams. */
-@get:JvmSynthetic
-val Float.grams: Mass
-    get() = toDouble().grams
-
-/** Creates [Mass] with the specified value in grams. */
-@get:JvmSynthetic
-val Long.grams: Mass
-    get() = toDouble().grams
-
-/** Creates [Mass] with the specified value in grams. */
-@get:JvmSynthetic
-val Int.grams: Mass
-    get() = toDouble().grams
-
-/** Creates [Mass] with the specified value in kilograms. */
-@get:JvmSynthetic
-val Double.kilograms: Mass
-    get() = Mass.kilograms(value = this)
-
-/** Creates [Mass] with the specified value in kilograms. */
-@get:JvmSynthetic
-val Float.kilograms: Mass
-    get() = toDouble().kilograms
-
-/** Creates [Mass] with the specified value in kilograms. */
-@get:JvmSynthetic
-val Long.kilograms: Mass
-    get() = toDouble().kilograms
-
-/** Creates [Mass] with the specified value in kilograms. */
-@get:JvmSynthetic
-val Int.kilograms: Mass
-    get() = toDouble().kilograms
-
-/** Creates [Mass] with the specified value in milligrams. */
-@get:JvmSynthetic
-val Double.milligrams: Mass
-    get() = Mass.milligrams(value = this)
-
-/** Creates [Mass] with the specified value in milligrams. */
-@get:JvmSynthetic
-val Float.milligrams: Mass
-    get() = toDouble().milligrams
-
-/** Creates [Mass] with the specified value in milligrams. */
-@get:JvmSynthetic
-val Long.milligrams: Mass
-    get() = toDouble().milligrams
-
-/** Creates [Mass] with the specified value in milligrams. */
-@get:JvmSynthetic
-val Int.milligrams: Mass
-    get() = toDouble().milligrams
-
-/** Creates [Mass] with the specified value in micrograms. */
-@get:JvmSynthetic
-val Double.micrograms: Mass
-    get() = Mass.micrograms(value = this)
-
-/** Creates [Mass] with the specified value in micrograms. */
-@get:JvmSynthetic
-val Float.micrograms: Mass
-    get() = toDouble().micrograms
-
-/** Creates [Mass] with the specified value in micrograms. */
-@get:JvmSynthetic
-val Long.micrograms: Mass
-    get() = toDouble().micrograms
-
-/** Creates [Mass] with the specified value in micrograms. */
-@get:JvmSynthetic
-val Int.micrograms: Mass
-    get() = toDouble().micrograms
-
-/** Creates [Mass] with the specified value in ounces. */
-@get:JvmSynthetic
-val Double.ounces: Mass
-    get() = Mass.ounces(value = this)
-
-/** Creates [Mass] with the specified value in ounces. */
-@get:JvmSynthetic
-val Float.ounces: Mass
-    get() = toDouble().ounces
-
-/** Creates [Mass] with the specified value in ounces. */
-@get:JvmSynthetic
-val Long.ounces: Mass
-    get() = toDouble().ounces
-
-/** Creates [Mass] with the specified value in ounces. */
-@get:JvmSynthetic
-val Int.ounces: Mass
-    get() = toDouble().ounces
diff --git a/health/health-connect-client/src/test/java/androidx/health/connect/client/impl/converters/records/AllRecordsConverterTest.kt b/health/health-connect-client/src/test/java/androidx/health/connect/client/impl/converters/records/AllRecordsConverterTest.kt
deleted file mode 100644
index 1510f7b..0000000
--- a/health/health-connect-client/src/test/java/androidx/health/connect/client/impl/converters/records/AllRecordsConverterTest.kt
+++ /dev/null
@@ -1,1005 +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.impl.converters.records
-
-import androidx.health.connect.client.impl.converters.datatype.toDataTypeName
-import androidx.health.connect.client.records.ActiveCaloriesBurnedRecord
-import androidx.health.connect.client.records.BasalBodyTemperatureRecord
-import androidx.health.connect.client.records.BasalMetabolicRateRecord
-import androidx.health.connect.client.records.BloodGlucoseRecord
-import androidx.health.connect.client.records.BloodPressureRecord
-import androidx.health.connect.client.records.BodyFatRecord
-import androidx.health.connect.client.records.BodyTemperatureMeasurementLocation
-import androidx.health.connect.client.records.BodyTemperatureRecord
-import androidx.health.connect.client.records.BodyWaterMassRecord
-import androidx.health.connect.client.records.BoneMassRecord
-import androidx.health.connect.client.records.CervicalMucusRecord
-import androidx.health.connect.client.records.CervicalMucusRecord.Appearance
-import androidx.health.connect.client.records.CervicalMucusRecord.Sensation
-import androidx.health.connect.client.records.CyclingPedalingCadenceRecord
-import androidx.health.connect.client.records.DistanceRecord
-import androidx.health.connect.client.records.ElevationGainedRecord
-import androidx.health.connect.client.records.ExerciseEventRecord
-import androidx.health.connect.client.records.ExerciseEventRecord.EventType
-import androidx.health.connect.client.records.ExerciseLapRecord
-import androidx.health.connect.client.records.ExerciseRepetitionsRecord
-import androidx.health.connect.client.records.ExerciseSessionRecord
-import androidx.health.connect.client.records.ExerciseSessionRecord.ExerciseType
-import androidx.health.connect.client.records.FloorsClimbedRecord
-import androidx.health.connect.client.records.HeartRateRecord
-import androidx.health.connect.client.records.HeartRateVariabilityDifferentialIndexRecord
-import androidx.health.connect.client.records.HeartRateVariabilityRmssdRecord
-import androidx.health.connect.client.records.HeartRateVariabilitySRecord
-import androidx.health.connect.client.records.HeartRateVariabilitySd2Record
-import androidx.health.connect.client.records.HeartRateVariabilitySdannRecord
-import androidx.health.connect.client.records.HeartRateVariabilitySdnnIndexRecord
-import androidx.health.connect.client.records.HeartRateVariabilitySdnnRecord
-import androidx.health.connect.client.records.HeartRateVariabilitySdsdRecord
-import androidx.health.connect.client.records.HeartRateVariabilityTinnRecord
-import androidx.health.connect.client.records.HeightRecord
-import androidx.health.connect.client.records.HipCircumferenceRecord
-import androidx.health.connect.client.records.HydrationRecord
-import androidx.health.connect.client.records.LeanBodyMassRecord
-import androidx.health.connect.client.records.MenstruationRecord
-import androidx.health.connect.client.records.MenstruationRecord.Flow
-import androidx.health.connect.client.records.NutritionRecord
-import androidx.health.connect.client.records.OvulationTestRecord
-import androidx.health.connect.client.records.OvulationTestRecord.Result
-import androidx.health.connect.client.records.OxygenSaturationRecord
-import androidx.health.connect.client.records.PowerRecord
-import androidx.health.connect.client.records.Record
-import androidx.health.connect.client.records.RespiratoryRateRecord
-import androidx.health.connect.client.records.RestingHeartRateRecord
-import androidx.health.connect.client.records.SexualActivityRecord
-import androidx.health.connect.client.records.SleepSessionRecord
-import androidx.health.connect.client.records.SleepStageRecord
-import androidx.health.connect.client.records.SleepStageRecord.StageType
-import androidx.health.connect.client.records.SpeedRecord
-import androidx.health.connect.client.records.StepsCadenceRecord
-import androidx.health.connect.client.records.StepsRecord
-import androidx.health.connect.client.records.SwimmingStrokesRecord
-import androidx.health.connect.client.records.SwimmingStrokesRecord.SwimmingType
-import androidx.health.connect.client.records.TotalCaloriesBurnedRecord
-import androidx.health.connect.client.records.Vo2MaxRecord
-import androidx.health.connect.client.records.WaistCircumferenceRecord
-import androidx.health.connect.client.records.WeightRecord
-import androidx.health.connect.client.records.WheelchairPushesRecord
-import androidx.health.connect.client.records.metadata.DataOrigin
-import androidx.health.connect.client.records.metadata.Device
-import androidx.health.connect.client.records.metadata.Metadata
-import androidx.health.connect.client.units.celsius
-import androidx.health.connect.client.units.grams
-import androidx.health.connect.client.units.kilocalories
-import androidx.health.connect.client.units.kilocaloriesPerDay
-import androidx.health.connect.client.units.kilograms
-import androidx.health.connect.client.units.liters
-import androidx.health.connect.client.units.meters
-import androidx.health.connect.client.units.metersPerSecond
-import androidx.health.connect.client.units.millimetersOfMercury
-import androidx.health.connect.client.units.percent
-import androidx.health.connect.client.units.watts
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import com.google.common.truth.Truth.assertThat
-import java.time.Instant
-import java.time.ZoneOffset
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@SuppressWarnings("GoodTime") // Safe to use in test
-private val START_TIME = Instant.ofEpochMilli(1234L)
-@SuppressWarnings("GoodTime") // Safe to use in test
-private val END_TIME = Instant.ofEpochMilli(5678L)
-@SuppressWarnings("GoodTime") // Safe to use in test
-private val START_ZONE_OFFSET = ZoneOffset.ofHours(1)
-@SuppressWarnings("GoodTime") // Safe to use in test
-private val END_ZONE_OFFSET = ZoneOffset.ofHours(2)
-private val TEST_METADATA =
-    Metadata(
-        uid = "uid",
-        clientId = "clientId",
-        clientVersion = 10,
-        device = Device(manufacturer = "manufacturer"),
-        lastModifiedTime = END_TIME,
-        dataOrigin = DataOrigin(packageName = "appId")
-    )
-
-// TODO(b/228314623): add tests which set optional fields
-@RunWith(AndroidJUnit4::class)
-class AllRecordsConverterTest {
-    @Test
-    fun testBasalBodyTemperature() {
-        val dataOnlyRequired =
-            BasalBodyTemperatureRecord(
-                temperature = 1.celsius,
-                measurementLocation = null,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        val dataAllFields =
-            BasalBodyTemperatureRecord(
-                temperature = 1.celsius,
-                measurementLocation = BodyTemperatureMeasurementLocation.ARMPIT,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(dataOnlyRequired)
-        assertThat(toRecord(dataOnlyRequired.toProto())).isEqualTo(dataOnlyRequired)
-        assertThat(toRecord(dataAllFields.toProto())).isEqualTo(dataAllFields)
-    }
-
-    @Test
-    fun testBasalMetabolicRate() {
-        val data =
-            BasalMetabolicRateRecord(
-                basalMetabolicRate = 1.kilocaloriesPerDay,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testBloodGlucose() {
-        val data =
-            BloodGlucoseRecord(
-                levelMillimolesPerLiter = 1.0,
-                specimenSource = null,
-                mealType = null,
-                relationToMeal = null,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testBloodPressure() {
-        val data =
-            BloodPressureRecord(
-                systolic = 20.millimetersOfMercury,
-                diastolic = 10.millimetersOfMercury,
-                bodyPosition = null,
-                measurementLocation = null,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testBodyFat() {
-        val data =
-            BodyFatRecord(
-                percentage = 1.percent,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testBodyTemperature() {
-        val data =
-            BodyTemperatureRecord(
-                temperature = 1.celsius,
-                measurementLocation = null,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testBodyWaterMass() {
-        val data =
-            BodyWaterMassRecord(
-                mass = 1.kilograms,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testBoneMass() {
-        val data =
-            BoneMassRecord(
-                mass = 1.kilograms,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testCervicalMucus() {
-        val data =
-            CervicalMucusRecord(
-                appearance = Appearance.CLEAR,
-                sensation = Sensation.HEAVY,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testCyclingPedalingCadenceSeries() {
-        val data =
-            CyclingPedalingCadenceRecord(
-                startTime = START_TIME,
-                startZoneOffset = START_ZONE_OFFSET,
-                endTime = END_TIME,
-                endZoneOffset = END_ZONE_OFFSET,
-                samples =
-                    listOf(
-                        CyclingPedalingCadenceRecord.Sample(
-                            time = START_TIME,
-                            revolutionsPerMinute = 1.0,
-                        ),
-                        CyclingPedalingCadenceRecord.Sample(
-                            time = START_TIME,
-                            revolutionsPerMinute = 2.0,
-                        ),
-                    ),
-                metadata = TEST_METADATA,
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testHeartRateSeries() {
-        val data =
-            HeartRateRecord(
-                startTime = START_TIME,
-                startZoneOffset = START_ZONE_OFFSET,
-                endTime = END_TIME,
-                endZoneOffset = END_ZONE_OFFSET,
-                samples =
-                    listOf(
-                        HeartRateRecord.Sample(
-                            time = START_TIME,
-                            beatsPerMinute = 100L,
-                        ),
-                        HeartRateRecord.Sample(
-                            time = START_TIME,
-                            beatsPerMinute = 110L,
-                        ),
-                        HeartRateRecord.Sample(
-                            time = START_TIME,
-                            beatsPerMinute = 120L,
-                        ),
-                    ),
-                metadata = TEST_METADATA,
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testHeight() {
-        val data =
-            HeightRecord(
-                height = 1.meters,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testHipCircumference() {
-        val data =
-            HipCircumferenceRecord(
-                circumference = 1.meters,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testHeartRateVariabilityDifferentialIndex() {
-        val data =
-            HeartRateVariabilityDifferentialIndexRecord(
-                heartRateVariabilityMillis = 1.0,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testHeartRateVariabilityRmssd() {
-        val data =
-            HeartRateVariabilityRmssdRecord(
-                heartRateVariabilityMillis = 1.0,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testHeartRateVariabilityS() {
-        val data =
-            HeartRateVariabilitySRecord(
-                heartRateVariabilityMillis = 1.0,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testHeartRateVariabilitySd2() {
-        val data =
-            HeartRateVariabilitySd2Record(
-                heartRateVariabilityMillis = 1.0,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testHeartRateVariabilitySdann() {
-        val data =
-            HeartRateVariabilitySdannRecord(
-                heartRateVariabilityMillis = 1.0,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testHeartRateVariabilitySdnnIndex() {
-        val data =
-            HeartRateVariabilitySdnnIndexRecord(
-                heartRateVariabilityMillis = 1.0,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testHeartRateVariabilitySdnn() {
-        val data =
-            HeartRateVariabilitySdnnRecord(
-                heartRateVariabilityMillis = 1.0,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testHeartRateVariabilitySdsd() {
-        val data =
-            HeartRateVariabilitySdsdRecord(
-                heartRateVariabilityMillis = 1.0,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testHeartRateVariabilityTinn() {
-        val data =
-            HeartRateVariabilityTinnRecord(
-                heartRateVariabilityMillis = 1.0,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testLeanBodyMass() {
-        val data =
-            LeanBodyMassRecord(
-                mass = 1.kilograms,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testMenstruation() {
-        val data =
-            MenstruationRecord(
-                flow = Flow.HEAVY,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testOvulationTest() {
-        val data =
-            OvulationTestRecord(
-                result = Result.NEGATIVE,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testOxygenSaturation() {
-        val data =
-            OxygenSaturationRecord(
-                percentage = 1.percent,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testPowerSeries() {
-        val data =
-            PowerRecord(
-                startTime = START_TIME,
-                startZoneOffset = START_ZONE_OFFSET,
-                endTime = END_TIME,
-                endZoneOffset = END_ZONE_OFFSET,
-                samples =
-                    listOf(
-                        PowerRecord.Sample(
-                            time = START_TIME,
-                            power = 1.watts,
-                        ),
-                        PowerRecord.Sample(
-                            time = START_TIME,
-                            power = 2.watts,
-                        ),
-                    ),
-                metadata = TEST_METADATA,
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testRespiratoryRate() {
-        val data =
-            RespiratoryRateRecord(
-                rate = 1.0,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testRestingHeartRate() {
-        val data =
-            RestingHeartRateRecord(
-                beatsPerMinute = 1,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testSexualActivity() {
-        val data =
-            SexualActivityRecord(
-                protectionUsed = null,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testSpeedSeries() {
-        val data =
-            SpeedRecord(
-                startTime = START_TIME,
-                startZoneOffset = START_ZONE_OFFSET,
-                endTime = END_TIME,
-                endZoneOffset = END_ZONE_OFFSET,
-                samples =
-                    listOf(
-                        SpeedRecord.Sample(
-                            time = START_TIME,
-                            speed = 1.metersPerSecond,
-                        ),
-                        SpeedRecord.Sample(
-                            time = START_TIME,
-                            speed = 2.metersPerSecond,
-                        ),
-                    ),
-                metadata = TEST_METADATA,
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testStepsCadenceSeries() {
-        val data =
-            StepsCadenceRecord(
-                startTime = START_TIME,
-                startZoneOffset = START_ZONE_OFFSET,
-                endTime = END_TIME,
-                endZoneOffset = END_ZONE_OFFSET,
-                samples =
-                    listOf(
-                        StepsCadenceRecord.Sample(
-                            time = START_TIME,
-                            rate = 1.0,
-                        ),
-                        StepsCadenceRecord.Sample(
-                            time = START_TIME,
-                            rate = 2.0,
-                        ),
-                    ),
-                metadata = TEST_METADATA,
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testVo2Max() {
-        val data =
-            Vo2MaxRecord(
-                vo2MillilitersPerMinuteKilogram = 1.0,
-                measurementMethod = null,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testWaistCircumference() {
-        val data =
-            WaistCircumferenceRecord(
-                circumference = 1.meters,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testWeight() {
-        val data =
-            WeightRecord(
-                weight = 1.kilograms,
-                time = START_TIME,
-                zoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testActiveCaloriesBurned() {
-        val data =
-            ActiveCaloriesBurnedRecord(
-                energy = 1.kilocalories,
-                startTime = START_TIME,
-                startZoneOffset = START_ZONE_OFFSET,
-                endTime = END_TIME,
-                endZoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testActivityEvent() {
-        val data =
-            ExerciseEventRecord(
-                eventType = EventType.PAUSE,
-                startTime = START_TIME,
-                startZoneOffset = START_ZONE_OFFSET,
-                endTime = END_TIME,
-                endZoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testActivityLap() {
-        val data =
-            ExerciseLapRecord(
-                length = 1.meters,
-                startTime = START_TIME,
-                startZoneOffset = START_ZONE_OFFSET,
-                endTime = END_TIME,
-                endZoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testActivitySession() {
-        val data =
-            ExerciseSessionRecord(
-                exerciseType = ExerciseType.BACK_EXTENSION,
-                title = null,
-                notes = null,
-                startTime = START_TIME,
-                startZoneOffset = START_ZONE_OFFSET,
-                endTime = END_TIME,
-                endZoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testDistance() {
-        val data =
-            DistanceRecord(
-                distance = 1.meters,
-                startTime = START_TIME,
-                startZoneOffset = START_ZONE_OFFSET,
-                endTime = END_TIME,
-                endZoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testElevationGained() {
-        val data =
-            ElevationGainedRecord(
-                elevation = 1.meters,
-                startTime = START_TIME,
-                startZoneOffset = START_ZONE_OFFSET,
-                endTime = END_TIME,
-                endZoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testFloorsClimbed() {
-        val data =
-            FloorsClimbedRecord(
-                floors = 1.0,
-                startTime = START_TIME,
-                startZoneOffset = START_ZONE_OFFSET,
-                endTime = END_TIME,
-                endZoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testHydration() {
-        val data =
-            HydrationRecord(
-                volume = 1.liters,
-                startTime = START_TIME,
-                startZoneOffset = START_ZONE_OFFSET,
-                endTime = END_TIME,
-                endZoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testNutrition() {
-        val data =
-            NutritionRecord(
-                biotin = 1.grams,
-                caffeine = 1.grams,
-                calcium = 1.grams,
-                energy = 1.kilocalories,
-                energyFromFat = 1.kilocalories,
-                chloride = 1.grams,
-                cholesterol = 1.grams,
-                chromium = 1.grams,
-                copper = 1.grams,
-                dietaryFiber = 1.grams,
-                folate = 1.grams,
-                folicAcid = 1.grams,
-                iodine = 1.grams,
-                iron = 1.grams,
-                magnesium = 1.grams,
-                manganese = 1.grams,
-                molybdenum = 1.grams,
-                monounsaturatedFat = 1.grams,
-                niacin = 1.grams,
-                pantothenicAcid = 1.grams,
-                phosphorus = 1.grams,
-                polyunsaturatedFat = 1.grams,
-                potassium = 1.grams,
-                protein = 1.grams,
-                riboflavin = 1.grams,
-                saturatedFat = 1.grams,
-                selenium = 1.grams,
-                sodium = 1.grams,
-                sugar = 1.grams,
-                thiamin = 1.grams,
-                totalCarbohydrate = 1.grams,
-                totalFat = 1.grams,
-                transFat = 1.grams,
-                unsaturatedFat = 1.grams,
-                vitaminA = 1.grams,
-                vitaminB12 = 1.grams,
-                vitaminB6 = 1.grams,
-                vitaminC = 1.grams,
-                vitaminD = 1.grams,
-                vitaminE = 1.grams,
-                vitaminK = 1.grams,
-                zinc = 1.grams,
-                mealType = null,
-                name = null,
-                startTime = START_TIME,
-                startZoneOffset = START_ZONE_OFFSET,
-                endTime = END_TIME,
-                endZoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testRepetitions() {
-        val data =
-            ExerciseRepetitionsRecord(
-                count = 1,
-                type = ExerciseType.JUMPING_JACK,
-                startTime = START_TIME,
-                startZoneOffset = START_ZONE_OFFSET,
-                endTime = END_TIME,
-                endZoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testSleepSession() {
-        val data =
-            SleepSessionRecord(
-                title = null,
-                notes = null,
-                startTime = START_TIME,
-                startZoneOffset = START_ZONE_OFFSET,
-                endTime = END_TIME,
-                endZoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testSleepStage() {
-        val data =
-            SleepStageRecord(
-                stage = StageType.AWAKE,
-                startTime = START_TIME,
-                startZoneOffset = START_ZONE_OFFSET,
-                endTime = END_TIME,
-                endZoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testSteps() {
-        val data =
-            StepsRecord(
-                count = 1,
-                startTime = START_TIME,
-                startZoneOffset = START_ZONE_OFFSET,
-                endTime = END_TIME,
-                endZoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testSwimmingStrokes() {
-        val data =
-            SwimmingStrokesRecord(
-                count = 1,
-                type = SwimmingType.BACKSTROKE,
-                startTime = START_TIME,
-                startZoneOffset = START_ZONE_OFFSET,
-                endTime = END_TIME,
-                endZoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testTotalCaloriesBurned() {
-        val data =
-            TotalCaloriesBurnedRecord(
-                energy = 1.kilocalories,
-                startTime = START_TIME,
-                startZoneOffset = START_ZONE_OFFSET,
-                endTime = END_TIME,
-                endZoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    @Test
-    fun testWheelchairPushes() {
-        val data =
-            WheelchairPushesRecord(
-                count = 1,
-                startTime = START_TIME,
-                startZoneOffset = START_ZONE_OFFSET,
-                endTime = END_TIME,
-                endZoneOffset = END_ZONE_OFFSET,
-                metadata = TEST_METADATA
-            )
-
-        checkProtoAndRecordTypeNameMatch(data)
-        assertThat(toRecord(data.toProto())).isEqualTo(data)
-    }
-
-    private inline fun <reified T : Record> checkProtoAndRecordTypeNameMatch(record: T) {
-        val serializedTypeName = record.toProto().dataType.name
-
-        assertThat(T::class.toDataTypeName()).isEqualTo(serializedTypeName)
-    }
-}
diff --git a/health/health-connect-client/src/test/java/androidx/health/platform/client/impl/testing/FakeHealthDataService.kt b/health/health-connect-client/src/test/java/androidx/health/platform/client/impl/testing/FakeHealthDataService.kt
deleted file mode 100644
index a119d78..0000000
--- a/health/health-connect-client/src/test/java/androidx/health/platform/client/impl/testing/FakeHealthDataService.kt
+++ /dev/null
@@ -1,227 +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.platform.client.impl.testing
-
-import androidx.annotation.RestrictTo
-import androidx.health.platform.client.error.ErrorCode
-import androidx.health.platform.client.error.ErrorStatus
-import androidx.health.platform.client.permission.Permission
-import androidx.health.platform.client.request.AggregateDataRequest
-import androidx.health.platform.client.request.DeleteDataRangeRequest
-import androidx.health.platform.client.request.DeleteDataRequest
-import androidx.health.platform.client.request.GetChangesRequest
-import androidx.health.platform.client.request.GetChangesTokenRequest
-import androidx.health.platform.client.request.ReadDataRangeRequest
-import androidx.health.platform.client.request.ReadDataRequest
-import androidx.health.platform.client.request.RequestContext
-import androidx.health.platform.client.request.UpsertDataRequest
-import androidx.health.platform.client.response.AggregateDataResponse
-import androidx.health.platform.client.response.GetChangesResponse
-import androidx.health.platform.client.response.GetChangesTokenResponse
-import androidx.health.platform.client.response.InsertDataResponse
-import androidx.health.platform.client.response.ReadDataRangeResponse
-import androidx.health.platform.client.response.ReadDataResponse
-import androidx.health.platform.client.service.IAggregateDataCallback
-import androidx.health.platform.client.service.IDeleteDataCallback
-import androidx.health.platform.client.service.IDeleteDataRangeCallback
-import androidx.health.platform.client.service.IGetChangesCallback
-import androidx.health.platform.client.service.IGetChangesTokenCallback
-import androidx.health.platform.client.service.IGetGrantedPermissionsCallback
-import androidx.health.platform.client.service.IHealthDataService
-import androidx.health.platform.client.service.IInsertDataCallback
-import androidx.health.platform.client.service.IReadDataCallback
-import androidx.health.platform.client.service.IReadDataRangeCallback
-import androidx.health.platform.client.service.IRevokeAllPermissionsCallback
-import androidx.health.platform.client.service.IUpdateDataCallback
-
-/** Fake {@link IHealthDataService} implementation for unit testing. */
-@RestrictTo(RestrictTo.Scope.LIBRARY)
-class FakeHealthDataService : IHealthDataService.Stub() {
-    /** Change this state to control permission responses. Not thread safe */
-    val grantedPermissions: MutableSet<Permission> = mutableSetOf()
-
-    /** State retaining last requested parameters. */
-    var lastUpsertDataRequest: UpsertDataRequest? = null
-    var lastReadDataRequest: ReadDataRequest? = null
-    var lastReadDataRangeRequest: ReadDataRangeRequest? = null
-    var lastDeleteDataRequest: DeleteDataRequest? = null
-    var lastDeleteDataRangeRequest: DeleteDataRangeRequest? = null
-    var lastAggregateRequest: AggregateDataRequest? = null
-    var lastGetChangesTokenRequest: GetChangesTokenRequest? = null
-    var lastGetChangesRequest: GetChangesRequest? = null
-
-    /** State for returned responses. */
-    var insertDataResponse: InsertDataResponse? = null
-    var readDataResponse: ReadDataResponse? = null
-    var readDataRangeResponse: ReadDataRangeResponse? = null
-    var aggregateDataResponse: AggregateDataResponse? = null
-    var changesTokenResponse: GetChangesTokenResponse? = null
-    var changesResponse: GetChangesResponse? = null
-
-    /** Set this to control error responses. Not thread safe. */
-    @ErrorCode var errorCode: Int? = null
-
-    override fun getApiVersion(): Int {
-        return 42
-    }
-
-    override fun getGrantedPermissions(
-        context: RequestContext,
-        permissions: List<Permission>,
-        callback: IGetGrantedPermissionsCallback,
-    ) {
-        errorCode?.let {
-            callback.onError(ErrorStatus.create(it, "" + it))
-            return@getGrantedPermissions
-        }
-
-        val granted = permissions.filter { it in grantedPermissions }.toList()
-        callback.onSuccess(granted)
-    }
-
-    override fun revokeAllPermissions(
-        context: RequestContext,
-        callback: IRevokeAllPermissionsCallback,
-    ) {
-        errorCode?.let {
-            callback.onError(ErrorStatus.create(it, "" + it))
-            return@revokeAllPermissions
-        }
-        grantedPermissions.clear()
-        callback.onSuccess()
-    }
-
-    fun addGrantedPermission(permission: Permission) {
-        grantedPermissions.add(permission)
-    }
-
-    override fun insertData(
-        context: RequestContext,
-        request: UpsertDataRequest,
-        callback: IInsertDataCallback,
-    ) {
-        lastUpsertDataRequest = request
-        errorCode?.let {
-            callback.onError(ErrorStatus.create(it, "" + it))
-            return@insertData
-        }
-        callback.onSuccess(insertDataResponse)
-    }
-
-    override fun updateData(
-        context: RequestContext,
-        request: UpsertDataRequest,
-        callback: IUpdateDataCallback,
-    ) {
-        lastUpsertDataRequest = request
-        errorCode?.let {
-            callback.onError(ErrorStatus.create(it, "" + it))
-            return@updateData
-        }
-        callback.onSuccess()
-    }
-
-    override fun deleteData(
-        context: RequestContext,
-        request: DeleteDataRequest,
-        callback: IDeleteDataCallback,
-    ) {
-        lastDeleteDataRequest = request
-        errorCode?.let {
-            callback.onError(ErrorStatus.create(it, "" + it))
-            return@deleteData
-        }
-        callback.onSuccess()
-    }
-
-    override fun deleteDataRange(
-        context: RequestContext,
-        request: DeleteDataRangeRequest,
-        callback: IDeleteDataRangeCallback,
-    ) {
-        lastDeleteDataRangeRequest = request
-        errorCode?.let {
-            callback.onError(ErrorStatus.create(it, "" + it))
-            return@deleteDataRange
-        }
-        callback.onSuccess()
-    }
-
-    override fun readData(
-        context: RequestContext,
-        request: ReadDataRequest,
-        callback: IReadDataCallback,
-    ) {
-        lastReadDataRequest = request
-        errorCode?.let {
-            callback.onError(ErrorStatus.create(it, "" + it))
-            return@readData
-        }
-        callback.onSuccess(checkNotNull(readDataResponse))
-    }
-
-    override fun readDataRange(
-        context: RequestContext,
-        request: ReadDataRangeRequest,
-        callback: IReadDataRangeCallback,
-    ) {
-        lastReadDataRangeRequest = request
-        errorCode?.let {
-            callback.onError(ErrorStatus.create(it, "" + it))
-            return@readDataRange
-        }
-        callback.onSuccess(checkNotNull(readDataRangeResponse))
-    }
-
-    override fun aggregate(
-        context: RequestContext,
-        request: AggregateDataRequest,
-        callback: IAggregateDataCallback,
-    ) {
-        lastAggregateRequest = request
-        errorCode?.let {
-            callback.onError(ErrorStatus.create(it, "" + it))
-            return@aggregate
-        }
-        callback.onSuccess(aggregateDataResponse)
-    }
-
-    override fun getChangesToken(
-        context: RequestContext,
-        request: GetChangesTokenRequest,
-        callback: IGetChangesTokenCallback,
-    ) {
-        lastGetChangesTokenRequest = request
-        errorCode?.let {
-            callback.onError(ErrorStatus.create(it, "" + it))
-            return@getChangesToken
-        }
-        callback.onSuccess(changesTokenResponse)
-    }
-
-    override fun getChanges(
-        context: RequestContext,
-        request: GetChangesRequest,
-        callback: IGetChangesCallback,
-    ) {
-        lastGetChangesRequest = request
-        errorCode?.let {
-            callback.onError(ErrorStatus.create(it, "" + it))
-            return@getChanges
-        }
-        callback.onSuccess(changesResponse)
-    }
-}
diff --git a/health/health-services-client/api/1.0.0-beta01.txt b/health/health-services-client/api/1.0.0-beta01.txt
index 56bfe2d..1af26ed 100644
--- a/health/health-services-client/api/1.0.0-beta01.txt
+++ b/health/health-services-client/api/1.0.0-beta01.txt
@@ -401,8 +401,6 @@
     property public final boolean isResuming;
     property public final String name;
     field public static final androidx.health.services.client.data.ExerciseState ACTIVE;
-    field public static final androidx.health.services.client.data.ExerciseState AUTO_ENDED;
-    field public static final androidx.health.services.client.data.ExerciseState AUTO_ENDED_PERMISSION_LOST;
     field public static final androidx.health.services.client.data.ExerciseState AUTO_ENDING;
     field public static final androidx.health.services.client.data.ExerciseState AUTO_ENDING_PERMISSION_LOST;
     field public static final androidx.health.services.client.data.ExerciseState AUTO_PAUSED;
@@ -411,9 +409,7 @@
     field public static final androidx.health.services.client.data.ExerciseState.Companion Companion;
     field public static final androidx.health.services.client.data.ExerciseState ENDED;
     field public static final androidx.health.services.client.data.ExerciseState PREPARING;
-    field public static final androidx.health.services.client.data.ExerciseState TERMINATED;
     field public static final androidx.health.services.client.data.ExerciseState TERMINATING;
-    field public static final androidx.health.services.client.data.ExerciseState USER_ENDED;
     field public static final androidx.health.services.client.data.ExerciseState USER_ENDING;
     field public static final androidx.health.services.client.data.ExerciseState USER_PAUSED;
     field public static final androidx.health.services.client.data.ExerciseState USER_PAUSING;
@@ -451,7 +447,6 @@
     field public static final androidx.health.services.client.data.ExerciseType BASEBALL;
     field public static final androidx.health.services.client.data.ExerciseType BASKETBALL;
     field public static final androidx.health.services.client.data.ExerciseType BENCH_PRESS;
-    field public static final androidx.health.services.client.data.ExerciseType BENCH_SIT_UP;
     field public static final androidx.health.services.client.data.ExerciseType BIKING;
     field public static final androidx.health.services.client.data.ExerciseType BIKING_STATIONARY;
     field public static final androidx.health.services.client.data.ExerciseType BOOT_CAMP;
@@ -464,13 +459,6 @@
     field public static final androidx.health.services.client.data.ExerciseType.Companion Companion;
     field public static final androidx.health.services.client.data.ExerciseType DANCING;
     field public static final androidx.health.services.client.data.ExerciseType DEADLIFT;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_CURL_LEFT_ARM;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_CURL_RIGHT_ARM;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_FRONT_RAISE;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_LATERAL_RAISE;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_TRICEPS_EXTENSION_LEFT_ARM;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_TRICEPS_EXTENSION_RIGHT_ARM;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_TRICEPS_EXTENSION_TWO_ARM;
     field public static final androidx.health.services.client.data.ExerciseType ELLIPTICAL;
     field public static final androidx.health.services.client.data.ExerciseType EXERCISE_CLASS;
     field public static final androidx.health.services.client.data.ExerciseType FENCING;
diff --git a/health/health-services-client/api/api_lint.ignore b/health/health-services-client/api/api_lint.ignore
index 692c66a..ded5bc40 100644
--- a/health/health-services-client/api/api_lint.ignore
+++ b/health/health-services-client/api/api_lint.ignore
@@ -23,8 +23,6 @@
     Invalid nullability on parameter `intent` in method `onBind`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
 InvalidNullabilityOverride: androidx.health.services.client.VersionApiService#onBind(android.content.Intent):
     Invalid nullability on method `onBind` return. Overrides of unannotated super method cannot be Nullable.
-InvalidNullabilityOverride: androidx.health.services.client.data.ProtoParcelable#writeToParcel(android.os.Parcel, int) parameter #0:
-    Invalid nullability on parameter `dest` in method `writeToParcel`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
 
 
 PairedRegistration: androidx.health.services.client.MeasureClient#registerMeasureCallback(androidx.health.services.client.data.DeltaDataType<?,?>, androidx.health.services.client.MeasureCallback):
diff --git a/health/health-services-client/api/current.txt b/health/health-services-client/api/current.txt
index 56bfe2d..1af26ed 100644
--- a/health/health-services-client/api/current.txt
+++ b/health/health-services-client/api/current.txt
@@ -401,8 +401,6 @@
     property public final boolean isResuming;
     property public final String name;
     field public static final androidx.health.services.client.data.ExerciseState ACTIVE;
-    field public static final androidx.health.services.client.data.ExerciseState AUTO_ENDED;
-    field public static final androidx.health.services.client.data.ExerciseState AUTO_ENDED_PERMISSION_LOST;
     field public static final androidx.health.services.client.data.ExerciseState AUTO_ENDING;
     field public static final androidx.health.services.client.data.ExerciseState AUTO_ENDING_PERMISSION_LOST;
     field public static final androidx.health.services.client.data.ExerciseState AUTO_PAUSED;
@@ -411,9 +409,7 @@
     field public static final androidx.health.services.client.data.ExerciseState.Companion Companion;
     field public static final androidx.health.services.client.data.ExerciseState ENDED;
     field public static final androidx.health.services.client.data.ExerciseState PREPARING;
-    field public static final androidx.health.services.client.data.ExerciseState TERMINATED;
     field public static final androidx.health.services.client.data.ExerciseState TERMINATING;
-    field public static final androidx.health.services.client.data.ExerciseState USER_ENDED;
     field public static final androidx.health.services.client.data.ExerciseState USER_ENDING;
     field public static final androidx.health.services.client.data.ExerciseState USER_PAUSED;
     field public static final androidx.health.services.client.data.ExerciseState USER_PAUSING;
@@ -451,7 +447,6 @@
     field public static final androidx.health.services.client.data.ExerciseType BASEBALL;
     field public static final androidx.health.services.client.data.ExerciseType BASKETBALL;
     field public static final androidx.health.services.client.data.ExerciseType BENCH_PRESS;
-    field public static final androidx.health.services.client.data.ExerciseType BENCH_SIT_UP;
     field public static final androidx.health.services.client.data.ExerciseType BIKING;
     field public static final androidx.health.services.client.data.ExerciseType BIKING_STATIONARY;
     field public static final androidx.health.services.client.data.ExerciseType BOOT_CAMP;
@@ -464,13 +459,6 @@
     field public static final androidx.health.services.client.data.ExerciseType.Companion Companion;
     field public static final androidx.health.services.client.data.ExerciseType DANCING;
     field public static final androidx.health.services.client.data.ExerciseType DEADLIFT;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_CURL_LEFT_ARM;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_CURL_RIGHT_ARM;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_FRONT_RAISE;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_LATERAL_RAISE;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_TRICEPS_EXTENSION_LEFT_ARM;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_TRICEPS_EXTENSION_RIGHT_ARM;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_TRICEPS_EXTENSION_TWO_ARM;
     field public static final androidx.health.services.client.data.ExerciseType ELLIPTICAL;
     field public static final androidx.health.services.client.data.ExerciseType EXERCISE_CLASS;
     field public static final androidx.health.services.client.data.ExerciseType FENCING;
diff --git a/health/health-services-client/api/public_plus_experimental_1.0.0-beta01.txt b/health/health-services-client/api/public_plus_experimental_1.0.0-beta01.txt
index 56bfe2d..1af26ed 100644
--- a/health/health-services-client/api/public_plus_experimental_1.0.0-beta01.txt
+++ b/health/health-services-client/api/public_plus_experimental_1.0.0-beta01.txt
@@ -401,8 +401,6 @@
     property public final boolean isResuming;
     property public final String name;
     field public static final androidx.health.services.client.data.ExerciseState ACTIVE;
-    field public static final androidx.health.services.client.data.ExerciseState AUTO_ENDED;
-    field public static final androidx.health.services.client.data.ExerciseState AUTO_ENDED_PERMISSION_LOST;
     field public static final androidx.health.services.client.data.ExerciseState AUTO_ENDING;
     field public static final androidx.health.services.client.data.ExerciseState AUTO_ENDING_PERMISSION_LOST;
     field public static final androidx.health.services.client.data.ExerciseState AUTO_PAUSED;
@@ -411,9 +409,7 @@
     field public static final androidx.health.services.client.data.ExerciseState.Companion Companion;
     field public static final androidx.health.services.client.data.ExerciseState ENDED;
     field public static final androidx.health.services.client.data.ExerciseState PREPARING;
-    field public static final androidx.health.services.client.data.ExerciseState TERMINATED;
     field public static final androidx.health.services.client.data.ExerciseState TERMINATING;
-    field public static final androidx.health.services.client.data.ExerciseState USER_ENDED;
     field public static final androidx.health.services.client.data.ExerciseState USER_ENDING;
     field public static final androidx.health.services.client.data.ExerciseState USER_PAUSED;
     field public static final androidx.health.services.client.data.ExerciseState USER_PAUSING;
@@ -451,7 +447,6 @@
     field public static final androidx.health.services.client.data.ExerciseType BASEBALL;
     field public static final androidx.health.services.client.data.ExerciseType BASKETBALL;
     field public static final androidx.health.services.client.data.ExerciseType BENCH_PRESS;
-    field public static final androidx.health.services.client.data.ExerciseType BENCH_SIT_UP;
     field public static final androidx.health.services.client.data.ExerciseType BIKING;
     field public static final androidx.health.services.client.data.ExerciseType BIKING_STATIONARY;
     field public static final androidx.health.services.client.data.ExerciseType BOOT_CAMP;
@@ -464,13 +459,6 @@
     field public static final androidx.health.services.client.data.ExerciseType.Companion Companion;
     field public static final androidx.health.services.client.data.ExerciseType DANCING;
     field public static final androidx.health.services.client.data.ExerciseType DEADLIFT;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_CURL_LEFT_ARM;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_CURL_RIGHT_ARM;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_FRONT_RAISE;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_LATERAL_RAISE;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_TRICEPS_EXTENSION_LEFT_ARM;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_TRICEPS_EXTENSION_RIGHT_ARM;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_TRICEPS_EXTENSION_TWO_ARM;
     field public static final androidx.health.services.client.data.ExerciseType ELLIPTICAL;
     field public static final androidx.health.services.client.data.ExerciseType EXERCISE_CLASS;
     field public static final androidx.health.services.client.data.ExerciseType FENCING;
diff --git a/health/health-services-client/api/public_plus_experimental_current.txt b/health/health-services-client/api/public_plus_experimental_current.txt
index 56bfe2d..1af26ed 100644
--- a/health/health-services-client/api/public_plus_experimental_current.txt
+++ b/health/health-services-client/api/public_plus_experimental_current.txt
@@ -401,8 +401,6 @@
     property public final boolean isResuming;
     property public final String name;
     field public static final androidx.health.services.client.data.ExerciseState ACTIVE;
-    field public static final androidx.health.services.client.data.ExerciseState AUTO_ENDED;
-    field public static final androidx.health.services.client.data.ExerciseState AUTO_ENDED_PERMISSION_LOST;
     field public static final androidx.health.services.client.data.ExerciseState AUTO_ENDING;
     field public static final androidx.health.services.client.data.ExerciseState AUTO_ENDING_PERMISSION_LOST;
     field public static final androidx.health.services.client.data.ExerciseState AUTO_PAUSED;
@@ -411,9 +409,7 @@
     field public static final androidx.health.services.client.data.ExerciseState.Companion Companion;
     field public static final androidx.health.services.client.data.ExerciseState ENDED;
     field public static final androidx.health.services.client.data.ExerciseState PREPARING;
-    field public static final androidx.health.services.client.data.ExerciseState TERMINATED;
     field public static final androidx.health.services.client.data.ExerciseState TERMINATING;
-    field public static final androidx.health.services.client.data.ExerciseState USER_ENDED;
     field public static final androidx.health.services.client.data.ExerciseState USER_ENDING;
     field public static final androidx.health.services.client.data.ExerciseState USER_PAUSED;
     field public static final androidx.health.services.client.data.ExerciseState USER_PAUSING;
@@ -451,7 +447,6 @@
     field public static final androidx.health.services.client.data.ExerciseType BASEBALL;
     field public static final androidx.health.services.client.data.ExerciseType BASKETBALL;
     field public static final androidx.health.services.client.data.ExerciseType BENCH_PRESS;
-    field public static final androidx.health.services.client.data.ExerciseType BENCH_SIT_UP;
     field public static final androidx.health.services.client.data.ExerciseType BIKING;
     field public static final androidx.health.services.client.data.ExerciseType BIKING_STATIONARY;
     field public static final androidx.health.services.client.data.ExerciseType BOOT_CAMP;
@@ -464,13 +459,6 @@
     field public static final androidx.health.services.client.data.ExerciseType.Companion Companion;
     field public static final androidx.health.services.client.data.ExerciseType DANCING;
     field public static final androidx.health.services.client.data.ExerciseType DEADLIFT;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_CURL_LEFT_ARM;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_CURL_RIGHT_ARM;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_FRONT_RAISE;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_LATERAL_RAISE;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_TRICEPS_EXTENSION_LEFT_ARM;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_TRICEPS_EXTENSION_RIGHT_ARM;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_TRICEPS_EXTENSION_TWO_ARM;
     field public static final androidx.health.services.client.data.ExerciseType ELLIPTICAL;
     field public static final androidx.health.services.client.data.ExerciseType EXERCISE_CLASS;
     field public static final androidx.health.services.client.data.ExerciseType FENCING;
diff --git a/health/health-services-client/api/restricted_1.0.0-beta01.txt b/health/health-services-client/api/restricted_1.0.0-beta01.txt
index 56bfe2d..1af26ed 100644
--- a/health/health-services-client/api/restricted_1.0.0-beta01.txt
+++ b/health/health-services-client/api/restricted_1.0.0-beta01.txt
@@ -401,8 +401,6 @@
     property public final boolean isResuming;
     property public final String name;
     field public static final androidx.health.services.client.data.ExerciseState ACTIVE;
-    field public static final androidx.health.services.client.data.ExerciseState AUTO_ENDED;
-    field public static final androidx.health.services.client.data.ExerciseState AUTO_ENDED_PERMISSION_LOST;
     field public static final androidx.health.services.client.data.ExerciseState AUTO_ENDING;
     field public static final androidx.health.services.client.data.ExerciseState AUTO_ENDING_PERMISSION_LOST;
     field public static final androidx.health.services.client.data.ExerciseState AUTO_PAUSED;
@@ -411,9 +409,7 @@
     field public static final androidx.health.services.client.data.ExerciseState.Companion Companion;
     field public static final androidx.health.services.client.data.ExerciseState ENDED;
     field public static final androidx.health.services.client.data.ExerciseState PREPARING;
-    field public static final androidx.health.services.client.data.ExerciseState TERMINATED;
     field public static final androidx.health.services.client.data.ExerciseState TERMINATING;
-    field public static final androidx.health.services.client.data.ExerciseState USER_ENDED;
     field public static final androidx.health.services.client.data.ExerciseState USER_ENDING;
     field public static final androidx.health.services.client.data.ExerciseState USER_PAUSED;
     field public static final androidx.health.services.client.data.ExerciseState USER_PAUSING;
@@ -451,7 +447,6 @@
     field public static final androidx.health.services.client.data.ExerciseType BASEBALL;
     field public static final androidx.health.services.client.data.ExerciseType BASKETBALL;
     field public static final androidx.health.services.client.data.ExerciseType BENCH_PRESS;
-    field public static final androidx.health.services.client.data.ExerciseType BENCH_SIT_UP;
     field public static final androidx.health.services.client.data.ExerciseType BIKING;
     field public static final androidx.health.services.client.data.ExerciseType BIKING_STATIONARY;
     field public static final androidx.health.services.client.data.ExerciseType BOOT_CAMP;
@@ -464,13 +459,6 @@
     field public static final androidx.health.services.client.data.ExerciseType.Companion Companion;
     field public static final androidx.health.services.client.data.ExerciseType DANCING;
     field public static final androidx.health.services.client.data.ExerciseType DEADLIFT;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_CURL_LEFT_ARM;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_CURL_RIGHT_ARM;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_FRONT_RAISE;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_LATERAL_RAISE;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_TRICEPS_EXTENSION_LEFT_ARM;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_TRICEPS_EXTENSION_RIGHT_ARM;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_TRICEPS_EXTENSION_TWO_ARM;
     field public static final androidx.health.services.client.data.ExerciseType ELLIPTICAL;
     field public static final androidx.health.services.client.data.ExerciseType EXERCISE_CLASS;
     field public static final androidx.health.services.client.data.ExerciseType FENCING;
diff --git a/health/health-services-client/api/restricted_current.txt b/health/health-services-client/api/restricted_current.txt
index 56bfe2d..1af26ed 100644
--- a/health/health-services-client/api/restricted_current.txt
+++ b/health/health-services-client/api/restricted_current.txt
@@ -401,8 +401,6 @@
     property public final boolean isResuming;
     property public final String name;
     field public static final androidx.health.services.client.data.ExerciseState ACTIVE;
-    field public static final androidx.health.services.client.data.ExerciseState AUTO_ENDED;
-    field public static final androidx.health.services.client.data.ExerciseState AUTO_ENDED_PERMISSION_LOST;
     field public static final androidx.health.services.client.data.ExerciseState AUTO_ENDING;
     field public static final androidx.health.services.client.data.ExerciseState AUTO_ENDING_PERMISSION_LOST;
     field public static final androidx.health.services.client.data.ExerciseState AUTO_PAUSED;
@@ -411,9 +409,7 @@
     field public static final androidx.health.services.client.data.ExerciseState.Companion Companion;
     field public static final androidx.health.services.client.data.ExerciseState ENDED;
     field public static final androidx.health.services.client.data.ExerciseState PREPARING;
-    field public static final androidx.health.services.client.data.ExerciseState TERMINATED;
     field public static final androidx.health.services.client.data.ExerciseState TERMINATING;
-    field public static final androidx.health.services.client.data.ExerciseState USER_ENDED;
     field public static final androidx.health.services.client.data.ExerciseState USER_ENDING;
     field public static final androidx.health.services.client.data.ExerciseState USER_PAUSED;
     field public static final androidx.health.services.client.data.ExerciseState USER_PAUSING;
@@ -451,7 +447,6 @@
     field public static final androidx.health.services.client.data.ExerciseType BASEBALL;
     field public static final androidx.health.services.client.data.ExerciseType BASKETBALL;
     field public static final androidx.health.services.client.data.ExerciseType BENCH_PRESS;
-    field public static final androidx.health.services.client.data.ExerciseType BENCH_SIT_UP;
     field public static final androidx.health.services.client.data.ExerciseType BIKING;
     field public static final androidx.health.services.client.data.ExerciseType BIKING_STATIONARY;
     field public static final androidx.health.services.client.data.ExerciseType BOOT_CAMP;
@@ -464,13 +459,6 @@
     field public static final androidx.health.services.client.data.ExerciseType.Companion Companion;
     field public static final androidx.health.services.client.data.ExerciseType DANCING;
     field public static final androidx.health.services.client.data.ExerciseType DEADLIFT;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_CURL_LEFT_ARM;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_CURL_RIGHT_ARM;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_FRONT_RAISE;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_LATERAL_RAISE;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_TRICEPS_EXTENSION_LEFT_ARM;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_TRICEPS_EXTENSION_RIGHT_ARM;
-    field public static final androidx.health.services.client.data.ExerciseType DUMBBELL_TRICEPS_EXTENSION_TWO_ARM;
     field public static final androidx.health.services.client.data.ExerciseType ELLIPTICAL;
     field public static final androidx.health.services.client.data.ExerciseType EXERCISE_CLASS;
     field public static final androidx.health.services.client.data.ExerciseType FENCING;
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseState.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseState.kt
index fa5f612..7bf98af 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseState.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseState.kt
@@ -161,7 +161,7 @@
          * Used only in the manually started exercise.
          */
         @JvmField
-        public val USER_ENDED: ExerciseState = ExerciseState(10, "USER_ENDED")
+        internal val USER_ENDED: ExerciseState = ExerciseState(10, "USER_ENDED")
 
         /**
          * The exercise is being automatically ended due to a lack of exercise updates being
@@ -180,7 +180,7 @@
          * Used only in the manually started exercise.
          */
         @JvmField
-        public val AUTO_ENDED: ExerciseState = ExerciseState(12, "AUTO_ENDED")
+        internal val AUTO_ENDED: ExerciseState = ExerciseState(12, "AUTO_ENDED")
 
         /**
          * The exercise is being automatically ended due to lack of client's permissions to receive
@@ -195,7 +195,7 @@
          * data for the exercise.
          */
         @JvmField
-        public val AUTO_ENDED_PERMISSION_LOST: ExerciseState =
+        internal val AUTO_ENDED_PERMISSION_LOST: ExerciseState =
             ExerciseState(17, "AUTO_ENDED_PERMISSION_LOST")
 
         /**
@@ -215,7 +215,7 @@
          * Used in both of the manually started exercise and the automatic exercise detection.
          */
         @JvmField
-        public val TERMINATED: ExerciseState = ExerciseState(14, "TERMINATED")
+        internal val TERMINATED: ExerciseState = ExerciseState(14, "TERMINATED")
 
         /**
          * The exercise has been ended, with the reason specified by [ExerciseStateInfo.endReason].
@@ -226,7 +226,7 @@
         private val RESUMING_STATES = setOf(USER_RESUMING, AUTO_RESUMING)
         private val PAUSED_STATES = setOf(USER_PAUSED, AUTO_PAUSED)
         private val ENDED_STATES =
-            setOf(USER_ENDED, AUTO_ENDED, AUTO_ENDED_PERMISSION_LOST, TERMINATED)
+            setOf(USER_ENDED, AUTO_ENDED, AUTO_ENDED_PERMISSION_LOST, TERMINATED, ENDED)
         private val ENDING_STATES =
             setOf(USER_ENDING, AUTO_ENDING, AUTO_ENDING_PERMISSION_LOST, TERMINATING)
         private val OTHER_STATES =
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseType.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseType.kt
index 6716a53..5f9affbe 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseType.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseType.kt
@@ -63,7 +63,7 @@
         @JvmField public val BASEBALL: ExerciseType = ExerciseType(4, "BASEBALL")
         @JvmField public val BASKETBALL: ExerciseType = ExerciseType(5, "BASKETBALL")
         @JvmField public val BENCH_PRESS: ExerciseType = ExerciseType(6, "BENCH_PRESS")
-        @JvmField public val BENCH_SIT_UP: ExerciseType = ExerciseType(7, "BENCH_SIT_UP")
+        @JvmField internal val BENCH_SIT_UP: ExerciseType = ExerciseType(7, "BENCH_SIT_UP")
         @JvmField public val BIKING: ExerciseType = ExerciseType(8, "BIKING")
         @JvmField public val BIKING_STATIONARY: ExerciseType = ExerciseType(9, "BIKING_STATIONARY")
         @JvmField public val BOOT_CAMP: ExerciseType = ExerciseType(10, "BOOT_CAMP")
@@ -79,22 +79,24 @@
         @JvmField public val DANCING: ExerciseType = ExerciseType(16, "DANCING")
         @JvmField public val DEADLIFT: ExerciseType = ExerciseType(17, "DEADLIFT")
         @JvmField
-        public val DUMBBELL_CURL_RIGHT_ARM: ExerciseType =
+        internal val DUMBBELL_CURL_RIGHT_ARM: ExerciseType =
             ExerciseType(18, "DUMBBELL_CURL_RIGHT_ARM")
         @JvmField
-        public val DUMBBELL_CURL_LEFT_ARM: ExerciseType = ExerciseType(19, "DUMBBELL_CURL_LEFT_ARM")
+        internal val DUMBBELL_CURL_LEFT_ARM: ExerciseType =
+            ExerciseType(19, "DUMBBELL_CURL_LEFT_ARM")
         @JvmField
-        public val DUMBBELL_FRONT_RAISE: ExerciseType = ExerciseType(20, "DUMBBELL_FRONT_RAISE")
+        internal val DUMBBELL_FRONT_RAISE: ExerciseType = ExerciseType(20, "DUMBBELL_FRONT_RAISE")
         @JvmField
-        public val DUMBBELL_LATERAL_RAISE: ExerciseType = ExerciseType(21, "DUMBBELL_LATERAL_RAISE")
+        internal val DUMBBELL_LATERAL_RAISE: ExerciseType =
+            ExerciseType(21, "DUMBBELL_LATERAL_RAISE")
         @JvmField
-        public val DUMBBELL_TRICEPS_EXTENSION_LEFT_ARM: ExerciseType =
+        internal val DUMBBELL_TRICEPS_EXTENSION_LEFT_ARM: ExerciseType =
             ExerciseType(22, "DUMBBELL_TRICEPS_EXTENSION_LEFT_ARM")
         @JvmField
-        public val DUMBBELL_TRICEPS_EXTENSION_RIGHT_ARM: ExerciseType =
+        internal val DUMBBELL_TRICEPS_EXTENSION_RIGHT_ARM: ExerciseType =
             ExerciseType(23, "DUMBBELL_TRICEPS_EXTENSION_RIGHT_ARM")
         @JvmField
-        public val DUMBBELL_TRICEPS_EXTENSION_TWO_ARM: ExerciseType =
+        internal val DUMBBELL_TRICEPS_EXTENSION_TWO_ARM: ExerciseType =
             ExerciseType(24, "DUMBBELL_TRICEPS_EXTENSION_TWO_ARM")
         @JvmField public val ELLIPTICAL: ExerciseType = ExerciseType(25, "ELLIPTICAL")
         @JvmField public val EXERCISE_CLASS: ExerciseType = ExerciseType(26, "EXERCISE_CLASS")
diff --git a/javascriptengine/javascriptengine/api/current.txt b/javascriptengine/javascriptengine/api/current.txt
index e808cea..5411655 100644
--- a/javascriptengine/javascriptengine/api/current.txt
+++ b/javascriptengine/javascriptengine/api/current.txt
@@ -23,7 +23,7 @@
 
   public final class JavaScriptIsolate implements java.lang.AutoCloseable {
     method public void close();
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.String!> evaluateJavaScriptAsync(@org.intellij.lang.annotations.Language("javascript") String);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.String!> evaluateJavaScriptAsync(String);
     method @RequiresFeature(name=androidx.javascriptengine.JavaScriptSandbox.JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER, enforcement="androidx.javascriptengine.JavaScriptSandbox#isFeatureSupported") public boolean provideNamedData(String, byte[]);
   }
 
diff --git a/javascriptengine/javascriptengine/api/public_plus_experimental_current.txt b/javascriptengine/javascriptengine/api/public_plus_experimental_current.txt
index e808cea..5411655 100644
--- a/javascriptengine/javascriptengine/api/public_plus_experimental_current.txt
+++ b/javascriptengine/javascriptengine/api/public_plus_experimental_current.txt
@@ -23,7 +23,7 @@
 
   public final class JavaScriptIsolate implements java.lang.AutoCloseable {
     method public void close();
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.String!> evaluateJavaScriptAsync(@org.intellij.lang.annotations.Language("javascript") String);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.String!> evaluateJavaScriptAsync(String);
     method @RequiresFeature(name=androidx.javascriptengine.JavaScriptSandbox.JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER, enforcement="androidx.javascriptengine.JavaScriptSandbox#isFeatureSupported") public boolean provideNamedData(String, byte[]);
   }
 
diff --git a/javascriptengine/javascriptengine/api/restricted_current.txt b/javascriptengine/javascriptengine/api/restricted_current.txt
index e808cea..5411655 100644
--- a/javascriptengine/javascriptengine/api/restricted_current.txt
+++ b/javascriptengine/javascriptengine/api/restricted_current.txt
@@ -23,7 +23,7 @@
 
   public final class JavaScriptIsolate implements java.lang.AutoCloseable {
     method public void close();
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.String!> evaluateJavaScriptAsync(@org.intellij.lang.annotations.Language("javascript") String);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.String!> evaluateJavaScriptAsync(String);
     method @RequiresFeature(name=androidx.javascriptengine.JavaScriptSandbox.JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER, enforcement="androidx.javascriptengine.JavaScriptSandbox#isFeatureSupported") public boolean provideNamedData(String, byte[]);
   }
 
diff --git a/javascriptengine/javascriptengine/build.gradle b/javascriptengine/javascriptengine/build.gradle
index eae553f..ed63ae3 100644
--- a/javascriptengine/javascriptengine/build.gradle
+++ b/javascriptengine/javascriptengine/build.gradle
@@ -25,7 +25,6 @@
     api("androidx.annotation:annotation:1.3.0")
     api("androidx.concurrent:concurrent-futures:1.0.0")
     api("androidx.core:core:1.1.0")
-    implementation("org.jetbrains:annotations:13.0")
     implementation(libs.guavaAndroid)
     androidTestImplementation 'junit:junit:4.12'
     annotationProcessor(libs.nullaway)
diff --git a/javascriptengine/javascriptengine/src/androidTest/java/androidx/javascriptengine/WebViewJavaScriptSandboxTest.java b/javascriptengine/javascriptengine/src/androidTest/java/androidx/javascriptengine/WebViewJavaScriptSandboxTest.java
index 491edec..72b8651 100644
--- a/javascriptengine/javascriptengine/src/androidTest/java/androidx/javascriptengine/WebViewJavaScriptSandboxTest.java
+++ b/javascriptengine/javascriptengine/src/androidTest/java/androidx/javascriptengine/WebViewJavaScriptSandboxTest.java
@@ -35,16 +35,21 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 
-/** Instrumentation test for JsSandboxService. */
+/** Instrumentation test for JavaScriptSandbox. */
 @RunWith(AndroidJUnit4.class)
 public class WebViewJavaScriptSandboxTest {
+    // This value is somewhat arbitrary. It might need bumping if V8 snapshots become significantly
+    // larger in future. However, we don't want it too large as that will make the tests slower and
+    // require more memory.
+    private static final long REASONABLE_HEAP_SIZE = 100 * 1024 * 1024;
+
     private boolean canCreateJsSandbox() throws Throwable {
         Context context = ApplicationProvider.getApplicationContext();
-        ListenableFuture<JavaScriptSandbox> JsSandboxFuture =
+        ListenableFuture<JavaScriptSandbox> jsSandboxFuture =
                 JavaScriptSandbox.createConnectedInstanceAsync(context);
         JavaScriptSandbox jsSandbox;
         try {
-            jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
+            jsSandbox = jsSandboxFuture.get(5, TimeUnit.SECONDS);
         } catch (ExecutionException e) {
             return false;
         }
@@ -66,16 +71,15 @@
         final String expected = "PASS";
         Context context = ApplicationProvider.getApplicationContext();
 
-        ListenableFuture<JavaScriptSandbox> JsSandboxFuture =
+        ListenableFuture<JavaScriptSandbox> jsSandboxFuture =
                 JavaScriptSandbox.createConnectedInstanceAsync(context);
-        JavaScriptSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
-        JavaScriptIsolate jsIsolate = jsSandbox.createIsolate();
-        ListenableFuture<String> resultFuture = jsIsolate.evaluateJavaScriptAsync(code);
-        String result = resultFuture.get(5, TimeUnit.SECONDS);
-        jsIsolate.close();
-        jsSandbox.close();
+        try (JavaScriptSandbox jsSandbox = jsSandboxFuture.get(5, TimeUnit.SECONDS);
+                JavaScriptIsolate jsIsolate = jsSandbox.createIsolate()) {
+            ListenableFuture<String> resultFuture = jsIsolate.evaluateJavaScriptAsync(code);
+            String result = resultFuture.get(5, TimeUnit.SECONDS);
 
-        Assert.assertEquals(expected, result);
+            Assert.assertEquals(expected, result);
+        }
     }
 
     @Test
@@ -85,18 +89,18 @@
         final String expected = "PASS";
         Context context = ApplicationProvider.getApplicationContext();
 
-        ListenableFuture<JavaScriptSandbox> JsSandboxFuture =
+        ListenableFuture<JavaScriptSandbox> jsSandboxFuture =
                 JavaScriptSandbox.createConnectedInstanceAsync(context);
-        JavaScriptSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
-        JavaScriptIsolate jsIsolate1 = jsSandbox.createIsolate();
-        JavaScriptIsolate jsIsolate2 = jsSandbox.createIsolate();
-        jsIsolate1.close();
-        ListenableFuture<String> resultFuture = jsIsolate2.evaluateJavaScriptAsync(code);
-        String result = resultFuture.get(5, TimeUnit.SECONDS);
-        jsIsolate2.close();
-        jsSandbox.close();
+        try (JavaScriptSandbox jsSandbox = jsSandboxFuture.get(5, TimeUnit.SECONDS);
+                JavaScriptIsolate jsIsolate1 = jsSandbox.createIsolate()) {
+            JavaScriptIsolate jsIsolate2 = jsSandbox.createIsolate();
+            jsIsolate2.close();
 
-        Assert.assertEquals(expected, result);
+            ListenableFuture<String> resultFuture = jsIsolate1.evaluateJavaScriptAsync(code);
+            String result = resultFuture.get(5, TimeUnit.SECONDS);
+
+            Assert.assertEquals(expected, result);
+        }
     }
 
     @Test
@@ -109,21 +113,19 @@
 
         Context context = ApplicationProvider.getApplicationContext();
 
-        ListenableFuture<JavaScriptSandbox> JsSandboxFuture =
+        ListenableFuture<JavaScriptSandbox> jsSandboxFuture =
                 JavaScriptSandbox.createConnectedInstanceAsync(context);
-        JavaScriptSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
-        JavaScriptIsolate jsIsolate1 = jsSandbox.createIsolate();
-        ListenableFuture<String> resultFuture1 = jsIsolate1.evaluateJavaScriptAsync(code1);
-        String result1 = resultFuture1.get(5, TimeUnit.SECONDS);
-        JavaScriptIsolate jsIsolate2 = jsSandbox.createIsolate();
-        ListenableFuture<String> resultFuture2 = jsIsolate2.evaluateJavaScriptAsync(code2);
-        String result2 = resultFuture2.get(5, TimeUnit.SECONDS);
-        jsIsolate1.close();
-        jsIsolate2.close();
-        jsSandbox.close();
+        try (JavaScriptSandbox jsSandbox = jsSandboxFuture.get(5, TimeUnit.SECONDS);
+                JavaScriptIsolate jsIsolate1 = jsSandbox.createIsolate();
+                JavaScriptIsolate jsIsolate2 = jsSandbox.createIsolate()) {
+            ListenableFuture<String> resultFuture1 = jsIsolate1.evaluateJavaScriptAsync(code1);
+            String result1 = resultFuture1.get(5, TimeUnit.SECONDS);
+            ListenableFuture<String> resultFuture2 = jsIsolate2.evaluateJavaScriptAsync(code2);
+            String result2 = resultFuture2.get(5, TimeUnit.SECONDS);
 
-        Assert.assertEquals(expected1, result1);
-        Assert.assertEquals(expected2, result2);
+            Assert.assertEquals(expected1, result1);
+            Assert.assertEquals(expected2, result2);
+        }
     }
 
     @Test
@@ -135,21 +137,19 @@
         final String expected2 = "undefined PASS";
         Context context = ApplicationProvider.getApplicationContext();
 
-        ListenableFuture<JavaScriptSandbox> JsSandboxFuture =
+        ListenableFuture<JavaScriptSandbox> jsSandboxFuture =
                 JavaScriptSandbox.createConnectedInstanceAsync(context);
-        JavaScriptSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
-        JavaScriptIsolate jsIsolate1 = jsSandbox.createIsolate();
-        ListenableFuture<String> resultFuture1 = jsIsolate1.evaluateJavaScriptAsync(code1);
-        String result1 = resultFuture1.get(5, TimeUnit.SECONDS);
-        JavaScriptIsolate jsIsolate2 = jsSandbox.createIsolate();
-        ListenableFuture<String> resultFuture2 = jsIsolate2.evaluateJavaScriptAsync(code2);
-        String result2 = resultFuture2.get(5, TimeUnit.SECONDS);
-        jsIsolate1.close();
-        jsIsolate2.close();
-        jsSandbox.close();
+        try (JavaScriptSandbox jsSandbox = jsSandboxFuture.get(5, TimeUnit.SECONDS);
+                JavaScriptIsolate jsIsolate1 = jsSandbox.createIsolate();
+                JavaScriptIsolate jsIsolate2 = jsSandbox.createIsolate()) {
+            ListenableFuture<String> resultFuture1 = jsIsolate1.evaluateJavaScriptAsync(code1);
+            String result1 = resultFuture1.get(5, TimeUnit.SECONDS);
+            ListenableFuture<String> resultFuture2 = jsIsolate2.evaluateJavaScriptAsync(code2);
+            String result2 = resultFuture2.get(5, TimeUnit.SECONDS);
 
-        Assert.assertEquals(expected1, result1);
-        Assert.assertEquals(expected2, result2);
+            Assert.assertEquals(expected1, result1);
+            Assert.assertEquals(expected2, result2);
+        }
     }
 
     @Test
@@ -161,19 +161,18 @@
         final String expected2 = "PASS PASS";
         Context context = ApplicationProvider.getApplicationContext();
 
-        ListenableFuture<JavaScriptSandbox> JsSandboxFuture =
+        ListenableFuture<JavaScriptSandbox> jsSandboxFuture =
                 JavaScriptSandbox.createConnectedInstanceAsync(context);
-        JavaScriptSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
-        JavaScriptIsolate jsIsolate1 = jsSandbox.createIsolate();
-        ListenableFuture<String> resultFuture1 = jsIsolate1.evaluateJavaScriptAsync(code1);
-        String result1 = resultFuture1.get(5, TimeUnit.SECONDS);
-        ListenableFuture<String> resultFuture2 = jsIsolate1.evaluateJavaScriptAsync(code2);
-        String result2 = resultFuture2.get(5, TimeUnit.SECONDS);
-        jsIsolate1.close();
-        jsSandbox.close();
+        try (JavaScriptSandbox jsSandbox = jsSandboxFuture.get(5, TimeUnit.SECONDS);
+                JavaScriptIsolate jsIsolate1 = jsSandbox.createIsolate()) {
+            ListenableFuture<String> resultFuture1 = jsIsolate1.evaluateJavaScriptAsync(code1);
+            String result1 = resultFuture1.get(5, TimeUnit.SECONDS);
+            ListenableFuture<String> resultFuture2 = jsIsolate1.evaluateJavaScriptAsync(code2);
+            String result2 = resultFuture2.get(5, TimeUnit.SECONDS);
 
-        Assert.assertEquals(expected1, result1);
-        Assert.assertEquals(expected2, result2);
+            Assert.assertEquals(expected1, result1);
+            Assert.assertEquals(expected2, result2);
+        }
     }
 
     @Test
@@ -183,24 +182,24 @@
         final String contains = "RandomLinkError";
         Context context = ApplicationProvider.getApplicationContext();
 
-        ListenableFuture<JavaScriptSandbox> JsSandboxFuture =
+        ListenableFuture<JavaScriptSandbox> jsSandboxFuture =
                 JavaScriptSandbox.createConnectedInstanceAsync(context);
-        JavaScriptSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
-        JavaScriptIsolate jsIsolate = jsSandbox.createIsolate();
-        ListenableFuture<String> resultFuture = jsIsolate.evaluateJavaScriptAsync(code);
-        boolean isOfCorrectType = false;
-        String error = "";
-        try {
-            String result = resultFuture.get(5, TimeUnit.SECONDS);
-        } catch (ExecutionException e) {
-            isOfCorrectType = e.getCause().getClass().equals(EvaluationFailedException.class);
-            error = e.getCause().getMessage();
-        }
-        jsIsolate.close();
-        jsSandbox.close();
+        try (JavaScriptSandbox jsSandbox = jsSandboxFuture.get(5, TimeUnit.SECONDS);
+                JavaScriptIsolate jsIsolate = jsSandbox.createIsolate()) {
+            ListenableFuture<String> resultFuture = jsIsolate.evaluateJavaScriptAsync(code);
+            boolean isOfCorrectType = false;
+            String error = "";
+            try {
+                resultFuture.get(5, TimeUnit.SECONDS);
+                Assert.fail("Should have thrown.");
+            } catch (ExecutionException e) {
+                isOfCorrectType = e.getCause().getClass().equals(EvaluationFailedException.class);
+                error = e.getCause().getMessage();
+            }
 
-        Assert.assertTrue(isOfCorrectType);
-        Assert.assertTrue(error.contains(contains));
+            Assert.assertTrue(isOfCorrectType);
+            Assert.assertTrue(error.contains(contains));
+        }
     }
 
     @Test
@@ -209,24 +208,26 @@
         final String code = "while(true){}";
         Context context = ApplicationProvider.getApplicationContext();
 
-        ListenableFuture<JavaScriptSandbox> JsSandboxFuture =
+        ListenableFuture<JavaScriptSandbox> jsSandboxFuture =
                 JavaScriptSandbox.createConnectedInstanceAsync(context);
-        JavaScriptSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
-        Assume.assumeTrue(
-                jsSandbox.isFeatureSupported(JavaScriptSandbox.JS_FEATURE_ISOLATE_TERMINATION));
+        try (JavaScriptSandbox jsSandbox = jsSandboxFuture.get(5, TimeUnit.SECONDS)) {
+            Assume.assumeTrue(
+                    jsSandbox.isFeatureSupported(JavaScriptSandbox.JS_FEATURE_ISOLATE_TERMINATION));
 
-        JavaScriptIsolate jsIsolate = jsSandbox.createIsolate();
-        ListenableFuture<String> resultFuture = jsIsolate.evaluateJavaScriptAsync(code);
-        boolean isOfCorrectType = false;
-        try {
-            jsIsolate.close();
-            String result = resultFuture.get(5, TimeUnit.SECONDS);
-        } catch (ExecutionException e) {
-            isOfCorrectType = e.getCause().getClass().equals(IsolateTerminatedException.class);
+            ListenableFuture<String> resultFuture;
+            try (JavaScriptIsolate jsIsolate = jsSandbox.createIsolate()) {
+                resultFuture = jsIsolate.evaluateJavaScriptAsync(code);
+            }
+
+            try {
+                resultFuture.get(5, TimeUnit.SECONDS);
+                Assert.fail("Should have thrown.");
+            } catch (ExecutionException e) {
+                if (!(e.getCause() instanceof IsolateTerminatedException)) {
+                    throw e;
+                }
+            }
         }
-        jsSandbox.close();
-
-        Assert.assertTrue(isOfCorrectType);
     }
 
     @Test
@@ -236,30 +237,31 @@
         final int num_of_evaluations = 10;
         Context context = ApplicationProvider.getApplicationContext();
 
-        ListenableFuture<JavaScriptSandbox> JsSandboxFuture =
+        ListenableFuture<JavaScriptSandbox> jsSandboxFuture =
                 JavaScriptSandbox.createConnectedInstanceAsync(context);
-        JavaScriptSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
-        Assume.assumeTrue(
-                jsSandbox.isFeatureSupported(JavaScriptSandbox.JS_FEATURE_ISOLATE_TERMINATION));
+        try (JavaScriptSandbox jsSandbox = jsSandboxFuture.get(5, TimeUnit.SECONDS)) {
+            Assume.assumeTrue(
+                    jsSandbox.isFeatureSupported(JavaScriptSandbox.JS_FEATURE_ISOLATE_TERMINATION));
 
-        JavaScriptIsolate jsIsolate = jsSandbox.createIsolate();
-        Vector<ListenableFuture<String>> resultFutures = new Vector<ListenableFuture<String>>();
-        for (int i = 0; i < num_of_evaluations; i++) {
-            ListenableFuture<String> resultFuture = jsIsolate.evaluateJavaScriptAsync(code);
-            resultFutures.add(resultFuture);
-        }
-        jsIsolate.close();
-
-        for (int i = 0; i < num_of_evaluations; i++) {
-            boolean isOfCorrectType = false;
-            try {
-                String result = resultFutures.elementAt(i).get(5, TimeUnit.SECONDS);
-            } catch (ExecutionException e) {
-                isOfCorrectType = e.getCause().getClass().equals(IsolateTerminatedException.class);
+            Vector<ListenableFuture<String>> resultFutures = new Vector<ListenableFuture<String>>();
+            try (JavaScriptIsolate jsIsolate = jsSandbox.createIsolate()) {
+                for (int i = 0; i < num_of_evaluations; i++) {
+                    ListenableFuture<String> resultFuture = jsIsolate.evaluateJavaScriptAsync(code);
+                    resultFutures.add(resultFuture);
+                }
             }
-            Assert.assertTrue(isOfCorrectType);
+
+            for (int i = 0; i < num_of_evaluations; i++) {
+                try {
+                    resultFutures.elementAt(i).get(5, TimeUnit.SECONDS);
+                    Assert.fail("Should have thrown.");
+                } catch (ExecutionException e) {
+                    if (!(e.getCause() instanceof IsolateTerminatedException)) {
+                        throw e;
+                    }
+                }
+            }
         }
-        jsSandbox.close();
     }
 
     @Test
@@ -275,15 +277,14 @@
                 + " return ab2str(value);"
                 + "});";
         Context context = ApplicationProvider.getApplicationContext();
-        ListenableFuture<JavaScriptSandbox> JsSandboxFuture =
+        ListenableFuture<JavaScriptSandbox> jsSandboxFuture =
                 JavaScriptSandbox.createConnectedInstanceAsync(context);
-        try (JavaScriptSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
-             JavaScriptIsolate jsIsolate = jsSandbox.createIsolate()) {
+        try (JavaScriptSandbox jsSandbox = jsSandboxFuture.get(5, TimeUnit.SECONDS);
+                JavaScriptIsolate jsIsolate = jsSandbox.createIsolate()) {
             Assume.assumeTrue(
                     jsSandbox.isFeatureSupported(JavaScriptSandbox.JS_FEATURE_PROMISE_RETURN));
-            Assume.assumeTrue(
-                    jsSandbox.isFeatureSupported(
-                            JavaScriptSandbox.JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER));
+            Assume.assumeTrue(jsSandbox.isFeatureSupported(
+                    JavaScriptSandbox.JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER));
 
             boolean provideNamedDataReturn = jsIsolate.provideNamedData("id-1", bytes);
             Assert.assertTrue(provideNamedDataReturn);
@@ -307,15 +308,14 @@
                 + "  });"
                 + "});";
         Context context = ApplicationProvider.getApplicationContext();
-        ListenableFuture<JavaScriptSandbox> JsSandboxFuture =
+        ListenableFuture<JavaScriptSandbox> jsSandboxFuture =
                 JavaScriptSandbox.createConnectedInstanceAsync(context);
-        try (JavaScriptSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
-             JavaScriptIsolate jsIsolate = jsSandbox.createIsolate()) {
+        try (JavaScriptSandbox jsSandbox = jsSandboxFuture.get(5, TimeUnit.SECONDS);
+                JavaScriptIsolate jsIsolate = jsSandbox.createIsolate()) {
             Assume.assumeTrue(
                     jsSandbox.isFeatureSupported(JavaScriptSandbox.JS_FEATURE_PROMISE_RETURN));
-            Assume.assumeTrue(
-                    jsSandbox.isFeatureSupported(
-                            JavaScriptSandbox.JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER));
+            Assume.assumeTrue(jsSandbox.isFeatureSupported(
+                    JavaScriptSandbox.JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER));
             Assume.assumeTrue(
                     jsSandbox.isFeatureSupported(JavaScriptSandbox.JS_FEATURE_WASM_COMPILATION));
 
@@ -334,10 +334,10 @@
         final String code = "Promise.resolve(\"PASS\")";
         final String expected = "PASS";
         Context context = ApplicationProvider.getApplicationContext();
-        ListenableFuture<JavaScriptSandbox> JsSandboxFuture =
+        ListenableFuture<JavaScriptSandbox> jsSandboxFuture =
                 JavaScriptSandbox.createConnectedInstanceAsync(context);
-        try (JavaScriptSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
-             JavaScriptIsolate jsIsolate = jsSandbox.createIsolate()) {
+        try (JavaScriptSandbox jsSandbox = jsSandboxFuture.get(5, TimeUnit.SECONDS);
+                JavaScriptIsolate jsIsolate = jsSandbox.createIsolate()) {
             Assume.assumeTrue(
                     jsSandbox.isFeatureSupported(JavaScriptSandbox.JS_FEATURE_PROMISE_RETURN));
 
@@ -360,10 +360,10 @@
         final String expected = "PASS";
         Context context = ApplicationProvider.getApplicationContext();
 
-        ListenableFuture<JavaScriptSandbox> JsSandboxFuture =
+        ListenableFuture<JavaScriptSandbox> jsSandboxFuture =
                 JavaScriptSandbox.createConnectedInstanceAsync(context);
-        try (JavaScriptSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
-             JavaScriptIsolate jsIsolate = jsSandbox.createIsolate()) {
+        try (JavaScriptSandbox jsSandbox = jsSandboxFuture.get(5, TimeUnit.SECONDS);
+                JavaScriptIsolate jsIsolate = jsSandbox.createIsolate()) {
             Assume.assumeTrue(
                     jsSandbox.isFeatureSupported(JavaScriptSandbox.JS_FEATURE_PROMISE_RETURN));
 
@@ -396,10 +396,10 @@
                 + " });"
                 + "});";
         Context context = ApplicationProvider.getApplicationContext();
-        ListenableFuture<JavaScriptSandbox> JsSandboxFuture =
+        ListenableFuture<JavaScriptSandbox> jsSandboxFuture =
                 JavaScriptSandbox.createConnectedInstanceAsync(context);
-        try (JavaScriptSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
-             JavaScriptIsolate jsIsolate = jsSandbox.createIsolate()) {
+        try (JavaScriptSandbox jsSandbox = jsSandboxFuture.get(5, TimeUnit.SECONDS);
+                JavaScriptIsolate jsIsolate = jsSandbox.createIsolate()) {
             Assume.assumeTrue(
                     jsSandbox.isFeatureSupported(JavaScriptSandbox.JS_FEATURE_PROMISE_RETURN));
             Assume.assumeTrue(jsSandbox.isFeatureSupported(
@@ -430,10 +430,10 @@
         final String contains = "RandomLinkError";
         Context context = ApplicationProvider.getApplicationContext();
 
-        ListenableFuture<JavaScriptSandbox> JsSandboxFuture =
+        ListenableFuture<JavaScriptSandbox> jsSandboxFuture =
                 JavaScriptSandbox.createConnectedInstanceAsync(context);
-        try (JavaScriptSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
-             JavaScriptIsolate jsIsolate = jsSandbox.createIsolate()) {
+        try (JavaScriptSandbox jsSandbox = jsSandboxFuture.get(5, TimeUnit.SECONDS);
+                JavaScriptIsolate jsIsolate = jsSandbox.createIsolate()) {
             Assume.assumeTrue(
                     jsSandbox.isFeatureSupported(JavaScriptSandbox.JS_FEATURE_PROMISE_RETURN));
             Assume.assumeTrue(jsSandbox.isFeatureSupported(
@@ -441,7 +441,7 @@
 
             ListenableFuture<String> resultFuture = jsIsolate.evaluateJavaScriptAsync(code);
             try {
-                String result = resultFuture.get(5, TimeUnit.SECONDS);
+                resultFuture.get(5, TimeUnit.SECONDS);
                 Assert.fail("Should have thrown.");
             } catch (ExecutionException e) {
                 if (!(e.getCause() instanceof EvaluationFailedException)) {
@@ -458,18 +458,19 @@
         final String code = "while(true){}";
         Context context = ApplicationProvider.getApplicationContext();
 
-        ListenableFuture<JavaScriptSandbox> JsSandboxFuture =
+        ListenableFuture<JavaScriptSandbox> jsSandboxFuture =
                 JavaScriptSandbox.createConnectedInstanceAsync(context);
-        JavaScriptSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
-        JavaScriptIsolate jsIsolate = jsSandbox.createIsolate();
-        ListenableFuture<String> resultFuture = jsIsolate.evaluateJavaScriptAsync(code);
-        try {
+        try (JavaScriptSandbox jsSandbox = jsSandboxFuture.get(5, TimeUnit.SECONDS);
+                JavaScriptIsolate jsIsolate = jsSandbox.createIsolate()) {
+            ListenableFuture<String> resultFuture = jsIsolate.evaluateJavaScriptAsync(code);
             jsSandbox.close();
-            resultFuture.get(5, TimeUnit.SECONDS);
-            Assert.fail("Should have thrown.");
-        } catch (ExecutionException e) {
-            if (!(e.getCause() instanceof IsolateTerminatedException)) {
-                throw e;
+            try {
+                resultFuture.get(5, TimeUnit.SECONDS);
+                Assert.fail("Should have thrown.");
+            } catch (ExecutionException e) {
+                if (!(e.getCause() instanceof IsolateTerminatedException)) {
+                    throw e;
+                }
             }
         }
     }
@@ -479,14 +480,15 @@
     public void testMultipleSandboxesCannotCoexist() throws Throwable {
         Context context = ApplicationProvider.getApplicationContext();
         final String contains = "already bound";
-        ListenableFuture<JavaScriptSandbox> JsSandboxFuture1 =
+        ListenableFuture<JavaScriptSandbox> jsSandboxFuture1 =
                 JavaScriptSandbox.createConnectedInstanceAsync(context);
-        try (JavaScriptSandbox jsSandbox1 = JsSandboxFuture1.get(5, TimeUnit.SECONDS)) {
-            ListenableFuture<JavaScriptSandbox> JsSandboxFuture2 =
+        try (JavaScriptSandbox jsSandbox1 = jsSandboxFuture1.get(5, TimeUnit.SECONDS)) {
+            ListenableFuture<JavaScriptSandbox> jsSandboxFuture2 =
                     JavaScriptSandbox.createConnectedInstanceAsync(context);
             try {
-                JavaScriptSandbox jsSandbox2 = JsSandboxFuture2.get(5, TimeUnit.SECONDS);
-                Assert.fail("Should have thrown.");
+                try (JavaScriptSandbox jsSandbox2 = jsSandboxFuture2.get(5, TimeUnit.SECONDS)) {
+                    Assert.fail("Should have thrown.");
+                }
             } catch (ExecutionException e) {
                 if (!(e.getCause() instanceof RuntimeException)) {
                     throw e;
@@ -501,41 +503,85 @@
     public void testSandboxCanBeCreatedAfterClosed() throws Throwable {
         final String code = "\"PASS\"";
         final String expected = "PASS";
+        final int num_of_startups = 2;
         Context context = ApplicationProvider.getApplicationContext();
 
-        ListenableFuture<JavaScriptSandbox> JsSandboxFuture1 =
-                JavaScriptSandbox.createConnectedInstanceAsync(context);
-        JavaScriptSandbox jsSandbox1 = JsSandboxFuture1.get(5, TimeUnit.SECONDS);
-        jsSandbox1.close();
-        ListenableFuture<JavaScriptSandbox> JsSandboxFuture2 =
-                JavaScriptSandbox.createConnectedInstanceAsync(context);
-        try (JavaScriptSandbox jsSandbox2 = JsSandboxFuture2.get(5, TimeUnit.SECONDS);
-             JavaScriptIsolate jsIsolate = jsSandbox2.createIsolate()) {
-            ListenableFuture<String> resultFuture1 = jsIsolate.evaluateJavaScriptAsync(code);
-            String result = resultFuture1.get(5, TimeUnit.SECONDS);
+        for (int i = 0; i < num_of_startups; i++) {
+            ListenableFuture<JavaScriptSandbox> jsSandboxFuture =
+                    JavaScriptSandbox.createConnectedInstanceAsync(context);
+            try (JavaScriptSandbox jsSandbox = jsSandboxFuture.get(5, TimeUnit.SECONDS);
+                    JavaScriptIsolate jsIsolate = jsSandbox.createIsolate()) {
+                ListenableFuture<String> resultFuture = jsIsolate.evaluateJavaScriptAsync(code);
+                String result = resultFuture.get(5, TimeUnit.SECONDS);
 
-            Assert.assertEquals(expected, result);
+                Assert.assertEquals(expected, result);
+            }
         }
     }
 
     @Test
     @MediumTest
-    public void testHeapSize() throws Throwable {
-        final String code = "const buffer = new ArrayBuffer(500000000);"
-                + "\"PASS\"";
+    public void testHeapSizeAdjustment() throws Throwable {
+        final String code = "\"PASS\"";
+        final String expected = "PASS";
+        final long[] heapSizes = {
+                0,
+                REASONABLE_HEAP_SIZE,
+                REASONABLE_HEAP_SIZE - 1,
+                REASONABLE_HEAP_SIZE + 1,
+                REASONABLE_HEAP_SIZE + 4095,
+                REASONABLE_HEAP_SIZE + 4096,
+                REASONABLE_HEAP_SIZE + 65535,
+                REASONABLE_HEAP_SIZE + 65536,
+                1L << 50,
+        };
         Context context = ApplicationProvider.getApplicationContext();
-        ListenableFuture<JavaScriptSandbox> JsSandboxFuture =
+        ListenableFuture<JavaScriptSandbox> jsSandboxFuture =
                 JavaScriptSandbox.createConnectedInstanceAsync(context);
-        try (JavaScriptSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS)) {
-            Assume.assumeTrue(
-                    jsSandbox.isFeatureSupported(
-                            JavaScriptSandbox.JS_FEATURE_ISOLATE_MAX_HEAP_SIZE));
+        try (JavaScriptSandbox jsSandbox = jsSandboxFuture.get(5, TimeUnit.SECONDS)) {
+            Assume.assumeTrue(jsSandbox.isFeatureSupported(
+                    JavaScriptSandbox.JS_FEATURE_ISOLATE_MAX_HEAP_SIZE));
+            for (long heapSize : heapSizes) {
+                IsolateStartupParameters isolateStartupParameters = new IsolateStartupParameters();
+                isolateStartupParameters.setMaxHeapSizeBytes(heapSize);
+                try (JavaScriptIsolate jsIsolate =
+                                jsSandbox.createIsolate(isolateStartupParameters)) {
+                    ListenableFuture<String> resultFuture = jsIsolate.evaluateJavaScriptAsync(code);
+                    String result = resultFuture.get(5, TimeUnit.SECONDS);
+                    Assert.assertEquals(expected, result);
+                } catch (Throwable e) {
+                    throw new AssertionError(
+                            "Failed to evaluate JavaScript using max heap size setting " + heapSize,
+                            e);
+                }
+            }
+        }
+    }
+
+    @Test
+    @MediumTest
+    public void testHeapSizeEnforced() throws Throwable {
+        final long maxHeapSize = REASONABLE_HEAP_SIZE;
+        // We need to beat the v8 optimizer to ensure it really allocates the required memory.
+        // Note that we're allocating an array of elements - not bytes.
+        final String code = "this.array = Array(" + maxHeapSize + ").fill(Math.random(), 0);"
+                + "var arrayLength = this.array.length;"
+                + "var sum = 0;"
+                + "for (var i = 0; i < arrayLength; i++) {"
+                + " sum+=this.array[i];"
+                + "}";
+        Context context = ApplicationProvider.getApplicationContext();
+        ListenableFuture<JavaScriptSandbox> jsSandboxFuture =
+                JavaScriptSandbox.createConnectedInstanceAsync(context);
+        try (JavaScriptSandbox jsSandbox = jsSandboxFuture.get(5, TimeUnit.SECONDS)) {
+            Assume.assumeTrue(jsSandbox.isFeatureSupported(
+                    JavaScriptSandbox.JS_FEATURE_ISOLATE_MAX_HEAP_SIZE));
             IsolateStartupParameters isolateStartupParameters = new IsolateStartupParameters();
-            isolateStartupParameters.setMaxHeapSizeBytes(10000);
+            isolateStartupParameters.setMaxHeapSizeBytes(maxHeapSize);
             try (JavaScriptIsolate jsIsolate = jsSandbox.createIsolate(isolateStartupParameters)) {
                 ListenableFuture<String> resultFuture = jsIsolate.evaluateJavaScriptAsync(code);
                 try {
-                    resultFuture.get(5, TimeUnit.SECONDS);
+                    resultFuture.get(10, TimeUnit.SECONDS);
                     Assert.fail("Should have thrown.");
                 } catch (ExecutionException e) {
                     if (!(e.getCause() instanceof SandboxDeadException)) {
diff --git a/javascriptengine/javascriptengine/src/main/aidl/org/chromium/android_webview/js_sandbox/common/IJsSandboxService.aidl b/javascriptengine/javascriptengine/src/main/aidl/org/chromium/android_webview/js_sandbox/common/IJsSandboxService.aidl
index 157b4cc..031b7d7 100644
--- a/javascriptengine/javascriptengine/src/main/aidl/org/chromium/android_webview/js_sandbox/common/IJsSandboxService.aidl
+++ b/javascriptengine/javascriptengine/src/main/aidl/org/chromium/android_webview/js_sandbox/common/IJsSandboxService.aidl
@@ -32,6 +32,12 @@
     const String ISOLATE_TERMINATION = "ISOLATE_TERMINATION";
 
     /**
+     * Feature flag indicating that isolate creation can take a parameter
+     * to set the maximum heap size limit of the isolate.
+     */
+    const String ISOLATE_MAX_HEAP_SIZE_LIMIT = "ISOLATE_MAX_HEAP_SIZE_LIMIT";
+
+    /**
      * This feature flag is a combination of three sub-features:
      * - If evaluateJavascript() returns a promise, we wait for the promise
      *   to resolve and then return the resolved value.
@@ -42,12 +48,11 @@
      */
     const String WASM_FROM_ARRAY_BUFFER = "WASM_FROM_ARRAY_BUFFER";
 
-    const String ISOLATE_MAX_HEAP_SIZE_LIMIT = "ISOLATE_MAX_HEAP_SIZE_LIMIT";
-
     /**
      * @return A list of feature names supported by this implementation.
      */
     List<String> getSupportedFeatures() = 1;
 
     IJsSandboxIsolate createIsolateWithMaxHeapSizeBytes(long maxHeapSize) = 2;
+
 }
diff --git a/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/IsolateStartupParameters.java b/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/IsolateStartupParameters.java
index 5e13f74..d32ea7c 100644
--- a/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/IsolateStartupParameters.java
+++ b/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/IsolateStartupParameters.java
@@ -35,12 +35,15 @@
      * <p>
      * If a value higher than the device specific maximum heap size limit is supplied, this limit
      * will be used as the maximum heap size.
+     * <p>
+     * The applied limit may not be exact. For example, the limit may internally be rounded up to
+     * some multiple of bytes, be increased to some minimum value, or reduced to some maximum
+     * supported value.
      *
      * @param size heap size in bytes
      */
     @RequiresFeature(name = JavaScriptSandbox.JS_FEATURE_ISOLATE_MAX_HEAP_SIZE,
-            enforcement =
-                    "androidx.javascriptengine.JavaScriptSandbox#isFeatureSupported")
+            enforcement = "androidx.javascriptengine.JavaScriptSandbox#isFeatureSupported")
     public void setMaxHeapSizeBytes(@IntRange(from = 0) long size) {
         if (size < 0) {
             throw new IllegalArgumentException("maxHeapSizeBytes should be >= 0");
diff --git a/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/JavaScriptIsolate.java b/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/JavaScriptIsolate.java
index 3797ad2..18c5e47 100644
--- a/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/JavaScriptIsolate.java
+++ b/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/JavaScriptIsolate.java
@@ -30,7 +30,6 @@
 
 import org.chromium.android_webview.js_sandbox.common.IJsSandboxIsolate;
 import org.chromium.android_webview.js_sandbox.common.IJsSandboxIsolateCallback;
-import org.intellij.lang.annotations.Language;
 
 import java.io.Closeable;
 import java.io.IOException;
@@ -71,8 +70,7 @@
 
                 @Override
                 public Thread newThread(Runnable r) {
-                    return new Thread(
-                            r, "JavaScriptIsolate Thread #" + mCount.getAndIncrement());
+                    return new Thread(r, "JavaScriptIsolate Thread #" + mCount.getAndIncrement());
                 }
             });
     private final JavaScriptSandbox mJsSandbox;
@@ -145,8 +143,7 @@
      */
     @SuppressWarnings("NullAway")
     @NonNull
-    public ListenableFuture<String> evaluateJavaScriptAsync(
-            @NonNull @Language("javascript") String code) {
+    public ListenableFuture<String> evaluateJavaScriptAsync(@NonNull String code) {
         if (mJsIsolateStub == null) {
             throw new IllegalStateException(
                     "Calling evaluateJavascript() after closing the Isolate");
@@ -250,11 +247,10 @@
      * @param inputBytes Bytes to be passed into the JavaScript environment
      *
      * @return {@code true} on success, {@code false} if the name has already been used before,
- *              in which case the client should use an unused name
+     *         in which case the client should use an unused name
      */
     @RequiresFeature(name = JavaScriptSandbox.JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER,
-            enforcement =
-                    "androidx.javascriptengine.JavaScriptSandbox#isFeatureSupported")
+            enforcement = "androidx.javascriptengine.JavaScriptSandbox#isFeatureSupported")
     public boolean provideNamedData(@NonNull String name, @NonNull byte[] inputBytes) {
         if (mJsIsolateStub == null) {
             throw new IllegalStateException("Calling provideNamedData() after closing the Isolate");
@@ -272,8 +268,7 @@
             mThreadPoolTaskExecutor.execute(
                     () -> {
                         convertByteArrayToStream(inputBytes, outputStream);
-                    }
-            );
+                    });
 
             AssetFileDescriptor asd = new AssetFileDescriptor(readSide, offset, length);
             return mJsIsolateStub.provideNamedData(name, asd);
diff --git a/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/JavaScriptSandbox.java b/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/JavaScriptSandbox.java
index a756777..7003d1a 100644
--- a/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/JavaScriptSandbox.java
+++ b/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/JavaScriptSandbox.java
@@ -97,12 +97,12 @@
      */
     @RestrictTo(RestrictTo.Scope.LIBRARY)
     @StringDef(value =
-            {
-                    JS_FEATURE_ISOLATE_TERMINATION,
-                    JS_FEATURE_PROMISE_RETURN,
-                    JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER,
-                    JS_FEATURE_WASM_COMPILATION,
-            })
+                       {
+                               JS_FEATURE_ISOLATE_TERMINATION,
+                               JS_FEATURE_PROMISE_RETURN,
+                               JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER,
+                               JS_FEATURE_WASM_COMPILATION,
+                       })
     @Retention(RetentionPolicy.SOURCE)
     @Target({ElementType.PARAMETER, ElementType.METHOD})
     public @interface JsSandboxFeature {}
@@ -184,9 +184,8 @@
         // one of the methods and have it fail.
         @Override
         public void onServiceDisconnected(ComponentName name) {
-            runShutdownTasks(
-                    new RuntimeException(
-                            "JavaScriptSandbox internal error: onServiceDisconnected()"));
+            runShutdownTasks(new RuntimeException(
+                    "JavaScriptSandbox internal error: onServiceDisconnected()"));
         }
 
         @Override
@@ -269,7 +268,8 @@
         return bindToServiceWithCallback(context, compName, flag);
     }
 
-    @NonNull private static ListenableFuture<JavaScriptSandbox> bindToServiceWithCallback(
+    @NonNull
+    private static ListenableFuture<JavaScriptSandbox> bindToServiceWithCallback(
             Context context, ComponentName compName, int flag) {
         Intent intent = new Intent();
         intent.setComponent(compName);
diff --git a/libraryversions.toml b/libraryversions.toml
index 9f93ced..29d1e49 100644
--- a/libraryversions.toml
+++ b/libraryversions.toml
@@ -1,10 +1,10 @@
 [versions]
-ACTIVITY = "1.6.0-beta01"
+ACTIVITY = "1.6.0-rc01"
 ADS_IDENTIFIER = "1.0.0-alpha05"
-ANNOTATION = "1.5.0-alpha02"
-ANNOTATION_EXPERIMENTAL = "1.3.0-beta01"
-APPCOMPAT = "1.6.0-beta01"
-APPSEARCH = "1.1.0-alpha01"
+ANNOTATION = "1.5.0-rc01"
+ANNOTATION_EXPERIMENTAL = "1.3.0-rc01"
+APPCOMPAT = "1.6.0-rc01"
+APPSEARCH = "1.1.0-alpha02"
 ARCH_CORE = "2.2.0-alpha01"
 ASYNCLAYOUTINFLATER = "1.1.0-alpha01"
 AUTOFILL = "1.2.0-beta02"
@@ -13,28 +13,28 @@
 BLUETOOTH = "1.0.0-alpha01"
 BROWSER = "1.5.0-alpha01"
 BUILDSRC_TESTS = "1.0.0-alpha01"
-CAMERA = "1.2.0-alpha05"
+CAMERA = "1.2.0-beta01"
 CAMERA_PIPE = "1.0.0-alpha01"
 CARDVIEW = "1.1.0-alpha01"
 CAR_APP = "1.3.0-alpha02"
 COLLECTION = "1.3.0-alpha03"
-COMPOSE = "1.3.0-alpha03"
-COMPOSE_COMPILER = "1.3.0-rc02"
-COMPOSE_MATERIAL3 = "1.0.0-alpha16"
+COMPOSE = "1.3.0-beta01"
+COMPOSE_COMPILER = "1.3.1"
+COMPOSE_MATERIAL3 = "1.0.0-beta01"
 COMPOSE_RUNTIME_TRACING = "1.0.0-alpha01"
 CONTENTPAGER = "1.1.0-alpha01"
 COORDINATORLAYOUT = "1.3.0-alpha01"
-CORE = "1.9.0-beta01"
+CORE = "1.9.0-rc01"
 CORE_ANIMATION = "1.0.0-beta02"
 CORE_ANIMATION_TESTING = "1.0.0-beta01"
 CORE_APPDIGEST = "1.0.0-alpha01"
 CORE_GOOGLE_SHORTCUTS = "1.1.0-alpha02"
 CORE_I18N = "1.0.0-alpha01"
 CORE_PERFORMANCE = "1.0.0-alpha03"
-CORE_REMOTEVIEWS = "1.0.0-beta02"
+CORE_REMOTEVIEWS = "1.0.0-beta03"
 CORE_ROLE = "1.2.0-alpha01"
 CORE_SPLASHSCREEN = "1.1.0-alpha01"
-CORE_UWB = "1.0.0-alpha03"
+CORE_UWB = "1.0.0-alpha04"
 CURSORADAPTER = "1.1.0-alpha01"
 CUSTOMVIEW = "1.2.0-alpha02"
 CUSTOMVIEW_POOLINGCONTAINER = "1.1.0-alpha01"
@@ -50,18 +50,18 @@
 EXIFINTERFACE = "1.4.0-alpha01"
 FRAGMENT = "1.6.0-alpha02"
 FUTURES = "1.2.0-alpha01"
-GLANCE = "1.0.0-alpha04"
+GLANCE = "1.0.0-alpha05"
 GLANCE_TEMPLATE = "1.0.0-alpha01"
 GRAPHICS = "1.0.0-alpha01"
 GRIDLAYOUT = "1.1.0-alpha01"
-HEALTH_CONNECT_CLIENT = "1.0.0-alpha04"
+HEALTH_CONNECT = "1.0.0-alpha04"
 HEALTH_SERVICES_CLIENT = "1.0.0-beta01"
 HEIFWRITER = "1.1.0-alpha02"
 HILT = "1.1.0-alpha01"
 HILT_NAVIGATION_COMPOSE = "1.1.0-alpha01"
 INSPECTION = "1.0.0"
 INTERPOLATOR = "1.1.0-alpha01"
-JAVASCRIPTENGINE = "1.0.0-alpha01"
+JAVASCRIPTENGINE = "1.0.0-alpha02"
 LEANBACK = "1.2.0-alpha03"
 LEANBACK_GRID = "1.0.0-alpha02"
 LEANBACK_PAGING = "1.1.0-alpha10"
@@ -77,16 +77,17 @@
 MEDIAROUTER = "1.4.0-alpha01"
 METRICS = "1.0.0-alpha04"
 NAVIGATION = "2.6.0-alpha01"
-PAGING = "3.2.0-alpha02"
-PAGING_COMPOSE = "1.0.0-alpha16"
+PAGING = "3.2.0-alpha03"
+PAGING_COMPOSE = "1.0.0-alpha17"
 PALETTE = "1.1.0-alpha01"
 PERCENTLAYOUT = "1.1.0-alpha01"
 PREFERENCE = "1.3.0-alpha01"
 PRINT = "1.1.0-beta01"
+PRIVACYSANDBOX_SDKRUNTIME = "1.0.0-alpha01"
 PRIVACYSANDBOX_TOOLS = "1.0.0-alpha01"
 PROFILEINSTALLER = "1.3.0-alpha01"
 RECOMMENDATION = "1.1.0-alpha01"
-RECYCLERVIEW = "1.3.0-beta02"
+RECYCLERVIEW = "1.3.0-beta03"
 RECYCLERVIEW_SELECTION = "1.2.0-alpha02"
 REMOTECALLBACK = "1.0.0-alpha02"
 RESOURCEINSPECTION = "1.1.0-alpha01"
@@ -103,7 +104,7 @@
 SLICE_BUILDERS_KTX = "1.0.0-alpha08"
 SLICE_REMOTECALLBACK = "1.0.0-alpha01"
 SLIDINGPANELAYOUT = "1.3.0-alpha01"
-SQLITE = "2.3.0-alpha04"
+SQLITE = "2.3.0-alpha05"
 SQLITE_INSPECTOR = "2.1.0-alpha01"
 STARTUP = "1.2.0-alpha02"
 SWIPEREFRESHLAYOUT = "1.2.0-alpha01"
@@ -123,19 +124,19 @@
 VIEWPAGER = "1.1.0-alpha02"
 VIEWPAGER2 = "1.2.0-alpha01"
 WEAR = "1.3.0-alpha03"
-WEAR_COMPOSE = "1.1.0-alpha03"
+WEAR_COMPOSE = "1.1.0-alpha04"
 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_REMOTE_INTERACTIONS = "1.1.0-alpha01"
-WEAR_TILES = "1.1.0-rc01"
-WEAR_WATCHFACE = "1.2.0-alpha01"
+WEAR_TILES = "1.2.0-alpha01"
+WEAR_WATCHFACE = "1.2.0-alpha02"
 WEBKIT = "1.6.0-alpha01"
 WINDOW = "1.1.0-alpha04"
 WINDOW_EXTENSIONS = "1.1.0-alpha01"
 WINDOW_SIDECAR = "1.0.0-rc01"
-WORK = "2.8.0-alpha03"
+WORK = "2.8.0-alpha04"
 
 [groups]
 ACTIVITY = { group = "androidx.activity", atomicGroupVersion = "versions.ACTIVITY" }
@@ -185,6 +186,7 @@
 GRAPHICS = { group = "androidx.graphics", atomicGroupVersion = "versions.GRAPHICS" }
 GRIDLAYOUT = { group = "androidx.gridlayout", atomicGroupVersion = "versions.GRIDLAYOUT" }
 HEALTH = { group = "androidx.health" }
+HEALTH_CONNECT = { group = "androidx.health.connect", atomicGroupVersion = "versions.HEALTH_CONNECT" }
 HEIFWRITER = { group = "androidx.heifwriter", atomicGroupVersion = "versions.HEIFWRITER" }
 HILT = { group = "androidx.hilt" }
 INSPECTION = { group = "androidx.inspection", atomicGroupVersion = "versions.INSPECTION" }
@@ -206,6 +208,7 @@
 PERCENTLAYOUT = { group = "androidx.percentlayout", atomicGroupVersion = "versions.PERCENTLAYOUT" }
 PREFERENCE = { group = "androidx.preference", atomicGroupVersion = "versions.PREFERENCE" }
 PRINT = { group = "androidx.print", atomicGroupVersion = "versions.PRINT" }
+PRIVACYSANDBOX_SDKRUNTIME = { group = "androidx.privacysandbox.sdkruntime", atomicGroupVersion = "versions.PRIVACYSANDBOX_SDKRUNTIME" }
 PRIVACYSANDBOX_TOOLS = { group = "androidx.privacysandbox.tools", atomicGroupVersion = "versions.PRIVACYSANDBOX_TOOLS" }
 PROFILEINSTALLER = { group = "androidx.profileinstaller", atomicGroupVersion = "versions.PROFILEINSTALLER" }
 RECOMMENDATION = { group = "androidx.recommendation", atomicGroupVersion = "versions.RECOMMENDATION" }
diff --git a/lifecycle/integration-tests/testapp/src/androidTest/java/androidx/lifecycle/PartiallyCoveredActivityTest.java b/lifecycle/integration-tests/testapp/src/androidTest/java/androidx/lifecycle/PartiallyCoveredActivityTest.java
index 31c9597..82ee56a 100644
--- a/lifecycle/integration-tests/testapp/src/androidTest/java/androidx/lifecycle/PartiallyCoveredActivityTest.java
+++ b/lifecycle/integration-tests/testapp/src/androidTest/java/androidx/lifecycle/PartiallyCoveredActivityTest.java
@@ -46,6 +46,7 @@
 import androidx.lifecycle.testapp.NavigationDialogActivity;
 import androidx.lifecycle.testapp.TestEvent;
 import androidx.test.core.app.ApplicationProvider;
+import androidx.test.filters.FlakyTest;
 import androidx.test.filters.LargeTest;
 import androidx.test.filters.SdkSuppress;
 import androidx.test.platform.app.InstrumentationRegistry;
@@ -132,6 +133,7 @@
         runTest(fragment);
     }
 
+    @FlakyTest(bugId = 173596006)
     @Test
     public void coveredWithDialog_childFragment() throws Throwable {
         CollectingSupportFragment parentFragment = new CollectingSupportFragment();
diff --git a/lifecycle/lifecycle-common/build.gradle b/lifecycle/lifecycle-common/build.gradle
index 8805aee9..c62e819 100644
--- a/lifecycle/lifecycle-common/build.gradle
+++ b/lifecycle/lifecycle-common/build.gradle
@@ -29,6 +29,7 @@
 
     constraints {
         implementation(project(":lifecycle:lifecycle-common-java8"))
+        implementation(project(":lifecycle:lifecycle-runtime"))
     }
 }
 
diff --git a/lifecycle/lifecycle-reactivestreams-ktx/build.gradle b/lifecycle/lifecycle-reactivestreams-ktx/build.gradle
index 74982db..fe0f886 100644
--- a/lifecycle/lifecycle-reactivestreams-ktx/build.gradle
+++ b/lifecycle/lifecycle-reactivestreams-ktx/build.gradle
@@ -34,6 +34,10 @@
   testImplementation(libs.kotlinCoroutinesTest)
   testImplementation(project(":lifecycle:lifecycle-runtime-testing"))
   testImplementation("androidx.arch.core:core-testing:2.1.0")
+
+  constraints {
+    implementation(project(":lifecycle:lifecycle-reactivestreams"))
+  }
 }
 
 androidx {
diff --git a/lifecycle/lifecycle-reactivestreams/build.gradle b/lifecycle/lifecycle-reactivestreams/build.gradle
index 2f02597..c3adbe4 100644
--- a/lifecycle/lifecycle-reactivestreams/build.gradle
+++ b/lifecycle/lifecycle-reactivestreams/build.gradle
@@ -37,6 +37,10 @@
     testImplementation(libs.kotlinCoroutinesTest)
     testImplementation(project(":lifecycle:lifecycle-runtime-testing"))
     testImplementation("androidx.arch.core:core-testing:2.1.0")
+
+    constraints {
+        implementation(project(":lifecycle:lifecycle-reactivestreams-ktx"))
+    }
 }
 
 androidx {
diff --git a/lifecycle/lifecycle-runtime-compose/build.gradle b/lifecycle/lifecycle-runtime-compose/build.gradle
index 532249b..effe393 100644
--- a/lifecycle/lifecycle-runtime-compose/build.gradle
+++ b/lifecycle/lifecycle-runtime-compose/build.gradle
@@ -42,6 +42,15 @@
     androidTestImplementation(libs.truth)
 
     samples(projectOrArtifact(":lifecycle:lifecycle-runtime-compose:lifecycle-runtime-compose-samples"))
+
+    constraints {
+        // this syntax mirrors the temporary workaround in lifecycle-runtime
+        // dependency constraints which allows lifecycle-runtime to have a
+        // project constraint on compose, even though compose is not within
+        // the 'MAIN' project-set.
+        // update syntax when b/239979823 is fixed.
+        implementation("androidx.lifecycle:lifecycle-runtime:{androidx.LibraryVersions.LIFECYCLE}")
+    }
 }
 
 androidx {
diff --git a/lifecycle/lifecycle-runtime-ktx/build.gradle b/lifecycle/lifecycle-runtime-ktx/build.gradle
index c68d0c4..a4effba 100644
--- a/lifecycle/lifecycle-runtime-ktx/build.gradle
+++ b/lifecycle/lifecycle-runtime-ktx/build.gradle
@@ -41,6 +41,10 @@
     androidTestImplementation(libs.kotlinCoroutinesTest)
 
     lintPublish(project(":lifecycle:lifecycle-runtime-ktx-lint"))
+
+    constraints {
+        implementation(project(":lifecycle:lifecycle-runtime"))
+    }
 }
 
 androidx {
diff --git a/lifecycle/lifecycle-runtime-testing/build.gradle b/lifecycle/lifecycle-runtime-testing/build.gradle
index 6b69daa..ab852c1 100644
--- a/lifecycle/lifecycle-runtime-testing/build.gradle
+++ b/lifecycle/lifecycle-runtime-testing/build.gradle
@@ -36,6 +36,10 @@
     androidTestImplementation(libs.testExtJunit)
     androidTestImplementation(libs.testCore)
     androidTestImplementation(libs.testRunner)
+
+    constraints {
+        implementation(project(":lifecycle:lifecycle-runtime"))
+    }
 }
 
 androidx {
diff --git a/lifecycle/lifecycle-runtime/build.gradle b/lifecycle/lifecycle-runtime/build.gradle
index bc2dc5b..38f1a2b 100644
--- a/lifecycle/lifecycle-runtime/build.gradle
+++ b/lifecycle/lifecycle-runtime/build.gradle
@@ -27,6 +27,16 @@
     androidTestImplementation(libs.testExtJunit)
     androidTestImplementation(libs.testCore)
     androidTestImplementation(libs.testRunner)
+
+    constraints {
+        implementation(project(":lifecycle:lifecycle-common"))
+        implementation(project(":lifecycle:lifecycle-runtime-ktx"))
+        implementation(project(":lifecycle:lifecycle-runtime-testing"))
+        // this syntax is a temporary workout to allow project dependency on cross-project-set
+        // i.e. COMPOSE + MAIN project sets
+        // update syntax when b/239979823 is fixed
+        implementation("androidx.lifecycle:lifecycle-runtime-compose:{androidx.LibraryVersions.LIFECYCLE}")
+    }
 }
 
 androidx {
diff --git a/lifecycle/lifecycle-viewmodel-ktx/build.gradle b/lifecycle/lifecycle-viewmodel-ktx/build.gradle
index 23dbe99..aa4f8f2 100644
--- a/lifecycle/lifecycle-viewmodel-ktx/build.gradle
+++ b/lifecycle/lifecycle-viewmodel-ktx/build.gradle
@@ -32,6 +32,15 @@
     androidTestImplementation(libs.testExtJunit)
     androidTestImplementation(libs.testCore)
     androidTestImplementation(libs.testRunner)
+
+    constraints {
+        // this syntax mirrors the temporary workaround in lifecycle-viewmodel
+        // dependency constraints which allows lifecycle-viewmodel-ktx to have a
+        // project constraint on compose, even though compose is not within
+        // the 'MAIN' project-set.
+        // update syntax when b/239979823 is fixed.
+        implementation("androidx.lifecycle:lifecycle-viewmodel:{androidx.LibraryVersions.LIFECYCLE}")
+    }
 }
 
 androidx {
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/build.gradle b/lifecycle/lifecycle-viewmodel-savedstate/build.gradle
index c4a6e00..df82aca 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/build.gradle
+++ b/lifecycle/lifecycle-viewmodel-savedstate/build.gradle
@@ -50,6 +50,10 @@
     androidTestImplementation(libs.testCore)
     androidTestImplementation(libs.testRunner)
     androidTestImplementation(libs.testRules)
+
+    constraints {
+        implementation(project(":lifecycle:lifecycle-viewmodel"))
+    }
 }
 
 //used by testImplementation safe-args-generator
diff --git a/lifecycle/lifecycle-viewmodel/build.gradle b/lifecycle/lifecycle-viewmodel/build.gradle
index 59ad2de..58ca6cad 100644
--- a/lifecycle/lifecycle-viewmodel/build.gradle
+++ b/lifecycle/lifecycle-viewmodel/build.gradle
@@ -39,6 +39,10 @@
     testImplementation(libs.truth)
 
     constraints {
+        // this syntax is a temporary workout to allow project dependency on cross-project-set
+        // i.e. COMPOSE + MAIN project sets
+        // update syntax when b/239979823 is fixed
+        implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:{androidx.LibraryVersions.LIFECYCLE}")
         implementation(project(":lifecycle:lifecycle-viewmodel-savedstate"))
     }
 
diff --git a/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelProvider.kt b/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelProvider.kt
index b28ee39..fb5616b 100644
--- a/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelProvider.kt
+++ b/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelProvider.kt
@@ -34,7 +34,7 @@
 import kotlin.UnsupportedOperationException
 
 /**
- * An utility class that provides `ViewModels` for a scope.
+ * A utility class that provides `ViewModels` for a scope.
  *
  * Default `ViewModelProvider` for an `Activity` or a `Fragment` can be obtained
  * by passing it to the constructor: `ViewModelProvider(myFragment)`
diff --git a/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeMethodWithQualifiedClass.java b/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeMethodWithQualifiedClass.java
index 86767db..3f660a4 100644
--- a/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeMethodWithQualifiedClass.java
+++ b/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeMethodWithQualifiedClass.java
@@ -16,22 +16,25 @@
 
 package androidx;
 
-import android.view.SearchEvent;
-import android.view.Window;
+import android.print.PrintAttributes;
 
 import androidx.annotation.RequiresApi;
 
 /**
- * Test class containing unsafe method reference that uses a value defined with a qualified class.
+ * Test class containing unsafe method reference that uses qualified class names.
  */
 @SuppressWarnings("unused")
 public class AutofixUnsafeMethodWithQualifiedClass {
     /**
-     * This method uses Window.Callback (not Callback), so the fix should also use Window.Callback.
+     * This method call:
+     * - has a receiver of type PrintAttributes.Builder
+     * - takes param of type PrintAttributes.MediaSize
+     * - has return type PrintAttributes.Builder
+     * In the generated fix, all three types should appear as qualified class names.
      */
-    @RequiresApi(23)
-    public boolean unsafeReferenceOnQualifiedClass(Window.Callback callback,
-            SearchEvent searchEvent) {
-        return callback.onSearchRequested(searchEvent);
+    @RequiresApi(19)
+    public void unsafeReferenceWithQualifiedClasses(PrintAttributes.Builder builder,
+            PrintAttributes.MediaSize mediaSize) {
+        builder.setMediaSize(mediaSize);
     }
 }
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 56316d6..8437ae7 100644
--- a/lint-checks/src/main/java/androidx/build/lint/ClassVerificationFailureDetector.kt
+++ b/lint-checks/src/main/java/androidx/build/lint/ClassVerificationFailureDetector.kt
@@ -704,7 +704,7 @@
             }
 
             val typedParams = method.parameters.map { param ->
-                "${(param.type as? PsiType)?.presentableText} ${param.name}"
+                "${(param.type as? PsiType)?.canonicalText} ${param.name}"
             }
             val typedParamsStr = (listOfNotNull(hostParam) + typedParams).joinToString(", ")
 
@@ -724,7 +724,7 @@
                 receiverStr = "new "
             } else {
                 wrapperMethodName = methodName
-                returnTypeStr = method.returnType?.presentableText ?: "void"
+                returnTypeStr = method.returnType?.canonicalText ?: "void"
                 returnStmtStr = if ("void" == returnTypeStr) "" else "return "
                 receiverStr = if (isStatic) "$hostType." else "$hostVar."
             }
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 aa02f01..71803b3 100644
--- a/lint-checks/src/test/java/androidx/build/lint/ClassVerificationFailureDetectorTest.kt
+++ b/lint-checks/src/test/java/androidx/build/lint/ClassVerificationFailureDetectorTest.kt
@@ -20,6 +20,7 @@
 
 import androidx.build.lint.Stubs.Companion.RequiresApi
 import androidx.build.lint.Stubs.Companion.IntRange
+import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
@@ -301,7 +302,7 @@
 +     }
 +
 +     @annotation.DoNotInline
-+     static <T> T getSystemService(Context context, Class<T> serviceClass) {
++     static <T> T getSystemService(Context context, java.lang.Class<T> serviceClass) {
 +         return context.getSystemService(serviceClass);
 +     }
 +
@@ -346,6 +347,7 @@
         check(*input).expectFixDiffs(expectedFix)
     }
 
+    @Ignore("Ignored until the fix for b/241573146 is in the current version of studio")
     @Test
     fun `Detection and auto-fix for qualified expressions (issue 205026874)`() {
         val input = arrayOf(
@@ -408,7 +410,7 @@
     }
 
     @Test
-    fun `Auto-fix includes fully qualified class name (issue 205035683)`() {
+    fun `Auto-fix includes fully qualified class name (issue 205035683, 236721202)`() {
         val input = arrayOf(
             javaSample("androidx.AutofixUnsafeMethodWithQualifiedClass"),
             RequiresApi
@@ -416,30 +418,30 @@
 
         /* ktlint-disable max-line-length */
         val expected = """
-src/androidx/AutofixUnsafeMethodWithQualifiedClass.java:35: Error: This call references a method added in API level 23; however, the containing class androidx.AutofixUnsafeMethodWithQualifiedClass is reachable from earlier API levels and will fail run-time class verification. [ClassVerificationFailure]
-        return callback.onSearchRequested(searchEvent);
-                        ~~~~~~~~~~~~~~~~~
+src/androidx/AutofixUnsafeMethodWithQualifiedClass.java:38: Error: This call references a method added in API level 19; however, the containing class androidx.AutofixUnsafeMethodWithQualifiedClass is reachable from earlier API levels and will fail run-time class verification. [ClassVerificationFailure]
+        builder.setMediaSize(mediaSize);
+                ~~~~~~~~~~~~
 1 errors, 0 warnings
         """
 
         val expectedFixDiffs = """
-Fix for src/androidx/AutofixUnsafeMethodWithQualifiedClass.java line 35: Extract to static inner class:
-@@ -35 +35
--         return callback.onSearchRequested(searchEvent);
-+         return Api23Impl.onSearchRequested(callback, searchEvent);
-@@ -37 +37
-+ @RequiresApi(23)
-+ static class Api23Impl {
-+     private Api23Impl() {
+Fix for src/androidx/AutofixUnsafeMethodWithQualifiedClass.java line 38: Extract to static inner class:
+@@ -38 +38
+-         builder.setMediaSize(mediaSize);
++         Api19Impl.setMediaSize(builder, mediaSize);
+@@ -40 +40
++ @RequiresApi(19)
++ static class Api19Impl {
++     private Api19Impl() {
 +         // This class is not instantiable.
 +     }
 +
 +     @DoNotInline
-+     static boolean onSearchRequested(Window.Callback callback, SearchEvent p) {
-+         return callback.onSearchRequested(p);
++     static PrintAttributes.Builder setMediaSize(PrintAttributes.Builder builder, PrintAttributes.MediaSize mediaSize) {
++         return builder.setMediaSize(mediaSize);
 +     }
 +
-@@ -38 +49
+@@ -41 +52
 + }
         """
         /* ktlint-enable max-line-length */
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationAndroidTest.kt b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationAndroidTest.kt
index ca7bd87..53d9d81 100644
--- a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationAndroidTest.kt
+++ b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationAndroidTest.kt
@@ -211,6 +211,80 @@
     }
 
     @Test
+    fun matchDeepLinkBestMatchExactPathSegments() {
+        val destination = NoOpNavigator().createDestination()
+
+        destination.addArgument("user", stringArgument("testUser"))
+        destination.addArgument("name", stringArgument("testName"))
+
+        destination.addDeepLink("www.test.com/{user}/{name}")
+        destination.addDeepLink("www.test.com/testUser/{name}")
+
+        val match = destination.matchDeepLink(
+            Uri.parse("https://www.test.com/testUser/testName")
+        )
+
+        assertWithMessage("Deep link should match")
+            .that(match)
+            .isNotNull()
+        assertWithMessage("Deep link should match with most exact path segments")
+            .that(match?.matchingArgs?.size())
+            .isEqualTo(1)
+        assertWithMessage("Deep link should extract name argument correctly")
+            .that(match?.matchingArgs?.getString("name"))
+            .isEqualTo("testName")
+    }
+
+    @Test
+    fun matchDeepLinkBestMatchExactPathSegmentsWithQueryParams() {
+        val destination = NoOpNavigator().createDestination()
+
+        destination.addArgument("user", stringArgument("testUser"))
+        destination.addArgument("name", stringArgument("testName"))
+        destination.addArgument("param", stringArgument("testArg"))
+
+        destination.addDeepLink("www.test.com/{user}/{name}?param={arg}")
+        destination.addDeepLink("www.test.com/testUser/{name}?param={arg}")
+
+        val match = destination.matchDeepLink(
+            Uri.parse("https://www.test.com/testUser/testName?param=testArg")
+        )
+
+        assertWithMessage("Deep link should match")
+            .that(match)
+            .isNotNull()
+        assertWithMessage("Deep link should match with most exact path segments")
+            .that(match?.matchingArgs?.size())
+            .isEqualTo(2)
+    }
+
+    @Test
+    fun matchDeepLinkBestMatchNonconsecutiveExactPathSegments() {
+        val destination = NoOpNavigator().createDestination()
+
+        destination.addArgument("two", stringArgument("two"))
+        destination.addArgument("three", stringArgument("three"))
+        destination.addArgument("four", stringArgument("four"))
+
+        destination.addDeepLink("www.test.com/one/two/{three}/{four}")
+        destination.addDeepLink("www.test.com/one/{two}/three/four")
+
+        val match = destination.matchDeepLink(
+            Uri.parse("https://www.test.com/one/two/three/four")
+        )
+
+        assertWithMessage("Deep link should match")
+            .that(match)
+            .isNotNull()
+        assertWithMessage("Deep link should match with most exact path segments")
+            .that(match?.matchingArgs?.size())
+            .isEqualTo(1)
+        assertWithMessage("Deep link should extract 'two' argument correctly")
+            .that(match?.matchingArgs?.getString("two"))
+            .isEqualTo("two")
+    }
+
+    @Test
     fun matchDeepLinkBestMatchNullableQueryParam() {
         val destination = NoOpNavigator().createDestination()
 
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLink.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLink.kt
index e331d25..7c3f571 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLink.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLink.kt
@@ -250,6 +250,16 @@
         return bundle
     }
 
+    internal fun calculateMatchingPathSegments(requestedLink: Uri?): Int {
+        if (requestedLink == null || uriPattern == null) return 0
+
+        val requestedPathSegments = requestedLink.pathSegments
+        val uriPathSegments = Uri.parse(uriPattern).pathSegments
+
+        val matches = requestedPathSegments.intersect(uriPathSegments)
+        return matches.size
+    }
+
     private fun parseArgument(
         bundle: Bundle,
         name: String,
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavDestination.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavDestination.kt
index 77dcb58..4c70f94 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavDestination.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavDestination.kt
@@ -24,7 +24,6 @@
 import androidx.annotation.IdRes
 import androidx.annotation.RestrictTo
 import androidx.collection.SparseArrayCompat
-import androidx.collection.forEach
 import androidx.collection.valueIterator
 import androidx.core.content.res.use
 import androidx.navigation.common.R
@@ -71,6 +70,7 @@
         @get:Suppress("NullableCollection") // Needed for nullable bundle
         public val matchingArgs: Bundle?,
         private val isExactDeepLink: Boolean,
+        private val matchingPathSegments: Int,
         private val hasMatchingAction: Boolean,
         private val mimeTypeMatchLevel: Int
     ) : Comparable<DeepLinkMatch> {
@@ -81,6 +81,13 @@
             } else if (!isExactDeepLink && other.isExactDeepLink) {
                 return -1
             }
+            // Then prefer most exact match path segments
+            val pathSegmentDifference = matchingPathSegments - other.matchingPathSegments
+            if (pathSegmentDifference > 0) {
+                return 1
+            } else if (pathSegmentDifference < 0) {
+                return -1
+            }
             if (matchingArgs != null && other.matchingArgs == null) {
                 return 1
             } else if (matchingArgs == null && other.matchingArgs != null) {
@@ -346,6 +353,7 @@
             val uri = navDeepLinkRequest.uri
             val matchingArguments =
                 if (uri != null) deepLink.getMatchingArguments(uri, arguments) else null
+            val matchingPathSegments = deepLink.calculateMatchingPathSegments(uri)
             val requestAction = navDeepLinkRequest.action
             val matchingAction = requestAction != null && requestAction ==
                 deepLink.action
@@ -355,7 +363,8 @@
             if (matchingArguments != null || matchingAction || mimeTypeMatchLevel > -1) {
                 val newMatch = DeepLinkMatch(
                     this, matchingArguments,
-                    deepLink.isExactDeepLink, matchingAction, mimeTypeMatchLevel
+                    deepLink.isExactDeepLink, matchingPathSegments, matchingAction,
+                    mimeTypeMatchLevel
                 )
                 if (bestMatch == null || newMatch > bestMatch) {
                     bestMatch = newMatch
diff --git a/playground-common/gradle/wrapper/gradle-wrapper.properties b/playground-common/gradle/wrapper/gradle-wrapper.properties
index 7e65b70..012d6d9 100644
--- a/playground-common/gradle/wrapper/gradle-wrapper.properties
+++ b/playground-common/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-rc-2-bin.zip
-distributionSha256Sum=ba761aa1563f5d893d1a6e7ddca48bbdc4385fdd527974e6472b873b7eae9a32
+distributionSha256Sum=cb87f222c5585bd46838ad4db78463a5c5f3d336e5e2b98dc7c0c586527351c2
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
diff --git a/playground-common/playground.properties b/playground-common/playground.properties
index 03d207e..b1c7b72 100644
--- a/playground-common/playground.properties
+++ b/playground-common/playground.properties
@@ -26,6 +26,6 @@
 # Disable docs
 androidx.enableDocumentation=false
 androidx.playground.snapshotBuildId=8877926
-androidx.playground.metalavaBuildId=8670428
+androidx.playground.metalavaBuildId=8873316
 androidx.playground.dokkaBuildId=7472101
 androidx.studio.type=playground
diff --git a/privacysandbox/OWNERS b/privacysandbox/OWNERS
index 518859b..8615f90 100644
--- a/privacysandbox/OWNERS
+++ b/privacysandbox/OWNERS
@@ -1,3 +1,4 @@
 abz@google.com
 ltenorio@google.com
 nicoroulet@google.com
+akulakov@google.com
diff --git a/privacysandbox/sdkruntime/OWNERS b/privacysandbox/sdkruntime/OWNERS
new file mode 100644
index 0000000..1ee0dca
--- /dev/null
+++ b/privacysandbox/sdkruntime/OWNERS
@@ -0,0 +1 @@
+akulakov@google.com
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/api/current.txt b/privacysandbox/sdkruntime/sdkruntime-client/api/current.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/privacysandbox/sdkruntime/sdkruntime-client/api/current.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/api/public_plus_experimental_current.txt b/privacysandbox/sdkruntime/sdkruntime-client/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/privacysandbox/sdkruntime/sdkruntime-client/api/public_plus_experimental_current.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/health/health-connect-client/api/res-current.txt b/privacysandbox/sdkruntime/sdkruntime-client/api/res-current.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to privacysandbox/sdkruntime/sdkruntime-client/api/res-current.txt
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/api/restricted_current.txt b/privacysandbox/sdkruntime/sdkruntime-client/api/restricted_current.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/privacysandbox/sdkruntime/sdkruntime-client/api/restricted_current.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/build.gradle b/privacysandbox/sdkruntime/sdkruntime-client/build.gradle
new file mode 100644
index 0000000..12371e8
--- /dev/null
+++ b/privacysandbox/sdkruntime/sdkruntime-client/build.gradle
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ */
+
+import androidx.build.LibraryType
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("org.jetbrains.kotlin.android")
+}
+
+dependencies {
+    api(libs.kotlinStdlib)
+}
+
+android {
+    namespace "androidx.privacysandbox.sdkruntime.client"
+}
+
+androidx {
+    name = "androidx.privacysandbox.sdkruntime:sdkruntime-client"
+    type = LibraryType.PUBLISHED_LIBRARY
+    mavenGroup = LibraryGroups.PRIVACYSANDBOX_SDKRUNTIME
+    inceptionYear = "2022"
+    description = "Provides components for SdkRuntime aware Applications"
+}
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/androidx/privacysandbox/sdkruntime/androidx-privacysandbox-sdkruntime-sdkruntime-client-documentation.md b/privacysandbox/sdkruntime/sdkruntime-client/src/main/androidx/privacysandbox/sdkruntime/androidx-privacysandbox-sdkruntime-sdkruntime-client-documentation.md
new file mode 100644
index 0000000..b446c84
--- /dev/null
+++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/androidx/privacysandbox/sdkruntime/androidx-privacysandbox-sdkruntime-sdkruntime-client-documentation.md
@@ -0,0 +1,7 @@
+# Module root
+
+Privacy Sandbox SdkRuntime Client
+
+# Package androidx.privacysandbox.sdkruntime.client
+
+This package provides components for interacting with SdkRuntime aware SDKs.
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/api/current.txt b/privacysandbox/sdkruntime/sdkruntime-core/api/current.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/privacysandbox/sdkruntime/sdkruntime-core/api/current.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/api/public_plus_experimental_current.txt b/privacysandbox/sdkruntime/sdkruntime-core/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/privacysandbox/sdkruntime/sdkruntime-core/api/public_plus_experimental_current.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/health/health-connect-client/api/res-current.txt b/privacysandbox/sdkruntime/sdkruntime-core/api/res-current.txt
similarity index 100%
copy from health/health-connect-client/api/res-current.txt
copy to privacysandbox/sdkruntime/sdkruntime-core/api/res-current.txt
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/api/restricted_current.txt b/privacysandbox/sdkruntime/sdkruntime-core/api/restricted_current.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/privacysandbox/sdkruntime/sdkruntime-core/api/restricted_current.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/build.gradle b/privacysandbox/sdkruntime/sdkruntime-core/build.gradle
new file mode 100644
index 0000000..2bb6772
--- /dev/null
+++ b/privacysandbox/sdkruntime/sdkruntime-core/build.gradle
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ */
+
+import androidx.build.LibraryType
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("org.jetbrains.kotlin.android")
+}
+
+dependencies {
+    api(libs.kotlinStdlib)
+}
+
+android {
+    namespace "androidx.privacysandbox.sdkruntime.core"
+}
+
+androidx {
+    name = "androidx.privacysandbox.sdkruntime:sdkruntime-core"
+    type = LibraryType.PUBLISHED_LIBRARY
+    mavenGroup = LibraryGroups.PRIVACYSANDBOX_SDKRUNTIME
+    inceptionYear = "2022"
+    description = "Provides components for SdkRuntime aware SDKs"
+}
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/src/main/androidx/privacysandbox/sdkruntime/androidx-privacysandbox-sdkruntime-sdkruntime-core-documentation.md b/privacysandbox/sdkruntime/sdkruntime-core/src/main/androidx/privacysandbox/sdkruntime/androidx-privacysandbox-sdkruntime-sdkruntime-core-documentation.md
new file mode 100644
index 0000000..24cc6ec
--- /dev/null
+++ b/privacysandbox/sdkruntime/sdkruntime-core/src/main/androidx/privacysandbox/sdkruntime/androidx-privacysandbox-sdkruntime-sdkruntime-core-documentation.md
@@ -0,0 +1,7 @@
+# Module root
+
+Privacy Sandbox SdkRuntime Core
+
+# Package androidx.privacysandbox.sdkruntime.core
+
+This package provides components for implementing SdkRuntime aware SDKs.
diff --git a/privacysandbox/tools/tools-apicompiler/build.gradle b/privacysandbox/tools/tools-apicompiler/build.gradle
index f4cab03..39983af 100644
--- a/privacysandbox/tools/tools-apicompiler/build.gradle
+++ b/privacysandbox/tools/tools-apicompiler/build.gradle
@@ -24,6 +24,11 @@
 dependencies {
     api(libs.kotlinStdlib)
     implementation(libs.kspApi)
+    implementation project(path: ':privacysandbox:tools:tools')
+
+    testImplementation(project(":room:room-compiler-processing-testing"))
+    testImplementation(libs.junit)
+    testImplementation(libs.truth)
 }
 
 androidx {
diff --git a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/Compiler.kt b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/Compiler.kt
deleted file mode 100644
index 4f92192..0000000
--- a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/Compiler.kt
+++ /dev/null
@@ -1,17 +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.privacysandbox.tools.apicompiler
\ No newline at end of file
diff --git a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/PrivacySandboxKspCompiler.kt b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/PrivacySandboxKspCompiler.kt
index 6f326cd..8fc30bf 100644
--- a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/PrivacySandboxKspCompiler.kt
+++ b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/PrivacySandboxKspCompiler.kt
@@ -16,20 +16,21 @@
 
 package androidx.privacysandbox.tools.apicompiler
 
+import com.google.devtools.ksp.processing.KSPLogger
 import com.google.devtools.ksp.processing.Resolver
 import com.google.devtools.ksp.processing.SymbolProcessor
 import com.google.devtools.ksp.processing.SymbolProcessorEnvironment
 import com.google.devtools.ksp.processing.SymbolProcessorProvider
 import com.google.devtools.ksp.symbol.KSAnnotated
 
-class PrivacySandboxKspCompiler() : SymbolProcessor {
+class PrivacySandboxKspCompiler(val logger: KSPLogger) : SymbolProcessor {
     override fun process(resolver: Resolver): List<KSAnnotated> {
         return emptyList()
     }
 
     class Provider : SymbolProcessorProvider {
         override fun create(environment: SymbolProcessorEnvironment): SymbolProcessor {
-            return PrivacySandboxKspCompiler()
+            return PrivacySandboxKspCompiler(environment.logger)
         }
     }
 }
\ No newline at end of file
diff --git a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/model/AnnotatedInterface.kt b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/model/AnnotatedInterface.kt
new file mode 100644
index 0000000..bfc8047
--- /dev/null
+++ b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/model/AnnotatedInterface.kt
@@ -0,0 +1,24 @@
+/*
+ * 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.privacysandbox.tools.apicompiler.model
+
+/** Result of parsing a Kotlin interface. */
+data class AnnotatedInterface(
+    val name: String,
+    val packageName: String,
+    val methods: List<Method> = emptyList(),
+)
\ No newline at end of file
diff --git a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/model/Method.kt b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/model/Method.kt
new file mode 100644
index 0000000..ea0f619
--- /dev/null
+++ b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/model/Method.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.privacysandbox.tools.apicompiler.model
+
+data class Method(
+    val name: String,
+    val parameters: List<Parameter>,
+    val returnType: Type,
+)
\ No newline at end of file
diff --git a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/model/Parameter.kt b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/model/Parameter.kt
new file mode 100644
index 0000000..6e2c29b
--- /dev/null
+++ b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/model/Parameter.kt
@@ -0,0 +1,22 @@
+/*
+ * 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.privacysandbox.tools.apicompiler.model
+
+data class Parameter(
+    val name: String,
+    val type: Type,
+)
\ No newline at end of file
diff --git a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/model/ParsedApi.kt b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/model/ParsedApi.kt
new file mode 100644
index 0000000..210f065
--- /dev/null
+++ b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/model/ParsedApi.kt
@@ -0,0 +1,22 @@
+/*
+ * 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.privacysandbox.tools.apicompiler.model
+
+/** Result of parsing a full developer-defined API for an SDK. */
+data class ParsedApi(
+    val services: Set<AnnotatedInterface>,
+)
\ No newline at end of file
diff --git a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/model/Type.kt b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/model/Type.kt
new file mode 100644
index 0000000..ae444a8
--- /dev/null
+++ b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/model/Type.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.privacysandbox.tools.apicompiler.model
+
+data class Type(
+  val name: String,
+)
\ No newline at end of file
diff --git a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/parser/ApiParser.kt b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/parser/ApiParser.kt
new file mode 100644
index 0000000..bdf8820
--- /dev/null
+++ b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/parser/ApiParser.kt
@@ -0,0 +1,102 @@
+/*
+ * 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.privacysandbox.tools.apicompiler.parser
+
+import androidx.privacysandbox.tools.PrivacySandboxService
+import androidx.privacysandbox.tools.apicompiler.model.ParsedApi
+import androidx.privacysandbox.tools.apicompiler.model.AnnotatedInterface
+import androidx.privacysandbox.tools.apicompiler.model.Method
+import androidx.privacysandbox.tools.apicompiler.model.Parameter
+import androidx.privacysandbox.tools.apicompiler.model.Type
+import com.google.devtools.ksp.getDeclaredFunctions
+import com.google.devtools.ksp.processing.KSPLogger
+import com.google.devtools.ksp.processing.Resolver
+import com.google.devtools.ksp.symbol.ClassKind
+import com.google.devtools.ksp.symbol.KSClassDeclaration
+import com.google.devtools.ksp.symbol.KSFunctionDeclaration
+import com.google.devtools.ksp.symbol.KSName
+import com.google.devtools.ksp.symbol.KSType
+import com.google.devtools.ksp.symbol.KSValueParameter
+
+/** Convenience extension to get the full qualifier + name from a [KSName]. */
+internal fun KSName.getFullName(): String {
+    if (getQualifier() == "") return getShortName()
+    return "${getQualifier()}.${getShortName()}"
+}
+
+/** Top-level entry point to parse a complete user-defined sandbox SDK API into a [ParsedApi]. */
+class ApiParser(private val resolver: Resolver, private val logger: KSPLogger) {
+    private val validator: ApiValidator = ApiValidator(logger, resolver)
+
+    fun parseApi(): ParsedApi {
+        return ParsedApi(services = parseAllServices())
+    }
+
+    private fun parseAllServices(): Set<AnnotatedInterface> {
+        val symbolsWithServiceAnnotation =
+            resolver.getSymbolsWithAnnotation(PrivacySandboxService::class.qualifiedName!!)
+        val interfacesWithServiceAnnotation =
+            symbolsWithServiceAnnotation.filterIsInstance<KSClassDeclaration>()
+                .filter { it.classKind == ClassKind.INTERFACE }
+        if (symbolsWithServiceAnnotation.count() != interfacesWithServiceAnnotation.count()) {
+            logger.error("Only interfaces can be annotated with @PrivacySandboxService.")
+            return setOf()
+        }
+        return interfacesWithServiceAnnotation.map(this::parseInterface).toSet()
+    }
+
+    private fun parseInterface(classDeclaration: KSClassDeclaration): AnnotatedInterface {
+        validator.validateInterface(classDeclaration)
+        return AnnotatedInterface(
+            name = classDeclaration.simpleName.getShortName(),
+            packageName = classDeclaration.packageName.getFullName(),
+            methods = getAllMethods(classDeclaration),
+        )
+    }
+
+    private fun getAllMethods(classDeclaration: KSClassDeclaration) =
+        classDeclaration.getDeclaredFunctions().map(::parseMethod).toList()
+
+    private fun parseMethod(method: KSFunctionDeclaration): Method {
+        validator.validateMethod(method)
+        return Method(
+            name = method.simpleName.getFullName(),
+            parameters = getAllParameters(method),
+            // TODO: returnType "Can be null if an error occurred during resolution".
+            returnType = parseType(method, method.returnType!!.resolve()),
+        )
+    }
+
+    private fun getAllParameters(method: KSFunctionDeclaration) =
+        method.parameters.map { parameter -> parseParameter(method, parameter) }.toList()
+
+    private fun parseParameter(method: KSFunctionDeclaration, parameter: KSValueParameter):
+        Parameter {
+        validator.validateParameter(method, parameter)
+        return Parameter(
+            name = parameter.name!!.getFullName(),
+            type = parseType(method, parameter.type.resolve()),
+        )
+    }
+
+    private fun parseType(method: KSFunctionDeclaration, type: KSType): Type {
+        validator.validateType(method, type)
+        return Type(
+            name = type.declaration.simpleName.getFullName(),
+        )
+    }
+}
\ No newline at end of file
diff --git a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/parser/ApiValidator.kt b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/parser/ApiValidator.kt
new file mode 100644
index 0000000..396edbc
--- /dev/null
+++ b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/parser/ApiValidator.kt
@@ -0,0 +1,125 @@
+/*
+ * 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.privacysandbox.tools.apicompiler.parser
+
+import com.google.devtools.ksp.getDeclaredProperties
+import com.google.devtools.ksp.isPublic
+import com.google.devtools.ksp.processing.KSBuiltIns
+import com.google.devtools.ksp.processing.KSPLogger
+import com.google.devtools.ksp.processing.Resolver
+import com.google.devtools.ksp.symbol.KSClassDeclaration
+import com.google.devtools.ksp.symbol.KSFunctionDeclaration
+import com.google.devtools.ksp.symbol.KSType
+import com.google.devtools.ksp.symbol.KSValueParameter
+import com.google.devtools.ksp.symbol.Modifier
+
+class ApiValidator(private val logger: KSPLogger, private val resolver: Resolver) {
+    private val primitiveTypes = getPrimitiveTypes(resolver.builtIns)
+
+    companion object {
+        val validInterfaceModifiers = setOf(Modifier.PUBLIC)
+        val validMethodModifiers = setOf(Modifier.PUBLIC, Modifier.SUSPEND)
+    }
+
+    fun validateInterface(interfaceDeclaration: KSClassDeclaration) {
+        val name = interfaceDeclaration.qualifiedName?.getFullName()
+            ?: interfaceDeclaration.simpleName.getFullName()
+        if (!interfaceDeclaration.isPublic()) {
+            logger.error("Error in $name: annotated interfaces should be public.")
+        }
+        if (interfaceDeclaration.getDeclaredProperties().any()) {
+            logger.error("Error in $name: annotated interfaces cannot declare properties.")
+        }
+        if (interfaceDeclaration.declarations.filterIsInstance<KSClassDeclaration>()
+                .any(KSClassDeclaration::isCompanionObject)
+        ) {
+            logger.error("Error in $name: annotated interfaces cannot declare companion objects.")
+        }
+        val invalidModifiers =
+            interfaceDeclaration.modifiers.filterNot(validInterfaceModifiers::contains)
+        if (invalidModifiers.isNotEmpty()) {
+            logger.error(
+                "Error in $name: annotated interface contains invalid modifiers (${
+                    invalidModifiers.map { it.name.lowercase() }.sorted().joinToString(limit = 3)
+                })."
+            )
+        }
+        if (interfaceDeclaration.typeParameters.isNotEmpty()) {
+            interfaceDeclaration.typeParameters.map { it.simpleName.getShortName() }.sorted()
+                .joinToString(limit = 3)
+            logger.error(
+                "Error in $name: annotated interfaces cannot declare type parameters (${
+                    interfaceDeclaration.typeParameters.map { it.simpleName.getShortName() }
+                        .sorted()
+                        .joinToString(limit = 3)
+                })."
+            )
+        }
+    }
+
+    fun validateMethod(method: KSFunctionDeclaration) {
+        val name = method.qualifiedName?.getFullName() ?: method.simpleName.getFullName()
+        if (!method.isAbstract) {
+            logger.error("Error in $name: method cannot have default implementation.")
+        }
+        if (method.typeParameters.isNotEmpty()) {
+            logger.error("Error in $name: method cannot declare type parameters (<${
+                method.typeParameters.joinToString(limit = 3) { it.name.getShortName() }
+            }>).")
+        }
+        val invalidModifiers = method.modifiers.filterNot(validMethodModifiers::contains)
+        if (invalidModifiers.isNotEmpty()) {
+            logger.error(
+                "Error in $name: method contains invalid modifiers (${
+                    invalidModifiers.map { it.name.lowercase() }.sorted().joinToString(limit = 3)
+                })."
+            )
+        }
+        if (!method.modifiers.contains(Modifier.SUSPEND)) {
+            logger.error("Error in $name: method should be a suspend function.")
+        }
+    }
+
+    fun validateParameter(method: KSFunctionDeclaration, parameter: KSValueParameter) {
+        val name = method.qualifiedName?.getFullName() ?: method.simpleName.getFullName()
+        if (parameter.hasDefault) {
+            logger.error("Error in $name: parameters cannot have default values.")
+        }
+    }
+
+    fun validateType(method: KSFunctionDeclaration, type: KSType) {
+        val name = getMethodName(method)
+        if (!primitiveTypes.contains(type)) {
+            logger.error("Error in $name: only primitive types are supported.")
+        }
+    }
+
+    private fun getPrimitiveTypes(builtIns: KSBuiltIns) = listOf(
+        builtIns.booleanType,
+        builtIns.shortType,
+        builtIns.intType,
+        builtIns.longType,
+        builtIns.floatType,
+        builtIns.doubleType,
+        builtIns.charType,
+        builtIns.stringType,
+        builtIns.unitType,
+    )
+
+    private fun getMethodName(method: KSFunctionDeclaration) =
+        method.qualifiedName?.getFullName() ?: method.simpleName.getFullName()
+}
\ No newline at end of file
diff --git a/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/parser/ApiParserTest.kt b/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/parser/ApiParserTest.kt
new file mode 100644
index 0000000..a4ad823
--- /dev/null
+++ b/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/parser/ApiParserTest.kt
@@ -0,0 +1,101 @@
+/*
+ * 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.privacysandbox.tools.apicompiler.parser
+
+import androidx.privacysandbox.tools.apicompiler.model.AnnotatedInterface
+import androidx.privacysandbox.tools.apicompiler.model.Method
+import androidx.privacysandbox.tools.apicompiler.model.Parameter
+import androidx.privacysandbox.tools.apicompiler.model.ParsedApi
+import androidx.privacysandbox.tools.apicompiler.model.Type
+import androidx.privacysandbox.tools.apicompiler.util.checkSourceFails
+import androidx.privacysandbox.tools.apicompiler.util.parseSource
+import androidx.room.compiler.processing.util.Source
+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 ApiParserTest {
+
+    @Test
+    fun parseServiceInterface_ok() {
+        val source =
+            Source.kotlin(
+                "com/mysdk/MySdk.kt",
+                """
+                    package com.mysdk
+                    import androidx.privacysandbox.tools.PrivacySandboxService
+                    @PrivacySandboxService
+                    interface MySdk {
+                        fun doStuff(x: Int, y: Int): String
+                    }
+                """
+            )
+        assertThat(parseSource(source)).isEqualTo(
+            ParsedApi(
+                services = mutableSetOf(
+                    AnnotatedInterface(
+                        name = "MySdk",
+                        packageName = "com.mysdk",
+                        methods = listOf(
+                            Method(
+                                name = "doStuff",
+                                parameters = listOf(
+                                    Parameter(
+                                        name = "x",
+                                        type = Type(
+                                            name = "Int",
+                                        )
+                                    ),
+                                    Parameter(
+                                        name = "y",
+                                        type = Type(
+                                            name = "Int",
+                                        )
+                                    )
+                                ),
+                                returnType = Type(
+                                    name = "String",
+                                )
+                            )
+                        )
+                    )
+                )
+            )
+        )
+    }
+
+    @Test
+    fun serviceAnnotatedClass_fails() {
+        val source =
+            Source.kotlin(
+                "com/mysdk/MySdk.kt",
+                """
+                    package com.mysdk
+                    import androidx.privacysandbox.tools.PrivacySandboxService
+                    @PrivacySandboxService
+                    abstract class MySdk {  // Fails because it's a class, not an interface.
+                        abstract fun doStuff(x: Int, y: Int): String
+                    }
+                """
+            )
+
+        checkSourceFails(source)
+            .containsError("Only interfaces can be annotated with @PrivacySandboxService.")
+    }
+}
\ No newline at end of file
diff --git a/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/parser/ApiValidatorTest.kt b/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/parser/ApiValidatorTest.kt
new file mode 100644
index 0000000..a6d124c
--- /dev/null
+++ b/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/parser/ApiValidatorTest.kt
@@ -0,0 +1,179 @@
+/*
+ * 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.privacysandbox.tools.apicompiler.parser
+
+import androidx.privacysandbox.tools.apicompiler.util.checkSourceFails
+import androidx.room.compiler.processing.util.Source
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class ApiValidatorTest {
+    @Test
+    fun privateInterface_fails() {
+        checkSourceFails(
+            serviceInterface("private interface MySdk")
+        ).containsError("Error in com.mysdk.MySdk: annotated interfaces should be public.")
+    }
+
+    @Test
+    fun interfaceWithProperties_fails() {
+        checkSourceFails(
+            serviceInterface(
+                """public interface MySdk {
+                    |   val x: Int
+                    |}
+                """.trimMargin()
+            )
+        ).containsExactlyErrors(
+            "Error in com.mysdk.MySdk: annotated interfaces cannot declare properties."
+        )
+    }
+
+    @Test
+    fun interfaceWithCompanionObject_fails() {
+        checkSourceFails(
+            serviceInterface(
+                """interface MySdk {
+                    |   companion object {
+                    |       fun foo() {}
+                    |   }
+                    |}
+                """.trimMargin()
+            )
+        ).containsExactlyErrors(
+            "Error in com.mysdk.MySdk: annotated interfaces cannot declare companion objects."
+        )
+    }
+
+    @Test
+    fun interfaceWithInvalidModifier_fails() {
+        checkSourceFails(
+            serviceInterface(
+                """external fun interface MySdk {
+                    |   suspend fun apply()
+                    |}
+                """.trimMargin()
+            )
+        ).containsExactlyErrors(
+            "Error in com.mysdk.MySdk: annotated interface contains invalid modifiers (external, " +
+                "fun)."
+        )
+    }
+
+    @Test
+    fun interfaceWithGenerics_fails() {
+        checkSourceFails(
+            serviceInterface(
+                """interface MySdk<T, U> {
+                    |   suspend fun getT()
+                    |}
+                """.trimMargin()
+            )
+        ).containsExactlyErrors(
+            "Error in com.mysdk.MySdk: annotated interfaces cannot declare type parameters (T, U)."
+        )
+    }
+
+    @Test
+    fun methodWithImplementation_fails() {
+        checkSourceFails(serviceMethod("suspend fun foo(): Int = 1")).containsExactlyErrors(
+            "Error in com.mysdk.MySdk.foo: method cannot have default implementation."
+        )
+    }
+
+    @Test
+    fun methodWithGenerics_fails() {
+        checkSourceFails(serviceMethod("suspend fun <T> foo()")).containsExactlyErrors(
+            "Error in com.mysdk.MySdk.foo: method cannot declare type parameters (<T>)."
+        )
+    }
+
+    @Test
+    fun methodWithInvalidModifiers_fails() {
+        checkSourceFails(serviceMethod("suspend inline fun foo()")).containsExactlyErrors(
+            "Error in com.mysdk.MySdk.foo: method contains invalid modifiers (inline)."
+        )
+    }
+
+    @Test
+    fun nonSuspendMethod_fails() {
+        checkSourceFails(serviceMethod("fun foo()")).containsExactlyErrors(
+            "Error in com.mysdk.MySdk.foo: method should be a suspend function."
+        )
+    }
+
+    @Test
+    fun parameterWitDefaultValue_fails() {
+        checkSourceFails(serviceMethod("suspend fun foo(x: Int = 5)")).containsExactlyErrors(
+            "Error in com.mysdk.MySdk.foo: parameters cannot have default values."
+        )
+    }
+
+    @Test
+    fun parameterWithGenerics_fails() {
+        checkSourceFails(serviceMethod("suspend fun foo(x: MutableList<Int>)"))
+            .containsExactlyErrors(
+                "Error in com.mysdk.MySdk.foo: only primitive types are supported."
+            )
+    }
+
+    @Test
+    fun parameterLambda_fails() {
+        checkSourceFails(serviceMethod("suspend fun foo(x: (Int) -> Int)"))
+            .containsExactlyErrors(
+                "Error in com.mysdk.MySdk.foo: only primitive types are supported."
+            )
+    }
+
+    @Test
+    fun returnTypeCustomClass_fails() {
+        val source = Source.kotlin(
+            "com/mysdk/MySdk.kt", """
+                    package com.mysdk
+                    import androidx.privacysandbox.tools.PrivacySandboxService
+                    @PrivacySandboxService
+                    interface MySdk {
+                        suspend fun foo(): CustomClass
+                    }
+
+                    class CustomClass
+                """
+        )
+        checkSourceFails(source).containsExactlyErrors(
+            "Error in com.mysdk.MySdk.foo: only primitive types are supported."
+        )
+    }
+
+    private fun serviceInterface(declaration: String) = Source.kotlin(
+        "com/mysdk/MySdk.kt", """
+            package com.mysdk
+            import androidx.privacysandbox.tools.PrivacySandboxService
+            @PrivacySandboxService
+            $declaration
+        """
+    )
+
+    private fun serviceMethod(declaration: String) = serviceInterface(
+        """
+            interface MySdk {
+                $declaration
+            }
+        """
+    )
+}
\ No newline at end of file
diff --git a/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/util/KspTestRunner.kt b/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/util/KspTestRunner.kt
new file mode 100644
index 0000000..1971f57
--- /dev/null
+++ b/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/util/KspTestRunner.kt
@@ -0,0 +1,97 @@
+/*
+ * 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.privacysandbox.tools.apicompiler.util
+
+import androidx.privacysandbox.tools.apicompiler.model.ParsedApi
+import androidx.privacysandbox.tools.apicompiler.parser.ApiParser
+import androidx.room.compiler.processing.util.DiagnosticMessage
+import androidx.room.compiler.processing.util.Source
+import androidx.room.compiler.processing.util.compiler.TestCompilationArguments
+import androidx.room.compiler.processing.util.compiler.TestCompilationResult
+import androidx.room.compiler.processing.util.compiler.compile
+import com.google.common.truth.Truth.assertThat
+import com.google.devtools.ksp.processing.KSPLogger
+import com.google.devtools.ksp.processing.Resolver
+import com.google.devtools.ksp.processing.SymbolProcessor
+import com.google.devtools.ksp.processing.SymbolProcessorEnvironment
+import com.google.devtools.ksp.processing.SymbolProcessorProvider
+import com.google.devtools.ksp.symbol.KSAnnotated
+import java.nio.file.Files
+import javax.tools.Diagnostic
+
+/**
+ * Helper to run KSP processing functionality in tests.
+ */
+fun parseSource(source: Source): ParsedApi {
+    val provider = CapturingSymbolProcessor.Provider()
+    compile(
+        Files.createTempDirectory("test").toFile(),
+        TestCompilationArguments(
+            sources = listOf(source),
+            symbolProcessorProviders = listOf(provider),
+        )
+    )
+    assert(provider.processor.capture != null) { "KSP run didn't produce any output." }
+    return provider.processor.capture!!
+}
+
+fun checkSourceFails(source: Source): CompilationResultSubject {
+    val provider = CapturingSymbolProcessor.Provider()
+    val result = compile(
+        Files.createTempDirectory("test").toFile(),
+        TestCompilationArguments(
+            sources = listOf(source),
+            symbolProcessorProviders = listOf(provider)
+        )
+    )
+    assertThat(result.success).isFalse()
+    return CompilationResultSubject(result)
+}
+
+class CompilationResultSubject(private val result: TestCompilationResult) {
+    fun containsError(error: String) {
+        assertThat(getErrorMessages())
+            .contains(error)
+    }
+
+    fun containsExactlyErrors(vararg errors: String) {
+        assertThat(getErrorMessages())
+            .containsExactly(*errors)
+    }
+
+    private fun getErrorMessages() =
+        result.diagnostics[Diagnostic.Kind.ERROR]?.map(DiagnosticMessage::msg)
+}
+
+private class CapturingSymbolProcessor(private val logger: KSPLogger) : SymbolProcessor {
+    var capture: ParsedApi? = null
+
+    override fun process(resolver: Resolver): List<KSAnnotated> {
+        capture = ApiParser(resolver, logger).parseApi()
+        return emptyList()
+    }
+
+    class Provider : SymbolProcessorProvider {
+        lateinit var processor: CapturingSymbolProcessor
+
+        override fun create(environment: SymbolProcessorEnvironment): SymbolProcessor {
+            assert(!::processor.isInitialized)
+            processor = CapturingSymbolProcessor(environment.logger)
+            return processor
+        }
+    }
+}
diff --git a/recyclerview/recyclerview/api/1.3.0-beta03.txt b/recyclerview/recyclerview/api/1.3.0-beta03.txt
new file mode 100644
index 0000000..7e45fbb
--- /dev/null
+++ b/recyclerview/recyclerview/api/1.3.0-beta03.txt
@@ -0,0 +1,1092 @@
+// Signature format: 4.0
+package androidx.recyclerview.widget {
+
+  public final class AdapterListUpdateCallback implements androidx.recyclerview.widget.ListUpdateCallback {
+    ctor public AdapterListUpdateCallback(androidx.recyclerview.widget.RecyclerView.Adapter);
+    method public void onChanged(int, int, Object!);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public final class AsyncDifferConfig<T> {
+    method public java.util.concurrent.Executor getBackgroundThreadExecutor();
+    method public androidx.recyclerview.widget.DiffUtil.ItemCallback<T!> getDiffCallback();
+  }
+
+  public static final class AsyncDifferConfig.Builder<T> {
+    ctor public AsyncDifferConfig.Builder(androidx.recyclerview.widget.DiffUtil.ItemCallback<T!>);
+    method public androidx.recyclerview.widget.AsyncDifferConfig<T!> build();
+    method public androidx.recyclerview.widget.AsyncDifferConfig.Builder<T!> setBackgroundThreadExecutor(java.util.concurrent.Executor?);
+  }
+
+  public class AsyncListDiffer<T> {
+    ctor public AsyncListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter, androidx.recyclerview.widget.DiffUtil.ItemCallback<T!>);
+    ctor public AsyncListDiffer(androidx.recyclerview.widget.ListUpdateCallback, androidx.recyclerview.widget.AsyncDifferConfig<T!>);
+    method public void addListListener(androidx.recyclerview.widget.AsyncListDiffer.ListListener<T!>);
+    method public java.util.List<T!> getCurrentList();
+    method public void removeListListener(androidx.recyclerview.widget.AsyncListDiffer.ListListener<T!>);
+    method public void submitList(java.util.List<T!>?);
+    method public void submitList(java.util.List<T!>?, Runnable?);
+  }
+
+  public static interface AsyncListDiffer.ListListener<T> {
+    method public void onCurrentListChanged(java.util.List<T!>, java.util.List<T!>);
+  }
+
+  public class AsyncListUtil<T> {
+    ctor public AsyncListUtil(Class<T!>, int, androidx.recyclerview.widget.AsyncListUtil.DataCallback<T!>, androidx.recyclerview.widget.AsyncListUtil.ViewCallback);
+    method public T? getItem(int);
+    method public int getItemCount();
+    method public void onRangeChanged();
+    method public void refresh();
+  }
+
+  public abstract static class AsyncListUtil.DataCallback<T> {
+    ctor public AsyncListUtil.DataCallback();
+    method @WorkerThread public abstract void fillData(T![], int, int);
+    method @WorkerThread public int getMaxCachedTiles();
+    method @WorkerThread public void recycleData(T![], int);
+    method @WorkerThread public abstract int refreshData();
+  }
+
+  public abstract static class AsyncListUtil.ViewCallback {
+    ctor public AsyncListUtil.ViewCallback();
+    method @UiThread public void extendRangeInto(int[], int[], int);
+    method @UiThread public abstract void getItemRangeInto(int[]);
+    method @UiThread public abstract void onDataRefresh();
+    method @UiThread public abstract void onItemLoaded(int);
+    field public static final int HINT_SCROLL_ASC = 2; // 0x2
+    field public static final int HINT_SCROLL_DESC = 1; // 0x1
+    field public static final int HINT_SCROLL_NONE = 0; // 0x0
+  }
+
+  public class BatchingListUpdateCallback implements androidx.recyclerview.widget.ListUpdateCallback {
+    ctor public BatchingListUpdateCallback(androidx.recyclerview.widget.ListUpdateCallback);
+    method public void dispatchLastEvent();
+    method public void onChanged(int, int, Object!);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public final class ConcatAdapter extends androidx.recyclerview.widget.RecyclerView.Adapter<androidx.recyclerview.widget.RecyclerView.ViewHolder> {
+    ctor @java.lang.SafeVarargs public ConcatAdapter(androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>!...);
+    ctor @java.lang.SafeVarargs public ConcatAdapter(androidx.recyclerview.widget.ConcatAdapter.Config, androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>!...);
+    ctor public ConcatAdapter(java.util.List<? extends androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>>);
+    ctor public ConcatAdapter(androidx.recyclerview.widget.ConcatAdapter.Config, java.util.List<? extends androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>>);
+    method public boolean addAdapter(androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>);
+    method public boolean addAdapter(int, androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>);
+    method public java.util.List<? extends androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>> getAdapters();
+    method public int getItemCount();
+    method public android.util.Pair<androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>!,java.lang.Integer!> getWrappedAdapterAndPosition(int);
+    method public void onBindViewHolder(androidx.recyclerview.widget.RecyclerView.ViewHolder, int);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
+    method public boolean onFailedToRecycleView(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void onViewAttachedToWindow(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void onViewDetachedFromWindow(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void onViewRecycled(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public boolean removeAdapter(androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>);
+  }
+
+  public static final class ConcatAdapter.Config {
+    field public static final androidx.recyclerview.widget.ConcatAdapter.Config DEFAULT;
+    field public final boolean isolateViewTypes;
+    field public final androidx.recyclerview.widget.ConcatAdapter.Config.StableIdMode stableIdMode;
+  }
+
+  public static final class ConcatAdapter.Config.Builder {
+    ctor public ConcatAdapter.Config.Builder();
+    method public androidx.recyclerview.widget.ConcatAdapter.Config build();
+    method public androidx.recyclerview.widget.ConcatAdapter.Config.Builder setIsolateViewTypes(boolean);
+    method public androidx.recyclerview.widget.ConcatAdapter.Config.Builder setStableIdMode(androidx.recyclerview.widget.ConcatAdapter.Config.StableIdMode);
+  }
+
+  public enum ConcatAdapter.Config.StableIdMode {
+    enum_constant public static final androidx.recyclerview.widget.ConcatAdapter.Config.StableIdMode ISOLATED_STABLE_IDS;
+    enum_constant public static final androidx.recyclerview.widget.ConcatAdapter.Config.StableIdMode NO_STABLE_IDS;
+    enum_constant public static final androidx.recyclerview.widget.ConcatAdapter.Config.StableIdMode SHARED_STABLE_IDS;
+  }
+
+  public class DefaultItemAnimator extends androidx.recyclerview.widget.SimpleItemAnimator {
+    ctor public DefaultItemAnimator();
+    method public boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void endAnimations();
+    method public boolean isRunning();
+    method public void runPendingAnimations();
+  }
+
+  public class DiffUtil {
+    method public static androidx.recyclerview.widget.DiffUtil.DiffResult calculateDiff(androidx.recyclerview.widget.DiffUtil.Callback);
+    method public static androidx.recyclerview.widget.DiffUtil.DiffResult calculateDiff(androidx.recyclerview.widget.DiffUtil.Callback, boolean);
+  }
+
+  public abstract static class DiffUtil.Callback {
+    ctor public DiffUtil.Callback();
+    method public abstract boolean areContentsTheSame(int, int);
+    method public abstract boolean areItemsTheSame(int, int);
+    method public Object? getChangePayload(int, int);
+    method public abstract int getNewListSize();
+    method public abstract int getOldListSize();
+  }
+
+  public static class DiffUtil.DiffResult {
+    method public int convertNewPositionToOld(@IntRange(from=0) int);
+    method public int convertOldPositionToNew(@IntRange(from=0) int);
+    method public void dispatchUpdatesTo(androidx.recyclerview.widget.RecyclerView.Adapter);
+    method public void dispatchUpdatesTo(androidx.recyclerview.widget.ListUpdateCallback);
+    field public static final int NO_POSITION = -1; // 0xffffffff
+  }
+
+  public abstract static class DiffUtil.ItemCallback<T> {
+    ctor public DiffUtil.ItemCallback();
+    method public abstract boolean areContentsTheSame(T, T);
+    method public abstract boolean areItemsTheSame(T, T);
+    method public Object? getChangePayload(T, T);
+  }
+
+  public class DividerItemDecoration extends androidx.recyclerview.widget.RecyclerView.ItemDecoration {
+    ctor public DividerItemDecoration(android.content.Context!, int);
+    method public android.graphics.drawable.Drawable? getDrawable();
+    method public void setDrawable(android.graphics.drawable.Drawable);
+    method public void setOrientation(int);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public class GridLayoutManager extends androidx.recyclerview.widget.LinearLayoutManager {
+    ctor public GridLayoutManager(android.content.Context!, android.util.AttributeSet!, int, int);
+    ctor public GridLayoutManager(android.content.Context!, int);
+    ctor public GridLayoutManager(android.content.Context!, int, int, boolean);
+    method public int getSpanCount();
+    method public androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup! getSpanSizeLookup();
+    method public boolean isUsingSpansToEstimateScrollbarDimensions();
+    method public void setSpanCount(int);
+    method public void setSpanSizeLookup(androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup!);
+    method public void setUsingSpansToEstimateScrollbarDimensions(boolean);
+    field public static final int DEFAULT_SPAN_COUNT = -1; // 0xffffffff
+  }
+
+  public static final class GridLayoutManager.DefaultSpanSizeLookup extends androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup {
+    ctor public GridLayoutManager.DefaultSpanSizeLookup();
+    method public int getSpanSize(int);
+  }
+
+  public static class GridLayoutManager.LayoutParams extends androidx.recyclerview.widget.RecyclerView.LayoutParams {
+    ctor public GridLayoutManager.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public GridLayoutManager.LayoutParams(int, int);
+    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public GridLayoutManager.LayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+    method public int getSpanIndex();
+    method public int getSpanSize();
+    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
+  }
+
+  public abstract static class GridLayoutManager.SpanSizeLookup {
+    ctor public GridLayoutManager.SpanSizeLookup();
+    method public int getSpanGroupIndex(int, int);
+    method public int getSpanIndex(int, int);
+    method public abstract int getSpanSize(int);
+    method public void invalidateSpanGroupIndexCache();
+    method public void invalidateSpanIndexCache();
+    method public boolean isSpanGroupIndexCacheEnabled();
+    method public boolean isSpanIndexCacheEnabled();
+    method public void setSpanGroupIndexCacheEnabled(boolean);
+    method public void setSpanIndexCacheEnabled(boolean);
+  }
+
+  public class ItemTouchHelper extends androidx.recyclerview.widget.RecyclerView.ItemDecoration implements androidx.recyclerview.widget.RecyclerView.OnChildAttachStateChangeListener {
+    ctor public ItemTouchHelper(androidx.recyclerview.widget.ItemTouchHelper.Callback);
+    method public void attachToRecyclerView(androidx.recyclerview.widget.RecyclerView?);
+    method public void onChildViewAttachedToWindow(android.view.View);
+    method public void onChildViewDetachedFromWindow(android.view.View);
+    method public void startDrag(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void startSwipe(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    field public static final int ACTION_STATE_DRAG = 2; // 0x2
+    field public static final int ACTION_STATE_IDLE = 0; // 0x0
+    field public static final int ACTION_STATE_SWIPE = 1; // 0x1
+    field public static final int ANIMATION_TYPE_DRAG = 8; // 0x8
+    field public static final int ANIMATION_TYPE_SWIPE_CANCEL = 4; // 0x4
+    field public static final int ANIMATION_TYPE_SWIPE_SUCCESS = 2; // 0x2
+    field public static final int DOWN = 2; // 0x2
+    field public static final int END = 32; // 0x20
+    field public static final int LEFT = 4; // 0x4
+    field public static final int RIGHT = 8; // 0x8
+    field public static final int START = 16; // 0x10
+    field public static final int UP = 1; // 0x1
+  }
+
+  public abstract static class ItemTouchHelper.Callback {
+    ctor public ItemTouchHelper.Callback();
+    method public boolean canDropOver(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder! chooseDropTarget(androidx.recyclerview.widget.RecyclerView.ViewHolder, java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder!>, int, int);
+    method public void clearView(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public int convertToAbsoluteDirection(int, int);
+    method public static int convertToRelativeDirection(int, int);
+    method public long getAnimationDuration(androidx.recyclerview.widget.RecyclerView, int, float, float);
+    method public int getBoundingBoxMargin();
+    method public static androidx.recyclerview.widget.ItemTouchUIUtil getDefaultUIUtil();
+    method public float getMoveThreshold(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public abstract int getMovementFlags(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public float getSwipeEscapeVelocity(float);
+    method public float getSwipeThreshold(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public float getSwipeVelocityThreshold(float);
+    method public int interpolateOutOfBoundsScroll(androidx.recyclerview.widget.RecyclerView, int, int, int, long);
+    method public boolean isItemViewSwipeEnabled();
+    method public boolean isLongPressDragEnabled();
+    method public static int makeFlag(int, int);
+    method public static int makeMovementFlags(int, int);
+    method public void onChildDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, float, float, int, boolean);
+    method public void onChildDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder!, float, float, int, boolean);
+    method public abstract boolean onMove(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void onMoved(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int);
+    method public void onSelectedChanged(androidx.recyclerview.widget.RecyclerView.ViewHolder?, int);
+    method public abstract void onSwiped(androidx.recyclerview.widget.RecyclerView.ViewHolder, int);
+    field public static final int DEFAULT_DRAG_ANIMATION_DURATION = 200; // 0xc8
+    field public static final int DEFAULT_SWIPE_ANIMATION_DURATION = 250; // 0xfa
+  }
+
+  public abstract static class ItemTouchHelper.SimpleCallback extends androidx.recyclerview.widget.ItemTouchHelper.Callback {
+    ctor public ItemTouchHelper.SimpleCallback(int, int);
+    method public int getDragDirs(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public int getMovementFlags(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public int getSwipeDirs(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void setDefaultDragDirs(int);
+    method public void setDefaultSwipeDirs(int);
+  }
+
+  public static interface ItemTouchHelper.ViewDropHandler {
+    method public void prepareForDrop(android.view.View, android.view.View, int, int);
+  }
+
+  public interface ItemTouchUIUtil {
+    method public void clearView(android.view.View!);
+    method public void onDraw(android.graphics.Canvas!, androidx.recyclerview.widget.RecyclerView!, android.view.View!, float, float, int, boolean);
+    method public void onDrawOver(android.graphics.Canvas!, androidx.recyclerview.widget.RecyclerView!, android.view.View!, float, float, int, boolean);
+    method public void onSelected(android.view.View!);
+  }
+
+  public class LinearLayoutManager extends androidx.recyclerview.widget.RecyclerView.LayoutManager implements androidx.recyclerview.widget.ItemTouchHelper.ViewDropHandler androidx.recyclerview.widget.RecyclerView.SmoothScroller.ScrollVectorProvider {
+    ctor public LinearLayoutManager(android.content.Context!);
+    ctor public LinearLayoutManager(android.content.Context!, int, boolean);
+    ctor public LinearLayoutManager(android.content.Context!, android.util.AttributeSet!, int, int);
+    method protected void calculateExtraLayoutSpace(androidx.recyclerview.widget.RecyclerView.State, int[]);
+    method public android.graphics.PointF! computeScrollVectorForPosition(int);
+    method public int findFirstCompletelyVisibleItemPosition();
+    method public int findFirstVisibleItemPosition();
+    method public int findLastCompletelyVisibleItemPosition();
+    method public int findLastVisibleItemPosition();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
+    method @Deprecated protected int getExtraLayoutSpace(androidx.recyclerview.widget.RecyclerView.State!);
+    method public int getInitialPrefetchItemCount();
+    method public int getOrientation();
+    method public boolean getRecycleChildrenOnDetach();
+    method public boolean getReverseLayout();
+    method public boolean getStackFromEnd();
+    method protected boolean isLayoutRTL();
+    method public boolean isSmoothScrollbarEnabled();
+    method public void prepareForDrop(android.view.View, android.view.View, int, int);
+    method public void scrollToPositionWithOffset(int, int);
+    method public void setInitialPrefetchItemCount(int);
+    method public void setOrientation(int);
+    method public void setRecycleChildrenOnDetach(boolean);
+    method public void setReverseLayout(boolean);
+    method public void setSmoothScrollbarEnabled(boolean);
+    method public void setStackFromEnd(boolean);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int INVALID_OFFSET = -2147483648; // 0x80000000
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  protected static class LinearLayoutManager.LayoutChunkResult {
+    ctor protected LinearLayoutManager.LayoutChunkResult();
+    field public int mConsumed;
+    field public boolean mFinished;
+    field public boolean mFocusable;
+    field public boolean mIgnoreConsumed;
+  }
+
+  public class LinearSmoothScroller extends androidx.recyclerview.widget.RecyclerView.SmoothScroller {
+    ctor public LinearSmoothScroller(android.content.Context!);
+    method public int calculateDtToFit(int, int, int, int, int);
+    method public int calculateDxToMakeVisible(android.view.View!, int);
+    method public int calculateDyToMakeVisible(android.view.View!, int);
+    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics!);
+    method protected int calculateTimeForDeceleration(int);
+    method protected int calculateTimeForScrolling(int);
+    method protected int getHorizontalSnapPreference();
+    method protected int getVerticalSnapPreference();
+    method protected void onSeekTargetStep(int, int, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
+    method protected void onStart();
+    method protected void onStop();
+    method protected void onTargetFound(android.view.View!, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
+    method protected void updateActionForInterimTarget(androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
+    field public static final int SNAP_TO_ANY = 0; // 0x0
+    field public static final int SNAP_TO_END = 1; // 0x1
+    field public static final int SNAP_TO_START = -1; // 0xffffffff
+    field protected final android.view.animation.DecelerateInterpolator! mDecelerateInterpolator;
+    field protected int mInterimTargetDx;
+    field protected int mInterimTargetDy;
+    field protected final android.view.animation.LinearInterpolator! mLinearInterpolator;
+    field protected android.graphics.PointF! mTargetVector;
+  }
+
+  public class LinearSnapHelper extends androidx.recyclerview.widget.SnapHelper {
+    ctor public LinearSnapHelper();
+    method public int[]! calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
+    method public android.view.View! findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
+  }
+
+  public abstract class ListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
+    ctor protected ListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T!>);
+    ctor protected ListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T!>);
+    method public java.util.List<T!> getCurrentList();
+    method protected T! getItem(int);
+    method public int getItemCount();
+    method public void onCurrentListChanged(java.util.List<T!>, java.util.List<T!>);
+    method public void submitList(java.util.List<T!>?);
+    method public void submitList(java.util.List<T!>?, Runnable?);
+  }
+
+  public interface ListUpdateCallback {
+    method public void onChanged(int, int, Object?);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public abstract class OrientationHelper {
+    method public static androidx.recyclerview.widget.OrientationHelper! createHorizontalHelper(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public static androidx.recyclerview.widget.OrientationHelper! createOrientationHelper(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int);
+    method public static androidx.recyclerview.widget.OrientationHelper! createVerticalHelper(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public abstract int getDecoratedEnd(android.view.View!);
+    method public abstract int getDecoratedMeasurement(android.view.View!);
+    method public abstract int getDecoratedMeasurementInOther(android.view.View!);
+    method public abstract int getDecoratedStart(android.view.View!);
+    method public abstract int getEnd();
+    method public abstract int getEndAfterPadding();
+    method public abstract int getEndPadding();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutManager! getLayoutManager();
+    method public abstract int getMode();
+    method public abstract int getModeInOther();
+    method public abstract int getStartAfterPadding();
+    method public abstract int getTotalSpace();
+    method public int getTotalSpaceChange();
+    method public abstract int getTransformedEndWithDecoration(android.view.View!);
+    method public abstract int getTransformedStartWithDecoration(android.view.View!);
+    method public abstract void offsetChild(android.view.View!, int);
+    method public abstract void offsetChildren(int);
+    method public void onLayoutComplete();
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+    field protected final androidx.recyclerview.widget.RecyclerView.LayoutManager! mLayoutManager;
+  }
+
+  public class PagerSnapHelper extends androidx.recyclerview.widget.SnapHelper {
+    ctor public PagerSnapHelper();
+    method public int[]? calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
+    method public android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
+  }
+
+  public class RecyclerView extends android.view.ViewGroup implements androidx.core.view.NestedScrollingChild2 androidx.core.view.NestedScrollingChild3 androidx.core.view.ScrollingView {
+    ctor public RecyclerView(android.content.Context);
+    ctor public RecyclerView(android.content.Context, android.util.AttributeSet?);
+    ctor public RecyclerView(android.content.Context, android.util.AttributeSet?, int);
+    method public void addItemDecoration(androidx.recyclerview.widget.RecyclerView.ItemDecoration, int);
+    method public void addItemDecoration(androidx.recyclerview.widget.RecyclerView.ItemDecoration);
+    method public void addOnChildAttachStateChangeListener(androidx.recyclerview.widget.RecyclerView.OnChildAttachStateChangeListener);
+    method public void addOnItemTouchListener(androidx.recyclerview.widget.RecyclerView.OnItemTouchListener);
+    method public void addOnScrollListener(androidx.recyclerview.widget.RecyclerView.OnScrollListener);
+    method public void addRecyclerListener(androidx.recyclerview.widget.RecyclerView.RecyclerListener);
+    method public void clearOnChildAttachStateChangeListeners();
+    method public void clearOnScrollListeners();
+    method public int computeHorizontalScrollExtent();
+    method public int computeHorizontalScrollOffset();
+    method public int computeHorizontalScrollRange();
+    method public int computeVerticalScrollExtent();
+    method public int computeVerticalScrollOffset();
+    method public int computeVerticalScrollRange();
+    method public boolean dispatchNestedPreScroll(int, int, int[]!, int[]!, int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]!, int);
+    method public final void dispatchNestedScroll(int, int, int, int, int[]!, int, int[]);
+    method public boolean drawChild(android.graphics.Canvas!, android.view.View!, long);
+    method public android.view.View? findChildViewUnder(float, float);
+    method public android.view.View? findContainingItemView(android.view.View);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? findContainingViewHolder(android.view.View);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? findViewHolderForAdapterPosition(int);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder! findViewHolderForItemId(long);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? findViewHolderForLayoutPosition(int);
+    method @Deprecated public androidx.recyclerview.widget.RecyclerView.ViewHolder? findViewHolderForPosition(int);
+    method public boolean fling(int, int);
+    method public androidx.recyclerview.widget.RecyclerView.Adapter? getAdapter();
+    method public int getChildAdapterPosition(android.view.View);
+    method public long getChildItemId(android.view.View);
+    method public int getChildLayoutPosition(android.view.View);
+    method @Deprecated public int getChildPosition(android.view.View);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder! getChildViewHolder(android.view.View);
+    method public androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate? getCompatAccessibilityDelegate();
+    method public void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
+    method public androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory getEdgeEffectFactory();
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator? getItemAnimator();
+    method public androidx.recyclerview.widget.RecyclerView.ItemDecoration getItemDecorationAt(int);
+    method public int getItemDecorationCount();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutManager? getLayoutManager();
+    method public int getMaxFlingVelocity();
+    method public int getMinFlingVelocity();
+    method public androidx.recyclerview.widget.RecyclerView.OnFlingListener? getOnFlingListener();
+    method public boolean getPreserveFocusAfterLayout();
+    method public androidx.recyclerview.widget.RecyclerView.RecycledViewPool getRecycledViewPool();
+    method public int getScrollState();
+    method public boolean hasFixedSize();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean hasPendingAdapterUpdates();
+    method public void invalidateItemDecorations();
+    method public boolean isAnimating();
+    method public boolean isComputingLayout();
+    method @Deprecated public boolean isLayoutFrozen();
+    method public final boolean isLayoutSuppressed();
+    method public void nestedScrollBy(int, int);
+    method public void offsetChildrenHorizontal(@Px int);
+    method public void offsetChildrenVertical(@Px int);
+    method public void onChildAttachedToWindow(android.view.View);
+    method public void onChildDetachedFromWindow(android.view.View);
+    method public void onDraw(android.graphics.Canvas!);
+    method public void onScrollStateChanged(int);
+    method public void onScrolled(@Px int, @Px int);
+    method public void removeItemDecoration(androidx.recyclerview.widget.RecyclerView.ItemDecoration);
+    method public void removeItemDecorationAt(int);
+    method public void removeOnChildAttachStateChangeListener(androidx.recyclerview.widget.RecyclerView.OnChildAttachStateChangeListener);
+    method public void removeOnItemTouchListener(androidx.recyclerview.widget.RecyclerView.OnItemTouchListener);
+    method public void removeOnScrollListener(androidx.recyclerview.widget.RecyclerView.OnScrollListener);
+    method public void removeRecyclerListener(androidx.recyclerview.widget.RecyclerView.RecyclerListener);
+    method public void scrollToPosition(int);
+    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 void setEdgeEffectFactory(androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory);
+    method public void setHasFixedSize(boolean);
+    method public void setItemAnimator(androidx.recyclerview.widget.RecyclerView.ItemAnimator?);
+    method public void setItemViewCacheSize(int);
+    method @Deprecated public void setLayoutFrozen(boolean);
+    method public void setLayoutManager(androidx.recyclerview.widget.RecyclerView.LayoutManager?);
+    method @Deprecated public void setLayoutTransition(android.animation.LayoutTransition!);
+    method public void setOnFlingListener(androidx.recyclerview.widget.RecyclerView.OnFlingListener?);
+    method @Deprecated public void setOnScrollListener(androidx.recyclerview.widget.RecyclerView.OnScrollListener?);
+    method public void setPreserveFocusAfterLayout(boolean);
+    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 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?);
+    method public void smoothScrollBy(@Px int, @Px int, android.view.animation.Interpolator?, int);
+    method public void smoothScrollToPosition(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+    method public void stopScroll();
+    method public final void suppressLayout(boolean);
+    method public void swapAdapter(androidx.recyclerview.widget.RecyclerView.Adapter?, boolean);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int INVALID_TYPE = -1; // 0xffffffff
+    field public static final long NO_ID = -1L; // 0xffffffffffffffffL
+    field public static final int NO_POSITION = -1; // 0xffffffff
+    field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
+    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
+    field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
+    field public static final int TOUCH_SLOP_DEFAULT = 0; // 0x0
+    field public static final int TOUCH_SLOP_PAGING = 1; // 0x1
+    field public static final int UNDEFINED_DURATION = -2147483648; // 0x80000000
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public abstract static class RecyclerView.Adapter<VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> {
+    ctor public RecyclerView.Adapter();
+    method public final void bindViewHolder(VH, int);
+    method public final VH createViewHolder(android.view.ViewGroup, int);
+    method public int findRelativeAdapterPositionIn(androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>, androidx.recyclerview.widget.RecyclerView.ViewHolder, int);
+    method public abstract int getItemCount();
+    method public long getItemId(int);
+    method public int getItemViewType(int);
+    method public final androidx.recyclerview.widget.RecyclerView.Adapter.StateRestorationPolicy getStateRestorationPolicy();
+    method public final boolean hasObservers();
+    method public final boolean hasStableIds();
+    method public final void notifyDataSetChanged();
+    method public final void notifyItemChanged(int);
+    method public final void notifyItemChanged(int, Object?);
+    method public final void notifyItemInserted(int);
+    method public final void notifyItemMoved(int, int);
+    method public final void notifyItemRangeChanged(int, int);
+    method public final void notifyItemRangeChanged(int, int, Object?);
+    method public final void notifyItemRangeInserted(int, int);
+    method public final void notifyItemRangeRemoved(int, int);
+    method public final void notifyItemRemoved(int);
+    method public void onAttachedToRecyclerView(androidx.recyclerview.widget.RecyclerView);
+    method public abstract void onBindViewHolder(VH, int);
+    method public void onBindViewHolder(VH, int, java.util.List<java.lang.Object!>);
+    method public abstract VH onCreateViewHolder(android.view.ViewGroup, int);
+    method public void onDetachedFromRecyclerView(androidx.recyclerview.widget.RecyclerView);
+    method public boolean onFailedToRecycleView(VH);
+    method public void onViewAttachedToWindow(VH);
+    method public void onViewDetachedFromWindow(VH);
+    method public void onViewRecycled(VH);
+    method public void registerAdapterDataObserver(androidx.recyclerview.widget.RecyclerView.AdapterDataObserver);
+    method public void setHasStableIds(boolean);
+    method public void setStateRestorationPolicy(androidx.recyclerview.widget.RecyclerView.Adapter.StateRestorationPolicy);
+    method public void unregisterAdapterDataObserver(androidx.recyclerview.widget.RecyclerView.AdapterDataObserver);
+  }
+
+  public enum RecyclerView.Adapter.StateRestorationPolicy {
+    enum_constant public static final androidx.recyclerview.widget.RecyclerView.Adapter.StateRestorationPolicy ALLOW;
+    enum_constant public static final androidx.recyclerview.widget.RecyclerView.Adapter.StateRestorationPolicy PREVENT;
+    enum_constant public static final androidx.recyclerview.widget.RecyclerView.Adapter.StateRestorationPolicy PREVENT_WHEN_EMPTY;
+  }
+
+  public abstract static class RecyclerView.AdapterDataObserver {
+    ctor public RecyclerView.AdapterDataObserver();
+    method public void onChanged();
+    method public void onItemRangeChanged(int, int);
+    method public void onItemRangeChanged(int, int, Object?);
+    method public void onItemRangeInserted(int, int);
+    method public void onItemRangeMoved(int, int, int);
+    method public void onItemRangeRemoved(int, int);
+    method public void onStateRestorationPolicyChanged();
+  }
+
+  public static interface RecyclerView.ChildDrawingOrderCallback {
+    method public int onGetChildDrawingOrder(int, int);
+  }
+
+  public static class RecyclerView.EdgeEffectFactory {
+    ctor public RecyclerView.EdgeEffectFactory();
+    method protected android.widget.EdgeEffect createEdgeEffect(androidx.recyclerview.widget.RecyclerView, @androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.EdgeDirection int);
+    field public static final int DIRECTION_BOTTOM = 3; // 0x3
+    field public static final int DIRECTION_LEFT = 0; // 0x0
+    field public static final int DIRECTION_RIGHT = 2; // 0x2
+    field public static final int DIRECTION_TOP = 1; // 0x1
+  }
+
+  @IntDef({androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.DIRECTION_LEFT, androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.DIRECTION_TOP, androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.DIRECTION_RIGHT, androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.DIRECTION_BOTTOM}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RecyclerView.EdgeEffectFactory.EdgeDirection {
+  }
+
+  public abstract static class RecyclerView.ItemAnimator {
+    ctor public RecyclerView.ItemAnimator();
+    method public abstract boolean animateAppearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateDisappearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?);
+    method public abstract boolean animatePersistence(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public boolean canReuseUpdatedViewHolder(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public boolean canReuseUpdatedViewHolder(androidx.recyclerview.widget.RecyclerView.ViewHolder, java.util.List<java.lang.Object!>);
+    method public final void dispatchAnimationFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public final void dispatchAnimationStarted(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public final void dispatchAnimationsFinished();
+    method public abstract void endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public abstract void endAnimations();
+    method public long getAddDuration();
+    method public long getChangeDuration();
+    method public long getMoveDuration();
+    method public long getRemoveDuration();
+    method public abstract boolean isRunning();
+    method public final boolean isRunning(androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemAnimatorFinishedListener?);
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo obtainHolderInfo();
+    method public void onAnimationFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void onAnimationStarted(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo recordPostLayoutInformation(androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo recordPreLayoutInformation(androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.ViewHolder, @androidx.recyclerview.widget.RecyclerView.ItemAnimator.AdapterChanges int, java.util.List<java.lang.Object!>);
+    method public abstract void runPendingAnimations();
+    method public void setAddDuration(long);
+    method public void setChangeDuration(long);
+    method public void setMoveDuration(long);
+    method public void setRemoveDuration(long);
+    field public static final int FLAG_APPEARED_IN_PRE_LAYOUT = 4096; // 0x1000
+    field public static final int FLAG_CHANGED = 2; // 0x2
+    field public static final int FLAG_INVALIDATED = 4; // 0x4
+    field public static final int FLAG_MOVED = 2048; // 0x800
+    field public static final int FLAG_REMOVED = 8; // 0x8
+  }
+
+  @IntDef(flag=true, value={androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_CHANGED, androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_REMOVED, androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_MOVED, androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_INVALIDATED, androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_APPEARED_IN_PRE_LAYOUT}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RecyclerView.ItemAnimator.AdapterChanges {
+  }
+
+  public static interface RecyclerView.ItemAnimator.ItemAnimatorFinishedListener {
+    method public void onAnimationsFinished();
+  }
+
+  public static class RecyclerView.ItemAnimator.ItemHolderInfo {
+    ctor public RecyclerView.ItemAnimator.ItemHolderInfo();
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo setFrom(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo setFrom(androidx.recyclerview.widget.RecyclerView.ViewHolder, @androidx.recyclerview.widget.RecyclerView.ItemAnimator.AdapterChanges int);
+    field public int bottom;
+    field @androidx.recyclerview.widget.RecyclerView.ItemAnimator.AdapterChanges public int changeFlags;
+    field public int left;
+    field public int right;
+    field public int top;
+  }
+
+  public abstract static class RecyclerView.ItemDecoration {
+    ctor public RecyclerView.ItemDecoration();
+    method @Deprecated public void getItemOffsets(android.graphics.Rect, int, androidx.recyclerview.widget.RecyclerView);
+    method public void getItemOffsets(android.graphics.Rect, android.view.View, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State);
+    method public void onDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State);
+    method @Deprecated public void onDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView);
+    method public void onDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State);
+    method @Deprecated public void onDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView);
+  }
+
+  public abstract static class RecyclerView.LayoutManager {
+    ctor public RecyclerView.LayoutManager();
+    method public void addDisappearingView(android.view.View!);
+    method public void addDisappearingView(android.view.View!, int);
+    method public void addView(android.view.View!);
+    method public void addView(android.view.View!, int);
+    method public void assertInLayoutOrScroll(String!);
+    method public void assertNotInLayoutOrScroll(String!);
+    method public void attachView(android.view.View, int, androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+    method public void attachView(android.view.View, int);
+    method public void attachView(android.view.View);
+    method public void calculateItemDecorationsForChild(android.view.View, android.graphics.Rect);
+    method public boolean canScrollHorizontally();
+    method public boolean canScrollVertically();
+    method public boolean checkLayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+    method public static int chooseSize(int, int, int);
+    method public void collectAdjacentPrefetchPositions(int, int, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry!);
+    method public void collectInitialPrefetchPositions(int, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry!);
+    method public int computeHorizontalScrollExtent(androidx.recyclerview.widget.RecyclerView.State);
+    method public int computeHorizontalScrollOffset(androidx.recyclerview.widget.RecyclerView.State);
+    method public int computeHorizontalScrollRange(androidx.recyclerview.widget.RecyclerView.State);
+    method public int computeVerticalScrollExtent(androidx.recyclerview.widget.RecyclerView.State);
+    method public int computeVerticalScrollOffset(androidx.recyclerview.widget.RecyclerView.State);
+    method public int computeVerticalScrollRange(androidx.recyclerview.widget.RecyclerView.State);
+    method public void detachAndScrapAttachedViews(androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public void detachAndScrapView(android.view.View, androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public void detachAndScrapViewAt(int, androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public void detachView(android.view.View);
+    method public void detachViewAt(int);
+    method public void endAnimation(android.view.View!);
+    method public android.view.View? findContainingItemView(android.view.View);
+    method public android.view.View? findViewByPosition(int);
+    method public abstract androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateLayoutParams(android.content.Context!, android.util.AttributeSet!);
+    method public int getBaseline();
+    method public int getBottomDecorationHeight(android.view.View);
+    method public android.view.View? getChildAt(int);
+    method public int getChildCount();
+    method @Deprecated public static int getChildMeasureSpec(int, int, int, boolean);
+    method public static int getChildMeasureSpec(int, int, int, int, boolean);
+    method public boolean getClipToPadding();
+    method public int getColumnCountForAccessibility(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public int getDecoratedBottom(android.view.View);
+    method public void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
+    method public int getDecoratedLeft(android.view.View);
+    method public int getDecoratedMeasuredHeight(android.view.View);
+    method public int getDecoratedMeasuredWidth(android.view.View);
+    method public int getDecoratedRight(android.view.View);
+    method public int getDecoratedTop(android.view.View);
+    method public android.view.View? getFocusedChild();
+    method @Px public int getHeight();
+    method public int getHeightMode();
+    method public int getItemCount();
+    method public int getItemViewType(android.view.View);
+    method public int getLayoutDirection();
+    method public int getLeftDecorationWidth(android.view.View);
+    method @Px public int getMinimumHeight();
+    method @Px public int getMinimumWidth();
+    method @Px public int getPaddingBottom();
+    method @Px public int getPaddingEnd();
+    method @Px public int getPaddingLeft();
+    method @Px public int getPaddingRight();
+    method @Px public int getPaddingStart();
+    method @Px public int getPaddingTop();
+    method public int getPosition(android.view.View);
+    method public static androidx.recyclerview.widget.RecyclerView.LayoutManager.Properties! getProperties(android.content.Context, android.util.AttributeSet?, int, int);
+    method public int getRightDecorationWidth(android.view.View);
+    method public int getRowCountForAccessibility(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public int getSelectionModeForAccessibility(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public int getTopDecorationHeight(android.view.View);
+    method public void getTransformedBoundingBox(android.view.View, boolean, android.graphics.Rect);
+    method @Px public int getWidth();
+    method public int getWidthMode();
+    method public boolean hasFocus();
+    method public void ignoreView(android.view.View);
+    method public boolean isAttachedToWindow();
+    method public boolean isAutoMeasureEnabled();
+    method public boolean isFocused();
+    method public final boolean isItemPrefetchEnabled();
+    method public boolean isLayoutHierarchical(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public boolean isMeasurementCacheEnabled();
+    method public boolean isSmoothScrolling();
+    method public boolean isViewPartiallyVisible(android.view.View, boolean, boolean);
+    method public void layoutDecorated(android.view.View, int, int, int, int);
+    method public void layoutDecoratedWithMargins(android.view.View, int, int, int, int);
+    method public void measureChild(android.view.View, int, int);
+    method public void measureChildWithMargins(android.view.View, int, int);
+    method public void moveView(int, int);
+    method public void offsetChildrenHorizontal(@Px int);
+    method public void offsetChildrenVertical(@Px int);
+    method public void onAdapterChanged(androidx.recyclerview.widget.RecyclerView.Adapter?, androidx.recyclerview.widget.RecyclerView.Adapter?);
+    method public boolean onAddFocusables(androidx.recyclerview.widget.RecyclerView, java.util.ArrayList<android.view.View!>, int, int);
+    method @CallSuper public void onAttachedToWindow(androidx.recyclerview.widget.RecyclerView!);
+    method @Deprecated public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView!);
+    method @CallSuper public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.Recycler!);
+    method public android.view.View? onFocusSearchFailed(android.view.View, int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
+    method public void onInitializeAccessibilityEvent(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, android.view.accessibility.AccessibilityEvent);
+    method public void onInitializeAccessibilityNodeInfo(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
+    method public void onInitializeAccessibilityNodeInfoForItem(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
+    method public android.view.View? onInterceptFocusSearch(android.view.View, int);
+    method public void onItemsAdded(androidx.recyclerview.widget.RecyclerView, int, int);
+    method public void onItemsChanged(androidx.recyclerview.widget.RecyclerView);
+    method public void onItemsMoved(androidx.recyclerview.widget.RecyclerView, int, int, int);
+    method public void onItemsRemoved(androidx.recyclerview.widget.RecyclerView, int, int);
+    method public void onItemsUpdated(androidx.recyclerview.widget.RecyclerView, int, int);
+    method public void onItemsUpdated(androidx.recyclerview.widget.RecyclerView, int, int, Object?);
+    method public void onLayoutChildren(androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
+    method public void onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State!);
+    method public void onMeasure(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, int, int);
+    method @Deprecated public boolean onRequestChildFocus(androidx.recyclerview.widget.RecyclerView, android.view.View, android.view.View?);
+    method public boolean onRequestChildFocus(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State, android.view.View, android.view.View?);
+    method public void onRestoreInstanceState(android.os.Parcelable!);
+    method public android.os.Parcelable? onSaveInstanceState();
+    method public void onScrollStateChanged(int);
+    method public boolean performAccessibilityAction(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, int, android.os.Bundle?);
+    method public boolean performAccessibilityActionForItem(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, android.view.View, int, android.os.Bundle?);
+    method public void postOnAnimation(Runnable!);
+    method public void removeAllViews();
+    method public void removeAndRecycleAllViews(androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public void removeAndRecycleView(android.view.View, androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public void removeAndRecycleViewAt(int, androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public boolean removeCallbacks(Runnable!);
+    method public void removeDetachedView(android.view.View);
+    method public void removeView(android.view.View!);
+    method public void removeViewAt(int);
+    method public boolean requestChildRectangleOnScreen(androidx.recyclerview.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean);
+    method public boolean requestChildRectangleOnScreen(androidx.recyclerview.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean, boolean);
+    method public void requestLayout();
+    method public void requestSimpleAnimationsInNextLayout();
+    method public int scrollHorizontallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
+    method public void scrollToPosition(int);
+    method public int scrollVerticallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
+    method @Deprecated public void setAutoMeasureEnabled(boolean);
+    method public final void setItemPrefetchEnabled(boolean);
+    method public void setMeasuredDimension(android.graphics.Rect!, int, int);
+    method public void setMeasuredDimension(int, int);
+    method public void setMeasurementCacheEnabled(boolean);
+    method public void smoothScrollToPosition(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.State!, int);
+    method public void startSmoothScroll(androidx.recyclerview.widget.RecyclerView.SmoothScroller!);
+    method public void stopIgnoringView(android.view.View);
+    method public boolean supportsPredictiveItemAnimations();
+  }
+
+  public static interface RecyclerView.LayoutManager.LayoutPrefetchRegistry {
+    method public void addPosition(int, int);
+  }
+
+  public static class RecyclerView.LayoutManager.Properties {
+    ctor public RecyclerView.LayoutManager.Properties();
+    field public int orientation;
+    field public boolean reverseLayout;
+    field public int spanCount;
+    field public boolean stackFromEnd;
+  }
+
+  public static class RecyclerView.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public RecyclerView.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public RecyclerView.LayoutParams(int, int);
+    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public RecyclerView.LayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+    method public int getAbsoluteAdapterPosition();
+    method public int getBindingAdapterPosition();
+    method @Deprecated public int getViewAdapterPosition();
+    method public int getViewLayoutPosition();
+    method @Deprecated public int getViewPosition();
+    method public boolean isItemChanged();
+    method public boolean isItemRemoved();
+    method public boolean isViewInvalid();
+    method public boolean viewNeedsUpdate();
+  }
+
+  public static interface RecyclerView.OnChildAttachStateChangeListener {
+    method public void onChildViewAttachedToWindow(android.view.View);
+    method public void onChildViewDetachedFromWindow(android.view.View);
+  }
+
+  public abstract static class RecyclerView.OnFlingListener {
+    ctor public RecyclerView.OnFlingListener();
+    method public abstract boolean onFling(int, int);
+  }
+
+  public static interface RecyclerView.OnItemTouchListener {
+    method public boolean onInterceptTouchEvent(androidx.recyclerview.widget.RecyclerView, android.view.MotionEvent);
+    method public void onRequestDisallowInterceptTouchEvent(boolean);
+    method public void onTouchEvent(androidx.recyclerview.widget.RecyclerView, android.view.MotionEvent);
+  }
+
+  public abstract static class RecyclerView.OnScrollListener {
+    ctor public RecyclerView.OnScrollListener();
+    method public void onScrollStateChanged(androidx.recyclerview.widget.RecyclerView, int);
+    method public void onScrolled(androidx.recyclerview.widget.RecyclerView, int, int);
+  }
+
+  public static class RecyclerView.RecycledViewPool {
+    ctor public RecyclerView.RecycledViewPool();
+    method public void clear();
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? getRecycledView(int);
+    method public int getRecycledViewCount(int);
+    method public void putRecycledView(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void setMaxRecycledViews(int, int);
+  }
+
+  public final class RecyclerView.Recycler {
+    ctor public RecyclerView.Recycler();
+    method public void bindViewToPosition(android.view.View, int);
+    method public void clear();
+    method public int convertPreLayoutPositionToPostLayout(int);
+    method public java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder!> getScrapList();
+    method public android.view.View getViewForPosition(int);
+    method public void recycleView(android.view.View);
+    method public void setViewCacheSize(int);
+  }
+
+  public static interface RecyclerView.RecyclerListener {
+    method public void onViewRecycled(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+  }
+
+  public static class RecyclerView.SimpleOnItemTouchListener implements androidx.recyclerview.widget.RecyclerView.OnItemTouchListener {
+    ctor public RecyclerView.SimpleOnItemTouchListener();
+    method public boolean onInterceptTouchEvent(androidx.recyclerview.widget.RecyclerView, android.view.MotionEvent);
+    method public void onRequestDisallowInterceptTouchEvent(boolean);
+    method public void onTouchEvent(androidx.recyclerview.widget.RecyclerView, android.view.MotionEvent);
+  }
+
+  public abstract static class RecyclerView.SmoothScroller {
+    ctor public RecyclerView.SmoothScroller();
+    method public android.graphics.PointF? computeScrollVectorForPosition(int);
+    method public android.view.View! findViewByPosition(int);
+    method public int getChildCount();
+    method public int getChildPosition(android.view.View!);
+    method public androidx.recyclerview.widget.RecyclerView.LayoutManager? getLayoutManager();
+    method public int getTargetPosition();
+    method @Deprecated public void instantScrollToPosition(int);
+    method public boolean isPendingInitialRun();
+    method public boolean isRunning();
+    method protected void normalize(android.graphics.PointF);
+    method protected void onChildAttachedToWindow(android.view.View!);
+    method protected abstract void onSeekTargetStep(@Px int, @Px int, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
+    method protected abstract void onStart();
+    method protected abstract void onStop();
+    method protected abstract void onTargetFound(android.view.View, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
+    method public void setTargetPosition(int);
+    method protected final void stop();
+  }
+
+  public static class RecyclerView.SmoothScroller.Action {
+    ctor public RecyclerView.SmoothScroller.Action(@Px int, @Px int);
+    ctor public RecyclerView.SmoothScroller.Action(@Px int, @Px int, int);
+    ctor public RecyclerView.SmoothScroller.Action(@Px int, @Px int, int, android.view.animation.Interpolator?);
+    method public int getDuration();
+    method @Px public int getDx();
+    method @Px public int getDy();
+    method public android.view.animation.Interpolator? getInterpolator();
+    method public void jumpTo(int);
+    method public void setDuration(int);
+    method public void setDx(@Px int);
+    method public void setDy(@Px int);
+    method public void setInterpolator(android.view.animation.Interpolator?);
+    method public void update(@Px int, @Px int, int, android.view.animation.Interpolator?);
+    field public static final int UNDEFINED_DURATION = -2147483648; // 0x80000000
+  }
+
+  public static interface RecyclerView.SmoothScroller.ScrollVectorProvider {
+    method public android.graphics.PointF? computeScrollVectorForPosition(int);
+  }
+
+  public static class RecyclerView.State {
+    ctor public RecyclerView.State();
+    method public boolean didStructureChange();
+    method public <T> T! get(int);
+    method public int getItemCount();
+    method public int getRemainingScrollHorizontal();
+    method public int getRemainingScrollVertical();
+    method public int getTargetScrollPosition();
+    method public boolean hasTargetScrollPosition();
+    method public boolean isMeasuring();
+    method public boolean isPreLayout();
+    method public void put(int, Object!);
+    method public void remove(int);
+    method public boolean willRunPredictiveAnimations();
+    method public boolean willRunSimpleAnimations();
+  }
+
+  public abstract static class RecyclerView.ViewCacheExtension {
+    ctor public RecyclerView.ViewCacheExtension();
+    method public abstract android.view.View? getViewForPositionAndType(androidx.recyclerview.widget.RecyclerView.Recycler, int, int);
+  }
+
+  public abstract static class RecyclerView.ViewHolder {
+    ctor public RecyclerView.ViewHolder(android.view.View);
+    method public final int getAbsoluteAdapterPosition();
+    method @Deprecated public final int getAdapterPosition();
+    method public final androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>? getBindingAdapter();
+    method public final int getBindingAdapterPosition();
+    method public final long getItemId();
+    method public final int getItemViewType();
+    method public final int getLayoutPosition();
+    method public final int getOldPosition();
+    method @Deprecated public final int getPosition();
+    method public final boolean isRecyclable();
+    method public final void setIsRecyclable(boolean);
+    field public final android.view.View itemView;
+  }
+
+  public class RecyclerViewAccessibilityDelegate extends androidx.core.view.AccessibilityDelegateCompat {
+    ctor public RecyclerViewAccessibilityDelegate(androidx.recyclerview.widget.RecyclerView);
+    method public androidx.core.view.AccessibilityDelegateCompat getItemDelegate();
+  }
+
+  public static class RecyclerViewAccessibilityDelegate.ItemDelegate extends androidx.core.view.AccessibilityDelegateCompat {
+    ctor public RecyclerViewAccessibilityDelegate.ItemDelegate(androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate);
+  }
+
+  public abstract class SimpleItemAnimator extends androidx.recyclerview.widget.RecyclerView.ItemAnimator {
+    ctor public SimpleItemAnimator();
+    method public abstract boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public boolean animateAppearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animateDisappearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?);
+    method public abstract boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animatePersistence(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchAddFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchAddStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchChangeFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
+    method public final void dispatchChangeStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
+    method public final void dispatchMoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchMoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchRemoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public boolean getSupportsChangeAnimations();
+    method public void onAddFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void onAddStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void onChangeFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
+    method public void onChangeStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
+    method public void onMoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void onMoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void onRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void onRemoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void setSupportsChangeAnimations(boolean);
+  }
+
+  public abstract class SnapHelper extends androidx.recyclerview.widget.RecyclerView.OnFlingListener {
+    ctor public SnapHelper();
+    method public void attachToRecyclerView(androidx.recyclerview.widget.RecyclerView?) throws java.lang.IllegalStateException;
+    method public abstract int[]? calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
+    method public int[]! calculateScrollDistance(int, int);
+    method protected androidx.recyclerview.widget.RecyclerView.SmoothScroller? createScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager);
+    method @Deprecated protected androidx.recyclerview.widget.LinearSmoothScroller? createSnapScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager);
+    method public abstract android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public abstract int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
+    method public boolean onFling(int, int);
+  }
+
+  public class SortedList<T> {
+    ctor public SortedList(Class<T!>, androidx.recyclerview.widget.SortedList.Callback<T!>);
+    ctor public SortedList(Class<T!>, androidx.recyclerview.widget.SortedList.Callback<T!>, int);
+    method public int add(T!);
+    method public void addAll(T![], boolean);
+    method public void addAll(T!...);
+    method public void addAll(java.util.Collection<T!>);
+    method public void beginBatchedUpdates();
+    method public void clear();
+    method public void endBatchedUpdates();
+    method public T! get(int) throws java.lang.IndexOutOfBoundsException;
+    method public int indexOf(T!);
+    method public void recalculatePositionOfItemAt(int);
+    method public boolean remove(T!);
+    method public T! removeItemAt(int);
+    method public void replaceAll(T![], boolean);
+    method public void replaceAll(T!...);
+    method public void replaceAll(java.util.Collection<T!>);
+    method public int size();
+    method public void updateItemAt(int, T!);
+    field public static final int INVALID_POSITION = -1; // 0xffffffff
+  }
+
+  public static class SortedList.BatchedCallback<T2> extends androidx.recyclerview.widget.SortedList.Callback<T2> {
+    ctor public SortedList.BatchedCallback(androidx.recyclerview.widget.SortedList.Callback<T2!>!);
+    method public boolean areContentsTheSame(T2!, T2!);
+    method public boolean areItemsTheSame(T2!, T2!);
+    method public int compare(T2!, T2!);
+    method public void dispatchLastEvent();
+    method public void onChanged(int, int);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public abstract static class SortedList.Callback<T2> implements java.util.Comparator<T2> androidx.recyclerview.widget.ListUpdateCallback {
+    ctor public SortedList.Callback();
+    method public abstract boolean areContentsTheSame(T2!, T2!);
+    method public abstract boolean areItemsTheSame(T2!, T2!);
+    method public abstract int compare(T2!, T2!);
+    method public Object? getChangePayload(T2!, T2!);
+    method public abstract void onChanged(int, int);
+    method public void onChanged(int, int, Object!);
+  }
+
+  public abstract class SortedListAdapterCallback<T2> extends androidx.recyclerview.widget.SortedList.Callback<T2> {
+    ctor public SortedListAdapterCallback(androidx.recyclerview.widget.RecyclerView.Adapter<?>!);
+    method public void onChanged(int, int);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public class StaggeredGridLayoutManager extends androidx.recyclerview.widget.RecyclerView.LayoutManager implements androidx.recyclerview.widget.RecyclerView.SmoothScroller.ScrollVectorProvider {
+    ctor public StaggeredGridLayoutManager(android.content.Context!, android.util.AttributeSet!, int, int);
+    ctor public StaggeredGridLayoutManager(int, int);
+    method public android.graphics.PointF! computeScrollVectorForPosition(int);
+    method public int[]! findFirstCompletelyVisibleItemPositions(int[]!);
+    method public int[]! findFirstVisibleItemPositions(int[]!);
+    method public int[]! findLastCompletelyVisibleItemPositions(int[]!);
+    method public int[]! findLastVisibleItemPositions(int[]!);
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
+    method public int getGapStrategy();
+    method public int getOrientation();
+    method public boolean getReverseLayout();
+    method public int getSpanCount();
+    method public void invalidateSpanAssignments();
+    method public void scrollToPositionWithOffset(int, int);
+    method public void setGapStrategy(int);
+    method public void setOrientation(int);
+    method public void setReverseLayout(boolean);
+    method public void setSpanCount(int);
+    field @Deprecated public static final int GAP_HANDLING_LAZY = 1; // 0x1
+    field public static final int GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS = 2; // 0x2
+    field public static final int GAP_HANDLING_NONE = 0; // 0x0
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public static class StaggeredGridLayoutManager.LayoutParams extends androidx.recyclerview.widget.RecyclerView.LayoutParams {
+    ctor public StaggeredGridLayoutManager.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public StaggeredGridLayoutManager.LayoutParams(int, int);
+    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public StaggeredGridLayoutManager.LayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+    method public final int getSpanIndex();
+    method public boolean isFullSpan();
+    method public void setFullSpan(boolean);
+    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
+  }
+
+}
+
diff --git a/recyclerview/recyclerview/api/public_plus_experimental_1.3.0-beta03.txt b/recyclerview/recyclerview/api/public_plus_experimental_1.3.0-beta03.txt
new file mode 100644
index 0000000..7e45fbb
--- /dev/null
+++ b/recyclerview/recyclerview/api/public_plus_experimental_1.3.0-beta03.txt
@@ -0,0 +1,1092 @@
+// Signature format: 4.0
+package androidx.recyclerview.widget {
+
+  public final class AdapterListUpdateCallback implements androidx.recyclerview.widget.ListUpdateCallback {
+    ctor public AdapterListUpdateCallback(androidx.recyclerview.widget.RecyclerView.Adapter);
+    method public void onChanged(int, int, Object!);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public final class AsyncDifferConfig<T> {
+    method public java.util.concurrent.Executor getBackgroundThreadExecutor();
+    method public androidx.recyclerview.widget.DiffUtil.ItemCallback<T!> getDiffCallback();
+  }
+
+  public static final class AsyncDifferConfig.Builder<T> {
+    ctor public AsyncDifferConfig.Builder(androidx.recyclerview.widget.DiffUtil.ItemCallback<T!>);
+    method public androidx.recyclerview.widget.AsyncDifferConfig<T!> build();
+    method public androidx.recyclerview.widget.AsyncDifferConfig.Builder<T!> setBackgroundThreadExecutor(java.util.concurrent.Executor?);
+  }
+
+  public class AsyncListDiffer<T> {
+    ctor public AsyncListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter, androidx.recyclerview.widget.DiffUtil.ItemCallback<T!>);
+    ctor public AsyncListDiffer(androidx.recyclerview.widget.ListUpdateCallback, androidx.recyclerview.widget.AsyncDifferConfig<T!>);
+    method public void addListListener(androidx.recyclerview.widget.AsyncListDiffer.ListListener<T!>);
+    method public java.util.List<T!> getCurrentList();
+    method public void removeListListener(androidx.recyclerview.widget.AsyncListDiffer.ListListener<T!>);
+    method public void submitList(java.util.List<T!>?);
+    method public void submitList(java.util.List<T!>?, Runnable?);
+  }
+
+  public static interface AsyncListDiffer.ListListener<T> {
+    method public void onCurrentListChanged(java.util.List<T!>, java.util.List<T!>);
+  }
+
+  public class AsyncListUtil<T> {
+    ctor public AsyncListUtil(Class<T!>, int, androidx.recyclerview.widget.AsyncListUtil.DataCallback<T!>, androidx.recyclerview.widget.AsyncListUtil.ViewCallback);
+    method public T? getItem(int);
+    method public int getItemCount();
+    method public void onRangeChanged();
+    method public void refresh();
+  }
+
+  public abstract static class AsyncListUtil.DataCallback<T> {
+    ctor public AsyncListUtil.DataCallback();
+    method @WorkerThread public abstract void fillData(T![], int, int);
+    method @WorkerThread public int getMaxCachedTiles();
+    method @WorkerThread public void recycleData(T![], int);
+    method @WorkerThread public abstract int refreshData();
+  }
+
+  public abstract static class AsyncListUtil.ViewCallback {
+    ctor public AsyncListUtil.ViewCallback();
+    method @UiThread public void extendRangeInto(int[], int[], int);
+    method @UiThread public abstract void getItemRangeInto(int[]);
+    method @UiThread public abstract void onDataRefresh();
+    method @UiThread public abstract void onItemLoaded(int);
+    field public static final int HINT_SCROLL_ASC = 2; // 0x2
+    field public static final int HINT_SCROLL_DESC = 1; // 0x1
+    field public static final int HINT_SCROLL_NONE = 0; // 0x0
+  }
+
+  public class BatchingListUpdateCallback implements androidx.recyclerview.widget.ListUpdateCallback {
+    ctor public BatchingListUpdateCallback(androidx.recyclerview.widget.ListUpdateCallback);
+    method public void dispatchLastEvent();
+    method public void onChanged(int, int, Object!);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public final class ConcatAdapter extends androidx.recyclerview.widget.RecyclerView.Adapter<androidx.recyclerview.widget.RecyclerView.ViewHolder> {
+    ctor @java.lang.SafeVarargs public ConcatAdapter(androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>!...);
+    ctor @java.lang.SafeVarargs public ConcatAdapter(androidx.recyclerview.widget.ConcatAdapter.Config, androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>!...);
+    ctor public ConcatAdapter(java.util.List<? extends androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>>);
+    ctor public ConcatAdapter(androidx.recyclerview.widget.ConcatAdapter.Config, java.util.List<? extends androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>>);
+    method public boolean addAdapter(androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>);
+    method public boolean addAdapter(int, androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>);
+    method public java.util.List<? extends androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>> getAdapters();
+    method public int getItemCount();
+    method public android.util.Pair<androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>!,java.lang.Integer!> getWrappedAdapterAndPosition(int);
+    method public void onBindViewHolder(androidx.recyclerview.widget.RecyclerView.ViewHolder, int);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
+    method public boolean onFailedToRecycleView(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void onViewAttachedToWindow(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void onViewDetachedFromWindow(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void onViewRecycled(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public boolean removeAdapter(androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>);
+  }
+
+  public static final class ConcatAdapter.Config {
+    field public static final androidx.recyclerview.widget.ConcatAdapter.Config DEFAULT;
+    field public final boolean isolateViewTypes;
+    field public final androidx.recyclerview.widget.ConcatAdapter.Config.StableIdMode stableIdMode;
+  }
+
+  public static final class ConcatAdapter.Config.Builder {
+    ctor public ConcatAdapter.Config.Builder();
+    method public androidx.recyclerview.widget.ConcatAdapter.Config build();
+    method public androidx.recyclerview.widget.ConcatAdapter.Config.Builder setIsolateViewTypes(boolean);
+    method public androidx.recyclerview.widget.ConcatAdapter.Config.Builder setStableIdMode(androidx.recyclerview.widget.ConcatAdapter.Config.StableIdMode);
+  }
+
+  public enum ConcatAdapter.Config.StableIdMode {
+    enum_constant public static final androidx.recyclerview.widget.ConcatAdapter.Config.StableIdMode ISOLATED_STABLE_IDS;
+    enum_constant public static final androidx.recyclerview.widget.ConcatAdapter.Config.StableIdMode NO_STABLE_IDS;
+    enum_constant public static final androidx.recyclerview.widget.ConcatAdapter.Config.StableIdMode SHARED_STABLE_IDS;
+  }
+
+  public class DefaultItemAnimator extends androidx.recyclerview.widget.SimpleItemAnimator {
+    ctor public DefaultItemAnimator();
+    method public boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void endAnimations();
+    method public boolean isRunning();
+    method public void runPendingAnimations();
+  }
+
+  public class DiffUtil {
+    method public static androidx.recyclerview.widget.DiffUtil.DiffResult calculateDiff(androidx.recyclerview.widget.DiffUtil.Callback);
+    method public static androidx.recyclerview.widget.DiffUtil.DiffResult calculateDiff(androidx.recyclerview.widget.DiffUtil.Callback, boolean);
+  }
+
+  public abstract static class DiffUtil.Callback {
+    ctor public DiffUtil.Callback();
+    method public abstract boolean areContentsTheSame(int, int);
+    method public abstract boolean areItemsTheSame(int, int);
+    method public Object? getChangePayload(int, int);
+    method public abstract int getNewListSize();
+    method public abstract int getOldListSize();
+  }
+
+  public static class DiffUtil.DiffResult {
+    method public int convertNewPositionToOld(@IntRange(from=0) int);
+    method public int convertOldPositionToNew(@IntRange(from=0) int);
+    method public void dispatchUpdatesTo(androidx.recyclerview.widget.RecyclerView.Adapter);
+    method public void dispatchUpdatesTo(androidx.recyclerview.widget.ListUpdateCallback);
+    field public static final int NO_POSITION = -1; // 0xffffffff
+  }
+
+  public abstract static class DiffUtil.ItemCallback<T> {
+    ctor public DiffUtil.ItemCallback();
+    method public abstract boolean areContentsTheSame(T, T);
+    method public abstract boolean areItemsTheSame(T, T);
+    method public Object? getChangePayload(T, T);
+  }
+
+  public class DividerItemDecoration extends androidx.recyclerview.widget.RecyclerView.ItemDecoration {
+    ctor public DividerItemDecoration(android.content.Context!, int);
+    method public android.graphics.drawable.Drawable? getDrawable();
+    method public void setDrawable(android.graphics.drawable.Drawable);
+    method public void setOrientation(int);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public class GridLayoutManager extends androidx.recyclerview.widget.LinearLayoutManager {
+    ctor public GridLayoutManager(android.content.Context!, android.util.AttributeSet!, int, int);
+    ctor public GridLayoutManager(android.content.Context!, int);
+    ctor public GridLayoutManager(android.content.Context!, int, int, boolean);
+    method public int getSpanCount();
+    method public androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup! getSpanSizeLookup();
+    method public boolean isUsingSpansToEstimateScrollbarDimensions();
+    method public void setSpanCount(int);
+    method public void setSpanSizeLookup(androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup!);
+    method public void setUsingSpansToEstimateScrollbarDimensions(boolean);
+    field public static final int DEFAULT_SPAN_COUNT = -1; // 0xffffffff
+  }
+
+  public static final class GridLayoutManager.DefaultSpanSizeLookup extends androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup {
+    ctor public GridLayoutManager.DefaultSpanSizeLookup();
+    method public int getSpanSize(int);
+  }
+
+  public static class GridLayoutManager.LayoutParams extends androidx.recyclerview.widget.RecyclerView.LayoutParams {
+    ctor public GridLayoutManager.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public GridLayoutManager.LayoutParams(int, int);
+    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public GridLayoutManager.LayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+    method public int getSpanIndex();
+    method public int getSpanSize();
+    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
+  }
+
+  public abstract static class GridLayoutManager.SpanSizeLookup {
+    ctor public GridLayoutManager.SpanSizeLookup();
+    method public int getSpanGroupIndex(int, int);
+    method public int getSpanIndex(int, int);
+    method public abstract int getSpanSize(int);
+    method public void invalidateSpanGroupIndexCache();
+    method public void invalidateSpanIndexCache();
+    method public boolean isSpanGroupIndexCacheEnabled();
+    method public boolean isSpanIndexCacheEnabled();
+    method public void setSpanGroupIndexCacheEnabled(boolean);
+    method public void setSpanIndexCacheEnabled(boolean);
+  }
+
+  public class ItemTouchHelper extends androidx.recyclerview.widget.RecyclerView.ItemDecoration implements androidx.recyclerview.widget.RecyclerView.OnChildAttachStateChangeListener {
+    ctor public ItemTouchHelper(androidx.recyclerview.widget.ItemTouchHelper.Callback);
+    method public void attachToRecyclerView(androidx.recyclerview.widget.RecyclerView?);
+    method public void onChildViewAttachedToWindow(android.view.View);
+    method public void onChildViewDetachedFromWindow(android.view.View);
+    method public void startDrag(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void startSwipe(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    field public static final int ACTION_STATE_DRAG = 2; // 0x2
+    field public static final int ACTION_STATE_IDLE = 0; // 0x0
+    field public static final int ACTION_STATE_SWIPE = 1; // 0x1
+    field public static final int ANIMATION_TYPE_DRAG = 8; // 0x8
+    field public static final int ANIMATION_TYPE_SWIPE_CANCEL = 4; // 0x4
+    field public static final int ANIMATION_TYPE_SWIPE_SUCCESS = 2; // 0x2
+    field public static final int DOWN = 2; // 0x2
+    field public static final int END = 32; // 0x20
+    field public static final int LEFT = 4; // 0x4
+    field public static final int RIGHT = 8; // 0x8
+    field public static final int START = 16; // 0x10
+    field public static final int UP = 1; // 0x1
+  }
+
+  public abstract static class ItemTouchHelper.Callback {
+    ctor public ItemTouchHelper.Callback();
+    method public boolean canDropOver(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder! chooseDropTarget(androidx.recyclerview.widget.RecyclerView.ViewHolder, java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder!>, int, int);
+    method public void clearView(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public int convertToAbsoluteDirection(int, int);
+    method public static int convertToRelativeDirection(int, int);
+    method public long getAnimationDuration(androidx.recyclerview.widget.RecyclerView, int, float, float);
+    method public int getBoundingBoxMargin();
+    method public static androidx.recyclerview.widget.ItemTouchUIUtil getDefaultUIUtil();
+    method public float getMoveThreshold(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public abstract int getMovementFlags(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public float getSwipeEscapeVelocity(float);
+    method public float getSwipeThreshold(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public float getSwipeVelocityThreshold(float);
+    method public int interpolateOutOfBoundsScroll(androidx.recyclerview.widget.RecyclerView, int, int, int, long);
+    method public boolean isItemViewSwipeEnabled();
+    method public boolean isLongPressDragEnabled();
+    method public static int makeFlag(int, int);
+    method public static int makeMovementFlags(int, int);
+    method public void onChildDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, float, float, int, boolean);
+    method public void onChildDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder!, float, float, int, boolean);
+    method public abstract boolean onMove(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void onMoved(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int);
+    method public void onSelectedChanged(androidx.recyclerview.widget.RecyclerView.ViewHolder?, int);
+    method public abstract void onSwiped(androidx.recyclerview.widget.RecyclerView.ViewHolder, int);
+    field public static final int DEFAULT_DRAG_ANIMATION_DURATION = 200; // 0xc8
+    field public static final int DEFAULT_SWIPE_ANIMATION_DURATION = 250; // 0xfa
+  }
+
+  public abstract static class ItemTouchHelper.SimpleCallback extends androidx.recyclerview.widget.ItemTouchHelper.Callback {
+    ctor public ItemTouchHelper.SimpleCallback(int, int);
+    method public int getDragDirs(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public int getMovementFlags(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public int getSwipeDirs(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void setDefaultDragDirs(int);
+    method public void setDefaultSwipeDirs(int);
+  }
+
+  public static interface ItemTouchHelper.ViewDropHandler {
+    method public void prepareForDrop(android.view.View, android.view.View, int, int);
+  }
+
+  public interface ItemTouchUIUtil {
+    method public void clearView(android.view.View!);
+    method public void onDraw(android.graphics.Canvas!, androidx.recyclerview.widget.RecyclerView!, android.view.View!, float, float, int, boolean);
+    method public void onDrawOver(android.graphics.Canvas!, androidx.recyclerview.widget.RecyclerView!, android.view.View!, float, float, int, boolean);
+    method public void onSelected(android.view.View!);
+  }
+
+  public class LinearLayoutManager extends androidx.recyclerview.widget.RecyclerView.LayoutManager implements androidx.recyclerview.widget.ItemTouchHelper.ViewDropHandler androidx.recyclerview.widget.RecyclerView.SmoothScroller.ScrollVectorProvider {
+    ctor public LinearLayoutManager(android.content.Context!);
+    ctor public LinearLayoutManager(android.content.Context!, int, boolean);
+    ctor public LinearLayoutManager(android.content.Context!, android.util.AttributeSet!, int, int);
+    method protected void calculateExtraLayoutSpace(androidx.recyclerview.widget.RecyclerView.State, int[]);
+    method public android.graphics.PointF! computeScrollVectorForPosition(int);
+    method public int findFirstCompletelyVisibleItemPosition();
+    method public int findFirstVisibleItemPosition();
+    method public int findLastCompletelyVisibleItemPosition();
+    method public int findLastVisibleItemPosition();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
+    method @Deprecated protected int getExtraLayoutSpace(androidx.recyclerview.widget.RecyclerView.State!);
+    method public int getInitialPrefetchItemCount();
+    method public int getOrientation();
+    method public boolean getRecycleChildrenOnDetach();
+    method public boolean getReverseLayout();
+    method public boolean getStackFromEnd();
+    method protected boolean isLayoutRTL();
+    method public boolean isSmoothScrollbarEnabled();
+    method public void prepareForDrop(android.view.View, android.view.View, int, int);
+    method public void scrollToPositionWithOffset(int, int);
+    method public void setInitialPrefetchItemCount(int);
+    method public void setOrientation(int);
+    method public void setRecycleChildrenOnDetach(boolean);
+    method public void setReverseLayout(boolean);
+    method public void setSmoothScrollbarEnabled(boolean);
+    method public void setStackFromEnd(boolean);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int INVALID_OFFSET = -2147483648; // 0x80000000
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  protected static class LinearLayoutManager.LayoutChunkResult {
+    ctor protected LinearLayoutManager.LayoutChunkResult();
+    field public int mConsumed;
+    field public boolean mFinished;
+    field public boolean mFocusable;
+    field public boolean mIgnoreConsumed;
+  }
+
+  public class LinearSmoothScroller extends androidx.recyclerview.widget.RecyclerView.SmoothScroller {
+    ctor public LinearSmoothScroller(android.content.Context!);
+    method public int calculateDtToFit(int, int, int, int, int);
+    method public int calculateDxToMakeVisible(android.view.View!, int);
+    method public int calculateDyToMakeVisible(android.view.View!, int);
+    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics!);
+    method protected int calculateTimeForDeceleration(int);
+    method protected int calculateTimeForScrolling(int);
+    method protected int getHorizontalSnapPreference();
+    method protected int getVerticalSnapPreference();
+    method protected void onSeekTargetStep(int, int, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
+    method protected void onStart();
+    method protected void onStop();
+    method protected void onTargetFound(android.view.View!, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
+    method protected void updateActionForInterimTarget(androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
+    field public static final int SNAP_TO_ANY = 0; // 0x0
+    field public static final int SNAP_TO_END = 1; // 0x1
+    field public static final int SNAP_TO_START = -1; // 0xffffffff
+    field protected final android.view.animation.DecelerateInterpolator! mDecelerateInterpolator;
+    field protected int mInterimTargetDx;
+    field protected int mInterimTargetDy;
+    field protected final android.view.animation.LinearInterpolator! mLinearInterpolator;
+    field protected android.graphics.PointF! mTargetVector;
+  }
+
+  public class LinearSnapHelper extends androidx.recyclerview.widget.SnapHelper {
+    ctor public LinearSnapHelper();
+    method public int[]! calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
+    method public android.view.View! findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
+  }
+
+  public abstract class ListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
+    ctor protected ListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T!>);
+    ctor protected ListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T!>);
+    method public java.util.List<T!> getCurrentList();
+    method protected T! getItem(int);
+    method public int getItemCount();
+    method public void onCurrentListChanged(java.util.List<T!>, java.util.List<T!>);
+    method public void submitList(java.util.List<T!>?);
+    method public void submitList(java.util.List<T!>?, Runnable?);
+  }
+
+  public interface ListUpdateCallback {
+    method public void onChanged(int, int, Object?);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public abstract class OrientationHelper {
+    method public static androidx.recyclerview.widget.OrientationHelper! createHorizontalHelper(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public static androidx.recyclerview.widget.OrientationHelper! createOrientationHelper(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int);
+    method public static androidx.recyclerview.widget.OrientationHelper! createVerticalHelper(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public abstract int getDecoratedEnd(android.view.View!);
+    method public abstract int getDecoratedMeasurement(android.view.View!);
+    method public abstract int getDecoratedMeasurementInOther(android.view.View!);
+    method public abstract int getDecoratedStart(android.view.View!);
+    method public abstract int getEnd();
+    method public abstract int getEndAfterPadding();
+    method public abstract int getEndPadding();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutManager! getLayoutManager();
+    method public abstract int getMode();
+    method public abstract int getModeInOther();
+    method public abstract int getStartAfterPadding();
+    method public abstract int getTotalSpace();
+    method public int getTotalSpaceChange();
+    method public abstract int getTransformedEndWithDecoration(android.view.View!);
+    method public abstract int getTransformedStartWithDecoration(android.view.View!);
+    method public abstract void offsetChild(android.view.View!, int);
+    method public abstract void offsetChildren(int);
+    method public void onLayoutComplete();
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+    field protected final androidx.recyclerview.widget.RecyclerView.LayoutManager! mLayoutManager;
+  }
+
+  public class PagerSnapHelper extends androidx.recyclerview.widget.SnapHelper {
+    ctor public PagerSnapHelper();
+    method public int[]? calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
+    method public android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
+  }
+
+  public class RecyclerView extends android.view.ViewGroup implements androidx.core.view.NestedScrollingChild2 androidx.core.view.NestedScrollingChild3 androidx.core.view.ScrollingView {
+    ctor public RecyclerView(android.content.Context);
+    ctor public RecyclerView(android.content.Context, android.util.AttributeSet?);
+    ctor public RecyclerView(android.content.Context, android.util.AttributeSet?, int);
+    method public void addItemDecoration(androidx.recyclerview.widget.RecyclerView.ItemDecoration, int);
+    method public void addItemDecoration(androidx.recyclerview.widget.RecyclerView.ItemDecoration);
+    method public void addOnChildAttachStateChangeListener(androidx.recyclerview.widget.RecyclerView.OnChildAttachStateChangeListener);
+    method public void addOnItemTouchListener(androidx.recyclerview.widget.RecyclerView.OnItemTouchListener);
+    method public void addOnScrollListener(androidx.recyclerview.widget.RecyclerView.OnScrollListener);
+    method public void addRecyclerListener(androidx.recyclerview.widget.RecyclerView.RecyclerListener);
+    method public void clearOnChildAttachStateChangeListeners();
+    method public void clearOnScrollListeners();
+    method public int computeHorizontalScrollExtent();
+    method public int computeHorizontalScrollOffset();
+    method public int computeHorizontalScrollRange();
+    method public int computeVerticalScrollExtent();
+    method public int computeVerticalScrollOffset();
+    method public int computeVerticalScrollRange();
+    method public boolean dispatchNestedPreScroll(int, int, int[]!, int[]!, int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]!, int);
+    method public final void dispatchNestedScroll(int, int, int, int, int[]!, int, int[]);
+    method public boolean drawChild(android.graphics.Canvas!, android.view.View!, long);
+    method public android.view.View? findChildViewUnder(float, float);
+    method public android.view.View? findContainingItemView(android.view.View);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? findContainingViewHolder(android.view.View);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? findViewHolderForAdapterPosition(int);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder! findViewHolderForItemId(long);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? findViewHolderForLayoutPosition(int);
+    method @Deprecated public androidx.recyclerview.widget.RecyclerView.ViewHolder? findViewHolderForPosition(int);
+    method public boolean fling(int, int);
+    method public androidx.recyclerview.widget.RecyclerView.Adapter? getAdapter();
+    method public int getChildAdapterPosition(android.view.View);
+    method public long getChildItemId(android.view.View);
+    method public int getChildLayoutPosition(android.view.View);
+    method @Deprecated public int getChildPosition(android.view.View);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder! getChildViewHolder(android.view.View);
+    method public androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate? getCompatAccessibilityDelegate();
+    method public void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
+    method public androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory getEdgeEffectFactory();
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator? getItemAnimator();
+    method public androidx.recyclerview.widget.RecyclerView.ItemDecoration getItemDecorationAt(int);
+    method public int getItemDecorationCount();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutManager? getLayoutManager();
+    method public int getMaxFlingVelocity();
+    method public int getMinFlingVelocity();
+    method public androidx.recyclerview.widget.RecyclerView.OnFlingListener? getOnFlingListener();
+    method public boolean getPreserveFocusAfterLayout();
+    method public androidx.recyclerview.widget.RecyclerView.RecycledViewPool getRecycledViewPool();
+    method public int getScrollState();
+    method public boolean hasFixedSize();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean hasPendingAdapterUpdates();
+    method public void invalidateItemDecorations();
+    method public boolean isAnimating();
+    method public boolean isComputingLayout();
+    method @Deprecated public boolean isLayoutFrozen();
+    method public final boolean isLayoutSuppressed();
+    method public void nestedScrollBy(int, int);
+    method public void offsetChildrenHorizontal(@Px int);
+    method public void offsetChildrenVertical(@Px int);
+    method public void onChildAttachedToWindow(android.view.View);
+    method public void onChildDetachedFromWindow(android.view.View);
+    method public void onDraw(android.graphics.Canvas!);
+    method public void onScrollStateChanged(int);
+    method public void onScrolled(@Px int, @Px int);
+    method public void removeItemDecoration(androidx.recyclerview.widget.RecyclerView.ItemDecoration);
+    method public void removeItemDecorationAt(int);
+    method public void removeOnChildAttachStateChangeListener(androidx.recyclerview.widget.RecyclerView.OnChildAttachStateChangeListener);
+    method public void removeOnItemTouchListener(androidx.recyclerview.widget.RecyclerView.OnItemTouchListener);
+    method public void removeOnScrollListener(androidx.recyclerview.widget.RecyclerView.OnScrollListener);
+    method public void removeRecyclerListener(androidx.recyclerview.widget.RecyclerView.RecyclerListener);
+    method public void scrollToPosition(int);
+    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 void setEdgeEffectFactory(androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory);
+    method public void setHasFixedSize(boolean);
+    method public void setItemAnimator(androidx.recyclerview.widget.RecyclerView.ItemAnimator?);
+    method public void setItemViewCacheSize(int);
+    method @Deprecated public void setLayoutFrozen(boolean);
+    method public void setLayoutManager(androidx.recyclerview.widget.RecyclerView.LayoutManager?);
+    method @Deprecated public void setLayoutTransition(android.animation.LayoutTransition!);
+    method public void setOnFlingListener(androidx.recyclerview.widget.RecyclerView.OnFlingListener?);
+    method @Deprecated public void setOnScrollListener(androidx.recyclerview.widget.RecyclerView.OnScrollListener?);
+    method public void setPreserveFocusAfterLayout(boolean);
+    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 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?);
+    method public void smoothScrollBy(@Px int, @Px int, android.view.animation.Interpolator?, int);
+    method public void smoothScrollToPosition(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+    method public void stopScroll();
+    method public final void suppressLayout(boolean);
+    method public void swapAdapter(androidx.recyclerview.widget.RecyclerView.Adapter?, boolean);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int INVALID_TYPE = -1; // 0xffffffff
+    field public static final long NO_ID = -1L; // 0xffffffffffffffffL
+    field public static final int NO_POSITION = -1; // 0xffffffff
+    field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
+    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
+    field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
+    field public static final int TOUCH_SLOP_DEFAULT = 0; // 0x0
+    field public static final int TOUCH_SLOP_PAGING = 1; // 0x1
+    field public static final int UNDEFINED_DURATION = -2147483648; // 0x80000000
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public abstract static class RecyclerView.Adapter<VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> {
+    ctor public RecyclerView.Adapter();
+    method public final void bindViewHolder(VH, int);
+    method public final VH createViewHolder(android.view.ViewGroup, int);
+    method public int findRelativeAdapterPositionIn(androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>, androidx.recyclerview.widget.RecyclerView.ViewHolder, int);
+    method public abstract int getItemCount();
+    method public long getItemId(int);
+    method public int getItemViewType(int);
+    method public final androidx.recyclerview.widget.RecyclerView.Adapter.StateRestorationPolicy getStateRestorationPolicy();
+    method public final boolean hasObservers();
+    method public final boolean hasStableIds();
+    method public final void notifyDataSetChanged();
+    method public final void notifyItemChanged(int);
+    method public final void notifyItemChanged(int, Object?);
+    method public final void notifyItemInserted(int);
+    method public final void notifyItemMoved(int, int);
+    method public final void notifyItemRangeChanged(int, int);
+    method public final void notifyItemRangeChanged(int, int, Object?);
+    method public final void notifyItemRangeInserted(int, int);
+    method public final void notifyItemRangeRemoved(int, int);
+    method public final void notifyItemRemoved(int);
+    method public void onAttachedToRecyclerView(androidx.recyclerview.widget.RecyclerView);
+    method public abstract void onBindViewHolder(VH, int);
+    method public void onBindViewHolder(VH, int, java.util.List<java.lang.Object!>);
+    method public abstract VH onCreateViewHolder(android.view.ViewGroup, int);
+    method public void onDetachedFromRecyclerView(androidx.recyclerview.widget.RecyclerView);
+    method public boolean onFailedToRecycleView(VH);
+    method public void onViewAttachedToWindow(VH);
+    method public void onViewDetachedFromWindow(VH);
+    method public void onViewRecycled(VH);
+    method public void registerAdapterDataObserver(androidx.recyclerview.widget.RecyclerView.AdapterDataObserver);
+    method public void setHasStableIds(boolean);
+    method public void setStateRestorationPolicy(androidx.recyclerview.widget.RecyclerView.Adapter.StateRestorationPolicy);
+    method public void unregisterAdapterDataObserver(androidx.recyclerview.widget.RecyclerView.AdapterDataObserver);
+  }
+
+  public enum RecyclerView.Adapter.StateRestorationPolicy {
+    enum_constant public static final androidx.recyclerview.widget.RecyclerView.Adapter.StateRestorationPolicy ALLOW;
+    enum_constant public static final androidx.recyclerview.widget.RecyclerView.Adapter.StateRestorationPolicy PREVENT;
+    enum_constant public static final androidx.recyclerview.widget.RecyclerView.Adapter.StateRestorationPolicy PREVENT_WHEN_EMPTY;
+  }
+
+  public abstract static class RecyclerView.AdapterDataObserver {
+    ctor public RecyclerView.AdapterDataObserver();
+    method public void onChanged();
+    method public void onItemRangeChanged(int, int);
+    method public void onItemRangeChanged(int, int, Object?);
+    method public void onItemRangeInserted(int, int);
+    method public void onItemRangeMoved(int, int, int);
+    method public void onItemRangeRemoved(int, int);
+    method public void onStateRestorationPolicyChanged();
+  }
+
+  public static interface RecyclerView.ChildDrawingOrderCallback {
+    method public int onGetChildDrawingOrder(int, int);
+  }
+
+  public static class RecyclerView.EdgeEffectFactory {
+    ctor public RecyclerView.EdgeEffectFactory();
+    method protected android.widget.EdgeEffect createEdgeEffect(androidx.recyclerview.widget.RecyclerView, @androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.EdgeDirection int);
+    field public static final int DIRECTION_BOTTOM = 3; // 0x3
+    field public static final int DIRECTION_LEFT = 0; // 0x0
+    field public static final int DIRECTION_RIGHT = 2; // 0x2
+    field public static final int DIRECTION_TOP = 1; // 0x1
+  }
+
+  @IntDef({androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.DIRECTION_LEFT, androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.DIRECTION_TOP, androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.DIRECTION_RIGHT, androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.DIRECTION_BOTTOM}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RecyclerView.EdgeEffectFactory.EdgeDirection {
+  }
+
+  public abstract static class RecyclerView.ItemAnimator {
+    ctor public RecyclerView.ItemAnimator();
+    method public abstract boolean animateAppearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateDisappearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?);
+    method public abstract boolean animatePersistence(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public boolean canReuseUpdatedViewHolder(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public boolean canReuseUpdatedViewHolder(androidx.recyclerview.widget.RecyclerView.ViewHolder, java.util.List<java.lang.Object!>);
+    method public final void dispatchAnimationFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public final void dispatchAnimationStarted(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public final void dispatchAnimationsFinished();
+    method public abstract void endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public abstract void endAnimations();
+    method public long getAddDuration();
+    method public long getChangeDuration();
+    method public long getMoveDuration();
+    method public long getRemoveDuration();
+    method public abstract boolean isRunning();
+    method public final boolean isRunning(androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemAnimatorFinishedListener?);
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo obtainHolderInfo();
+    method public void onAnimationFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void onAnimationStarted(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo recordPostLayoutInformation(androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo recordPreLayoutInformation(androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.ViewHolder, @androidx.recyclerview.widget.RecyclerView.ItemAnimator.AdapterChanges int, java.util.List<java.lang.Object!>);
+    method public abstract void runPendingAnimations();
+    method public void setAddDuration(long);
+    method public void setChangeDuration(long);
+    method public void setMoveDuration(long);
+    method public void setRemoveDuration(long);
+    field public static final int FLAG_APPEARED_IN_PRE_LAYOUT = 4096; // 0x1000
+    field public static final int FLAG_CHANGED = 2; // 0x2
+    field public static final int FLAG_INVALIDATED = 4; // 0x4
+    field public static final int FLAG_MOVED = 2048; // 0x800
+    field public static final int FLAG_REMOVED = 8; // 0x8
+  }
+
+  @IntDef(flag=true, value={androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_CHANGED, androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_REMOVED, androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_MOVED, androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_INVALIDATED, androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_APPEARED_IN_PRE_LAYOUT}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RecyclerView.ItemAnimator.AdapterChanges {
+  }
+
+  public static interface RecyclerView.ItemAnimator.ItemAnimatorFinishedListener {
+    method public void onAnimationsFinished();
+  }
+
+  public static class RecyclerView.ItemAnimator.ItemHolderInfo {
+    ctor public RecyclerView.ItemAnimator.ItemHolderInfo();
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo setFrom(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo setFrom(androidx.recyclerview.widget.RecyclerView.ViewHolder, @androidx.recyclerview.widget.RecyclerView.ItemAnimator.AdapterChanges int);
+    field public int bottom;
+    field @androidx.recyclerview.widget.RecyclerView.ItemAnimator.AdapterChanges public int changeFlags;
+    field public int left;
+    field public int right;
+    field public int top;
+  }
+
+  public abstract static class RecyclerView.ItemDecoration {
+    ctor public RecyclerView.ItemDecoration();
+    method @Deprecated public void getItemOffsets(android.graphics.Rect, int, androidx.recyclerview.widget.RecyclerView);
+    method public void getItemOffsets(android.graphics.Rect, android.view.View, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State);
+    method public void onDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State);
+    method @Deprecated public void onDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView);
+    method public void onDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State);
+    method @Deprecated public void onDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView);
+  }
+
+  public abstract static class RecyclerView.LayoutManager {
+    ctor public RecyclerView.LayoutManager();
+    method public void addDisappearingView(android.view.View!);
+    method public void addDisappearingView(android.view.View!, int);
+    method public void addView(android.view.View!);
+    method public void addView(android.view.View!, int);
+    method public void assertInLayoutOrScroll(String!);
+    method public void assertNotInLayoutOrScroll(String!);
+    method public void attachView(android.view.View, int, androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+    method public void attachView(android.view.View, int);
+    method public void attachView(android.view.View);
+    method public void calculateItemDecorationsForChild(android.view.View, android.graphics.Rect);
+    method public boolean canScrollHorizontally();
+    method public boolean canScrollVertically();
+    method public boolean checkLayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+    method public static int chooseSize(int, int, int);
+    method public void collectAdjacentPrefetchPositions(int, int, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry!);
+    method public void collectInitialPrefetchPositions(int, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry!);
+    method public int computeHorizontalScrollExtent(androidx.recyclerview.widget.RecyclerView.State);
+    method public int computeHorizontalScrollOffset(androidx.recyclerview.widget.RecyclerView.State);
+    method public int computeHorizontalScrollRange(androidx.recyclerview.widget.RecyclerView.State);
+    method public int computeVerticalScrollExtent(androidx.recyclerview.widget.RecyclerView.State);
+    method public int computeVerticalScrollOffset(androidx.recyclerview.widget.RecyclerView.State);
+    method public int computeVerticalScrollRange(androidx.recyclerview.widget.RecyclerView.State);
+    method public void detachAndScrapAttachedViews(androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public void detachAndScrapView(android.view.View, androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public void detachAndScrapViewAt(int, androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public void detachView(android.view.View);
+    method public void detachViewAt(int);
+    method public void endAnimation(android.view.View!);
+    method public android.view.View? findContainingItemView(android.view.View);
+    method public android.view.View? findViewByPosition(int);
+    method public abstract androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateLayoutParams(android.content.Context!, android.util.AttributeSet!);
+    method public int getBaseline();
+    method public int getBottomDecorationHeight(android.view.View);
+    method public android.view.View? getChildAt(int);
+    method public int getChildCount();
+    method @Deprecated public static int getChildMeasureSpec(int, int, int, boolean);
+    method public static int getChildMeasureSpec(int, int, int, int, boolean);
+    method public boolean getClipToPadding();
+    method public int getColumnCountForAccessibility(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public int getDecoratedBottom(android.view.View);
+    method public void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
+    method public int getDecoratedLeft(android.view.View);
+    method public int getDecoratedMeasuredHeight(android.view.View);
+    method public int getDecoratedMeasuredWidth(android.view.View);
+    method public int getDecoratedRight(android.view.View);
+    method public int getDecoratedTop(android.view.View);
+    method public android.view.View? getFocusedChild();
+    method @Px public int getHeight();
+    method public int getHeightMode();
+    method public int getItemCount();
+    method public int getItemViewType(android.view.View);
+    method public int getLayoutDirection();
+    method public int getLeftDecorationWidth(android.view.View);
+    method @Px public int getMinimumHeight();
+    method @Px public int getMinimumWidth();
+    method @Px public int getPaddingBottom();
+    method @Px public int getPaddingEnd();
+    method @Px public int getPaddingLeft();
+    method @Px public int getPaddingRight();
+    method @Px public int getPaddingStart();
+    method @Px public int getPaddingTop();
+    method public int getPosition(android.view.View);
+    method public static androidx.recyclerview.widget.RecyclerView.LayoutManager.Properties! getProperties(android.content.Context, android.util.AttributeSet?, int, int);
+    method public int getRightDecorationWidth(android.view.View);
+    method public int getRowCountForAccessibility(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public int getSelectionModeForAccessibility(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public int getTopDecorationHeight(android.view.View);
+    method public void getTransformedBoundingBox(android.view.View, boolean, android.graphics.Rect);
+    method @Px public int getWidth();
+    method public int getWidthMode();
+    method public boolean hasFocus();
+    method public void ignoreView(android.view.View);
+    method public boolean isAttachedToWindow();
+    method public boolean isAutoMeasureEnabled();
+    method public boolean isFocused();
+    method public final boolean isItemPrefetchEnabled();
+    method public boolean isLayoutHierarchical(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public boolean isMeasurementCacheEnabled();
+    method public boolean isSmoothScrolling();
+    method public boolean isViewPartiallyVisible(android.view.View, boolean, boolean);
+    method public void layoutDecorated(android.view.View, int, int, int, int);
+    method public void layoutDecoratedWithMargins(android.view.View, int, int, int, int);
+    method public void measureChild(android.view.View, int, int);
+    method public void measureChildWithMargins(android.view.View, int, int);
+    method public void moveView(int, int);
+    method public void offsetChildrenHorizontal(@Px int);
+    method public void offsetChildrenVertical(@Px int);
+    method public void onAdapterChanged(androidx.recyclerview.widget.RecyclerView.Adapter?, androidx.recyclerview.widget.RecyclerView.Adapter?);
+    method public boolean onAddFocusables(androidx.recyclerview.widget.RecyclerView, java.util.ArrayList<android.view.View!>, int, int);
+    method @CallSuper public void onAttachedToWindow(androidx.recyclerview.widget.RecyclerView!);
+    method @Deprecated public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView!);
+    method @CallSuper public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.Recycler!);
+    method public android.view.View? onFocusSearchFailed(android.view.View, int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
+    method public void onInitializeAccessibilityEvent(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, android.view.accessibility.AccessibilityEvent);
+    method public void onInitializeAccessibilityNodeInfo(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
+    method public void onInitializeAccessibilityNodeInfoForItem(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
+    method public android.view.View? onInterceptFocusSearch(android.view.View, int);
+    method public void onItemsAdded(androidx.recyclerview.widget.RecyclerView, int, int);
+    method public void onItemsChanged(androidx.recyclerview.widget.RecyclerView);
+    method public void onItemsMoved(androidx.recyclerview.widget.RecyclerView, int, int, int);
+    method public void onItemsRemoved(androidx.recyclerview.widget.RecyclerView, int, int);
+    method public void onItemsUpdated(androidx.recyclerview.widget.RecyclerView, int, int);
+    method public void onItemsUpdated(androidx.recyclerview.widget.RecyclerView, int, int, Object?);
+    method public void onLayoutChildren(androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
+    method public void onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State!);
+    method public void onMeasure(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, int, int);
+    method @Deprecated public boolean onRequestChildFocus(androidx.recyclerview.widget.RecyclerView, android.view.View, android.view.View?);
+    method public boolean onRequestChildFocus(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State, android.view.View, android.view.View?);
+    method public void onRestoreInstanceState(android.os.Parcelable!);
+    method public android.os.Parcelable? onSaveInstanceState();
+    method public void onScrollStateChanged(int);
+    method public boolean performAccessibilityAction(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, int, android.os.Bundle?);
+    method public boolean performAccessibilityActionForItem(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, android.view.View, int, android.os.Bundle?);
+    method public void postOnAnimation(Runnable!);
+    method public void removeAllViews();
+    method public void removeAndRecycleAllViews(androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public void removeAndRecycleView(android.view.View, androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public void removeAndRecycleViewAt(int, androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public boolean removeCallbacks(Runnable!);
+    method public void removeDetachedView(android.view.View);
+    method public void removeView(android.view.View!);
+    method public void removeViewAt(int);
+    method public boolean requestChildRectangleOnScreen(androidx.recyclerview.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean);
+    method public boolean requestChildRectangleOnScreen(androidx.recyclerview.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean, boolean);
+    method public void requestLayout();
+    method public void requestSimpleAnimationsInNextLayout();
+    method public int scrollHorizontallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
+    method public void scrollToPosition(int);
+    method public int scrollVerticallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
+    method @Deprecated public void setAutoMeasureEnabled(boolean);
+    method public final void setItemPrefetchEnabled(boolean);
+    method public void setMeasuredDimension(android.graphics.Rect!, int, int);
+    method public void setMeasuredDimension(int, int);
+    method public void setMeasurementCacheEnabled(boolean);
+    method public void smoothScrollToPosition(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.State!, int);
+    method public void startSmoothScroll(androidx.recyclerview.widget.RecyclerView.SmoothScroller!);
+    method public void stopIgnoringView(android.view.View);
+    method public boolean supportsPredictiveItemAnimations();
+  }
+
+  public static interface RecyclerView.LayoutManager.LayoutPrefetchRegistry {
+    method public void addPosition(int, int);
+  }
+
+  public static class RecyclerView.LayoutManager.Properties {
+    ctor public RecyclerView.LayoutManager.Properties();
+    field public int orientation;
+    field public boolean reverseLayout;
+    field public int spanCount;
+    field public boolean stackFromEnd;
+  }
+
+  public static class RecyclerView.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public RecyclerView.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public RecyclerView.LayoutParams(int, int);
+    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public RecyclerView.LayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+    method public int getAbsoluteAdapterPosition();
+    method public int getBindingAdapterPosition();
+    method @Deprecated public int getViewAdapterPosition();
+    method public int getViewLayoutPosition();
+    method @Deprecated public int getViewPosition();
+    method public boolean isItemChanged();
+    method public boolean isItemRemoved();
+    method public boolean isViewInvalid();
+    method public boolean viewNeedsUpdate();
+  }
+
+  public static interface RecyclerView.OnChildAttachStateChangeListener {
+    method public void onChildViewAttachedToWindow(android.view.View);
+    method public void onChildViewDetachedFromWindow(android.view.View);
+  }
+
+  public abstract static class RecyclerView.OnFlingListener {
+    ctor public RecyclerView.OnFlingListener();
+    method public abstract boolean onFling(int, int);
+  }
+
+  public static interface RecyclerView.OnItemTouchListener {
+    method public boolean onInterceptTouchEvent(androidx.recyclerview.widget.RecyclerView, android.view.MotionEvent);
+    method public void onRequestDisallowInterceptTouchEvent(boolean);
+    method public void onTouchEvent(androidx.recyclerview.widget.RecyclerView, android.view.MotionEvent);
+  }
+
+  public abstract static class RecyclerView.OnScrollListener {
+    ctor public RecyclerView.OnScrollListener();
+    method public void onScrollStateChanged(androidx.recyclerview.widget.RecyclerView, int);
+    method public void onScrolled(androidx.recyclerview.widget.RecyclerView, int, int);
+  }
+
+  public static class RecyclerView.RecycledViewPool {
+    ctor public RecyclerView.RecycledViewPool();
+    method public void clear();
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? getRecycledView(int);
+    method public int getRecycledViewCount(int);
+    method public void putRecycledView(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void setMaxRecycledViews(int, int);
+  }
+
+  public final class RecyclerView.Recycler {
+    ctor public RecyclerView.Recycler();
+    method public void bindViewToPosition(android.view.View, int);
+    method public void clear();
+    method public int convertPreLayoutPositionToPostLayout(int);
+    method public java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder!> getScrapList();
+    method public android.view.View getViewForPosition(int);
+    method public void recycleView(android.view.View);
+    method public void setViewCacheSize(int);
+  }
+
+  public static interface RecyclerView.RecyclerListener {
+    method public void onViewRecycled(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+  }
+
+  public static class RecyclerView.SimpleOnItemTouchListener implements androidx.recyclerview.widget.RecyclerView.OnItemTouchListener {
+    ctor public RecyclerView.SimpleOnItemTouchListener();
+    method public boolean onInterceptTouchEvent(androidx.recyclerview.widget.RecyclerView, android.view.MotionEvent);
+    method public void onRequestDisallowInterceptTouchEvent(boolean);
+    method public void onTouchEvent(androidx.recyclerview.widget.RecyclerView, android.view.MotionEvent);
+  }
+
+  public abstract static class RecyclerView.SmoothScroller {
+    ctor public RecyclerView.SmoothScroller();
+    method public android.graphics.PointF? computeScrollVectorForPosition(int);
+    method public android.view.View! findViewByPosition(int);
+    method public int getChildCount();
+    method public int getChildPosition(android.view.View!);
+    method public androidx.recyclerview.widget.RecyclerView.LayoutManager? getLayoutManager();
+    method public int getTargetPosition();
+    method @Deprecated public void instantScrollToPosition(int);
+    method public boolean isPendingInitialRun();
+    method public boolean isRunning();
+    method protected void normalize(android.graphics.PointF);
+    method protected void onChildAttachedToWindow(android.view.View!);
+    method protected abstract void onSeekTargetStep(@Px int, @Px int, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
+    method protected abstract void onStart();
+    method protected abstract void onStop();
+    method protected abstract void onTargetFound(android.view.View, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
+    method public void setTargetPosition(int);
+    method protected final void stop();
+  }
+
+  public static class RecyclerView.SmoothScroller.Action {
+    ctor public RecyclerView.SmoothScroller.Action(@Px int, @Px int);
+    ctor public RecyclerView.SmoothScroller.Action(@Px int, @Px int, int);
+    ctor public RecyclerView.SmoothScroller.Action(@Px int, @Px int, int, android.view.animation.Interpolator?);
+    method public int getDuration();
+    method @Px public int getDx();
+    method @Px public int getDy();
+    method public android.view.animation.Interpolator? getInterpolator();
+    method public void jumpTo(int);
+    method public void setDuration(int);
+    method public void setDx(@Px int);
+    method public void setDy(@Px int);
+    method public void setInterpolator(android.view.animation.Interpolator?);
+    method public void update(@Px int, @Px int, int, android.view.animation.Interpolator?);
+    field public static final int UNDEFINED_DURATION = -2147483648; // 0x80000000
+  }
+
+  public static interface RecyclerView.SmoothScroller.ScrollVectorProvider {
+    method public android.graphics.PointF? computeScrollVectorForPosition(int);
+  }
+
+  public static class RecyclerView.State {
+    ctor public RecyclerView.State();
+    method public boolean didStructureChange();
+    method public <T> T! get(int);
+    method public int getItemCount();
+    method public int getRemainingScrollHorizontal();
+    method public int getRemainingScrollVertical();
+    method public int getTargetScrollPosition();
+    method public boolean hasTargetScrollPosition();
+    method public boolean isMeasuring();
+    method public boolean isPreLayout();
+    method public void put(int, Object!);
+    method public void remove(int);
+    method public boolean willRunPredictiveAnimations();
+    method public boolean willRunSimpleAnimations();
+  }
+
+  public abstract static class RecyclerView.ViewCacheExtension {
+    ctor public RecyclerView.ViewCacheExtension();
+    method public abstract android.view.View? getViewForPositionAndType(androidx.recyclerview.widget.RecyclerView.Recycler, int, int);
+  }
+
+  public abstract static class RecyclerView.ViewHolder {
+    ctor public RecyclerView.ViewHolder(android.view.View);
+    method public final int getAbsoluteAdapterPosition();
+    method @Deprecated public final int getAdapterPosition();
+    method public final androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>? getBindingAdapter();
+    method public final int getBindingAdapterPosition();
+    method public final long getItemId();
+    method public final int getItemViewType();
+    method public final int getLayoutPosition();
+    method public final int getOldPosition();
+    method @Deprecated public final int getPosition();
+    method public final boolean isRecyclable();
+    method public final void setIsRecyclable(boolean);
+    field public final android.view.View itemView;
+  }
+
+  public class RecyclerViewAccessibilityDelegate extends androidx.core.view.AccessibilityDelegateCompat {
+    ctor public RecyclerViewAccessibilityDelegate(androidx.recyclerview.widget.RecyclerView);
+    method public androidx.core.view.AccessibilityDelegateCompat getItemDelegate();
+  }
+
+  public static class RecyclerViewAccessibilityDelegate.ItemDelegate extends androidx.core.view.AccessibilityDelegateCompat {
+    ctor public RecyclerViewAccessibilityDelegate.ItemDelegate(androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate);
+  }
+
+  public abstract class SimpleItemAnimator extends androidx.recyclerview.widget.RecyclerView.ItemAnimator {
+    ctor public SimpleItemAnimator();
+    method public abstract boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public boolean animateAppearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animateDisappearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?);
+    method public abstract boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animatePersistence(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchAddFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchAddStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchChangeFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
+    method public final void dispatchChangeStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
+    method public final void dispatchMoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchMoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchRemoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public boolean getSupportsChangeAnimations();
+    method public void onAddFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void onAddStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void onChangeFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
+    method public void onChangeStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
+    method public void onMoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void onMoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void onRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void onRemoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void setSupportsChangeAnimations(boolean);
+  }
+
+  public abstract class SnapHelper extends androidx.recyclerview.widget.RecyclerView.OnFlingListener {
+    ctor public SnapHelper();
+    method public void attachToRecyclerView(androidx.recyclerview.widget.RecyclerView?) throws java.lang.IllegalStateException;
+    method public abstract int[]? calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
+    method public int[]! calculateScrollDistance(int, int);
+    method protected androidx.recyclerview.widget.RecyclerView.SmoothScroller? createScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager);
+    method @Deprecated protected androidx.recyclerview.widget.LinearSmoothScroller? createSnapScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager);
+    method public abstract android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public abstract int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
+    method public boolean onFling(int, int);
+  }
+
+  public class SortedList<T> {
+    ctor public SortedList(Class<T!>, androidx.recyclerview.widget.SortedList.Callback<T!>);
+    ctor public SortedList(Class<T!>, androidx.recyclerview.widget.SortedList.Callback<T!>, int);
+    method public int add(T!);
+    method public void addAll(T![], boolean);
+    method public void addAll(T!...);
+    method public void addAll(java.util.Collection<T!>);
+    method public void beginBatchedUpdates();
+    method public void clear();
+    method public void endBatchedUpdates();
+    method public T! get(int) throws java.lang.IndexOutOfBoundsException;
+    method public int indexOf(T!);
+    method public void recalculatePositionOfItemAt(int);
+    method public boolean remove(T!);
+    method public T! removeItemAt(int);
+    method public void replaceAll(T![], boolean);
+    method public void replaceAll(T!...);
+    method public void replaceAll(java.util.Collection<T!>);
+    method public int size();
+    method public void updateItemAt(int, T!);
+    field public static final int INVALID_POSITION = -1; // 0xffffffff
+  }
+
+  public static class SortedList.BatchedCallback<T2> extends androidx.recyclerview.widget.SortedList.Callback<T2> {
+    ctor public SortedList.BatchedCallback(androidx.recyclerview.widget.SortedList.Callback<T2!>!);
+    method public boolean areContentsTheSame(T2!, T2!);
+    method public boolean areItemsTheSame(T2!, T2!);
+    method public int compare(T2!, T2!);
+    method public void dispatchLastEvent();
+    method public void onChanged(int, int);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public abstract static class SortedList.Callback<T2> implements java.util.Comparator<T2> androidx.recyclerview.widget.ListUpdateCallback {
+    ctor public SortedList.Callback();
+    method public abstract boolean areContentsTheSame(T2!, T2!);
+    method public abstract boolean areItemsTheSame(T2!, T2!);
+    method public abstract int compare(T2!, T2!);
+    method public Object? getChangePayload(T2!, T2!);
+    method public abstract void onChanged(int, int);
+    method public void onChanged(int, int, Object!);
+  }
+
+  public abstract class SortedListAdapterCallback<T2> extends androidx.recyclerview.widget.SortedList.Callback<T2> {
+    ctor public SortedListAdapterCallback(androidx.recyclerview.widget.RecyclerView.Adapter<?>!);
+    method public void onChanged(int, int);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public class StaggeredGridLayoutManager extends androidx.recyclerview.widget.RecyclerView.LayoutManager implements androidx.recyclerview.widget.RecyclerView.SmoothScroller.ScrollVectorProvider {
+    ctor public StaggeredGridLayoutManager(android.content.Context!, android.util.AttributeSet!, int, int);
+    ctor public StaggeredGridLayoutManager(int, int);
+    method public android.graphics.PointF! computeScrollVectorForPosition(int);
+    method public int[]! findFirstCompletelyVisibleItemPositions(int[]!);
+    method public int[]! findFirstVisibleItemPositions(int[]!);
+    method public int[]! findLastCompletelyVisibleItemPositions(int[]!);
+    method public int[]! findLastVisibleItemPositions(int[]!);
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
+    method public int getGapStrategy();
+    method public int getOrientation();
+    method public boolean getReverseLayout();
+    method public int getSpanCount();
+    method public void invalidateSpanAssignments();
+    method public void scrollToPositionWithOffset(int, int);
+    method public void setGapStrategy(int);
+    method public void setOrientation(int);
+    method public void setReverseLayout(boolean);
+    method public void setSpanCount(int);
+    field @Deprecated public static final int GAP_HANDLING_LAZY = 1; // 0x1
+    field public static final int GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS = 2; // 0x2
+    field public static final int GAP_HANDLING_NONE = 0; // 0x0
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public static class StaggeredGridLayoutManager.LayoutParams extends androidx.recyclerview.widget.RecyclerView.LayoutParams {
+    ctor public StaggeredGridLayoutManager.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public StaggeredGridLayoutManager.LayoutParams(int, int);
+    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public StaggeredGridLayoutManager.LayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+    method public final int getSpanIndex();
+    method public boolean isFullSpan();
+    method public void setFullSpan(boolean);
+    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
+  }
+
+}
+
diff --git a/recyclerview/recyclerview/api/res-1.3.0-beta03.txt b/recyclerview/recyclerview/api/res-1.3.0-beta03.txt
new file mode 100644
index 0000000..475bfc43
--- /dev/null
+++ b/recyclerview/recyclerview/api/res-1.3.0-beta03.txt
@@ -0,0 +1,9 @@
+attr fastScrollEnabled
+attr fastScrollHorizontalThumbDrawable
+attr fastScrollHorizontalTrackDrawable
+attr fastScrollVerticalThumbDrawable
+attr fastScrollVerticalTrackDrawable
+attr layoutManager
+attr reverseLayout
+attr spanCount
+attr stackFromEnd
diff --git a/recyclerview/recyclerview/api/restricted_1.3.0-beta03.txt b/recyclerview/recyclerview/api/restricted_1.3.0-beta03.txt
new file mode 100644
index 0000000..ac7b64b
--- /dev/null
+++ b/recyclerview/recyclerview/api/restricted_1.3.0-beta03.txt
@@ -0,0 +1,1095 @@
+// Signature format: 4.0
+package androidx.recyclerview.widget {
+
+  public final class AdapterListUpdateCallback implements androidx.recyclerview.widget.ListUpdateCallback {
+    ctor public AdapterListUpdateCallback(androidx.recyclerview.widget.RecyclerView.Adapter);
+    method public void onChanged(int, int, Object!);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public final class AsyncDifferConfig<T> {
+    method public java.util.concurrent.Executor getBackgroundThreadExecutor();
+    method public androidx.recyclerview.widget.DiffUtil.ItemCallback<T!> getDiffCallback();
+  }
+
+  public static final class AsyncDifferConfig.Builder<T> {
+    ctor public AsyncDifferConfig.Builder(androidx.recyclerview.widget.DiffUtil.ItemCallback<T!>);
+    method public androidx.recyclerview.widget.AsyncDifferConfig<T!> build();
+    method public androidx.recyclerview.widget.AsyncDifferConfig.Builder<T!> setBackgroundThreadExecutor(java.util.concurrent.Executor?);
+  }
+
+  public class AsyncListDiffer<T> {
+    ctor public AsyncListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter, androidx.recyclerview.widget.DiffUtil.ItemCallback<T!>);
+    ctor public AsyncListDiffer(androidx.recyclerview.widget.ListUpdateCallback, androidx.recyclerview.widget.AsyncDifferConfig<T!>);
+    method public void addListListener(androidx.recyclerview.widget.AsyncListDiffer.ListListener<T!>);
+    method public java.util.List<T!> getCurrentList();
+    method public void removeListListener(androidx.recyclerview.widget.AsyncListDiffer.ListListener<T!>);
+    method public void submitList(java.util.List<T!>?);
+    method public void submitList(java.util.List<T!>?, Runnable?);
+  }
+
+  public static interface AsyncListDiffer.ListListener<T> {
+    method public void onCurrentListChanged(java.util.List<T!>, java.util.List<T!>);
+  }
+
+  public class AsyncListUtil<T> {
+    ctor public AsyncListUtil(Class<T!>, int, androidx.recyclerview.widget.AsyncListUtil.DataCallback<T!>, androidx.recyclerview.widget.AsyncListUtil.ViewCallback);
+    method public T? getItem(int);
+    method public int getItemCount();
+    method public void onRangeChanged();
+    method public void refresh();
+  }
+
+  public abstract static class AsyncListUtil.DataCallback<T> {
+    ctor public AsyncListUtil.DataCallback();
+    method @WorkerThread public abstract void fillData(T![], int, int);
+    method @WorkerThread public int getMaxCachedTiles();
+    method @WorkerThread public void recycleData(T![], int);
+    method @WorkerThread public abstract int refreshData();
+  }
+
+  public abstract static class AsyncListUtil.ViewCallback {
+    ctor public AsyncListUtil.ViewCallback();
+    method @UiThread public void extendRangeInto(int[], int[], int);
+    method @UiThread public abstract void getItemRangeInto(int[]);
+    method @UiThread public abstract void onDataRefresh();
+    method @UiThread public abstract void onItemLoaded(int);
+    field public static final int HINT_SCROLL_ASC = 2; // 0x2
+    field public static final int HINT_SCROLL_DESC = 1; // 0x1
+    field public static final int HINT_SCROLL_NONE = 0; // 0x0
+  }
+
+  public class BatchingListUpdateCallback implements androidx.recyclerview.widget.ListUpdateCallback {
+    ctor public BatchingListUpdateCallback(androidx.recyclerview.widget.ListUpdateCallback);
+    method public void dispatchLastEvent();
+    method public void onChanged(int, int, Object!);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public final class ConcatAdapter extends androidx.recyclerview.widget.RecyclerView.Adapter<androidx.recyclerview.widget.RecyclerView.ViewHolder> {
+    ctor @java.lang.SafeVarargs public ConcatAdapter(androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>!...);
+    ctor @java.lang.SafeVarargs public ConcatAdapter(androidx.recyclerview.widget.ConcatAdapter.Config, androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>!...);
+    ctor public ConcatAdapter(java.util.List<? extends androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>>);
+    ctor public ConcatAdapter(androidx.recyclerview.widget.ConcatAdapter.Config, java.util.List<? extends androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>>);
+    method public boolean addAdapter(androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>);
+    method public boolean addAdapter(int, androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>);
+    method public java.util.List<? extends androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>> getAdapters();
+    method public int getItemCount();
+    method public android.util.Pair<androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>!,java.lang.Integer!> getWrappedAdapterAndPosition(int);
+    method public void onBindViewHolder(androidx.recyclerview.widget.RecyclerView.ViewHolder, int);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
+    method public boolean onFailedToRecycleView(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void onViewAttachedToWindow(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void onViewDetachedFromWindow(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void onViewRecycled(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public boolean removeAdapter(androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>);
+  }
+
+  public static final class ConcatAdapter.Config {
+    field public static final androidx.recyclerview.widget.ConcatAdapter.Config DEFAULT;
+    field public final boolean isolateViewTypes;
+    field public final androidx.recyclerview.widget.ConcatAdapter.Config.StableIdMode stableIdMode;
+  }
+
+  public static final class ConcatAdapter.Config.Builder {
+    ctor public ConcatAdapter.Config.Builder();
+    method public androidx.recyclerview.widget.ConcatAdapter.Config build();
+    method public androidx.recyclerview.widget.ConcatAdapter.Config.Builder setIsolateViewTypes(boolean);
+    method public androidx.recyclerview.widget.ConcatAdapter.Config.Builder setStableIdMode(androidx.recyclerview.widget.ConcatAdapter.Config.StableIdMode);
+  }
+
+  public enum ConcatAdapter.Config.StableIdMode {
+    enum_constant public static final androidx.recyclerview.widget.ConcatAdapter.Config.StableIdMode ISOLATED_STABLE_IDS;
+    enum_constant public static final androidx.recyclerview.widget.ConcatAdapter.Config.StableIdMode NO_STABLE_IDS;
+    enum_constant public static final androidx.recyclerview.widget.ConcatAdapter.Config.StableIdMode SHARED_STABLE_IDS;
+  }
+
+  public class DefaultItemAnimator extends androidx.recyclerview.widget.SimpleItemAnimator {
+    ctor public DefaultItemAnimator();
+    method public boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void endAnimations();
+    method public boolean isRunning();
+    method public void runPendingAnimations();
+  }
+
+  public class DiffUtil {
+    method public static androidx.recyclerview.widget.DiffUtil.DiffResult calculateDiff(androidx.recyclerview.widget.DiffUtil.Callback);
+    method public static androidx.recyclerview.widget.DiffUtil.DiffResult calculateDiff(androidx.recyclerview.widget.DiffUtil.Callback, boolean);
+  }
+
+  public abstract static class DiffUtil.Callback {
+    ctor public DiffUtil.Callback();
+    method public abstract boolean areContentsTheSame(int, int);
+    method public abstract boolean areItemsTheSame(int, int);
+    method public Object? getChangePayload(int, int);
+    method public abstract int getNewListSize();
+    method public abstract int getOldListSize();
+  }
+
+  public static class DiffUtil.DiffResult {
+    method public int convertNewPositionToOld(@IntRange(from=0) int);
+    method public int convertOldPositionToNew(@IntRange(from=0) int);
+    method public void dispatchUpdatesTo(androidx.recyclerview.widget.RecyclerView.Adapter);
+    method public void dispatchUpdatesTo(androidx.recyclerview.widget.ListUpdateCallback);
+    field public static final int NO_POSITION = -1; // 0xffffffff
+  }
+
+  public abstract static class DiffUtil.ItemCallback<T> {
+    ctor public DiffUtil.ItemCallback();
+    method public abstract boolean areContentsTheSame(T, T);
+    method public abstract boolean areItemsTheSame(T, T);
+    method public Object? getChangePayload(T, T);
+  }
+
+  public class DividerItemDecoration extends androidx.recyclerview.widget.RecyclerView.ItemDecoration {
+    ctor public DividerItemDecoration(android.content.Context!, int);
+    method public android.graphics.drawable.Drawable? getDrawable();
+    method public void setDrawable(android.graphics.drawable.Drawable);
+    method public void setOrientation(int);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public class GridLayoutManager extends androidx.recyclerview.widget.LinearLayoutManager {
+    ctor public GridLayoutManager(android.content.Context!, android.util.AttributeSet!, int, int);
+    ctor public GridLayoutManager(android.content.Context!, int);
+    ctor public GridLayoutManager(android.content.Context!, int, @androidx.recyclerview.widget.RecyclerView.Orientation int, boolean);
+    method public int getSpanCount();
+    method public androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup! getSpanSizeLookup();
+    method public boolean isUsingSpansToEstimateScrollbarDimensions();
+    method public void setSpanCount(int);
+    method public void setSpanSizeLookup(androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup!);
+    method public void setUsingSpansToEstimateScrollbarDimensions(boolean);
+    field public static final int DEFAULT_SPAN_COUNT = -1; // 0xffffffff
+  }
+
+  public static final class GridLayoutManager.DefaultSpanSizeLookup extends androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup {
+    ctor public GridLayoutManager.DefaultSpanSizeLookup();
+    method public int getSpanSize(int);
+  }
+
+  public static class GridLayoutManager.LayoutParams extends androidx.recyclerview.widget.RecyclerView.LayoutParams {
+    ctor public GridLayoutManager.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public GridLayoutManager.LayoutParams(int, int);
+    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public GridLayoutManager.LayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+    method public int getSpanIndex();
+    method public int getSpanSize();
+    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
+  }
+
+  public abstract static class GridLayoutManager.SpanSizeLookup {
+    ctor public GridLayoutManager.SpanSizeLookup();
+    method public int getSpanGroupIndex(int, int);
+    method public int getSpanIndex(int, int);
+    method public abstract int getSpanSize(int);
+    method public void invalidateSpanGroupIndexCache();
+    method public void invalidateSpanIndexCache();
+    method public boolean isSpanGroupIndexCacheEnabled();
+    method public boolean isSpanIndexCacheEnabled();
+    method public void setSpanGroupIndexCacheEnabled(boolean);
+    method public void setSpanIndexCacheEnabled(boolean);
+  }
+
+  public class ItemTouchHelper extends androidx.recyclerview.widget.RecyclerView.ItemDecoration implements androidx.recyclerview.widget.RecyclerView.OnChildAttachStateChangeListener {
+    ctor public ItemTouchHelper(androidx.recyclerview.widget.ItemTouchHelper.Callback);
+    method public void attachToRecyclerView(androidx.recyclerview.widget.RecyclerView?);
+    method public void onChildViewAttachedToWindow(android.view.View);
+    method public void onChildViewDetachedFromWindow(android.view.View);
+    method public void startDrag(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void startSwipe(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    field public static final int ACTION_STATE_DRAG = 2; // 0x2
+    field public static final int ACTION_STATE_IDLE = 0; // 0x0
+    field public static final int ACTION_STATE_SWIPE = 1; // 0x1
+    field public static final int ANIMATION_TYPE_DRAG = 8; // 0x8
+    field public static final int ANIMATION_TYPE_SWIPE_CANCEL = 4; // 0x4
+    field public static final int ANIMATION_TYPE_SWIPE_SUCCESS = 2; // 0x2
+    field public static final int DOWN = 2; // 0x2
+    field public static final int END = 32; // 0x20
+    field public static final int LEFT = 4; // 0x4
+    field public static final int RIGHT = 8; // 0x8
+    field public static final int START = 16; // 0x10
+    field public static final int UP = 1; // 0x1
+  }
+
+  public abstract static class ItemTouchHelper.Callback {
+    ctor public ItemTouchHelper.Callback();
+    method public boolean canDropOver(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder! chooseDropTarget(androidx.recyclerview.widget.RecyclerView.ViewHolder, java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder!>, int, int);
+    method public void clearView(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public int convertToAbsoluteDirection(int, int);
+    method public static int convertToRelativeDirection(int, int);
+    method public long getAnimationDuration(androidx.recyclerview.widget.RecyclerView, int, float, float);
+    method public int getBoundingBoxMargin();
+    method public static androidx.recyclerview.widget.ItemTouchUIUtil getDefaultUIUtil();
+    method public float getMoveThreshold(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public abstract int getMovementFlags(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public float getSwipeEscapeVelocity(float);
+    method public float getSwipeThreshold(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public float getSwipeVelocityThreshold(float);
+    method public int interpolateOutOfBoundsScroll(androidx.recyclerview.widget.RecyclerView, int, int, int, long);
+    method public boolean isItemViewSwipeEnabled();
+    method public boolean isLongPressDragEnabled();
+    method public static int makeFlag(int, int);
+    method public static int makeMovementFlags(int, int);
+    method public void onChildDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, float, float, int, boolean);
+    method public void onChildDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder!, float, float, int, boolean);
+    method public abstract boolean onMove(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void onMoved(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int);
+    method public void onSelectedChanged(androidx.recyclerview.widget.RecyclerView.ViewHolder?, int);
+    method public abstract void onSwiped(androidx.recyclerview.widget.RecyclerView.ViewHolder, int);
+    field public static final int DEFAULT_DRAG_ANIMATION_DURATION = 200; // 0xc8
+    field public static final int DEFAULT_SWIPE_ANIMATION_DURATION = 250; // 0xfa
+  }
+
+  public abstract static class ItemTouchHelper.SimpleCallback extends androidx.recyclerview.widget.ItemTouchHelper.Callback {
+    ctor public ItemTouchHelper.SimpleCallback(int, int);
+    method public int getDragDirs(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public int getMovementFlags(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public int getSwipeDirs(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void setDefaultDragDirs(int);
+    method public void setDefaultSwipeDirs(int);
+  }
+
+  public static interface ItemTouchHelper.ViewDropHandler {
+    method public void prepareForDrop(android.view.View, android.view.View, int, int);
+  }
+
+  public interface ItemTouchUIUtil {
+    method public void clearView(android.view.View!);
+    method public void onDraw(android.graphics.Canvas!, androidx.recyclerview.widget.RecyclerView!, android.view.View!, float, float, int, boolean);
+    method public void onDrawOver(android.graphics.Canvas!, androidx.recyclerview.widget.RecyclerView!, android.view.View!, float, float, int, boolean);
+    method public void onSelected(android.view.View!);
+  }
+
+  public class LinearLayoutManager extends androidx.recyclerview.widget.RecyclerView.LayoutManager implements androidx.recyclerview.widget.ItemTouchHelper.ViewDropHandler androidx.recyclerview.widget.RecyclerView.SmoothScroller.ScrollVectorProvider {
+    ctor public LinearLayoutManager(android.content.Context!);
+    ctor public LinearLayoutManager(android.content.Context!, @androidx.recyclerview.widget.RecyclerView.Orientation int, boolean);
+    ctor public LinearLayoutManager(android.content.Context!, android.util.AttributeSet!, int, int);
+    method protected void calculateExtraLayoutSpace(androidx.recyclerview.widget.RecyclerView.State, int[]);
+    method public android.graphics.PointF! computeScrollVectorForPosition(int);
+    method public int findFirstCompletelyVisibleItemPosition();
+    method public int findFirstVisibleItemPosition();
+    method public int findLastCompletelyVisibleItemPosition();
+    method public int findLastVisibleItemPosition();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
+    method @Deprecated protected int getExtraLayoutSpace(androidx.recyclerview.widget.RecyclerView.State!);
+    method public int getInitialPrefetchItemCount();
+    method @androidx.recyclerview.widget.RecyclerView.Orientation public int getOrientation();
+    method public boolean getRecycleChildrenOnDetach();
+    method public boolean getReverseLayout();
+    method public boolean getStackFromEnd();
+    method protected boolean isLayoutRTL();
+    method public boolean isSmoothScrollbarEnabled();
+    method public void prepareForDrop(android.view.View, android.view.View, int, int);
+    method public void scrollToPositionWithOffset(int, int);
+    method public void setInitialPrefetchItemCount(int);
+    method public void setOrientation(@androidx.recyclerview.widget.RecyclerView.Orientation int);
+    method public void setRecycleChildrenOnDetach(boolean);
+    method public void setReverseLayout(boolean);
+    method public void setSmoothScrollbarEnabled(boolean);
+    method public void setStackFromEnd(boolean);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int INVALID_OFFSET = -2147483648; // 0x80000000
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  protected static class LinearLayoutManager.LayoutChunkResult {
+    ctor protected LinearLayoutManager.LayoutChunkResult();
+    field public int mConsumed;
+    field public boolean mFinished;
+    field public boolean mFocusable;
+    field public boolean mIgnoreConsumed;
+  }
+
+  public class LinearSmoothScroller extends androidx.recyclerview.widget.RecyclerView.SmoothScroller {
+    ctor public LinearSmoothScroller(android.content.Context!);
+    method public int calculateDtToFit(int, int, int, int, int);
+    method public int calculateDxToMakeVisible(android.view.View!, int);
+    method public int calculateDyToMakeVisible(android.view.View!, int);
+    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics!);
+    method protected int calculateTimeForDeceleration(int);
+    method protected int calculateTimeForScrolling(int);
+    method protected int getHorizontalSnapPreference();
+    method protected int getVerticalSnapPreference();
+    method protected void onSeekTargetStep(int, int, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
+    method protected void onStart();
+    method protected void onStop();
+    method protected void onTargetFound(android.view.View!, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
+    method protected void updateActionForInterimTarget(androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
+    field public static final int SNAP_TO_ANY = 0; // 0x0
+    field public static final int SNAP_TO_END = 1; // 0x1
+    field public static final int SNAP_TO_START = -1; // 0xffffffff
+    field protected final android.view.animation.DecelerateInterpolator! mDecelerateInterpolator;
+    field protected int mInterimTargetDx;
+    field protected int mInterimTargetDy;
+    field protected final android.view.animation.LinearInterpolator! mLinearInterpolator;
+    field protected android.graphics.PointF! mTargetVector;
+  }
+
+  public class LinearSnapHelper extends androidx.recyclerview.widget.SnapHelper {
+    ctor public LinearSnapHelper();
+    method public int[]! calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
+    method public android.view.View! findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
+  }
+
+  public abstract class ListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
+    ctor protected ListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T!>);
+    ctor protected ListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T!>);
+    method public java.util.List<T!> getCurrentList();
+    method protected T! getItem(int);
+    method public int getItemCount();
+    method public void onCurrentListChanged(java.util.List<T!>, java.util.List<T!>);
+    method public void submitList(java.util.List<T!>?);
+    method public void submitList(java.util.List<T!>?, Runnable?);
+  }
+
+  public interface ListUpdateCallback {
+    method public void onChanged(int, int, Object?);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public abstract class OrientationHelper {
+    method public static androidx.recyclerview.widget.OrientationHelper! createHorizontalHelper(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public static androidx.recyclerview.widget.OrientationHelper! createOrientationHelper(androidx.recyclerview.widget.RecyclerView.LayoutManager!, @androidx.recyclerview.widget.RecyclerView.Orientation int);
+    method public static androidx.recyclerview.widget.OrientationHelper! createVerticalHelper(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public abstract int getDecoratedEnd(android.view.View!);
+    method public abstract int getDecoratedMeasurement(android.view.View!);
+    method public abstract int getDecoratedMeasurementInOther(android.view.View!);
+    method public abstract int getDecoratedStart(android.view.View!);
+    method public abstract int getEnd();
+    method public abstract int getEndAfterPadding();
+    method public abstract int getEndPadding();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutManager! getLayoutManager();
+    method public abstract int getMode();
+    method public abstract int getModeInOther();
+    method public abstract int getStartAfterPadding();
+    method public abstract int getTotalSpace();
+    method public int getTotalSpaceChange();
+    method public abstract int getTransformedEndWithDecoration(android.view.View!);
+    method public abstract int getTransformedStartWithDecoration(android.view.View!);
+    method public abstract void offsetChild(android.view.View!, int);
+    method public abstract void offsetChildren(int);
+    method public void onLayoutComplete();
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+    field protected final androidx.recyclerview.widget.RecyclerView.LayoutManager! mLayoutManager;
+  }
+
+  public class PagerSnapHelper extends androidx.recyclerview.widget.SnapHelper {
+    ctor public PagerSnapHelper();
+    method public int[]? calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
+    method public android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
+  }
+
+  public class RecyclerView extends android.view.ViewGroup implements androidx.core.view.NestedScrollingChild2 androidx.core.view.NestedScrollingChild3 androidx.core.view.ScrollingView {
+    ctor public RecyclerView(android.content.Context);
+    ctor public RecyclerView(android.content.Context, android.util.AttributeSet?);
+    ctor public RecyclerView(android.content.Context, android.util.AttributeSet?, int);
+    method public void addItemDecoration(androidx.recyclerview.widget.RecyclerView.ItemDecoration, int);
+    method public void addItemDecoration(androidx.recyclerview.widget.RecyclerView.ItemDecoration);
+    method public void addOnChildAttachStateChangeListener(androidx.recyclerview.widget.RecyclerView.OnChildAttachStateChangeListener);
+    method public void addOnItemTouchListener(androidx.recyclerview.widget.RecyclerView.OnItemTouchListener);
+    method public void addOnScrollListener(androidx.recyclerview.widget.RecyclerView.OnScrollListener);
+    method public void addRecyclerListener(androidx.recyclerview.widget.RecyclerView.RecyclerListener);
+    method public void clearOnChildAttachStateChangeListeners();
+    method public void clearOnScrollListeners();
+    method public int computeHorizontalScrollExtent();
+    method public int computeHorizontalScrollOffset();
+    method public int computeHorizontalScrollRange();
+    method public int computeVerticalScrollExtent();
+    method public int computeVerticalScrollOffset();
+    method public int computeVerticalScrollRange();
+    method public boolean dispatchNestedPreScroll(int, int, int[]!, int[]!, int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]!, int);
+    method public final void dispatchNestedScroll(int, int, int, int, int[]!, int, int[]);
+    method public boolean drawChild(android.graphics.Canvas!, android.view.View!, long);
+    method public android.view.View? findChildViewUnder(float, float);
+    method public android.view.View? findContainingItemView(android.view.View);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? findContainingViewHolder(android.view.View);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? findViewHolderForAdapterPosition(int);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder! findViewHolderForItemId(long);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? findViewHolderForLayoutPosition(int);
+    method @Deprecated public androidx.recyclerview.widget.RecyclerView.ViewHolder? findViewHolderForPosition(int);
+    method public boolean fling(int, int);
+    method public androidx.recyclerview.widget.RecyclerView.Adapter? getAdapter();
+    method public int getChildAdapterPosition(android.view.View);
+    method public long getChildItemId(android.view.View);
+    method public int getChildLayoutPosition(android.view.View);
+    method @Deprecated public int getChildPosition(android.view.View);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder! getChildViewHolder(android.view.View);
+    method public androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate? getCompatAccessibilityDelegate();
+    method public void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
+    method public androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory getEdgeEffectFactory();
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator? getItemAnimator();
+    method public androidx.recyclerview.widget.RecyclerView.ItemDecoration getItemDecorationAt(int);
+    method public int getItemDecorationCount();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutManager? getLayoutManager();
+    method public int getMaxFlingVelocity();
+    method public int getMinFlingVelocity();
+    method public androidx.recyclerview.widget.RecyclerView.OnFlingListener? getOnFlingListener();
+    method public boolean getPreserveFocusAfterLayout();
+    method public androidx.recyclerview.widget.RecyclerView.RecycledViewPool getRecycledViewPool();
+    method public int getScrollState();
+    method public boolean hasFixedSize();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean hasPendingAdapterUpdates();
+    method public void invalidateItemDecorations();
+    method public boolean isAnimating();
+    method public boolean isComputingLayout();
+    method @Deprecated public boolean isLayoutFrozen();
+    method public final boolean isLayoutSuppressed();
+    method public void nestedScrollBy(int, int);
+    method public void offsetChildrenHorizontal(@Px int);
+    method public void offsetChildrenVertical(@Px int);
+    method public void onChildAttachedToWindow(android.view.View);
+    method public void onChildDetachedFromWindow(android.view.View);
+    method public void onDraw(android.graphics.Canvas!);
+    method public void onScrollStateChanged(int);
+    method public void onScrolled(@Px int, @Px int);
+    method public void removeItemDecoration(androidx.recyclerview.widget.RecyclerView.ItemDecoration);
+    method public void removeItemDecorationAt(int);
+    method public void removeOnChildAttachStateChangeListener(androidx.recyclerview.widget.RecyclerView.OnChildAttachStateChangeListener);
+    method public void removeOnItemTouchListener(androidx.recyclerview.widget.RecyclerView.OnItemTouchListener);
+    method public void removeOnScrollListener(androidx.recyclerview.widget.RecyclerView.OnScrollListener);
+    method public void removeRecyclerListener(androidx.recyclerview.widget.RecyclerView.RecyclerListener);
+    method public void scrollToPosition(int);
+    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 void setEdgeEffectFactory(androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory);
+    method public void setHasFixedSize(boolean);
+    method public void setItemAnimator(androidx.recyclerview.widget.RecyclerView.ItemAnimator?);
+    method public void setItemViewCacheSize(int);
+    method @Deprecated public void setLayoutFrozen(boolean);
+    method public void setLayoutManager(androidx.recyclerview.widget.RecyclerView.LayoutManager?);
+    method @Deprecated public void setLayoutTransition(android.animation.LayoutTransition!);
+    method public void setOnFlingListener(androidx.recyclerview.widget.RecyclerView.OnFlingListener?);
+    method @Deprecated public void setOnScrollListener(androidx.recyclerview.widget.RecyclerView.OnScrollListener?);
+    method public void setPreserveFocusAfterLayout(boolean);
+    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 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?);
+    method public void smoothScrollBy(@Px int, @Px int, android.view.animation.Interpolator?, int);
+    method public void smoothScrollToPosition(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+    method public void stopScroll();
+    method public final void suppressLayout(boolean);
+    method public void swapAdapter(androidx.recyclerview.widget.RecyclerView.Adapter?, boolean);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int INVALID_TYPE = -1; // 0xffffffff
+    field public static final long NO_ID = -1L; // 0xffffffffffffffffL
+    field public static final int NO_POSITION = -1; // 0xffffffff
+    field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
+    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
+    field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
+    field public static final int TOUCH_SLOP_DEFAULT = 0; // 0x0
+    field public static final int TOUCH_SLOP_PAGING = 1; // 0x1
+    field public static final int UNDEFINED_DURATION = -2147483648; // 0x80000000
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public abstract static class RecyclerView.Adapter<VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> {
+    ctor public RecyclerView.Adapter();
+    method public final void bindViewHolder(VH, int);
+    method public final VH createViewHolder(android.view.ViewGroup, int);
+    method public int findRelativeAdapterPositionIn(androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>, androidx.recyclerview.widget.RecyclerView.ViewHolder, int);
+    method public abstract int getItemCount();
+    method public long getItemId(int);
+    method public int getItemViewType(int);
+    method public final androidx.recyclerview.widget.RecyclerView.Adapter.StateRestorationPolicy getStateRestorationPolicy();
+    method public final boolean hasObservers();
+    method public final boolean hasStableIds();
+    method public final void notifyDataSetChanged();
+    method public final void notifyItemChanged(int);
+    method public final void notifyItemChanged(int, Object?);
+    method public final void notifyItemInserted(int);
+    method public final void notifyItemMoved(int, int);
+    method public final void notifyItemRangeChanged(int, int);
+    method public final void notifyItemRangeChanged(int, int, Object?);
+    method public final void notifyItemRangeInserted(int, int);
+    method public final void notifyItemRangeRemoved(int, int);
+    method public final void notifyItemRemoved(int);
+    method public void onAttachedToRecyclerView(androidx.recyclerview.widget.RecyclerView);
+    method public abstract void onBindViewHolder(VH, int);
+    method public void onBindViewHolder(VH, int, java.util.List<java.lang.Object!>);
+    method public abstract VH onCreateViewHolder(android.view.ViewGroup, int);
+    method public void onDetachedFromRecyclerView(androidx.recyclerview.widget.RecyclerView);
+    method public boolean onFailedToRecycleView(VH);
+    method public void onViewAttachedToWindow(VH);
+    method public void onViewDetachedFromWindow(VH);
+    method public void onViewRecycled(VH);
+    method public void registerAdapterDataObserver(androidx.recyclerview.widget.RecyclerView.AdapterDataObserver);
+    method public void setHasStableIds(boolean);
+    method public void setStateRestorationPolicy(androidx.recyclerview.widget.RecyclerView.Adapter.StateRestorationPolicy);
+    method public void unregisterAdapterDataObserver(androidx.recyclerview.widget.RecyclerView.AdapterDataObserver);
+  }
+
+  public enum RecyclerView.Adapter.StateRestorationPolicy {
+    enum_constant public static final androidx.recyclerview.widget.RecyclerView.Adapter.StateRestorationPolicy ALLOW;
+    enum_constant public static final androidx.recyclerview.widget.RecyclerView.Adapter.StateRestorationPolicy PREVENT;
+    enum_constant public static final androidx.recyclerview.widget.RecyclerView.Adapter.StateRestorationPolicy PREVENT_WHEN_EMPTY;
+  }
+
+  public abstract static class RecyclerView.AdapterDataObserver {
+    ctor public RecyclerView.AdapterDataObserver();
+    method public void onChanged();
+    method public void onItemRangeChanged(int, int);
+    method public void onItemRangeChanged(int, int, Object?);
+    method public void onItemRangeInserted(int, int);
+    method public void onItemRangeMoved(int, int, int);
+    method public void onItemRangeRemoved(int, int);
+    method public void onStateRestorationPolicyChanged();
+  }
+
+  public static interface RecyclerView.ChildDrawingOrderCallback {
+    method public int onGetChildDrawingOrder(int, int);
+  }
+
+  public static class RecyclerView.EdgeEffectFactory {
+    ctor public RecyclerView.EdgeEffectFactory();
+    method protected android.widget.EdgeEffect createEdgeEffect(androidx.recyclerview.widget.RecyclerView, @androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.EdgeDirection int);
+    field public static final int DIRECTION_BOTTOM = 3; // 0x3
+    field public static final int DIRECTION_LEFT = 0; // 0x0
+    field public static final int DIRECTION_RIGHT = 2; // 0x2
+    field public static final int DIRECTION_TOP = 1; // 0x1
+  }
+
+  @IntDef({androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.DIRECTION_LEFT, androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.DIRECTION_TOP, androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.DIRECTION_RIGHT, androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.DIRECTION_BOTTOM}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RecyclerView.EdgeEffectFactory.EdgeDirection {
+  }
+
+  public abstract static class RecyclerView.ItemAnimator {
+    ctor public RecyclerView.ItemAnimator();
+    method public abstract boolean animateAppearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateDisappearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?);
+    method public abstract boolean animatePersistence(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public boolean canReuseUpdatedViewHolder(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public boolean canReuseUpdatedViewHolder(androidx.recyclerview.widget.RecyclerView.ViewHolder, java.util.List<java.lang.Object!>);
+    method public final void dispatchAnimationFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public final void dispatchAnimationStarted(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public final void dispatchAnimationsFinished();
+    method public abstract void endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public abstract void endAnimations();
+    method public long getAddDuration();
+    method public long getChangeDuration();
+    method public long getMoveDuration();
+    method public long getRemoveDuration();
+    method public abstract boolean isRunning();
+    method public final boolean isRunning(androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemAnimatorFinishedListener?);
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo obtainHolderInfo();
+    method public void onAnimationFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void onAnimationStarted(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo recordPostLayoutInformation(androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo recordPreLayoutInformation(androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.ViewHolder, @androidx.recyclerview.widget.RecyclerView.ItemAnimator.AdapterChanges int, java.util.List<java.lang.Object!>);
+    method public abstract void runPendingAnimations();
+    method public void setAddDuration(long);
+    method public void setChangeDuration(long);
+    method public void setMoveDuration(long);
+    method public void setRemoveDuration(long);
+    field public static final int FLAG_APPEARED_IN_PRE_LAYOUT = 4096; // 0x1000
+    field public static final int FLAG_CHANGED = 2; // 0x2
+    field public static final int FLAG_INVALIDATED = 4; // 0x4
+    field public static final int FLAG_MOVED = 2048; // 0x800
+    field public static final int FLAG_REMOVED = 8; // 0x8
+  }
+
+  @IntDef(flag=true, value={androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_CHANGED, androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_REMOVED, androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_MOVED, androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_INVALIDATED, androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_APPEARED_IN_PRE_LAYOUT}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RecyclerView.ItemAnimator.AdapterChanges {
+  }
+
+  public static interface RecyclerView.ItemAnimator.ItemAnimatorFinishedListener {
+    method public void onAnimationsFinished();
+  }
+
+  public static class RecyclerView.ItemAnimator.ItemHolderInfo {
+    ctor public RecyclerView.ItemAnimator.ItemHolderInfo();
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo setFrom(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo setFrom(androidx.recyclerview.widget.RecyclerView.ViewHolder, @androidx.recyclerview.widget.RecyclerView.ItemAnimator.AdapterChanges int);
+    field public int bottom;
+    field @androidx.recyclerview.widget.RecyclerView.ItemAnimator.AdapterChanges public int changeFlags;
+    field public int left;
+    field public int right;
+    field public int top;
+  }
+
+  public abstract static class RecyclerView.ItemDecoration {
+    ctor public RecyclerView.ItemDecoration();
+    method @Deprecated public void getItemOffsets(android.graphics.Rect, int, androidx.recyclerview.widget.RecyclerView);
+    method public void getItemOffsets(android.graphics.Rect, android.view.View, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State);
+    method public void onDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State);
+    method @Deprecated public void onDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView);
+    method public void onDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State);
+    method @Deprecated public void onDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView);
+  }
+
+  public abstract static class RecyclerView.LayoutManager {
+    ctor public RecyclerView.LayoutManager();
+    method public void addDisappearingView(android.view.View!);
+    method public void addDisappearingView(android.view.View!, int);
+    method public void addView(android.view.View!);
+    method public void addView(android.view.View!, int);
+    method public void assertInLayoutOrScroll(String!);
+    method public void assertNotInLayoutOrScroll(String!);
+    method public void attachView(android.view.View, int, androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+    method public void attachView(android.view.View, int);
+    method public void attachView(android.view.View);
+    method public void calculateItemDecorationsForChild(android.view.View, android.graphics.Rect);
+    method public boolean canScrollHorizontally();
+    method public boolean canScrollVertically();
+    method public boolean checkLayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+    method public static int chooseSize(int, int, int);
+    method public void collectAdjacentPrefetchPositions(int, int, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry!);
+    method public void collectInitialPrefetchPositions(int, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry!);
+    method public int computeHorizontalScrollExtent(androidx.recyclerview.widget.RecyclerView.State);
+    method public int computeHorizontalScrollOffset(androidx.recyclerview.widget.RecyclerView.State);
+    method public int computeHorizontalScrollRange(androidx.recyclerview.widget.RecyclerView.State);
+    method public int computeVerticalScrollExtent(androidx.recyclerview.widget.RecyclerView.State);
+    method public int computeVerticalScrollOffset(androidx.recyclerview.widget.RecyclerView.State);
+    method public int computeVerticalScrollRange(androidx.recyclerview.widget.RecyclerView.State);
+    method public void detachAndScrapAttachedViews(androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public void detachAndScrapView(android.view.View, androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public void detachAndScrapViewAt(int, androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public void detachView(android.view.View);
+    method public void detachViewAt(int);
+    method public void endAnimation(android.view.View!);
+    method public android.view.View? findContainingItemView(android.view.View);
+    method public android.view.View? findViewByPosition(int);
+    method public abstract androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateLayoutParams(android.content.Context!, android.util.AttributeSet!);
+    method public int getBaseline();
+    method public int getBottomDecorationHeight(android.view.View);
+    method public android.view.View? getChildAt(int);
+    method public int getChildCount();
+    method @Deprecated public static int getChildMeasureSpec(int, int, int, boolean);
+    method public static int getChildMeasureSpec(int, int, int, int, boolean);
+    method public boolean getClipToPadding();
+    method public int getColumnCountForAccessibility(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public int getDecoratedBottom(android.view.View);
+    method public void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
+    method public int getDecoratedLeft(android.view.View);
+    method public int getDecoratedMeasuredHeight(android.view.View);
+    method public int getDecoratedMeasuredWidth(android.view.View);
+    method public int getDecoratedRight(android.view.View);
+    method public int getDecoratedTop(android.view.View);
+    method public android.view.View? getFocusedChild();
+    method @Px public int getHeight();
+    method public int getHeightMode();
+    method public int getItemCount();
+    method public int getItemViewType(android.view.View);
+    method public int getLayoutDirection();
+    method public int getLeftDecorationWidth(android.view.View);
+    method @Px public int getMinimumHeight();
+    method @Px public int getMinimumWidth();
+    method @Px public int getPaddingBottom();
+    method @Px public int getPaddingEnd();
+    method @Px public int getPaddingLeft();
+    method @Px public int getPaddingRight();
+    method @Px public int getPaddingStart();
+    method @Px public int getPaddingTop();
+    method public int getPosition(android.view.View);
+    method public static androidx.recyclerview.widget.RecyclerView.LayoutManager.Properties! getProperties(android.content.Context, android.util.AttributeSet?, int, int);
+    method public int getRightDecorationWidth(android.view.View);
+    method public int getRowCountForAccessibility(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public int getSelectionModeForAccessibility(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public int getTopDecorationHeight(android.view.View);
+    method public void getTransformedBoundingBox(android.view.View, boolean, android.graphics.Rect);
+    method @Px public int getWidth();
+    method public int getWidthMode();
+    method public boolean hasFocus();
+    method public void ignoreView(android.view.View);
+    method public boolean isAttachedToWindow();
+    method public boolean isAutoMeasureEnabled();
+    method public boolean isFocused();
+    method public final boolean isItemPrefetchEnabled();
+    method public boolean isLayoutHierarchical(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public boolean isMeasurementCacheEnabled();
+    method public boolean isSmoothScrolling();
+    method public boolean isViewPartiallyVisible(android.view.View, boolean, boolean);
+    method public void layoutDecorated(android.view.View, int, int, int, int);
+    method public void layoutDecoratedWithMargins(android.view.View, int, int, int, int);
+    method public void measureChild(android.view.View, int, int);
+    method public void measureChildWithMargins(android.view.View, int, int);
+    method public void moveView(int, int);
+    method public void offsetChildrenHorizontal(@Px int);
+    method public void offsetChildrenVertical(@Px int);
+    method public void onAdapterChanged(androidx.recyclerview.widget.RecyclerView.Adapter?, androidx.recyclerview.widget.RecyclerView.Adapter?);
+    method public boolean onAddFocusables(androidx.recyclerview.widget.RecyclerView, java.util.ArrayList<android.view.View!>, int, int);
+    method @CallSuper public void onAttachedToWindow(androidx.recyclerview.widget.RecyclerView!);
+    method @Deprecated public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView!);
+    method @CallSuper public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.Recycler!);
+    method public android.view.View? onFocusSearchFailed(android.view.View, int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
+    method public void onInitializeAccessibilityEvent(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, android.view.accessibility.AccessibilityEvent);
+    method public void onInitializeAccessibilityNodeInfo(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
+    method public void onInitializeAccessibilityNodeInfoForItem(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
+    method public android.view.View? onInterceptFocusSearch(android.view.View, int);
+    method public void onItemsAdded(androidx.recyclerview.widget.RecyclerView, int, int);
+    method public void onItemsChanged(androidx.recyclerview.widget.RecyclerView);
+    method public void onItemsMoved(androidx.recyclerview.widget.RecyclerView, int, int, int);
+    method public void onItemsRemoved(androidx.recyclerview.widget.RecyclerView, int, int);
+    method public void onItemsUpdated(androidx.recyclerview.widget.RecyclerView, int, int);
+    method public void onItemsUpdated(androidx.recyclerview.widget.RecyclerView, int, int, Object?);
+    method public void onLayoutChildren(androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
+    method public void onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State!);
+    method public void onMeasure(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, int, int);
+    method @Deprecated public boolean onRequestChildFocus(androidx.recyclerview.widget.RecyclerView, android.view.View, android.view.View?);
+    method public boolean onRequestChildFocus(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State, android.view.View, android.view.View?);
+    method public void onRestoreInstanceState(android.os.Parcelable!);
+    method public android.os.Parcelable? onSaveInstanceState();
+    method public void onScrollStateChanged(int);
+    method public boolean performAccessibilityAction(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, int, android.os.Bundle?);
+    method public boolean performAccessibilityActionForItem(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, android.view.View, int, android.os.Bundle?);
+    method public void postOnAnimation(Runnable!);
+    method public void removeAllViews();
+    method public void removeAndRecycleAllViews(androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public void removeAndRecycleView(android.view.View, androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public void removeAndRecycleViewAt(int, androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public boolean removeCallbacks(Runnable!);
+    method public void removeDetachedView(android.view.View);
+    method public void removeView(android.view.View!);
+    method public void removeViewAt(int);
+    method public boolean requestChildRectangleOnScreen(androidx.recyclerview.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean);
+    method public boolean requestChildRectangleOnScreen(androidx.recyclerview.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean, boolean);
+    method public void requestLayout();
+    method public void requestSimpleAnimationsInNextLayout();
+    method public int scrollHorizontallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
+    method public void scrollToPosition(int);
+    method public int scrollVerticallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
+    method @Deprecated public void setAutoMeasureEnabled(boolean);
+    method public final void setItemPrefetchEnabled(boolean);
+    method public void setMeasuredDimension(android.graphics.Rect!, int, int);
+    method public void setMeasuredDimension(int, int);
+    method public void setMeasurementCacheEnabled(boolean);
+    method public void smoothScrollToPosition(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.State!, int);
+    method public void startSmoothScroll(androidx.recyclerview.widget.RecyclerView.SmoothScroller!);
+    method public void stopIgnoringView(android.view.View);
+    method public boolean supportsPredictiveItemAnimations();
+  }
+
+  public static interface RecyclerView.LayoutManager.LayoutPrefetchRegistry {
+    method public void addPosition(int, int);
+  }
+
+  public static class RecyclerView.LayoutManager.Properties {
+    ctor public RecyclerView.LayoutManager.Properties();
+    field public int orientation;
+    field public boolean reverseLayout;
+    field public int spanCount;
+    field public boolean stackFromEnd;
+  }
+
+  public static class RecyclerView.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public RecyclerView.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public RecyclerView.LayoutParams(int, int);
+    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public RecyclerView.LayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+    method public int getAbsoluteAdapterPosition();
+    method public int getBindingAdapterPosition();
+    method @Deprecated public int getViewAdapterPosition();
+    method public int getViewLayoutPosition();
+    method @Deprecated public int getViewPosition();
+    method public boolean isItemChanged();
+    method public boolean isItemRemoved();
+    method public boolean isViewInvalid();
+    method public boolean viewNeedsUpdate();
+  }
+
+  public static interface RecyclerView.OnChildAttachStateChangeListener {
+    method public void onChildViewAttachedToWindow(android.view.View);
+    method public void onChildViewDetachedFromWindow(android.view.View);
+  }
+
+  public abstract static class RecyclerView.OnFlingListener {
+    ctor public RecyclerView.OnFlingListener();
+    method public abstract boolean onFling(int, int);
+  }
+
+  public static interface RecyclerView.OnItemTouchListener {
+    method public boolean onInterceptTouchEvent(androidx.recyclerview.widget.RecyclerView, android.view.MotionEvent);
+    method public void onRequestDisallowInterceptTouchEvent(boolean);
+    method public void onTouchEvent(androidx.recyclerview.widget.RecyclerView, android.view.MotionEvent);
+  }
+
+  public abstract static class RecyclerView.OnScrollListener {
+    ctor public RecyclerView.OnScrollListener();
+    method public void onScrollStateChanged(androidx.recyclerview.widget.RecyclerView, int);
+    method public void onScrolled(androidx.recyclerview.widget.RecyclerView, int, int);
+  }
+
+  @IntDef({androidx.recyclerview.widget.RecyclerView.HORIZONTAL, androidx.recyclerview.widget.RecyclerView.VERTICAL}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RecyclerView.Orientation {
+  }
+
+  public static class RecyclerView.RecycledViewPool {
+    ctor public RecyclerView.RecycledViewPool();
+    method public void clear();
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? getRecycledView(int);
+    method public int getRecycledViewCount(int);
+    method public void putRecycledView(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void setMaxRecycledViews(int, int);
+  }
+
+  public final class RecyclerView.Recycler {
+    ctor public RecyclerView.Recycler();
+    method public void bindViewToPosition(android.view.View, int);
+    method public void clear();
+    method public int convertPreLayoutPositionToPostLayout(int);
+    method public java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder!> getScrapList();
+    method public android.view.View getViewForPosition(int);
+    method public void recycleView(android.view.View);
+    method public void setViewCacheSize(int);
+  }
+
+  public static interface RecyclerView.RecyclerListener {
+    method public void onViewRecycled(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+  }
+
+  public static class RecyclerView.SimpleOnItemTouchListener implements androidx.recyclerview.widget.RecyclerView.OnItemTouchListener {
+    ctor public RecyclerView.SimpleOnItemTouchListener();
+    method public boolean onInterceptTouchEvent(androidx.recyclerview.widget.RecyclerView, android.view.MotionEvent);
+    method public void onRequestDisallowInterceptTouchEvent(boolean);
+    method public void onTouchEvent(androidx.recyclerview.widget.RecyclerView, android.view.MotionEvent);
+  }
+
+  public abstract static class RecyclerView.SmoothScroller {
+    ctor public RecyclerView.SmoothScroller();
+    method public android.graphics.PointF? computeScrollVectorForPosition(int);
+    method public android.view.View! findViewByPosition(int);
+    method public int getChildCount();
+    method public int getChildPosition(android.view.View!);
+    method public androidx.recyclerview.widget.RecyclerView.LayoutManager? getLayoutManager();
+    method public int getTargetPosition();
+    method @Deprecated public void instantScrollToPosition(int);
+    method public boolean isPendingInitialRun();
+    method public boolean isRunning();
+    method protected void normalize(android.graphics.PointF);
+    method protected void onChildAttachedToWindow(android.view.View!);
+    method protected abstract void onSeekTargetStep(@Px int, @Px int, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
+    method protected abstract void onStart();
+    method protected abstract void onStop();
+    method protected abstract void onTargetFound(android.view.View, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
+    method public void setTargetPosition(int);
+    method protected final void stop();
+  }
+
+  public static class RecyclerView.SmoothScroller.Action {
+    ctor public RecyclerView.SmoothScroller.Action(@Px int, @Px int);
+    ctor public RecyclerView.SmoothScroller.Action(@Px int, @Px int, int);
+    ctor public RecyclerView.SmoothScroller.Action(@Px int, @Px int, int, android.view.animation.Interpolator?);
+    method public int getDuration();
+    method @Px public int getDx();
+    method @Px public int getDy();
+    method public android.view.animation.Interpolator? getInterpolator();
+    method public void jumpTo(int);
+    method public void setDuration(int);
+    method public void setDx(@Px int);
+    method public void setDy(@Px int);
+    method public void setInterpolator(android.view.animation.Interpolator?);
+    method public void update(@Px int, @Px int, int, android.view.animation.Interpolator?);
+    field public static final int UNDEFINED_DURATION = -2147483648; // 0x80000000
+  }
+
+  public static interface RecyclerView.SmoothScroller.ScrollVectorProvider {
+    method public android.graphics.PointF? computeScrollVectorForPosition(int);
+  }
+
+  public static class RecyclerView.State {
+    ctor public RecyclerView.State();
+    method public boolean didStructureChange();
+    method public <T> T! get(int);
+    method public int getItemCount();
+    method public int getRemainingScrollHorizontal();
+    method public int getRemainingScrollVertical();
+    method public int getTargetScrollPosition();
+    method public boolean hasTargetScrollPosition();
+    method public boolean isMeasuring();
+    method public boolean isPreLayout();
+    method public void put(int, Object!);
+    method public void remove(int);
+    method public boolean willRunPredictiveAnimations();
+    method public boolean willRunSimpleAnimations();
+  }
+
+  public abstract static class RecyclerView.ViewCacheExtension {
+    ctor public RecyclerView.ViewCacheExtension();
+    method public abstract android.view.View? getViewForPositionAndType(androidx.recyclerview.widget.RecyclerView.Recycler, int, int);
+  }
+
+  public abstract static class RecyclerView.ViewHolder {
+    ctor public RecyclerView.ViewHolder(android.view.View);
+    method public final int getAbsoluteAdapterPosition();
+    method @Deprecated public final int getAdapterPosition();
+    method public final androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>? getBindingAdapter();
+    method public final int getBindingAdapterPosition();
+    method public final long getItemId();
+    method public final int getItemViewType();
+    method public final int getLayoutPosition();
+    method public final int getOldPosition();
+    method @Deprecated public final int getPosition();
+    method public final boolean isRecyclable();
+    method public final void setIsRecyclable(boolean);
+    field public final android.view.View itemView;
+  }
+
+  public class RecyclerViewAccessibilityDelegate extends androidx.core.view.AccessibilityDelegateCompat {
+    ctor public RecyclerViewAccessibilityDelegate(androidx.recyclerview.widget.RecyclerView);
+    method public androidx.core.view.AccessibilityDelegateCompat getItemDelegate();
+  }
+
+  public static class RecyclerViewAccessibilityDelegate.ItemDelegate extends androidx.core.view.AccessibilityDelegateCompat {
+    ctor public RecyclerViewAccessibilityDelegate.ItemDelegate(androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate);
+  }
+
+  public abstract class SimpleItemAnimator extends androidx.recyclerview.widget.RecyclerView.ItemAnimator {
+    ctor public SimpleItemAnimator();
+    method public abstract boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public boolean animateAppearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animateDisappearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?);
+    method public abstract boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animatePersistence(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchAddFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchAddStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchChangeFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
+    method public final void dispatchChangeStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
+    method public final void dispatchMoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchMoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchRemoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public boolean getSupportsChangeAnimations();
+    method public void onAddFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void onAddStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void onChangeFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
+    method public void onChangeStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
+    method public void onMoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void onMoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void onRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void onRemoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void setSupportsChangeAnimations(boolean);
+  }
+
+  public abstract class SnapHelper extends androidx.recyclerview.widget.RecyclerView.OnFlingListener {
+    ctor public SnapHelper();
+    method public void attachToRecyclerView(androidx.recyclerview.widget.RecyclerView?) throws java.lang.IllegalStateException;
+    method public abstract int[]? calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
+    method public int[]! calculateScrollDistance(int, int);
+    method protected androidx.recyclerview.widget.RecyclerView.SmoothScroller? createScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager);
+    method @Deprecated protected androidx.recyclerview.widget.LinearSmoothScroller? createSnapScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager);
+    method public abstract android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public abstract int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
+    method public boolean onFling(int, int);
+  }
+
+  public class SortedList<T> {
+    ctor public SortedList(Class<T!>, androidx.recyclerview.widget.SortedList.Callback<T!>);
+    ctor public SortedList(Class<T!>, androidx.recyclerview.widget.SortedList.Callback<T!>, int);
+    method public int add(T!);
+    method public void addAll(T![], boolean);
+    method public void addAll(T!...);
+    method public void addAll(java.util.Collection<T!>);
+    method public void beginBatchedUpdates();
+    method public void clear();
+    method public void endBatchedUpdates();
+    method public T! get(int) throws java.lang.IndexOutOfBoundsException;
+    method public int indexOf(T!);
+    method public void recalculatePositionOfItemAt(int);
+    method public boolean remove(T!);
+    method public T! removeItemAt(int);
+    method public void replaceAll(T![], boolean);
+    method public void replaceAll(T!...);
+    method public void replaceAll(java.util.Collection<T!>);
+    method public int size();
+    method public void updateItemAt(int, T!);
+    field public static final int INVALID_POSITION = -1; // 0xffffffff
+  }
+
+  public static class SortedList.BatchedCallback<T2> extends androidx.recyclerview.widget.SortedList.Callback<T2> {
+    ctor public SortedList.BatchedCallback(androidx.recyclerview.widget.SortedList.Callback<T2!>!);
+    method public boolean areContentsTheSame(T2!, T2!);
+    method public boolean areItemsTheSame(T2!, T2!);
+    method public int compare(T2!, T2!);
+    method public void dispatchLastEvent();
+    method public void onChanged(int, int);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public abstract static class SortedList.Callback<T2> implements java.util.Comparator<T2> androidx.recyclerview.widget.ListUpdateCallback {
+    ctor public SortedList.Callback();
+    method public abstract boolean areContentsTheSame(T2!, T2!);
+    method public abstract boolean areItemsTheSame(T2!, T2!);
+    method public abstract int compare(T2!, T2!);
+    method public Object? getChangePayload(T2!, T2!);
+    method public abstract void onChanged(int, int);
+    method public void onChanged(int, int, Object!);
+  }
+
+  public abstract class SortedListAdapterCallback<T2> extends androidx.recyclerview.widget.SortedList.Callback<T2> {
+    ctor public SortedListAdapterCallback(androidx.recyclerview.widget.RecyclerView.Adapter<?>!);
+    method public void onChanged(int, int);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public class StaggeredGridLayoutManager extends androidx.recyclerview.widget.RecyclerView.LayoutManager implements androidx.recyclerview.widget.RecyclerView.SmoothScroller.ScrollVectorProvider {
+    ctor public StaggeredGridLayoutManager(android.content.Context!, android.util.AttributeSet!, int, int);
+    ctor public StaggeredGridLayoutManager(int, int);
+    method public android.graphics.PointF! computeScrollVectorForPosition(int);
+    method public int[]! findFirstCompletelyVisibleItemPositions(int[]!);
+    method public int[]! findFirstVisibleItemPositions(int[]!);
+    method public int[]! findLastCompletelyVisibleItemPositions(int[]!);
+    method public int[]! findLastVisibleItemPositions(int[]!);
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
+    method public int getGapStrategy();
+    method public int getOrientation();
+    method public boolean getReverseLayout();
+    method public int getSpanCount();
+    method public void invalidateSpanAssignments();
+    method public void scrollToPositionWithOffset(int, int);
+    method public void setGapStrategy(int);
+    method public void setOrientation(int);
+    method public void setReverseLayout(boolean);
+    method public void setSpanCount(int);
+    field @Deprecated public static final int GAP_HANDLING_LAZY = 1; // 0x1
+    field public static final int GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS = 2; // 0x2
+    field public static final int GAP_HANDLING_NONE = 0; // 0x0
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public static class StaggeredGridLayoutManager.LayoutParams extends androidx.recyclerview.widget.RecyclerView.LayoutParams {
+    ctor public StaggeredGridLayoutManager.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public StaggeredGridLayoutManager.LayoutParams(int, int);
+    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public StaggeredGridLayoutManager.LayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+    method public final int getSpanIndex();
+    method public boolean isFullSpan();
+    method public void setFullSpan(boolean);
+    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
+  }
+
+}
+
diff --git a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/PoolingContainerRecyclerViewTest.kt b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/PoolingContainerRecyclerViewTest.kt
index 48b36e1..d21ab11 100644
--- a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/PoolingContainerRecyclerViewTest.kt
+++ b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/PoolingContainerRecyclerViewTest.kt
@@ -43,6 +43,12 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.KITKAT)
+/**
+ * Note: this test's structure largely parallels AndroidComposeViewsRecyclerViewTest
+ * (though there are notable implementation differences)
+ *
+ * Consider if new tests added here should also be added there.
+ */
 class PoolingContainerRecyclerViewTest : BaseRecyclerViewInstrumentationTest() {
     @get:Rule
     val animationRule = AnimationDurationScaleRule.create()
@@ -357,6 +363,7 @@
         // After the first RecyclerView is removed, we expect everything it created to be disposed,
         // *except* for what's in the shared pool
         assertThat(adapter1.creations).isEqualTo(adapter1Creations) // just checking
+        assertThat(pool.size()).isEqualTo(expectedRecycledItems)
         assertThat(adapter1.releases).isEqualTo(adapter1Creations - expectedRecycledItems)
         assertThat(adapter2.creations).isEqualTo(20) // it's twice as tall with rv1 gone
         assertThat(adapter2.releases).isEqualTo(0) // it hasn't scrolled
diff --git a/room/integration-tests/kotlintestapp/build.gradle b/room/integration-tests/kotlintestapp/build.gradle
index 4bfc976..22916dc 100644
--- a/room/integration-tests/kotlintestapp/build.gradle
+++ b/room/integration-tests/kotlintestapp/build.gradle
@@ -112,6 +112,7 @@
     androidTestImplementation(project(":internal-testutils-common"))
     androidTestImplementation("androidx.arch.core:core-testing:2.0.1")
     androidTestImplementation("androidx.paging:paging-runtime:3.1.1")
+    androidTestImplementation(project(":lifecycle:lifecycle-runtime-testing"))
     androidTestImplementation(libs.rxjava2)
     testImplementation(libs.mockitoCore)
 }
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/dao/BooksDao.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/dao/BooksDao.kt
index b6c57857..5ea0247 100644
--- a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/dao/BooksDao.kt
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/dao/BooksDao.kt
@@ -46,6 +46,7 @@
 import io.reactivex.Flowable
 import io.reactivex.Maybe
 import io.reactivex.Single
+import io.reactivex.Observable
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.runBlocking
 import java.util.Date
@@ -458,5 +459,62 @@
     val allBooks: List<Book>
 
     @Upsert
+    fun upsertBooks(vararg books: Book)
+
+    @Upsert
+    suspend fun upsertBooksSuspend(vararg books: Book)
+
+    @Upsert
+    fun upsertBookPublisher(publisher: Publisher, book: Book)
+
+    @Upsert(entity = Book::class)
+    fun upsertMiniBook(miniBook: MiniBook)
+
+    @Upsert
+    fun upsertBookReturnLong(book: Book): Long
+
+    @Upsert
+    fun upsertBooksReturnLongList(vararg books: Book): List<Long>
+
+    @Upsert
+    fun upsertBooksReturnLongArray(vararg books: Book): Array<Long>
+
+    @Upsert
+    fun upsertBooksReturnLongArrayPrimitive(vararg books: Book): LongArray
+
+    @Upsert
+    fun upsertBooksReturnListenableFuture(vararg books: Book): ListenableFuture<List<Long>>
+
+    @Upsert
     fun upsertPublishers(vararg publishers: Publisher)
+
+    @Upsert
+    fun upsertTwoPublishers(publisherOne: Publisher, publisherTwo: Publisher)
+
+    @Upsert
+    fun upsertMultiple(publisher: Publisher, publishers: List<Publisher>)
+
+    @Upsert
+    fun upsertPublisherSingle(publisher: Publisher): Single<Long>
+
+    @Upsert
+    fun upsertBookSingle(book: Book): Single<Long>
+
+    @Upsert
+    fun upsertBookMaybe(book: Book): Maybe<Long>
+
+    @Upsert
+    fun upsertBookCompletable(book: Book): Completable
+
+    @Upsert
+    fun upsertListOfBooksReturnLongArray(books: List<Book>): Array<Long>
+
+    @Query("SELECT * FROM book")
+    fun getBooksFlowable(): Flowable<List<Book>>
+
+    @Query("SELECT * FROM book")
+    fun getBooksObservable(): Observable<List<Book>>
+
+    @Insert
+    fun addPublisherReturnArray(publishers: List<Publisher>): Array<Long>
 }
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/BooksDaoTest.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/BooksDaoTest.kt
index f434424..baae976 100644
--- a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/BooksDaoTest.kt
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/BooksDaoTest.kt
@@ -48,6 +48,18 @@
 class BooksDaoTest : TestDatabaseTest() {
 
     @Test
+    fun addPublisherIdError() {
+        // the following would cause Unique constraint fail and would not return -1
+        // booksDao.addPublishers(TestUtil.PUBLISHER2)
+        val publisherList = buildList<Publisher> {
+            add(TestUtil.PUBLISHER)
+            add(TestUtil.PUBLISHER2)
+        }
+        val result = booksDao.addPublisherReturnArray(publisherList)
+        assertEquals(result[1], 2)
+    }
+
+    @Test
     fun bookById() {
         booksDao.addAuthors(TestUtil.AUTHOR_1)
         booksDao.addPublishers(TestUtil.PUBLISHER)
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/QueryInterceptorTest.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/QueryInterceptorTest.kt
index c2d6323..145d0d1 100644
--- a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/QueryInterceptorTest.kt
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/QueryInterceptorTest.kt
@@ -158,7 +158,7 @@
             SimpleSQLiteQuery(
                 "INSERT OR ABORT INTO `queryInterceptorTestDatabase` (`id`,`description`) " +
                     "VALUES (?,?)",
-                arrayOf<Any>("3", "Description")
+                arrayOf("3", "Description")
             )
         )
         assertQueryLogged(
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/TestDatabaseTest.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/TestDatabaseTest.kt
index be74fd0..5cf1dba 100644
--- a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/TestDatabaseTest.kt
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/TestDatabaseTest.kt
@@ -19,6 +19,7 @@
 import androidx.arch.core.executor.testing.CountingTaskExecutorRule
 import androidx.room.Room
 import androidx.room.androidx.room.integration.kotlintestapp.dao.UsersDao
+import androidx.room.androidx.room.integration.kotlintestapp.testutil.TestObserver
 import androidx.room.integration.kotlintestapp.TestDatabase
 import androidx.room.integration.kotlintestapp.dao.BooksDao
 import androidx.test.core.app.ApplicationProvider
@@ -57,4 +58,10 @@
     fun drain() {
         countingTaskExecutorRule.drainTasks(10, TimeUnit.SECONDS)
     }
+
+    inner class LiveDataTestObserver<T> : TestObserver<T>() {
+        override fun drain() {
+            countingTaskExecutorRule.drainTasks(1, TimeUnit.MINUTES)
+        }
+    }
 }
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/TestUtil.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/TestUtil.kt
index 66cf87b..c94c1cb 100644
--- a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/TestUtil.kt
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/TestUtil.kt
@@ -16,18 +16,35 @@
 
 package androidx.room.integration.kotlintestapp.test
 
+import androidx.arch.core.executor.ArchTaskExecutor
+import androidx.lifecycle.LifecycleOwner
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.Observer
 import androidx.room.integration.kotlintestapp.vo.Author
 import androidx.room.integration.kotlintestapp.vo.Book
 import androidx.room.integration.kotlintestapp.vo.BookAuthor
 import androidx.room.integration.kotlintestapp.vo.Lang
 import androidx.room.integration.kotlintestapp.vo.Publisher
+import java.util.concurrent.FutureTask
 
 class TestUtil {
 
     companion object {
+        fun observeOnMainThread(
+            liveData: LiveData<Book>,
+            provider: LifecycleOwner,
+            observer: Observer<Book>
+        ) {
+            val futureTask = FutureTask<Unit> {
+                liveData.observe(provider, observer)
+            }
+            ArchTaskExecutor.getInstance().executeOnMainThread(futureTask)
+            futureTask.get()
+        }
 
         val PUBLISHER = Publisher("ph1", "publisher 1")
         val PUBLISHER2 = Publisher("ph2", "publisher 2")
+        val PUBLISHER3 = Publisher("ph3", "publisher 3")
 
         val AUTHOR_1 = Author("a1", "author 1")
         val AUTHOR_2 = Author("a2", "author 2")
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/UpsertTest.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/UpsertTest.kt
index 28b2d34..b46ed98 100644
--- a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/UpsertTest.kt
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/UpsertTest.kt
@@ -15,16 +15,428 @@
  */
 
 package androidx.room.androidx.room.integration.kotlintestapp.test
+
+import android.database.sqlite.SQLiteConstraintException
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.testing.TestLifecycleOwner
 import androidx.room.integration.kotlintestapp.test.TestDatabaseTest
 import androidx.room.integration.kotlintestapp.test.TestUtil
+import androidx.room.integration.kotlintestapp.vo.Book
+import androidx.room.integration.kotlintestapp.vo.Lang
+import androidx.room.integration.kotlintestapp.vo.MiniBook
+import androidx.room.integration.kotlintestapp.vo.Publisher
 import androidx.test.filters.MediumTest
+import com.google.common.truth.Truth.assertThat
+import io.reactivex.observers.TestObserver
+import io.reactivex.subscribers.TestSubscriber
+import java.util.concurrent.CountDownLatch
+import kotlin.test.assertFails
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.async
+import kotlinx.coroutines.cancelAndJoin
+import kotlinx.coroutines.runBlocking
+import org.junit.Assert.fail
 import org.junit.Test
 
 @MediumTest
 class UpsertTest : TestDatabaseTest() {
+    @Test
+    fun upsertBookById() {
+        booksDao.addAuthors(TestUtil.AUTHOR_1)
+        booksDao.addPublishers(TestUtil.PUBLISHER)
+        booksDao.upsertBooks(TestUtil.BOOK_1)
+        assertThat(booksDao.getBook(TestUtil.BOOK_1.bookId)).isEqualTo(TestUtil.BOOK_1)
+
+        booksDao.upsertBooks(TestUtil.BOOK_1.copy(title = "changed title"))
+        assertThat(booksDao.getBook(TestUtil.BOOK_1.bookId).title).isEqualTo("changed title")
+    }
 
     @Test
-    fun upsertPublishers() {
+    fun multiUpsertBookPublisher() {
+        booksDao.upsertBookPublisher(TestUtil.PUBLISHER, TestUtil.BOOK_1)
+        assertThat(booksDao.getPublisher(TestUtil.PUBLISHER.publisherId))
+            .isEqualTo(TestUtil.PUBLISHER)
+        assertThat(booksDao.getBook(TestUtil.BOOK_1.bookId))
+            .isEqualTo(TestUtil.BOOK_1)
+
+        booksDao.upsertBookPublisher(
+            TestUtil.PUBLISHER.copy(name = "changed name"),
+            TestUtil.BOOK_1.copy(title = "changed title")
+        )
+        assertThat(booksDao.getPublisher(TestUtil.PUBLISHER.publisherId).name)
+            .isEqualTo("changed name")
+        assertThat(booksDao.getBook(TestUtil.BOOK_1.bookId).title)
+            .isEqualTo("changed title")
+    }
+
+    val PUBLISHERLIST: List<Publisher> = buildList {
+        add(Publisher("ph4", "publisher 4"))
+        add(Publisher("ph2", "change publisher 2"))
+        add(TestUtil.PUBLISHER3)
+    }
+
+    val BOOK_1_EDIT: Book = Book(
+        "b1", "book title 4", "ph1",
+        setOf(Lang.EN), 6
+    )
+    @Test
+    fun upsertMultiParams() {
+        booksDao.upsertTwoPublishers(TestUtil.PUBLISHER, TestUtil.PUBLISHER2)
+
+        assertThat(booksDao.getPublisher(TestUtil.PUBLISHER.publisherId)).isEqualTo(
+            TestUtil.PUBLISHER
+        )
+        assertThat(booksDao.getPublisher(TestUtil.PUBLISHER2.publisherId)).isEqualTo(
+            TestUtil.PUBLISHER2
+        )
+
+        val modifyPublisher3 = Publisher("ph3", "changed publisher 3")
+        booksDao.upsertPublishers(modifyPublisher3)
+        booksDao.upsertMultiple(TestUtil.PUBLISHER3, PUBLISHERLIST)
+
+        assertThat(booksDao.getPublisher(TestUtil.PUBLISHER3.publisherId)).isEqualTo(
+            TestUtil.PUBLISHER3
+        )
+        assertThat(booksDao.getPublisher(PUBLISHERLIST[1].publisherId).name).isEqualTo(
+            "change publisher 2"
+        )
+        assertThat(booksDao.getPublisher(PUBLISHERLIST[0].publisherId).name).isEqualTo(
+            "publisher 4"
+        )
+    }
+
+    @Test
+    fun upsertBookByFlow() = runBlocking {
+        booksDao.addAuthors(TestUtil.AUTHOR_1)
+        booksDao.addPublishers(TestUtil.PUBLISHER)
+        booksDao.upsertBooks(TestUtil.BOOK_1, TestUtil.BOOK_2)
+
+        val firstResultLatch = CountDownLatch(1)
+        val secondResultLatch = CountDownLatch(1)
+        val thirdResultLatch = CountDownLatch(1)
+        val results = mutableListOf<List<Book>>()
+        val job = async(Dispatchers.IO) {
+            booksDao.getBooksFlow().collect {
+                when (results.size) {
+                    0 -> {
+                        results.add(it)
+                        firstResultLatch.countDown()
+                    }
+                    1 -> {
+                        results.add(it)
+                        secondResultLatch.countDown()
+                    }
+                    2 -> {
+                        results.add(it)
+                        thirdResultLatch.countDown()
+                    }
+                    else -> fail("Should have only collected 3 results.")
+                }
+            }
+        }
+
+        firstResultLatch.await()
+
+        booksDao.upsertBooksSuspend(TestUtil.BOOK_3)
+        secondResultLatch.await()
+
+        booksDao.upsertBooksSuspend(TestUtil.BOOK_3.copy(title = "new title"))
+        thirdResultLatch.await()
+
+        assertThat(results.size).isEqualTo(3)
+        assertThat(results[0])
+            .isEqualTo(listOf(TestUtil.BOOK_1,
+                TestUtil.BOOK_2))
+        assertThat(results[1])
+            .isEqualTo(listOf(TestUtil.BOOK_1,
+                TestUtil.BOOK_2,
+                TestUtil.BOOK_3))
+        assertThat(results[2])
+            .isEqualTo(listOf(TestUtil.BOOK_1,
+                TestUtil.BOOK_2,
+                TestUtil.BOOK_3.copy(title = "new title")))
+
+        job.cancelAndJoin()
+    }
+
+    @Test
+    fun upsertBookByLiveData() {
+        booksDao.addAuthors(TestUtil.AUTHOR_1)
+        booksDao.addPublishers(TestUtil.PUBLISHER)
+
+        val bookLiveData: LiveData<Book> = booksDao.getBookLiveData(TestUtil.BOOK_1.bookId)
+        val testOwner = TestLifecycleOwner(Lifecycle.State.CREATED)
+        val observer = LiveDataTestObserver<Book>()
+
+        TestUtil.observeOnMainThread(bookLiveData, testOwner, observer)
+
+        assertThat(observer.hasValue()).isFalse()
+        observer.reset()
+
+        testOwner.handleLifecycleEvent(Lifecycle.Event.ON_START)
+        assertThat(observer.get()).isNull()
+        observer.reset()
+
+        booksDao.upsertBooks(TestUtil.BOOK_2)
+        assertThat(observer.get()).isNull()
+        observer.reset()
+
+        booksDao.upsertBooks(TestUtil.BOOK_1)
+        assertThat(observer.get()).isNotNull()
+        observer.reset()
+
+        booksDao.upsertBooks(TestUtil.BOOK_1.copy(title = "changed title"))
+        assertThat(observer.get()).isNotNull()
+        assertThat(observer.get()?.title).isEqualTo("changed title")
+
+        testOwner.handleLifecycleEvent(Lifecycle.Event.ON_STOP)
+        observer.reset()
+    }
+
+    @Test
+    fun upsertSingle() {
+        val testObserver = TestObserver<Long>()
+        booksDao.upsertPublisherSingle(TestUtil.PUBLISHER).subscribeWith(testObserver)
+        testObserver.assertComplete()
+        val result = testObserver.values().single()
+        assertThat(booksDao.getPublisher(TestUtil.PUBLISHER.publisherId)).isEqualTo(
+            TestUtil.PUBLISHER
+        )
+        assertThat(result).isEqualTo(1)
+    }
+
+    @Test
+    fun upsertSingleError() {
+        val testObserver = TestObserver<Long>()
+        booksDao.upsertBookSingle(TestUtil.BOOK_1).subscribeWith(testObserver)
+        testObserver.assertError(SQLiteConstraintException::class.java)
+        assertThat(testObserver.errors().get(0).message).ignoringCase().contains("foreign key")
+    }
+
+    @Test
+    fun upsertSingleWithFlowableQuery() {
+        val testObserver = TestObserver<Long>()
+        val testObserver2 = TestObserver<Long>()
+        val subscriber = TestSubscriber<Book>()
+        booksDao.addPublishers(TestUtil.PUBLISHER)
+        booksDao.upsertBookSingle(TestUtil.BOOK_1).subscribeWith(testObserver)
+        booksDao.getBookFlowable(TestUtil.BOOK_1.bookId).subscribeWith(subscriber)
+        testObserver.assertComplete()
+        drain()
+        assertThat(subscriber.values().size).isEqualTo(1)
+        assertThat(subscriber.values()[0]).isEqualTo(TestUtil.BOOK_1)
+        booksDao.upsertBookSingle(TestUtil.BOOK_1.copy(title = "changed title"))
+            .subscribeWith(testObserver2)
+        drain()
+        assertThat(subscriber.values().size).isEqualTo(2)
+        assertThat(subscriber.values()[1].title).isEqualTo("changed title")
+    }
+
+    @Test
+    fun upsertMaybe() {
+        val testObserver = TestObserver<Long>()
+        booksDao.addPublishers(TestUtil.PUBLISHER)
+        booksDao.addBooks(BOOK_1_EDIT)
+        booksDao.upsertBookMaybe(TestUtil.BOOK_1).subscribeWith(testObserver)
+        testObserver.assertComplete()
+        assertThat(booksDao.getBook(TestUtil.BOOK_1.bookId)).isEqualTo(
+            TestUtil.BOOK_1
+        )
+    }
+
+    @Test
+    fun upsertMaybeError() {
+        val testObserver = TestObserver<Long>()
+        booksDao.upsertBookMaybe(TestUtil.BOOK_1).subscribeWith(testObserver)
+        testObserver.assertError(SQLiteConstraintException::class.java)
+        assertThat(testObserver.errors().get(0).message).ignoringCase().contains("foreign key")
+    }
+
+    @Test
+    fun upsertMaybeWithFlowableQuery() {
+        val testObserver = TestObserver<Long>()
+        val testObserver2 = TestObserver<Long>()
+        val subscriber = TestSubscriber<Book>()
+        booksDao.addPublishers(TestUtil.PUBLISHER)
+        booksDao.upsertBookMaybe(TestUtil.BOOK_1).subscribeWith(testObserver)
+        booksDao.getBookFlowable(TestUtil.BOOK_1.bookId).subscribeWith(subscriber)
+        testObserver.assertComplete()
+        drain()
+        assertThat(subscriber.values().size).isEqualTo(1)
+        assertThat(subscriber.values()[0]).isEqualTo(TestUtil.BOOK_1)
+        booksDao.upsertBookMaybe(TestUtil.BOOK_1.copy(title = "changed title"))
+            .subscribeWith(testObserver2)
+        drain()
+        assertThat(subscriber.values().size).isEqualTo(2)
+        assertThat(subscriber.values()[1].title).isEqualTo("changed title")
+    }
+
+    @Test
+    fun upsertCompletable() {
+        val testObserver = TestObserver<Long>()
+        booksDao.addPublishers(TestUtil.PUBLISHER)
+        booksDao.addBooks(BOOK_1_EDIT)
+        booksDao.upsertBookCompletable(TestUtil.BOOK_1).subscribeWith(testObserver)
+        testObserver.assertComplete()
+        assertThat(booksDao.getBook(TestUtil.BOOK_1.bookId)).isEqualTo(
+            TestUtil.BOOK_1
+        )
+    }
+
+    @Test
+    fun upsertCompletableError() {
+        val testObserver = TestObserver<Long>()
+        booksDao.upsertBookCompletable(TestUtil.BOOK_1).subscribeWith(testObserver)
+        testObserver.assertError(SQLiteConstraintException::class.java)
+        assertThat(testObserver.errors().get(0).message).ignoringCase().contains("foreign key")
+    }
+
+    @Test
+    fun upsertFlowable() {
         booksDao.upsertPublishers(TestUtil.PUBLISHER)
+        booksDao.upsertBooks(TestUtil.BOOK_1)
+        val subscriber = TestSubscriber<List<Book>>()
+        booksDao.getBooksFlowable().subscribeWith(subscriber)
+        drain()
+        assertThat(subscriber.values().size).isEqualTo(1)
+        assertThat(subscriber.values()[0]).isEqualTo(listOf(TestUtil.BOOK_1))
+        booksDao.upsertBooks(TestUtil.BOOK_1.copy(title = "changed title"))
+        drain()
+        assertThat(subscriber.values()[1][0].title).isEqualTo("changed title")
+        booksDao.upsertListOfBooksReturnLongArray(buildList {
+            add(TestUtil.BOOK_2)
+            add(TestUtil.BOOK_3)
+        })
+        drain()
+        assertThat(subscriber.values().size).isEqualTo(3)
+        assertThat(subscriber.values()[2]).isEqualTo(
+            listOf(TestUtil.BOOK_1.copy(title = "changed title"), TestUtil.BOOK_2, TestUtil.BOOK_3)
+        )
+    }
+
+    @Test
+    fun upsertObservable() {
+        booksDao.addPublishers(TestUtil.PUBLISHER)
+        booksDao.upsertBooks(TestUtil.BOOK_1)
+        val observer = TestObserver<List<Book>>()
+        booksDao.getBooksObservable().subscribeWith(observer)
+        drain()
+        assertThat(observer.values().size).isEqualTo(1)
+        assertThat(observer.values()[0]).isEqualTo(listOf(TestUtil.BOOK_1))
+        booksDao.upsertBooks(TestUtil.BOOK_1.copy(title = "changed title"))
+        drain()
+        assertThat(observer.values()[1][0].title).isEqualTo("changed title")
+        booksDao.upsertListOfBooksReturnLongArray(buildList {
+            add(TestUtil.BOOK_2)
+            add(TestUtil.BOOK_3)
+        })
+        drain()
+        assertThat(observer.values().size).isEqualTo(3)
+        assertThat(observer.values()[2]).isEqualTo(
+            listOf(TestUtil.BOOK_1.copy(title = "changed title"), TestUtil.BOOK_2, TestUtil.BOOK_3)
+        )
+    }
+
+    @Test
+    fun upsertPartialEntity() {
+        val MINI_BOOK_1 = MiniBook(
+            "b1", "book title 1", "ph1")
+
+        booksDao.addAuthors(TestUtil.AUTHOR_1)
+        booksDao.addPublishers(TestUtil.PUBLISHER)
+        booksDao.upsertMiniBook(MINI_BOOK_1)
+
+        booksDao.upsertMiniBook(MINI_BOOK_1.copy(title = "changed title"))
+        assertThat(booksDao.getBook(MINI_BOOK_1.bookId).title).isEqualTo("changed title")
+    }
+
+    @Test
+    fun upsertForeignKeyConstraint_failure() {
+        booksDao.addAuthors(TestUtil.AUTHOR_1)
+        booksDao.addPublishers(TestUtil.PUBLISHER)
+        booksDao.addBooks(TestUtil.BOOK_1)
+
+        // TODO: (b/242928508) Fix problem if foreign key continues to be updated when aborted
+        val exception = assertFails {
+            booksDao.upsertBooks(TestUtil.BOOK_1.copy(bookPublisherId = "phnew"))
+        }
+
+        assertThat(exception).hasMessageThat().ignoringCase()
+            .contains("foreign key constraint failed")
+    }
+
+    private fun <T> upsertReturnTypeBasic(
+        upsertMethod: (book: Book) -> T,
+        insertedAlready: Boolean = false
+    ): T {
+        if (insertedAlready) {
+            return upsertMethod(TestUtil.BOOK_1.copy(title = "changed title"))
+        }
+        booksDao.addAuthors(TestUtil.AUTHOR_1)
+        booksDao.addPublishers(TestUtil.PUBLISHER)
+        return upsertMethod(TestUtil.BOOK_1)
+    }
+
+    @Test
+    fun upsertBookReturnUnit() {
+        assertThat(upsertReturnTypeBasic(booksDao::upsertBooks)).isEqualTo(Unit)
+        assertThat(upsertReturnTypeBasic(booksDao::upsertBooks, true)).isEqualTo(Unit)
+    }
+
+    @Test
+    fun upsertBookReturnLong() {
+        assertThat(upsertReturnTypeBasic(booksDao::upsertBookReturnLong))
+            .isEqualTo(1)
+        assertThat(upsertReturnTypeBasic(booksDao::upsertBookReturnLong, true))
+            .isEqualTo(-1)
+    }
+
+    @Test
+    fun upsertBookReturnList() {
+        booksDao.addAuthors(TestUtil.AUTHOR_1)
+        booksDao.addPublishers(TestUtil.PUBLISHER)
+
+        assertThat(booksDao.upsertBooksReturnLongList(TestUtil.BOOK_1)).containsExactly(1L)
+        assertThat(booksDao.upsertBooksReturnLongList(
+            TestUtil.BOOK_1.copy(title = "changed title"))
+        )
+            .containsExactly(-1L)
+    }
+
+    @Test
+    fun upsertBookReturnArrayPrimitive() {
+        val result = longArrayOf(1)
+        assertThat(upsertReturnTypeBasic(booksDao::upsertBooksReturnLongArrayPrimitive))
+            .isEqualTo(result)
+
+        val updatedResult = longArrayOf(-1)
+        assertThat(upsertReturnTypeBasic(booksDao::upsertBooksReturnLongArrayPrimitive, true))
+            .isEqualTo(updatedResult)
+    }
+
+    @Test
+    fun upsertBookReturnArray() {
+        val result = arrayOf<Long>(1)
+        assertThat(upsertReturnTypeBasic(booksDao::upsertBooksReturnLongArray)).isEqualTo(result)
+
+        val updatedResult = arrayOf<Long>(-1)
+        assertThat(upsertReturnTypeBasic(booksDao::upsertBooksReturnLongArray, true))
+            .isEqualTo(updatedResult)
+    }
+
+    @Test
+    fun upsertBookReturnListenableFuture() {
+        booksDao.addAuthors(TestUtil.AUTHOR_1)
+        booksDao.addPublishers(TestUtil.PUBLISHER)
+
+        val result = listOf<Long>(1)
+        assertThat(booksDao.upsertBooksReturnListenableFuture(TestUtil.BOOK_1).get())
+            .isEqualTo(result)
+
+        val updatedResult = listOf<Long>(-1)
+        assertThat(booksDao.upsertBooksReturnListenableFuture(
+            TestUtil.BOOK_1.copy(title = "changed title")).get())
+            .isEqualTo(updatedResult)
     }
 }
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/testutil/TestObserver.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/testutil/TestObserver.kt
new file mode 100644
index 0000000..c3005bf
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/testutil/TestObserver.kt
@@ -0,0 +1,46 @@
+/*
+ * 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.room.androidx.room.integration.kotlintestapp.testutil
+
+import androidx.lifecycle.Observer
+
+abstract class TestObserver<T> : Observer<T> {
+    private var mLastData: T? = null
+    private var mHasValue = false
+
+    fun reset() {
+        mHasValue = false
+        mLastData = null
+    }
+
+    override fun onChanged(o: T?) {
+        mLastData = o
+        mHasValue = true
+    }
+
+    fun hasValue(): Boolean {
+        drain()
+        return mHasValue
+    }
+
+    fun get(): T? {
+        drain()
+        return mLastData
+    }
+
+    protected abstract fun drain()
+}
\ No newline at end of file
diff --git a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/AutoClosingRoomOpenHelperTest.java b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/AutoClosingRoomOpenHelperTest.java
index 3033b44..d4a92d7 100644
--- a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/AutoClosingRoomOpenHelperTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/AutoClosingRoomOpenHelperTest.java
@@ -35,7 +35,6 @@
 import androidx.room.integration.testapp.TestDatabase;
 import androidx.room.integration.testapp.dao.UserDao;
 import androidx.room.integration.testapp.vo.User;
-import androidx.room.util.SneakyThrow;
 import androidx.sqlite.db.SupportSQLiteDatabase;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.filters.MediumTest;
@@ -104,16 +103,12 @@
         Thread.sleep(30);
         mUserDao.load(1);
         // Connection should be auto closed here
-
-
         mDb.runInTransaction(
                 () -> {
                     try {
                         Thread.sleep(100);
-                        // Connection would've been auto closed here
-                    } catch (InterruptedException e) {
-                        SneakyThrow.reThrow(e);
-                    }
+                    } catch (InterruptedException ignored) { }
+                    // Connection would've been auto closed here
                 }
         );
 
diff --git a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/EntityUpsertionAdapterTest.java b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/EntityUpsertionAdapterTest.java
index 36bd106..ef08baf 100644
--- a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/EntityUpsertionAdapterTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/EntityUpsertionAdapterTest.java
@@ -38,6 +38,7 @@
 import org.junit.runner.RunWith;
 
 import java.util.Date;
+import java.util.List;
 
 @RunWith(AndroidJUnit4.class)
 @SmallTest
@@ -154,6 +155,20 @@
     }
 
     @Test
+    public void testUpsertReturnList() {
+        Pet[] testPets = TestUtil.createPetsForUser(0, 1, 10);
+        List<Long> result = mUpsertionAdapter.upsertAndReturnIdsList(testPets);
+        assertThat(result.get(3)).isEqualTo(4);
+    }
+
+    @Test
+    public void testInsertReturnBox() {
+        Pet[] testPets = TestUtil.createPetsForUser(0, 1, 10);
+        Long[] result = mInsertionAdapter.insertAndReturnIdsArrayBox(testPets);
+        assertThat(result[3]).isEqualTo(4);
+    }
+
+    @Test
     public void testUpsertWithoutTryCatch() {
         Pet testPet = TestUtil.createPet(232);
         Pet testPet2 = TestUtil.createPet(232);
diff --git a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/WriteAheadLoggingTest.java b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/WriteAheadLoggingTest.java
index 264f38f..602708d 100644
--- a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/WriteAheadLoggingTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/WriteAheadLoggingTest.java
@@ -135,6 +135,7 @@
         }
     }
 
+    @FlakyTest(bugId = 241095868)
     @Test
     public void observeLiveData() {
         UserDao dao = mDatabase.getUserDao();
@@ -146,6 +147,7 @@
         stopObserver(user1, observer);
     }
 
+    @FlakyTest(bugId = 241095868)
     @Test
     public void observeLiveDataWithTransaction() {
         UserDao dao = mDatabase.getUserDao();
diff --git a/room/room-common/api/current.txt b/room/room-common/api/current.txt
index 2d17a93..c70bacd 100644
--- a/room/room-common/api/current.txt
+++ b/room/room-common/api/current.txt
@@ -403,5 +403,10 @@
     property @androidx.room.OnConflictStrategy public abstract int onConflict;
   }
 
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface Upsert {
+    method public abstract kotlin.reflect.KClass<?> entity() default java.lang.Object;
+    property public abstract kotlin.reflect.KClass<?> entity;
+  }
+
 }
 
diff --git a/room/room-common/api/public_plus_experimental_current.txt b/room/room-common/api/public_plus_experimental_current.txt
index 2d17a93..c70bacd 100644
--- a/room/room-common/api/public_plus_experimental_current.txt
+++ b/room/room-common/api/public_plus_experimental_current.txt
@@ -403,5 +403,10 @@
     property @androidx.room.OnConflictStrategy public abstract int onConflict;
   }
 
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface Upsert {
+    method public abstract kotlin.reflect.KClass<?> entity() default java.lang.Object;
+    property public abstract kotlin.reflect.KClass<?> entity;
+  }
+
 }
 
diff --git a/room/room-common/api/restricted_current.txt b/room/room-common/api/restricted_current.txt
index ab2db40..ddf226b 100644
--- a/room/room-common/api/restricted_current.txt
+++ b/room/room-common/api/restricted_current.txt
@@ -412,5 +412,10 @@
     property @androidx.room.OnConflictStrategy public abstract int onConflict;
   }
 
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface Upsert {
+    method public abstract kotlin.reflect.KClass<?> entity() default java.lang.Object;
+    property public abstract kotlin.reflect.KClass<?> entity;
+  }
+
 }
 
diff --git a/room/room-common/src/main/java/androidx/room/Insert.kt b/room/room-common/src/main/java/androidx/room/Insert.kt
index cc9acdc..bda4870 100644
--- a/room/room-common/src/main/java/androidx/room/Insert.kt
+++ b/room/room-common/src/main/java/androidx/room/Insert.kt
@@ -30,15 +30,15 @@
  *
  * ```
  * @Dao
- * public interface MusicDao {
+ * interface MusicDao {
  *   @Insert(onConflict = OnConflictStrategy.REPLACE)
- *   public fun insertSongs(varargs songs: Song)
+ *   fun insertSongs(varargs songs: Song)
  *
  *   @Insert
- *   public fun insertBoth(song1: Song, song2: Song)
+ *   fun insertBoth(song1: Song, song2: Song)
  *
  *   @Insert
- *   public fun insertAlbumWithSongs(album: Album, songs: List<Song>);
+ *   fun insertAlbumWithSongs(album: Album, songs: List<Song>)
  * }
  * ```
  *
@@ -69,9 +69,9 @@
  * )
  *
  * @Dao
- * public interface PlaylistDao {
+ * interface PlaylistDao {
  *   @Insert(entity = Playlist::class)
- *   public fun insertNewPlaylist(nameDescription: NameAndDescription);
+ *   fun insertNewPlaylist(nameDescription: NameAndDescription)
  * }
  * ```
  *
diff --git a/room/room-common/src/main/java/androidx/room/Upsert.kt b/room/room-common/src/main/java/androidx/room/Upsert.kt
index 3b29b35..117159e 100644
--- a/room/room-common/src/main/java/androidx/room/Upsert.kt
+++ b/room/room-common/src/main/java/androidx/room/Upsert.kt
@@ -16,8 +16,6 @@
 
 package androidx.room
 
-import androidx.annotation.RestrictTo
-import androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP
 import kotlin.reflect.KClass
 
 /**
@@ -33,14 +31,50 @@
  * Example:
  *
  * ```
- * TODO
+ * @Dao
+ * interface MusicDao {
+ *   @Upsert
+ *   fun upsertSongs(varargs songs: Song)
+ *
+ *   @Upsert
+ *   fun upsertBoth(song1: Song, song2: Song)
+ *
+ *   @Upsert
+ *   fun upsertAlbumWithSongs(album: Album, songs: List<Song>)
+ * }
  * ```
  *
  * If the target entity is specified via [entity] then the parameters can be of arbitrary
  * POJO types that will be interpreted as partial entities. For example:
  *
  * ```
- * TODO
+ * @Entity
+ * data class Playlist (
+ *   @PrimaryKey(autoGenerate = true)
+ *   val playlistId: Long,
+ *   val name: String,
+ *   val description: String?,
+ *
+ *   @ColumnInfo(defaultValue = "normal")
+ *   val category: String,
+ *
+ *   @ColumnInfo(defaultValue = "CURRENT_TIMESTAMP")
+ *   val createdTime: String,
+ *
+ *   @ColumnInfo(defaultValue = "CURRENT_TIMESTAMP")
+ *   val lastModifiedTime: String
+ * )
+ *
+ * data class NameAndDescription (
+ *   val name: String,
+ *   val description: String
+ * )
+ *
+ * @Dao
+ * interface PlaylistDao {
+ *   @Upsert(entity = Playlist::class)
+ *   fun upsertNewPlaylist(nameDescription: NameAndDescription)
+ * }
  * ```
  *
  * @see [Insert]
@@ -48,7 +82,6 @@
  */
 @Target(AnnotationTarget.FUNCTION)
 @Retention(AnnotationRetention.BINARY)
-@RestrictTo(LIBRARY_GROUP)
 public annotation class Upsert(
 
     /**
diff --git a/room/room-compiler-processing/build.gradle b/room/room-compiler-processing/build.gradle
index 075cb85..4e99504 100644
--- a/room/room-compiler-processing/build.gradle
+++ b/room/room-compiler-processing/build.gradle
@@ -26,6 +26,7 @@
     api(libs.kotlinStdlib)
     api(libs.javapoet)
     api(libs.kotlinPoet)
+    api(libs.kotlinPoetJavaPoet)
     implementation(libs.guava)
     implementation(libs.autoCommon)
     implementation(libs.autoValueAnnotations)
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 136ac5d..834cf3f 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
@@ -19,6 +19,7 @@
 import androidx.room.compiler.processing.XEquality
 import androidx.room.compiler.processing.XNullability
 import androidx.room.compiler.processing.XType
+import androidx.room.compiler.processing.isArray
 import androidx.room.compiler.processing.tryBox
 import androidx.room.compiler.processing.tryUnbox
 import com.google.devtools.ksp.symbol.KSClassDeclaration
@@ -84,9 +85,18 @@
     }
 
     override val typeElement by lazy {
-        // for primitive types, we could technically return null from here as they are not backed
-        // by a type element in javac but in Kotlin we have types for them, hence returning them
-        // is better.
+        // Array types don't have an associated type element (only the componentType does), so
+        // return null.
+        if (isArray()) {
+            return@lazy null
+        }
+
+        // If the typeName is primitive, return null for consistency since primitives normally imply
+        // that there isn't an associated type element.
+        if (typeName.isPrimitive) {
+            return@lazy null
+        }
+
         val declaration = ksType.declaration as? KSClassDeclaration
         declaration?.let {
             env.wrapClassDeclaration(it)
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 9f0364c..b347899 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
@@ -18,6 +18,7 @@
 
 import androidx.room.compiler.processing.ksp.ERROR_TYPE_NAME
 import androidx.room.compiler.processing.util.Source
+import androidx.room.compiler.processing.util.XTestInvocation
 import androidx.room.compiler.processing.util.className
 import androidx.room.compiler.processing.util.getDeclaredMethodByJvmName
 import androidx.room.compiler.processing.util.getField
@@ -830,6 +831,76 @@
         }
     }
 
+    @Test
+    fun arrayTypes() {
+        // Used to test both java and kotlin sources.
+        fun XTestInvocation.checkArrayTypesTest() {
+            val fooElement = processingEnv.requireTypeElement("foo.bar.Foo")
+            val barElement = processingEnv.requireTypeElement("foo.bar.Bar")
+            val barType = fooElement.getField("bar").type
+            val barArrayType = fooElement.getField("barArray").type
+
+            assertThat(barType.typeElement).isEqualTo(barElement)
+            assertThat(barType.isArray()).isFalse()
+            assertThat(barArrayType.typeElement).isNull()
+            assertThat(barArrayType.isArray()).isTrue()
+        }
+
+        runProcessorTest(listOf(Source.java(
+            "foo.bar.Foo",
+            """
+            package foo.bar;
+            class Foo {
+              Bar bar;
+              Bar[] barArray;
+            }
+            class Bar {}
+            """.trimIndent()
+        ))) { it.checkArrayTypesTest() }
+
+        runProcessorTest(listOf(Source.kotlin(
+            "foo.bar.Foo.kt",
+            """
+            package foo.bar;
+            class Foo {
+              val bar: Bar = TODO()
+              val barArray: Array<Bar> = TODO()
+            }
+            class Bar
+            """.trimIndent()
+        ))) { it.checkArrayTypesTest() }
+    }
+
+    @Test
+    fun primitiveTypes() {
+        fun XTestInvocation.checkPrimitiveType() {
+            val fooElement = processingEnv.requireTypeElement("foo.bar.Foo")
+            val primitiveType = fooElement.getField("i").type
+            assertThat(primitiveType.typeName).isEqualTo(TypeName.INT)
+            assertThat(primitiveType.typeElement).isNull()
+        }
+
+        runProcessorTest(listOf(Source.java(
+            "foo.bar.Foo",
+            """
+            package foo.bar;
+            class Foo {
+              int i;
+            }
+            """.trimIndent()
+        ))) { it.checkPrimitiveType() }
+
+        runProcessorTest(listOf(Source.kotlin(
+            "foo.bar.Foo.kt",
+            """
+            package foo.bar
+            class Foo {
+              val i: Int = TODO()
+            }
+            """.trimIndent()
+        ))) { it.checkPrimitiveType() }
+    }
+
     /**
      * Dumps the typename with its bounds in a given depth.
      * This makes tests more readable.
diff --git a/room/room-compiler/build.gradle b/room/room-compiler/build.gradle
index 13d97c6..ad40553 100644
--- a/room/room-compiler/build.gradle
+++ b/room/room-compiler/build.gradle
@@ -125,7 +125,7 @@
             dir: provider {
                 // Wrapping in a provider as we access buildDir before this project is configured
                 // Replace with AGP API once it is added b/228109260
-                "${new File(project(":sqlite:sqlite").buildDir, "libJar")}"
+                "${new File(project(":sqlite:sqlite").buildDir, "intermediates/compile_library_classes_jar/release/")}"
             },
             include : "*.jar"
     ))
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/RoomKspProcessor.kt b/room/room-compiler/src/main/kotlin/androidx/room/RoomKspProcessor.kt
index 3c3080d..0a37134 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/RoomKspProcessor.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/RoomKspProcessor.kt
@@ -17,9 +17,12 @@
 package androidx.room
 
 import androidx.room.DatabaseProcessingStep.Companion.ENV_CONFIG
+import androidx.room.compiler.processing.XProcessingEnv
+import androidx.room.compiler.processing.XRoundEnv
 import androidx.room.compiler.processing.ksp.KspBasicAnnotationProcessor
 import androidx.room.processor.Context.BooleanProcessorOptions.USE_NULL_AWARE_CONVERTER
 import androidx.room.processor.ProcessorErrors
+import androidx.room.verifier.DatabaseVerifier
 import com.google.devtools.ksp.processing.SymbolProcessor
 import com.google.devtools.ksp.processing.SymbolProcessorEnvironment
 import com.google.devtools.ksp.processing.SymbolProcessorProvider
@@ -51,6 +54,12 @@
         DatabaseProcessingStep()
     )
 
+    override fun postRound(env: XProcessingEnv, round: XRoundEnv) {
+        if (round.isProcessingOver) {
+            DatabaseVerifier.cleanup()
+        }
+    }
+
     class Provider : SymbolProcessorProvider {
         override fun create(environment: SymbolProcessorEnvironment): SymbolProcessor {
             return RoomKspProcessor(environment)
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/RoomProcessor.kt b/room/room-compiler/src/main/kotlin/androidx/room/RoomProcessor.kt
index e230b3e..5c7daee 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/RoomProcessor.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/RoomProcessor.kt
@@ -17,10 +17,13 @@
 package androidx.room
 
 import androidx.room.DatabaseProcessingStep.Companion.ENV_CONFIG
+import androidx.room.compiler.processing.XProcessingEnv
+import androidx.room.compiler.processing.XRoundEnv
 import androidx.room.compiler.processing.javac.JavacBasicAnnotationProcessor
 import androidx.room.processor.Context
 import androidx.room.processor.ProcessorErrors
 import androidx.room.util.SimpleJavaVersion
+import androidx.room.verifier.DatabaseVerifier
 import androidx.room.vo.Warning
 import javax.lang.model.SourceVersion
 
@@ -113,4 +116,10 @@
     override fun getSupportedSourceVersion(): SourceVersion {
         return SourceVersion.latest()
     }
+
+    override fun postRound(env: XProcessingEnv, round: XRoundEnv) {
+        if (round.isProcessingOver) {
+            DatabaseVerifier.cleanup()
+        }
+    }
 }
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt b/room/room-compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt
index ffad3f1..5acd990 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt
@@ -376,7 +376,7 @@
                     check(method.element, daoMethod.dao, it.value.entityTypeName)
                 }
             }
-            daoMethod.dao.insertionMethods.forEach { method ->
+            daoMethod.dao.insertOrUpsertShortcutMethods.forEach { method ->
                 method.entities.forEach {
                     check(method.element, daoMethod.dao, it.value.entityTypeName)
                 }
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/processor/InsertionMethodProcessor.kt b/room/room-compiler/src/main/kotlin/androidx/room/processor/InsertionMethodProcessor.kt
index 8ea1093..e05cf9e 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/processor/InsertionMethodProcessor.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/processor/InsertionMethodProcessor.kt
@@ -31,6 +31,7 @@
     val executableElement: XMethodElement
 ) {
     val context = baseContext.fork(executableElement)
+
     fun process(): InsertionMethod {
         val delegate = ShortcutMethodProcessor(context, containing, executableElement)
         val annotation = delegate.extractAnnotation(
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/processor/ProcessorErrors.kt b/room/room-compiler/src/main/kotlin/androidx/room/processor/ProcessorErrors.kt
index 7c08dd0..e951537 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/processor/ProcessorErrors.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/processor/ProcessorErrors.kt
@@ -188,6 +188,18 @@
 
     val CANNOT_FIND_UPSERT_RESULT_ADAPTER = "Not sure how to handle upsert method's return type."
 
+    val INSERT_MULTI_PARAM_SINGLE_RETURN_MISMATCH = "Insert method accepts multiple parameters " +
+        "but the return type is a single element. Try using a multiple element return type."
+
+    val UPSERT_MULTI_PARAM_SINGLE_RETURN_MISMATCH = "Upsert method accepts multiple parameters " +
+        "but the return type is a single element. Try using a multiple element return type."
+
+    val INSERT_SINGLE_PARAM_MULTI_RETURN_MISMATCH = "Insert method accepts a single parameter " +
+        "but the return type is a collection of elements. Try using a single element return type."
+
+    val UPSERT_SINGLE_PARAM_MULTI_RETURN_MISMATCH = "Upsert method accepts a single parameter " +
+        "but the return type is a collection of elements. Try using a single element return type."
+
     val UPDATE_MISSING_PARAMS = "Method annotated with" +
         " @Update but does not have any parameters to update."
 
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/processor/UpsertionMethodProcessor.kt b/room/room-compiler/src/main/kotlin/androidx/room/processor/UpsertionMethodProcessor.kt
index e45bf90..4e07a9c 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/processor/UpsertionMethodProcessor.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/processor/UpsertionMethodProcessor.kt
@@ -28,6 +28,7 @@
     val executableElement: XMethodElement
 ) {
     val context = baseContext.fork(executableElement)
+
     fun process(): UpsertionMethod {
         val delegate = ShortcutMethodProcessor(context, containing, executableElement)
 
@@ -77,6 +78,7 @@
         )
 
         val methodBinder = delegate.findUpsertMethodBinder(returnType, params)
+
         context.checker.check(
             methodBinder.adapter != null,
             executableElement,
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/solver/TypeAdapterStore.kt b/room/room-compiler/src/main/kotlin/androidx/room/solver/TypeAdapterStore.kt
index 8662073..70b2209 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/solver/TypeAdapterStore.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/solver/TypeAdapterStore.kt
@@ -448,14 +448,14 @@
         typeMirror: XType,
         params: List<ShortcutQueryParameter>
     ): InsertOrUpsertMethodAdapter? {
-        return InsertOrUpsertMethodAdapter.createInsert(typeMirror, params)
+        return InsertOrUpsertMethodAdapter.createInsert(context, typeMirror, params)
     }
 
     fun findUpsertAdapter(
         typeMirror: XType,
         params: List<ShortcutQueryParameter>
     ): InsertOrUpsertMethodAdapter? {
-        return InsertOrUpsertMethodAdapter.createUpsert(typeMirror, params)
+        return InsertOrUpsertMethodAdapter.createUpsert(context, typeMirror, params)
     }
 
     fun findQueryResultAdapter(
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/solver/shortcut/result/InsertOrUpsertMethodAdapter.kt b/room/room-compiler/src/main/kotlin/androidx/room/solver/shortcut/result/InsertOrUpsertMethodAdapter.kt
index 9d06985..58440d8 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/solver/shortcut/result/InsertOrUpsertMethodAdapter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/solver/shortcut/result/InsertOrUpsertMethodAdapter.kt
@@ -27,6 +27,8 @@
 import androidx.room.ext.N
 import androidx.room.ext.T
 import androidx.room.ext.typeName
+import androidx.room.processor.Context
+import androidx.room.processor.ProcessorErrors
 import androidx.room.solver.CodeGenScope
 import androidx.room.vo.ShortcutQueryParameter
 import com.squareup.javapoet.ArrayTypeName
@@ -37,44 +39,85 @@
 class InsertOrUpsertMethodAdapter private constructor(private val methodType: MethodType) {
     companion object {
         fun createInsert(
+            context: Context,
             returnType: XType,
             params: List<ShortcutQueryParameter>
         ): InsertOrUpsertMethodAdapter? {
-            val methodReturnType = getReturnType(returnType)
-            if (methodReturnType != null && isReturnValid(methodReturnType, params)) {
-                val methodType = InsertMethodType(methodReturnType)
-                return InsertOrUpsertMethodAdapter(methodType)
-            }
-            return null
+            return createMethod(
+                context,
+                returnType,
+                params,
+                ::InsertMethodType,
+                ProcessorErrors.INSERT_MULTI_PARAM_SINGLE_RETURN_MISMATCH,
+                ProcessorErrors.INSERT_SINGLE_PARAM_MULTI_RETURN_MISMATCH
+            )
         }
 
         fun createUpsert(
+            context: Context,
             returnType: XType,
             params: List<ShortcutQueryParameter>
         ): InsertOrUpsertMethodAdapter? {
+            return createMethod(
+                context,
+                returnType,
+                params,
+                ::UpsertMethodType,
+                ProcessorErrors.UPSERT_MULTI_PARAM_SINGLE_RETURN_MISMATCH,
+                ProcessorErrors.UPSERT_SINGLE_PARAM_MULTI_RETURN_MISMATCH
+            )
+        }
+
+        private fun createMethod(
+            context: Context,
+            returnType: XType,
+            params: List<ShortcutQueryParameter>,
+            methodTypeClass: (returnType: ReturnType) -> MethodType,
+            multiParamSingleReturnError: String,
+            singleParamMultiReturnError: String
+        ): InsertOrUpsertMethodAdapter? {
             val methodReturnType = getReturnType(returnType)
-            if (methodReturnType != null && isReturnValid(methodReturnType, params)) {
-                val methodType = UpsertMethodType(methodReturnType)
+            if (methodReturnType != null &&
+                isReturnValid(
+                    context,
+                    methodReturnType,
+                    params,
+                    multiParamSingleReturnError,
+                    singleParamMultiReturnError
+                )
+            ) {
+                val methodType = methodTypeClass(methodReturnType)
                 return InsertOrUpsertMethodAdapter(methodType)
             }
             return null
         }
 
         private fun isReturnValid(
+            context: Context,
             returnType: ReturnType,
-            params: List<ShortcutQueryParameter>
+            params: List<ShortcutQueryParameter>,
+            multiParamSingleReturnError: String,
+            singleParamMultiReturnError: String
         ): Boolean {
             if (params.isEmpty() || params.size > 1) {
                 return returnType == ReturnType.VOID ||
                     returnType == ReturnType.UNIT
             }
-            return if (params.first().isMultiple) {
-                returnType in MULTIPLE_ITEM_SET
+            if (params.first().isMultiple) {
+                val isValid = returnType in MULTIPLE_ITEM_SET
+                if (!isValid) {
+                    context.logger.e(multiParamSingleReturnError)
+                }
+                return isValid
             } else {
-                returnType == ReturnType.VOID ||
+                val isValid = (returnType == ReturnType.VOID ||
                     returnType == ReturnType.VOID_OBJECT ||
                     returnType == ReturnType.UNIT ||
-                    returnType == ReturnType.SINGLE_ID
+                    returnType == ReturnType.SINGLE_ID)
+                if (!isValid) {
+                    context.logger.e(singleParamMultiReturnError)
+                }
+                return isValid
             }
         }
 
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/verifier/DatabaseVerifier.kt b/room/room-compiler/src/main/kotlin/androidx/room/verifier/DatabaseVerifier.kt
index 07b664e..6158ff4 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/verifier/DatabaseVerifier.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/verifier/DatabaseVerifier.kt
@@ -24,12 +24,14 @@
 import androidx.room.vo.FtsEntity
 import androidx.room.vo.FtsOptions
 import androidx.room.vo.Warning
-import org.sqlite.JDBC
-import org.sqlite.SQLiteJDBCLoader
 import java.io.File
 import java.sql.Connection
+import java.sql.Driver
+import java.sql.DriverManager
 import java.sql.SQLException
 import java.util.regex.Pattern
+import org.sqlite.JDBC
+import org.sqlite.SQLiteJDBCLoader
 
 /**
  * Builds an in-memory version of the database and verifies the queries against it.
@@ -59,6 +61,13 @@
             "\\s+COLLATE\\s+(LOCALIZED|UNICODE)", Pattern.CASE_INSENSITIVE
         )
 
+        /**
+         * Keep a reference to the SQLite JDBC driver so we can re-register it in the case that Room
+         * finishes processing, cleans up and unregisters the driver but is started again within the
+         * same class loader such that JDBC's static block and driver registration does not occur.
+         */
+        private val DRIVER: Driver
+
         init {
             verifyTempDir()
             // Synchronize on a bootstrap loaded class so that parallel runs of Room in the same JVM
@@ -69,6 +78,10 @@
             synchronized(System::class.java) {
                 SQLiteJDBCLoader.initialize() // extract and loads native library
                 JDBC.isValidURL(CONNECTION_URL) // call to register driver
+                DRIVER = DriverManager.getDriver("jdbc:sqlite:") // get registered driver
+                check(DRIVER is JDBC) {
+                    "Expected driver to be a '${JDBC::class.java}' but was '${DRIVER::class.java}'"
+                }
             }
         }
 
@@ -103,6 +116,8 @@
             views: List<DatabaseView>
         ): DatabaseVerifier? {
             try {
+                // Re-register driver in case it was unregistered, this is a no-op is already there.
+                DriverManager.registerDriver(DRIVER)
                 val connection = JDBC.createConnection(CONNECTION_URL, java.util.Properties())
                 return DatabaseVerifier(connection, context, entities, views)
             } catch (ex: Exception) {
@@ -113,6 +128,20 @@
                 return null
             }
         }
+
+        /**
+         * Unregisters the SQLite JDBC driver used by the verifier.
+         *
+         * This is necessary since the driver is statically registered and never unregistered and
+         * can cause class loader leaks. See https://github.com/google/ksp/issues/1063.
+         */
+        fun cleanup() {
+            try {
+                DriverManager.deregisterDriver(DRIVER)
+            } catch (ignored: SQLException) {
+                // Driver was not found
+            }
+        }
     }
 
     init {
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/vo/Dao.kt b/room/room-compiler/src/main/kotlin/androidx/room/vo/Dao.kt
index f328947..aec2802 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/vo/Dao.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/vo/Dao.kt
@@ -52,6 +52,10 @@
         deletionMethods + updateMethods
     }
 
+    val insertOrUpsertShortcutMethods: List<InsertOrUpsertShortcutMethod> by lazy {
+        insertionMethods + upsertionMethods
+    }
+
     private val implClassName by lazy {
         if (suffix == null) {
             suffix = ""
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt
index bd5eb43..f6f9d51 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt
@@ -177,6 +177,32 @@
                 """
         )
 
+        val PUBLISHER = Source.java(
+            "foo.bar.Publisher",
+            """
+                package foo.bar;
+                import androidx.room.*;
+                @Entity
+                public class Publisher {
+                    @PrimaryKey
+                    int publisherId;
+                }
+            """
+        )
+
+        val PUBLISHER_DAO = Source.java(
+            "foo.bar.PublisherDao",
+            """
+                package foo.bar;
+                import androidx.room.*;
+                @Dao
+                public interface PublisherDao {
+                    @Upsert
+                    public void upsert(Publisher publisher);
+                }
+            """
+        )
+
         val AUTOMIGRATION = Source.java(
             "foo.bar.MyAutoMigration",
             """
@@ -797,6 +823,29 @@
     }
 
     @Test
+    fun upsertNotReferencedEntity() {
+        singleDb(
+            """
+                @Database(entities = {User.class}, version = 42)
+                public abstract class MyDb extends RoomDatabase {
+                    abstract PublisherDao publisherDao();
+                }
+            """,
+            USER, USER_DAO, PUBLISHER, PUBLISHER_DAO
+        ) { _, invocation ->
+            invocation.assertCompilationResult {
+                hasErrorContaining(
+                    ProcessorErrors.shortcutEntityIsNotInDatabase(
+                        database = "foo.bar.MyDb",
+                        dao = "foo.bar.PublisherDao",
+                        entity = "foo.bar.Publisher"
+                    )
+                )
+            }
+        }
+    }
+
+    @Test
     fun cache_entity() {
         singleDb(
             """
@@ -1155,19 +1204,9 @@
                 baseContext = invocation.context,
                 element = element
             ).process()
-            assertThat(result.daoMethods).hasSize(
-                // for KSP, it will still show as a method, just bad return type
-                if (invocation.isKsp) 1 else 0
-            )
+            assertThat(result.daoMethods).hasSize(0)
             invocation.assertCompilationResult {
-                hasErrorContaining(
-                    if (invocation.isKsp) {
-                        // no primitives in KSP hence we'll get another error
-                        ProcessorErrors.DAO_MUST_BE_ANNOTATED_WITH_DAO
-                    } else {
-                        ProcessorErrors.DATABASE_INVALID_DAO_METHOD_RETURN_TYPE
-                    }
-                )
+                hasErrorContaining(ProcessorErrors.DATABASE_INVALID_DAO_METHOD_RETURN_TYPE)
             }
         }
     }
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/processor/DeleteOrUpdateShortcutMethodProcessorTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/processor/DeleteOrUpdateShortcutMethodProcessorTest.kt
index db69a38..9991b4d 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/processor/DeleteOrUpdateShortcutMethodProcessorTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/processor/DeleteOrUpdateShortcutMethodProcessorTest.kt
@@ -582,20 +582,11 @@
                 """,
         ) { _, invocation ->
             invocation.assertCompilationResult {
-                if (invocation.isKsp) {
-                    hasErrorContaining(
-                        ProcessorErrors.noColumnsInPartialEntity(
-                            "java.lang.Long"
-                        )
+                hasErrorContaining(
+                    ProcessorErrors.shortcutMethodArgumentMustBeAClass(
+                        TypeName.LONG
                     )
-                } else {
-                    // javac has a different error for primitives.
-                    hasErrorContaining(
-                        ProcessorErrors.shortcutMethodArgumentMustBeAClass(
-                            TypeName.LONG
-                        )
-                    )
-                }
+                )
             }
         }
     }
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/processor/InsertOrUpsertShortcutMethodProcessorTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/processor/InsertOrUpsertShortcutMethodProcessorTest.kt
index a1aee1e..46b6fca 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/processor/InsertOrUpsertShortcutMethodProcessorTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/processor/InsertOrUpsertShortcutMethodProcessorTest.kt
@@ -25,6 +25,10 @@
 import androidx.room.compiler.processing.util.XTestInvocation
 import androidx.room.compiler.processing.util.runProcessorTest
 import androidx.room.ext.CommonTypeNames
+import androidx.room.ext.GuavaUtilConcurrentTypeNames
+import androidx.room.ext.KotlinTypeNames
+import androidx.room.ext.LifecyclesTypeNames
+import androidx.room.ext.ReactiveStreamsTypeNames
 import androidx.room.ext.RxJava2TypeNames
 import androidx.room.ext.RxJava3TypeNames
 import androidx.room.solver.shortcut.result.InsertOrUpsertMethodAdapter
@@ -80,7 +84,6 @@
                 abstract public void foo();
                 """
         ) { insertionUpsertion, invocation ->
-
             assertThat(insertionUpsertion.element.jvmName).isEqualTo("foo")
             assertThat(insertionUpsertion.parameters.size).isEqualTo(0)
             assertThat(insertionUpsertion.returnType.typeName).isEqualTo(TypeName.VOID)
@@ -393,7 +396,7 @@
                 abstract public $type foo(User user);
                 """
             ) { insertionUpsertion, invocation ->
-                // TODO: (b/240491383) remove methodBinder nullability
+
                 assertThat(insertionUpsertion.methodBinder?.adapter).isNull()
 
                 invocation.assertCompilationResult {
@@ -418,11 +421,11 @@
                 abstract public $type foo(User user);
                 """
             ) { insertionUpsertion, invocation ->
-                // TODO: (b/240491383) remove methodBinder nullability
+
                 assertThat(insertionUpsertion.methodBinder?.adapter).isNull()
 
                 invocation.assertCompilationResult {
-                    hasErrorContaining(noAdapter())
+                    hasErrorContaining(singleParamAndMultiReturnMismatchError())
                 }
             }
         }
@@ -442,11 +445,10 @@
                 abstract public $type foo(User... user);
                 """
             ) { insertionUpsertion, invocation ->
-                // TODO: (b/240491383) remove methodBinder nullability
                 assertThat(insertionUpsertion.methodBinder?.adapter).isNull()
 
                 invocation.assertCompilationResult {
-                    hasErrorContaining(noAdapter())
+                    hasErrorContaining(multiParamAndSingleReturnMismatchError())
                 }
             }
         }
@@ -466,7 +468,6 @@
                 abstract public $type foo(User user1, User user2);
                 """
             ) { insertionUpsertion, invocation ->
-                // TODO: (b/240491383) remove methodBinder nullability
                 assertThat(insertionUpsertion.methodBinder?.adapter).isNull()
 
                 invocation.assertCompilationResult {
@@ -548,6 +549,10 @@
 
     abstract fun noAdapter(): String
 
+    abstract fun multiParamAndSingleReturnMismatchError(): String
+
+    abstract fun singleParamAndMultiReturnMismatchError(): String
+
     @Test
     fun targetEntitySingle() {
         val usernameSource = Source.java(
@@ -930,6 +935,39 @@
         }
     }
 
+    @Test
+    fun suspendReturnsDeferredType() {
+        listOf(
+            "${RxJava2TypeNames.FLOWABLE}<Int>",
+            "${RxJava2TypeNames.OBSERVABLE}<Int>",
+            "${RxJava2TypeNames.MAYBE}<Int>",
+            "${RxJava2TypeNames.SINGLE}<Int>",
+            "${RxJava2TypeNames.COMPLETABLE}",
+            "${RxJava3TypeNames.FLOWABLE}<Int>",
+            "${RxJava3TypeNames.OBSERVABLE}<Int>",
+            "${RxJava3TypeNames.MAYBE}<Int>",
+            "${RxJava3TypeNames.SINGLE}<Int>",
+            "${RxJava3TypeNames.COMPLETABLE}",
+            "${LifecyclesTypeNames.LIVE_DATA}<Int>",
+            "${LifecyclesTypeNames.COMPUTABLE_LIVE_DATA}<Int>",
+            "${GuavaUtilConcurrentTypeNames.LISTENABLE_FUTURE}<Int>",
+            "${ReactiveStreamsTypeNames.PUBLISHER}<Int>",
+            "${KotlinTypeNames.FLOW}<Int>"
+        ).forEach { type ->
+            singleInsertUpsertShortcutMethodKotlin(
+                """
+                @${annotation.java.canonicalName}
+                abstract suspend fun foo(user: User): $type
+                """
+            ) { _, invocation ->
+                invocation.assertCompilationResult {
+                    val rawTypeName = type.substringBefore("<")
+                    hasErrorContaining(ProcessorErrors.suspendReturnsDeferredType(rawTypeName))
+                }
+            }
+        }
+    }
+
     abstract fun process(
         baseContext: Context,
         containing: XType,
@@ -973,4 +1011,44 @@
             handler(processed, invocation)
         }
     }
+
+    fun singleInsertUpsertShortcutMethodKotlin(
+        vararg input: String,
+        additionalSources: List<Source> = emptyList(),
+        handler: (T, XTestInvocation) -> Unit
+    ) {
+        val inputSource = Source.kotlin(
+            "MyClass.kt",
+            DAO_PREFIX_KT + input.joinToString("\n") + DAO_SUFFIX
+        )
+        val commonSources = listOf(
+            COMMON.USER, COMMON.BOOK, COMMON.NOT_AN_ENTITY, COMMON.RX2_COMPLETABLE,
+            COMMON.RX2_MAYBE, COMMON.RX2_SINGLE, COMMON.RX2_FLOWABLE, COMMON.RX2_OBSERVABLE,
+            COMMON.RX3_COMPLETABLE, COMMON.RX3_MAYBE, COMMON.RX3_SINGLE, COMMON.RX3_FLOWABLE,
+            COMMON.RX3_OBSERVABLE, COMMON.LISTENABLE_FUTURE, COMMON.LIVE_DATA,
+            COMMON.COMPUTABLE_LIVE_DATA, COMMON.PUBLISHER, COMMON.FLOW, COMMON.GUAVA_ROOM
+        )
+
+        runProcessorTest(
+            sources = commonSources + additionalSources + inputSource
+        ) { invocation ->
+            val (owner, methods) = invocation.roundEnv
+                .getElementsAnnotatedWith(Dao::class.qualifiedName!!)
+                .filterIsInstance<XTypeElement>()
+                .map {
+                    Pair(
+                        it,
+                        it.getAllMethods().filter {
+                            it.hasAnnotation(annotation)
+                        }.toList()
+                    )
+                }.first { it.second.isNotEmpty() }
+            val processed = process(
+                baseContext = invocation.context,
+                containing = owner.type,
+                executableElement = methods.first()
+            )
+            handler(processed, invocation)
+        }
+    }
 }
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/processor/InsertionMethodProcessorTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/processor/InsertionMethodProcessorTest.kt
index a968514..1806453c 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/processor/InsertionMethodProcessorTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/processor/InsertionMethodProcessorTest.kt
@@ -22,6 +22,8 @@
 import androidx.room.compiler.processing.XType
 import androidx.room.processor.ProcessorErrors.INSERTION_DOES_NOT_HAVE_ANY_PARAMETERS_TO_INSERT
 import androidx.room.processor.ProcessorErrors.CANNOT_FIND_INSERT_RESULT_ADAPTER
+import androidx.room.processor.ProcessorErrors.INSERT_MULTI_PARAM_SINGLE_RETURN_MISMATCH
+import androidx.room.processor.ProcessorErrors.INSERT_SINGLE_PARAM_MULTI_RETURN_MISMATCH
 import androidx.room.vo.InsertionMethod
 import com.google.common.truth.Truth.assertThat
 import org.junit.Test
@@ -44,6 +46,12 @@
 
     override fun noAdapter(): String = CANNOT_FIND_INSERT_RESULT_ADAPTER
 
+    override fun multiParamAndSingleReturnMismatchError():
+        String = INSERT_MULTI_PARAM_SINGLE_RETURN_MISMATCH
+
+    override fun singleParamAndMultiReturnMismatchError():
+        String = INSERT_SINGLE_PARAM_MULTI_RETURN_MISMATCH
+
     @Test
     fun onConflict_Default() {
         singleInsertUpsertShortcutMethod(
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTest.kt
index 099ecf8..1df902e 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTest.kt
@@ -330,16 +330,8 @@
                 int embeddedPrimitive;
                 """
         ) { _, invocation ->
-            if (invocation.isKsp) {
-                // there are no primitives in KSP so this won't work. Instead, it will fail
-                // because we cannot find a constructor for `int`
-                invocation.assertCompilationResult {
-                    hasErrorContaining(MISSING_POJO_CONSTRUCTOR)
-                }
-            } else {
-                invocation.assertCompilationResult {
-                    hasErrorContaining(ProcessorErrors.EMBEDDED_TYPES_MUST_BE_A_CLASS_OR_INTERFACE)
-                }
+            invocation.assertCompilationResult {
+                hasErrorContaining(ProcessorErrors.EMBEDDED_TYPES_MUST_BE_A_CLASS_OR_INTERFACE)
             }
         }
     }
@@ -481,22 +473,8 @@
                 public long user;
                 """
         ) { _, invocation ->
-            if (invocation.isKsp) {
-                // in KSP, there are no primitives so `long` (kotlin.Long) will still look like a
-                // class but then we'll fail because it doesn't hvae a `uid` column
-                invocation.assertCompilationResult {
-                    hasErrorContaining(
-                        relationCannotFindEntityField(
-                            entityName = "java.lang.Long",
-                            columnName = "uid",
-                            availableColumns = emptyList()
-                        )
-                    )
-                }
-            } else {
-                invocation.assertCompilationResult {
-                    hasErrorContaining(ProcessorErrors.RELATION_TYPE_MUST_BE_A_CLASS_OR_INTERFACE)
-                }
+            invocation.assertCompilationResult {
+                hasErrorContaining(ProcessorErrors.RELATION_TYPE_MUST_BE_A_CLASS_OR_INTERFACE)
             }
         }
     }
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/processor/UpsertionMethodProcessorTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/processor/UpsertionMethodProcessorTest.kt
index 26ecca7..49832fb 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/processor/UpsertionMethodProcessorTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/processor/UpsertionMethodProcessorTest.kt
@@ -21,6 +21,8 @@
 import androidx.room.compiler.processing.XType
 import androidx.room.processor.ProcessorErrors.UPSERTION_DOES_NOT_HAVE_ANY_PARAMETERS_TO_UPSERT
 import androidx.room.processor.ProcessorErrors.CANNOT_FIND_UPSERT_RESULT_ADAPTER
+import androidx.room.processor.ProcessorErrors.UPSERT_MULTI_PARAM_SINGLE_RETURN_MISMATCH
+import androidx.room.processor.ProcessorErrors.UPSERT_SINGLE_PARAM_MULTI_RETURN_MISMATCH
 import androidx.room.vo.UpsertionMethod
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
@@ -41,6 +43,12 @@
 
     override fun noAdapter(): String = CANNOT_FIND_UPSERT_RESULT_ADAPTER
 
+    override fun multiParamAndSingleReturnMismatchError():
+        String = UPSERT_MULTI_PARAM_SINGLE_RETURN_MISMATCH
+
+    override fun singleParamAndMultiReturnMismatchError():
+        String = UPSERT_SINGLE_PARAM_MULTI_RETURN_MISMATCH
+
     override fun process(
         baseContext: Context,
         containing: XType,
diff --git a/room/room-runtime/api/restricted_current.ignore b/room/room-runtime/api/restricted_current.ignore
index d53b9c9..ac20e68 100644
--- a/room/room-runtime/api/restricted_current.ignore
+++ b/room/room-runtime/api/restricted_current.ignore
@@ -1,6 +1,30 @@
 // Baseline format: 1.0
 AddedFinal: androidx.room.Room:
     Class androidx.room.Room added 'final' qualifier
+AddedFinal: androidx.room.RoomSQLiteQuery#bindBlob(int, byte[]):
+    Method androidx.room.RoomSQLiteQuery.bindBlob has added 'final' qualifier
+AddedFinal: androidx.room.RoomSQLiteQuery#bindDouble(int, double):
+    Method androidx.room.RoomSQLiteQuery.bindDouble has added 'final' qualifier
+AddedFinal: androidx.room.RoomSQLiteQuery#bindLong(int, long):
+    Method androidx.room.RoomSQLiteQuery.bindLong has added 'final' qualifier
+AddedFinal: androidx.room.RoomSQLiteQuery#bindNull(int):
+    Method androidx.room.RoomSQLiteQuery.bindNull has added 'final' qualifier
+AddedFinal: androidx.room.RoomSQLiteQuery#bindString(int, String):
+    Method androidx.room.RoomSQLiteQuery.bindString has added 'final' qualifier
+AddedFinal: androidx.room.RoomSQLiteQuery#bindTo(androidx.sqlite.db.SupportSQLiteProgram):
+    Method androidx.room.RoomSQLiteQuery.bindTo has added 'final' qualifier
+AddedFinal: androidx.room.RoomSQLiteQuery#clearBindings():
+    Method androidx.room.RoomSQLiteQuery.clearBindings has added 'final' qualifier
+AddedFinal: androidx.room.RoomSQLiteQuery#close():
+    Method androidx.room.RoomSQLiteQuery.close has added 'final' qualifier
+AddedFinal: androidx.room.RoomSQLiteQuery#copyArgumentsFrom(androidx.room.RoomSQLiteQuery):
+    Method androidx.room.RoomSQLiteQuery.copyArgumentsFrom has added 'final' qualifier
+AddedFinal: androidx.room.RoomSQLiteQuery#getArgCount():
+    Method androidx.room.RoomSQLiteQuery.getArgCount has added 'final' qualifier
+AddedFinal: androidx.room.RoomSQLiteQuery#getSql():
+    Method androidx.room.RoomSQLiteQuery.getSql has added 'final' qualifier
+AddedFinal: androidx.room.RoomSQLiteQuery#release():
+    Method androidx.room.RoomSQLiteQuery.release has added 'final' qualifier
 
 
 ChangedType: androidx.room.DatabaseConfiguration#autoMigrationSpecs:
diff --git a/room/room-runtime/api/restricted_current.txt b/room/room-runtime/api/restricted_current.txt
index ed8b0bc..ee903c6 100644
--- a/room/room-runtime/api/restricted_current.txt
+++ b/room/room-runtime/api/restricted_current.txt
@@ -67,6 +67,7 @@
     method public Long![] upsertAndReturnIdsArrayBox(T![] entities);
     method public Long![] upsertAndReturnIdsArrayBox(java.util.Collection<? extends T> entities);
     method public java.util.List<java.lang.Long> upsertAndReturnIdsList(T![] entities);
+    method public java.util.List<java.lang.Long> upsertAndReturnIdsList(java.util.Collection<? extends T> entities);
   }
 
   public class InvalidationTracker {
@@ -224,28 +225,29 @@
     field public final boolean isValid;
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class RoomSQLiteQuery implements androidx.sqlite.db.SupportSQLiteProgram androidx.sqlite.db.SupportSQLiteQuery {
-    method public static final androidx.room.RoomSQLiteQuery acquire(String query, int argumentCount);
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class RoomSQLiteQuery implements androidx.sqlite.db.SupportSQLiteProgram androidx.sqlite.db.SupportSQLiteQuery {
+    method public static androidx.room.RoomSQLiteQuery acquire(String query, int argumentCount);
     method public void bindBlob(int index, byte[] value);
     method public void bindDouble(int index, double value);
     method public void bindLong(int index, long value);
     method public void bindNull(int index);
     method public void bindString(int index, String value);
-    method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram program);
+    method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram statement);
     method public void clearBindings();
     method public void close();
     method public void copyArgumentsFrom(androidx.room.RoomSQLiteQuery other);
-    method public static final androidx.room.RoomSQLiteQuery copyFrom(androidx.sqlite.db.SupportSQLiteQuery supportSQLiteQuery);
+    method public static androidx.room.RoomSQLiteQuery copyFrom(androidx.sqlite.db.SupportSQLiteQuery supportSQLiteQuery);
     method public int getArgCount();
-    method public final int getCapacity();
+    method public int getCapacity();
     method public String getSql();
     method public void init(String query, int initArgCount);
     method public void release();
+    property public int argCount;
     property public final int capacity;
+    property public String sql;
     field public static final androidx.room.RoomSQLiteQuery.Companion Companion;
     field @VisibleForTesting public static final int DESIRED_POOL_SIZE = 10; // 0xa
     field @VisibleForTesting public static final int POOL_LIMIT = 15; // 0xf
-    field @VisibleForTesting public int argCount;
     field @VisibleForTesting public final byte[]![] blobBindings;
     field @VisibleForTesting public final double[] doubleBindings;
     field @VisibleForTesting public final long[] longBindings;
diff --git a/room/room-runtime/src/main/java/androidx/room/AutoCloser.kt b/room/room-runtime/src/main/java/androidx/room/AutoCloser.kt
index f79f982..456d2a9 100644
--- a/room/room-runtime/src/main/java/androidx/room/AutoCloser.kt
+++ b/room/room-runtime/src/main/java/androidx/room/AutoCloser.kt
@@ -20,7 +20,6 @@
 import android.os.SystemClock
 import androidx.annotation.GuardedBy
 import androidx.annotation.VisibleForTesting
-import androidx.room.util.SneakyThrow
 import androidx.sqlite.db.SupportSQLiteDatabase
 import androidx.sqlite.db.SupportSQLiteOpenHelper
 import java.io.IOException
@@ -92,11 +91,7 @@
 
             delegateDatabase?.let {
                 if (it.isOpen) {
-                    try {
-                        it.close()
-                    } catch (e: IOException) {
-                        SneakyThrow.reThrow(e)
-                    }
+                    it.close()
                 }
             }
             delegateDatabase = null
diff --git a/room/room-runtime/src/main/java/androidx/room/AutoClosingRoomOpenHelper.kt b/room/room-runtime/src/main/java/androidx/room/AutoClosingRoomOpenHelper.kt
index d32cf1d..76c4ba8 100644
--- a/room/room-runtime/src/main/java/androidx/room/AutoClosingRoomOpenHelper.kt
+++ b/room/room-runtime/src/main/java/androidx/room/AutoClosingRoomOpenHelper.kt
@@ -26,7 +26,6 @@
 import android.os.CancellationSignal
 import android.util.Pair
 import androidx.annotation.RequiresApi
-import androidx.room.util.SneakyThrow
 import androidx.sqlite.db.SupportSQLiteCompat
 import androidx.sqlite.db.SupportSQLiteDatabase
 import androidx.sqlite.db.SupportSQLiteOpenHelper
@@ -69,11 +68,7 @@
     }
 
     override fun close() {
-        try {
-            autoClosingDb.close()
-        } catch (e: IOException) {
-            SneakyThrow.reThrow(e)
-        }
+        autoClosingDb.close()
     }
 
     /**
diff --git a/room/room-runtime/src/main/java/androidx/room/EntityInsertionAdapter.kt b/room/room-runtime/src/main/java/androidx/room/EntityInsertionAdapter.kt
index 0fe0daf..056d840 100644
--- a/room/room-runtime/src/main/java/androidx/room/EntityInsertionAdapter.kt
+++ b/room/room-runtime/src/main/java/androidx/room/EntityInsertionAdapter.kt
@@ -151,13 +151,14 @@
      * @param entities Entities to insert
      * @return The SQLite row ids, for entities that are not inserted the row id returned will be -1
      */
-    fun insertAndReturnIdsArrayBox(entities: Collection<T>): Array<Long?> {
+    fun insertAndReturnIdsArrayBox(entities: Collection<T>): Array<Long> {
         val stmt: SupportSQLiteStatement = acquire()
+        val iterator = entities.iterator()
         return try {
-            val result = arrayOfNulls<Long>(entities.size)
-            entities.forEachIndexed { index, entity ->
+            val result = Array(entities.size) {
+                val entity = iterator.next()
                 bind(stmt, entity)
-                result[index] = stmt.executeInsert()
+                stmt.executeInsert()
             }
             result
         } finally {
@@ -171,13 +172,14 @@
      * @param entities Entities to insert
      * @return The SQLite row ids, for entities that are not inserted the row id returned will be -1
      */
-    fun insertAndReturnIdsArrayBox(entities: Array<T>): Array<Long?> {
+    fun insertAndReturnIdsArrayBox(entities: Array<T>): Array<Long> {
         val stmt: SupportSQLiteStatement = acquire()
+        val iterator = entities.iterator()
         return try {
-            val result = arrayOfNulls<Long>(entities.size)
-            entities.forEachIndexed { index, entity ->
+            val result = Array(entities.size) {
+                val entity = iterator.next()
                 bind(stmt, entity)
-                result[index] = stmt.executeInsert()
+                stmt.executeInsert()
             }
             result
         } finally {
diff --git a/room/room-runtime/src/main/java/androidx/room/EntityUpsertionAdapter.kt b/room/room-runtime/src/main/java/androidx/room/EntityUpsertionAdapter.kt
index 52502db..aad5bbe 100644
--- a/room/room-runtime/src/main/java/androidx/room/EntityUpsertionAdapter.kt
+++ b/room/room-runtime/src/main/java/androidx/room/EntityUpsertionAdapter.kt
@@ -124,7 +124,7 @@
     }
 
     fun upsertAndReturnIdsList(entities: Array<T>): List<Long> {
-        return buildList<Long> {
+        return buildList {
             entities.forEach { entity ->
                 try {
                     add(insertionAdapter.insertAndReturnId(entity))
@@ -136,8 +136,21 @@
         }
     }
 
-    fun upsertAndReturnIdsArrayBox(entities: Array<T>): Array<Long?> {
-        return Array<Long?>(entities.size) { index ->
+    fun upsertAndReturnIdsList(entities: Collection<T>): List<Long> {
+        return buildList {
+            entities.forEach { entity ->
+                try {
+                    add(insertionAdapter.insertAndReturnId(entity))
+                } catch (ex: SQLiteConstraintException) {
+                    updateAdapter.handle(entity)
+                    add(-1)
+                }
+            }
+        }
+    }
+
+    fun upsertAndReturnIdsArrayBox(entities: Array<T>): Array<Long> {
+        return Array(entities.size) { index ->
             try {
                 insertionAdapter.insertAndReturnId(entities[index])
             } catch (ex: SQLiteConstraintException) {
@@ -147,9 +160,9 @@
         }
     }
 
-    fun upsertAndReturnIdsArrayBox(entities: Collection<T>): Array<Long?> {
+    fun upsertAndReturnIdsArrayBox(entities: Collection<T>): Array<Long> {
         val iterator = entities.iterator()
-        return Array<Long?>(entities.size) {
+        return Array(entities.size) {
             val entity = iterator.next()
             try {
                 insertionAdapter.insertAndReturnId(entity)
diff --git a/room/room-runtime/src/main/java/androidx/room/QueryInterceptorDatabase.kt b/room/room-runtime/src/main/java/androidx/room/QueryInterceptorDatabase.kt
index 1ae68ea3..ab9a009 100644
--- a/room/room-runtime/src/main/java/androidx/room/QueryInterceptorDatabase.kt
+++ b/room/room-runtime/src/main/java/androidx/room/QueryInterceptorDatabase.kt
@@ -103,7 +103,7 @@
         val queryInterceptorProgram = QueryInterceptorProgram()
         query.bindTo(queryInterceptorProgram)
         queryCallbackExecutor.execute {
-            queryCallback.onQuery(query.getSql(), queryInterceptorProgram.bindArgsCache)
+            queryCallback.onQuery(query.sql, queryInterceptorProgram.bindArgsCache)
         }
         return delegate.query(query)
     }
diff --git a/room/room-runtime/src/main/java/androidx/room/RoomSQLiteQuery.kt b/room/room-runtime/src/main/java/androidx/room/RoomSQLiteQuery.kt
index 4c0ee9b..c13695e 100644
--- a/room/room-runtime/src/main/java/androidx/room/RoomSQLiteQuery.kt
+++ b/room/room-runtime/src/main/java/androidx/room/RoomSQLiteQuery.kt
@@ -32,7 +32,7 @@
  * @hide
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-open class RoomSQLiteQuery private constructor(
+class RoomSQLiteQuery private constructor(
     @field:VisibleForTesting val capacity: Int
 ) : SupportSQLiteQuery, SupportSQLiteProgram {
     @Volatile
@@ -58,11 +58,10 @@
     private val bindingTypes: IntArray
 
     // number of arguments in the query
-    @JvmField
-    @VisibleForTesting
-    var argCount = 0
+    override var argCount = 0
+        private set
 
-    open fun init(query: String, initArgCount: Int) {
+    fun init(query: String, initArgCount: Int) {
         this.query = query
         argCount = initArgCount
     }
@@ -83,29 +82,24 @@
      * After released, the statement might be returned when [.acquire] is called
      * so you should never re-use it after releasing.
      */
-    open fun release() {
+    fun release() {
         synchronized(queryPool) {
             queryPool[capacity] = this
             prunePoolLocked()
         }
     }
 
-    override fun getSql(): String {
-        return requireNotNull(query)
-    }
+    override val sql: String
+        get() = checkNotNull(this.query)
 
-    override fun getArgCount(): Int {
-        return argCount
-    }
-
-    override fun bindTo(program: SupportSQLiteProgram) {
+    override fun bindTo(statement: SupportSQLiteProgram) {
         for (index in 1..argCount) {
             when (bindingTypes[index]) {
-                NULL -> program.bindNull(index)
-                LONG -> program.bindLong(index, longBindings[index])
-                DOUBLE -> program.bindDouble(index, doubleBindings[index])
-                STRING -> program.bindString(index, requireNotNull(stringBindings[index]))
-                BLOB -> program.bindBlob(index, requireNotNull(blobBindings[index]))
+                NULL -> statement.bindNull(index)
+                LONG -> statement.bindLong(index, longBindings[index])
+                DOUBLE -> statement.bindDouble(index, doubleBindings[index])
+                STRING -> statement.bindString(index, requireNotNull(stringBindings[index]))
+                BLOB -> statement.bindBlob(index, requireNotNull(blobBindings[index]))
             }
         }
     }
@@ -143,7 +137,7 @@
      *
      * @param other The other query, which holds the arguments to be copied.
      */
-    open fun copyArgumentsFrom(other: RoomSQLiteQuery) {
+    fun copyArgumentsFrom(other: RoomSQLiteQuery) {
         val argCount = other.argCount + 1 // +1 for the binding offsets
         System.arraycopy(other.bindingTypes, 0, bindingTypes, 0, argCount)
         System.arraycopy(other.longBindings, 0, longBindings, 0, argCount)
diff --git a/room/room-runtime/src/main/java/androidx/room/util/SneakyThrow.java b/room/room-runtime/src/main/java/androidx/room/util/SneakyThrow.java
deleted file mode 100644
index 76968ab..0000000
--- a/room/room-runtime/src/main/java/androidx/room/util/SneakyThrow.java
+++ /dev/null
@@ -1,47 +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.room.util;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
-
-/**
- * Java 8 Sneaky Throw technique.
- *
- * @hide
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public class SneakyThrow {
-
-    /**
-     * Re-throws a checked exception as if it was a runtime exception without wrapping it.
-     *
-     * @param e the exception to re-throw.
-     */
-    public static void reThrow(@NonNull Exception e) {
-        sneakyThrow(e);
-    }
-
-    @SuppressWarnings("unchecked")
-    private static <E extends Throwable> void sneakyThrow(@NonNull Throwable e) throws E {
-        throw (E) e;
-    }
-
-    private SneakyThrow() {
-
-    }
-}
diff --git a/room/room-runtime/src/test/java/androidx/room/RoomSQLiteQueryTest.java b/room/room-runtime/src/test/java/androidx/room/RoomSQLiteQueryTest.java
index 3ff9773..0738a49 100644
--- a/room/room-runtime/src/test/java/androidx/room/RoomSQLiteQueryTest.java
+++ b/room/room-runtime/src/test/java/androidx/room/RoomSQLiteQueryTest.java
@@ -45,7 +45,7 @@
     public void acquireBasic() {
         RoomSQLiteQuery query = RoomSQLiteQuery.acquire("abc", 3);
         assertThat(query.getSql(), is("abc"));
-        assertThat(query.argCount, is(3));
+        assertThat(query.getArgCount(), is(3));
         assertThat(query.blobBindings.length, is(4));
         assertThat(query.longBindings.length, is(4));
         assertThat(query.stringBindings.length, is(4));
diff --git a/samples/Support7Demos/OWNERS b/samples/Support7Demos/OWNERS
index cd27592..036f04d 100644
--- a/samples/Support7Demos/OWNERS
+++ b/samples/Support7Demos/OWNERS
@@ -1,5 +1,9 @@
+# Media
 bachinger@google.com
 christosts@google.com
 ibaker@google.com
 olly@google.com
-tonihei@google.com
\ No newline at end of file
+tonihei@google.com
+
+# RecyclerView
+ryanmentley@google.com
\ No newline at end of file
diff --git a/security/security-app-authenticator/src/main/java/androidx/security/app/authenticator/AppAuthenticator.java b/security/security-app-authenticator/src/main/java/androidx/security/app/authenticator/AppAuthenticator.java
index 0e9f201..7f609b0 100644
--- a/security/security-app-authenticator/src/main/java/androidx/security/app/authenticator/AppAuthenticator.java
+++ b/security/security-app-authenticator/src/main/java/androidx/security/app/authenticator/AppAuthenticator.java
@@ -23,8 +23,10 @@
 import android.text.TextUtils;
 import android.util.Log;
 
+import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
 import androidx.annotation.VisibleForTesting;
 import androidx.annotation.XmlRes;
 import androidx.collection.ArrayMap;
@@ -38,6 +40,8 @@
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
@@ -85,6 +89,22 @@
     public static final int PERMISSION_DENIED_PACKAGE_UID_MISMATCH = -5;
 
     /**
+     * Values returned when checking that a specified package has the expected signing identity
+     * for a particular permission.
+     *
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    @IntDef(value = {
+            PERMISSION_GRANTED,
+            PERMISSION_DENIED_NO_MATCH,
+            PERMISSION_DENIED_UNKNOWN_PACKAGE,
+            PERMISSION_DENIED_PACKAGE_UID_MISMATCH,
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface AppIdentityPermissionResult {}
+
+    /**
      * This is returned by {@link #checkAppIdentity(String)} when the specified package name has
      * the expected signing identity.
      *
@@ -101,6 +121,20 @@
     public static final int SIGNATURE_NO_MATCH = -1;
 
     /**
+     * Values returned when checking that a specified package has the expected signing identity
+     * on the device.
+     *
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    @IntDef(value = {
+            SIGNATURE_MATCH,
+            SIGNATURE_NO_MATCH,
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface AppIdentityResult {}
+
+    /**
      * The root tag for an AppAuthenticator XMl config file.
      */
     private static final String ROOT_TAG = "app-authenticator";
@@ -233,6 +267,7 @@
      *     {@link #PERMISSION_DENIED_PACKAGE_UID_MISMATCH} if the uid as returned from
      *     {@link Binder#getCallingUid()} does not match the uid assigned to the package
      */
+    @AppIdentityPermissionResult
     public int checkCallingAppIdentity(@NonNull String packageName, @NonNull String permission) {
         return checkCallingAppIdentity(packageName, permission,
                 mAppAuthenticatorUtils.getCallingPid(), mAppAuthenticatorUtils.getCallingUid());
@@ -258,6 +293,7 @@
      *     {@link #PERMISSION_DENIED_PACKAGE_UID_MISMATCH} if the specified {@code uid} does not
      *     match the uid assigned to the package
      */
+    @AppIdentityPermissionResult
     public int checkCallingAppIdentity(@NonNull String packageName, @NonNull String permission,
             int pid, int uid) {
         AppAuthenticatorResult result = checkCallingAppIdentityInternal(packageName, permission,
@@ -332,6 +368,7 @@
      * @return {@link #SIGNATURE_MATCH} if the specified package has the expected
      * signing identity
      */
+    @AppIdentityResult
     public int checkAppIdentity(@NonNull String packageName) {
         if (mAppSignatureVerifier.verifyExpectedIdentity(packageName)) {
             return SIGNATURE_MATCH;
diff --git a/settings.gradle b/settings.gradle
index 6184bf2..b0e6b49 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -380,6 +380,7 @@
 includeProject(":autofill:autofill", [BuildType.MAIN])
 includeProject(":benchmark:benchmark-benchmark", "benchmark/benchmark", [BuildType.MAIN, BuildType.COMPOSE])
 includeProject(":benchmark:benchmark-common")
+includeProject(":benchmark:benchmark-darwin-core", [BuildType.KMP])
 includeProject(":benchmark:benchmark-gradle-plugin", "benchmark/gradle-plugin", [BuildType.MAIN])
 includeProject(":benchmark:benchmark-junit4")
 includeProject(":benchmark:benchmark-macro", [BuildType.MAIN, BuildType.COMPOSE])
@@ -654,10 +655,11 @@
 includeProject(":glance:glance-wear-tiles:integration-tests:demos", [BuildType.GLANCE])
 includeProject(":glance:glance-wear-tiles:integration-tests:template-demos", [BuildType.GLANCE])
 includeProject(":glance:glance-wear-tiles", [BuildType.GLANCE])
+includeProject(":glance:glance-wear-tiles-preview", [BuildType.GLANCE])
 includeProject(":gridlayout:gridlayout", [BuildType.MAIN])
-includeProject(":health:health-connect-client", [BuildType.MAIN])
-includeProject(":health:health-connect-client-proto", [BuildType.MAIN])
-includeProject(":health:health-connect-client-samples", "health/health-connect-client/samples", [BuildType.MAIN])
+includeProject(":health:connect:connect-client", [BuildType.MAIN])
+includeProject(":health:connect:connect-client-proto", [BuildType.MAIN])
+includeProject(":health:connect:connect-client-samples", "health/connect/connect-client/samples", [BuildType.MAIN])
 includeProject(":health:health-services-client", [BuildType.MAIN])
 includeProject(":heifwriter:heifwriter", [BuildType.MAIN])
 includeProject(":graphics:graphics-core", [BuildType.MAIN])
@@ -769,6 +771,8 @@
 includeProject(":preference:preference", [BuildType.MAIN])
 includeProject(":preference:preference-ktx", [BuildType.MAIN])
 includeProject(":print:print", [BuildType.MAIN])
+includeProject(":privacysandbox:sdkruntime:sdkruntime-client", [BuildType.MAIN])
+includeProject(":privacysandbox:sdkruntime:sdkruntime-core", [BuildType.MAIN])
 includeProject(":privacysandbox:tools:tools", [BuildType.MAIN])
 includeProject(":privacysandbox:tools:tools-apicompiler", [BuildType.MAIN])
 includeProject(":privacysandbox:tools:tools-apigenerator", [BuildType.MAIN])
diff --git a/sqlite/OWNERS b/sqlite/OWNERS
index f6ddd16..4161873 100644
--- a/sqlite/OWNERS
+++ b/sqlite/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 461409
 sergeyv@google.com
 yboyar@google.com
 danysantiago@google.com
diff --git a/sqlite/sqlite-framework/build.gradle b/sqlite/sqlite-framework/build.gradle
index 8f170c3..657c4f3 100644
--- a/sqlite/sqlite-framework/build.gradle
+++ b/sqlite/sqlite-framework/build.gradle
@@ -25,6 +25,7 @@
 dependencies {
     api("androidx.annotation:annotation:1.2.0")
     api(project(":sqlite:sqlite"))
+    implementation(libs.kotlinStdlib)
     androidTestImplementation(libs.kotlinStdlib)
     androidTestImplementation(libs.testExtJunit)
     androidTestImplementation(libs.testCore)
diff --git a/sqlite/sqlite/api/current.txt b/sqlite/sqlite/api/current.txt
index 1014417..53bbd20 100644
--- a/sqlite/sqlite/api/current.txt
+++ b/sqlite/sqlite/api/current.txt
@@ -2,12 +2,19 @@
 package androidx.sqlite.db {
 
   public final class SimpleSQLiteQuery implements androidx.sqlite.db.SupportSQLiteQuery {
-    ctor public SimpleSQLiteQuery(String, Object![]?);
-    ctor public SimpleSQLiteQuery(String);
-    method public static void bind(androidx.sqlite.db.SupportSQLiteProgram, Object![]?);
-    method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram);
+    ctor public SimpleSQLiteQuery(String query, Object![]? bindArgs);
+    ctor public SimpleSQLiteQuery(String query);
+    method public static void bind(androidx.sqlite.db.SupportSQLiteProgram statement, Object![]? bindArgs);
+    method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram statement);
     method public int getArgCount();
     method public String getSql();
+    property public int argCount;
+    property public String sql;
+    field public static final androidx.sqlite.db.SimpleSQLiteQuery.Companion Companion;
+  }
+
+  public static final class SimpleSQLiteQuery.Companion {
+    method public void bind(androidx.sqlite.db.SupportSQLiteProgram statement, Object![]? bindArgs);
   }
 
   public interface SupportSQLiteDatabase extends java.io.Closeable {
@@ -94,18 +101,20 @@
   }
 
   public interface SupportSQLiteProgram extends java.io.Closeable {
-    method public void bindBlob(int, byte[]);
-    method public void bindDouble(int, double);
-    method public void bindLong(int, long);
-    method public void bindNull(int);
-    method public void bindString(int, String);
+    method public void bindBlob(int index, byte[] value);
+    method public void bindDouble(int index, double value);
+    method public void bindLong(int index, long value);
+    method public void bindNull(int index);
+    method public void bindString(int index, String value);
     method public void clearBindings();
   }
 
   public interface SupportSQLiteQuery {
-    method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram);
+    method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram statement);
     method public int getArgCount();
     method public String getSql();
+    property public abstract int argCount;
+    property public abstract String sql;
   }
 
   public final class SupportSQLiteQueryBuilder {
diff --git a/sqlite/sqlite/api/public_plus_experimental_current.txt b/sqlite/sqlite/api/public_plus_experimental_current.txt
index 1014417..53bbd20 100644
--- a/sqlite/sqlite/api/public_plus_experimental_current.txt
+++ b/sqlite/sqlite/api/public_plus_experimental_current.txt
@@ -2,12 +2,19 @@
 package androidx.sqlite.db {
 
   public final class SimpleSQLiteQuery implements androidx.sqlite.db.SupportSQLiteQuery {
-    ctor public SimpleSQLiteQuery(String, Object![]?);
-    ctor public SimpleSQLiteQuery(String);
-    method public static void bind(androidx.sqlite.db.SupportSQLiteProgram, Object![]?);
-    method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram);
+    ctor public SimpleSQLiteQuery(String query, Object![]? bindArgs);
+    ctor public SimpleSQLiteQuery(String query);
+    method public static void bind(androidx.sqlite.db.SupportSQLiteProgram statement, Object![]? bindArgs);
+    method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram statement);
     method public int getArgCount();
     method public String getSql();
+    property public int argCount;
+    property public String sql;
+    field public static final androidx.sqlite.db.SimpleSQLiteQuery.Companion Companion;
+  }
+
+  public static final class SimpleSQLiteQuery.Companion {
+    method public void bind(androidx.sqlite.db.SupportSQLiteProgram statement, Object![]? bindArgs);
   }
 
   public interface SupportSQLiteDatabase extends java.io.Closeable {
@@ -94,18 +101,20 @@
   }
 
   public interface SupportSQLiteProgram extends java.io.Closeable {
-    method public void bindBlob(int, byte[]);
-    method public void bindDouble(int, double);
-    method public void bindLong(int, long);
-    method public void bindNull(int);
-    method public void bindString(int, String);
+    method public void bindBlob(int index, byte[] value);
+    method public void bindDouble(int index, double value);
+    method public void bindLong(int index, long value);
+    method public void bindNull(int index);
+    method public void bindString(int index, String value);
     method public void clearBindings();
   }
 
   public interface SupportSQLiteQuery {
-    method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram);
+    method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram statement);
     method public int getArgCount();
     method public String getSql();
+    property public abstract int argCount;
+    property public abstract String sql;
   }
 
   public final class SupportSQLiteQueryBuilder {
diff --git a/sqlite/sqlite/api/restricted_current.txt b/sqlite/sqlite/api/restricted_current.txt
index 1014417..53bbd20 100644
--- a/sqlite/sqlite/api/restricted_current.txt
+++ b/sqlite/sqlite/api/restricted_current.txt
@@ -2,12 +2,19 @@
 package androidx.sqlite.db {
 
   public final class SimpleSQLiteQuery implements androidx.sqlite.db.SupportSQLiteQuery {
-    ctor public SimpleSQLiteQuery(String, Object![]?);
-    ctor public SimpleSQLiteQuery(String);
-    method public static void bind(androidx.sqlite.db.SupportSQLiteProgram, Object![]?);
-    method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram);
+    ctor public SimpleSQLiteQuery(String query, Object![]? bindArgs);
+    ctor public SimpleSQLiteQuery(String query);
+    method public static void bind(androidx.sqlite.db.SupportSQLiteProgram statement, Object![]? bindArgs);
+    method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram statement);
     method public int getArgCount();
     method public String getSql();
+    property public int argCount;
+    property public String sql;
+    field public static final androidx.sqlite.db.SimpleSQLiteQuery.Companion Companion;
+  }
+
+  public static final class SimpleSQLiteQuery.Companion {
+    method public void bind(androidx.sqlite.db.SupportSQLiteProgram statement, Object![]? bindArgs);
   }
 
   public interface SupportSQLiteDatabase extends java.io.Closeable {
@@ -94,18 +101,20 @@
   }
 
   public interface SupportSQLiteProgram extends java.io.Closeable {
-    method public void bindBlob(int, byte[]);
-    method public void bindDouble(int, double);
-    method public void bindLong(int, long);
-    method public void bindNull(int);
-    method public void bindString(int, String);
+    method public void bindBlob(int index, byte[] value);
+    method public void bindDouble(int index, double value);
+    method public void bindLong(int index, long value);
+    method public void bindNull(int index);
+    method public void bindString(int index, String value);
     method public void clearBindings();
   }
 
   public interface SupportSQLiteQuery {
-    method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram);
+    method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram statement);
     method public int getArgCount();
     method public String getSql();
+    property public abstract int argCount;
+    property public abstract String sql;
   }
 
   public final class SupportSQLiteQueryBuilder {
diff --git a/sqlite/sqlite/build.gradle b/sqlite/sqlite/build.gradle
index 63ddf32..d3f6c60 100644
--- a/sqlite/sqlite/build.gradle
+++ b/sqlite/sqlite/build.gradle
@@ -19,10 +19,12 @@
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
+    id("org.jetbrains.kotlin.android")
 }
 
 dependencies {
     api("androidx.annotation:annotation:1.0.0")
+    implementation(libs.kotlinStdlib)
     testImplementation(libs.junit)
     testImplementation(libs.mockitoCore)
 }
diff --git a/sqlite/sqlite/src/main/java/androidx/sqlite/db/SimpleSQLiteQuery.java b/sqlite/sqlite/src/main/java/androidx/sqlite/db/SimpleSQLiteQuery.java
deleted file mode 100644
index b5e3ba7..0000000
--- a/sqlite/sqlite/src/main/java/androidx/sqlite/db/SimpleSQLiteQuery.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.sqlite.db;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-/**
- * A basic implementation of {@link SupportSQLiteQuery} which receives a query and its args and
- * binds args based on the passed in Object type.
- */
-public final class SimpleSQLiteQuery implements SupportSQLiteQuery {
-    private final String mQuery;
-    @Nullable
-    private final Object[] mBindArgs;
-
-    /**
-     * Creates an SQL query with the sql string and the bind arguments.
-     *
-     * @param query    The query string, can include bind arguments (.e.g ?).
-     * @param bindArgs The bind argument value that will replace the placeholders in the query.
-     */
-    public SimpleSQLiteQuery(@NonNull String query, @Nullable Object[] bindArgs) {
-        mQuery = query;
-        mBindArgs = bindArgs;
-    }
-
-    /**
-     * Creates an SQL query without any bind arguments.
-     *
-     * @param query The SQL query to execute. Cannot include bind parameters.
-     */
-    public SimpleSQLiteQuery(@NonNull String query) {
-        this(query, null);
-    }
-
-    @NonNull
-    @Override
-    public String getSql() {
-        return mQuery;
-    }
-
-    @Override
-    public void bindTo(@NonNull SupportSQLiteProgram statement) {
-        bind(statement, mBindArgs);
-    }
-
-    @Override
-    public int getArgCount() {
-        return mBindArgs == null ? 0 : mBindArgs.length;
-    }
-
-    /**
-     * Binds the given arguments into the given sqlite statement.
-     *
-     * @param statement The sqlite statement
-     * @param bindArgs  The list of bind arguments
-     */
-    public static void bind(@NonNull SupportSQLiteProgram statement, @Nullable Object[] bindArgs) {
-        if (bindArgs == null) {
-            return;
-        }
-        final int limit = bindArgs.length;
-        for (int i = 0; i < limit; i++) {
-            final Object arg = bindArgs[i];
-            bind(statement, i + 1, arg);
-        }
-    }
-
-    private static void bind(SupportSQLiteProgram statement, int index, Object arg) {
-        // extracted from android.database.sqlite.SQLiteConnection
-        if (arg == null) {
-            statement.bindNull(index);
-        } else if (arg instanceof byte[]) {
-            statement.bindBlob(index, (byte[]) arg);
-        } else if (arg instanceof Float) {
-            statement.bindDouble(index, (Float) arg);
-        } else if (arg instanceof Double) {
-            statement.bindDouble(index, (Double) arg);
-        } else if (arg instanceof Long) {
-            statement.bindLong(index, (Long) arg);
-        } else if (arg instanceof Integer) {
-            statement.bindLong(index, (Integer) arg);
-        } else if (arg instanceof Short) {
-            statement.bindLong(index, (Short) arg);
-        } else if (arg instanceof Byte) {
-            statement.bindLong(index, (Byte) arg);
-        } else if (arg instanceof String) {
-            statement.bindString(index, (String) arg);
-        } else if (arg instanceof Boolean) {
-            statement.bindLong(index, ((Boolean) arg) ? 1 : 0);
-        } else {
-            throw new IllegalArgumentException("Cannot bind " + arg + " at index " + index
-                    + " Supported types: null, byte[], float, double, long, int, short, byte,"
-                    + " string");
-        }
-    }
-}
diff --git a/sqlite/sqlite/src/main/java/androidx/sqlite/db/SimpleSQLiteQuery.kt b/sqlite/sqlite/src/main/java/androidx/sqlite/db/SimpleSQLiteQuery.kt
new file mode 100644
index 0000000..2e6a9d9
--- /dev/null
+++ b/sqlite/sqlite/src/main/java/androidx/sqlite/db/SimpleSQLiteQuery.kt
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.sqlite.db
+
+import android.annotation.SuppressLint
+
+/**
+ * A basic implementation of [SupportSQLiteQuery] which receives a query and its args and
+ * binds args based on the passed in Object type.
+ *
+ * @constructor Creates an SQL query with the sql string and the bind arguments.
+ *
+ * @param query    The query string, can include bind arguments (.e.g ?).
+ * @param bindArgs The bind argument value that will replace the placeholders in the query.
+ */
+class SimpleSQLiteQuery(
+    private val query: String,
+    @Suppress("ArrayReturn") // Due to legacy API
+    private val bindArgs: Array<Any?>?
+    ) : SupportSQLiteQuery {
+
+    /**
+     * Creates an SQL query without any bind arguments.
+     *
+     * @param query The SQL query to execute. Cannot include bind parameters.
+     */
+    constructor(query: String) : this(query, null)
+
+    override val sql: String
+        get() = this.query
+
+    /**
+     * Creates an SQL query without any bind arguments.
+     *
+     * @param [statement] The SQL query to execute. Cannot include bind parameters.
+     */
+    override fun bindTo(statement: SupportSQLiteProgram) {
+        bind(statement, bindArgs)
+    }
+
+    override val argCount: Int
+        get() = bindArgs?.size ?: 0
+
+    companion object {
+        /**
+         * Binds the given arguments into the given sqlite statement.
+         *
+         * @param [statement] The sqlite statement
+         * @param [bindArgs]  The list of bind arguments
+         */
+        @SuppressLint("SyntheticAccessor")
+        @JvmStatic
+        fun bind(
+            statement: SupportSQLiteProgram,
+            @Suppress("ArrayReturn") // Due to legacy API
+            bindArgs: Array<Any?>?
+        ) {
+            if (bindArgs == null) {
+                return
+            }
+
+            val limit = bindArgs.size
+            for (i in 0 until limit) {
+                val arg = bindArgs[i]
+                bind(statement, i + 1, arg)
+            }
+        }
+
+        private fun bind(statement: SupportSQLiteProgram, index: Int, arg: Any?) {
+            // extracted from android.database.sqlite.SQLiteConnection
+            if (arg == null) {
+                statement.bindNull(index)
+            } else if (arg is ByteArray) {
+                statement.bindBlob(index, arg)
+            } else if (arg is Float) {
+                statement.bindDouble(index, arg.toDouble())
+            } else if (arg is Double) {
+                statement.bindDouble(index, arg)
+            } else if (arg is Long) {
+                statement.bindLong(index, arg)
+            } else if (arg is Int) {
+                statement.bindLong(index, arg.toLong())
+            } else if (arg is Short) {
+                statement.bindLong(index, arg.toLong())
+            } else if (arg is Byte) {
+                statement.bindLong(index, arg.toLong())
+            } else if (arg is String) {
+                statement.bindString(index, arg)
+            } else if (arg is Boolean) {
+                statement.bindLong(index, if (arg) 1 else 0)
+            } else {
+                throw IllegalArgumentException(
+                    "Cannot bind $arg at index $index Supported types: Null, ByteArray, " +
+                        "Float, Double, Long, Int, Short, Byte, String"
+                )
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteCompat.java b/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteCompat.java
deleted file mode 100644
index 286d449..0000000
--- a/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteCompat.java
+++ /dev/null
@@ -1,321 +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.sqlite.db;
-
-import android.app.ActivityManager;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.database.ContentObserver;
-import android.database.Cursor;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.CancellationSignal;
-import android.os.OperationCanceledException;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RequiresApi;
-import androidx.annotation.RestrictTo;
-
-import java.io.File;
-import java.util.List;
-
-/**
- * Helper for accessing features in {@link SupportSQLiteOpenHelper}.
- *
- * @hide
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public final class SupportSQLiteCompat {
-    private SupportSQLiteCompat() { }
-    /**
-     * Class for accessing functions that require SDK version 16 and higher.
-     *
-     * @hide
-     */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    @RequiresApi(16)
-    public static final class Api16Impl {
-
-        /**
-         * Cancels the operation and signals the cancellation listener. If the operation has not yet
-         * started, then it will be canceled as soon as it does.
-         *
-         * @hide
-         */
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-        public static void cancel(@NonNull CancellationSignal cancellationSignal) {
-            cancellationSignal.cancel();
-        }
-
-        /**
-         * Creates a cancellation signal, initially not canceled.
-         *
-         * @return a new cancellation signal
-         *
-         * @hide
-         */
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-        @NonNull
-        public static CancellationSignal createCancellationSignal() {
-            return new CancellationSignal();
-        }
-
-        /**
-         * Deletes a database including its journal file and other auxiliary files
-         * that may have been created by the database engine.
-         *
-         * @param file The database file path.
-         * @return True if the database was successfully deleted.
-         *
-         * @hide
-         */
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-        @SuppressWarnings("StreamFiles")
-        public static boolean deleteDatabase(@NonNull File file) {
-            return SQLiteDatabase.deleteDatabase(file);
-        }
-
-        /**
-         * Runs the provided SQL and returns a cursor over the result set.
-         *
-         * @param sql the SQL query. The SQL string must not be ; terminated
-         * @param selectionArgs You may include ?s in where clause in the query,
-         *     which will be replaced by the values from selectionArgs. The
-         *     values will be bound as Strings.
-         * @param editTable the name of the first table, which is editable
-         * @param cancellationSignal A signal to cancel the operation in progress, or null if none.
-         * If the operation is canceled, then {@link OperationCanceledException} will be thrown
-         * when the query is executed.
-         * @param cursorFactory the cursor factory to use, or null for the default factory
-         * @return A {@link Cursor} object, which is positioned before the first entry. Note that
-         * {@link Cursor}s are not synchronized, see the documentation for more details.
-         *
-         * @hide
-         */
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-        @NonNull
-        public static Cursor rawQueryWithFactory(@NonNull SQLiteDatabase sQLiteDatabase,
-                @NonNull String sql, @NonNull String[] selectionArgs,
-                @NonNull String editTable, @NonNull CancellationSignal cancellationSignal,
-                @NonNull SQLiteDatabase.CursorFactory cursorFactory) {
-            return sQLiteDatabase.rawQueryWithFactory(cursorFactory, sql, selectionArgs, editTable,
-                    cancellationSignal);
-        }
-
-        /**
-         * Sets whether foreign key constraints are enabled for the database.
-         *
-         * @param enable True to enable foreign key constraints, false to disable them.
-         *
-         * @throws IllegalStateException if the are transactions is in progress
-         * when this method is called.
-         *
-         * @hide
-         */
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-        public static void setForeignKeyConstraintsEnabled(@NonNull SQLiteDatabase sQLiteDatabase,
-                boolean enable) {
-            sQLiteDatabase.setForeignKeyConstraintsEnabled(enable);
-        }
-
-        /**
-         * This method disables the features enabled by
-         * {@link SQLiteDatabase#enableWriteAheadLogging()}.
-         *
-         * @throws IllegalStateException if there are transactions in progress at the
-         * time this method is called.  WAL mode can only be changed when there are no
-         * transactions in progress.
-         *
-         * @see SQLiteDatabase#enableWriteAheadLogging
-         *
-         * @hide
-         */
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-        public static void disableWriteAheadLogging(@NonNull SQLiteDatabase sQLiteDatabase) {
-            sQLiteDatabase.disableWriteAheadLogging();
-        }
-
-        /**
-         * Returns true if write-ahead logging has been enabled for this database.
-         *
-         * @return True if write-ahead logging has been enabled for this database.
-         *
-         * @see SQLiteDatabase#enableWriteAheadLogging
-         * @see SQLiteDatabase#ENABLE_WRITE_AHEAD_LOGGING
-         *
-         * @hide
-         */
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-        public static boolean isWriteAheadLoggingEnabled(@NonNull SQLiteDatabase sQLiteDatabase) {
-            return sQLiteDatabase.isWriteAheadLoggingEnabled();
-        }
-
-        /**
-         * Sets {@link SQLiteDatabase#ENABLE_WRITE_AHEAD_LOGGING} flag if {@code enabled} is {@code
-         * true}, unsets otherwise.
-         *
-         * @hide
-         */
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-        public static void setWriteAheadLoggingEnabled(@NonNull SQLiteOpenHelper sQLiteOpenHelper,
-                boolean enabled) {
-            sQLiteOpenHelper.setWriteAheadLoggingEnabled(enabled);
-        }
-
-        private Api16Impl() {}
-    }
-
-    /**
-     * Helper for accessing functions that require SDK version 19 and higher.
-     *
-     * @hide
-     */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    @RequiresApi(19)
-    public static final class Api19Impl {
-        /**
-         * Return the URI at which notifications of changes in this Cursor's data
-         * will be delivered.
-         *
-         * @return Returns a URI that can be used with
-         * {@link ContentResolver#registerContentObserver(android.net.Uri, boolean, ContentObserver)
-         * ContentResolver.registerContentObserver} to find out about changes to this Cursor's
-         * data. May be null if no notification URI has been set.
-         *
-         * @hide
-         */
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-        @NonNull
-        public static Uri getNotificationUri(@NonNull Cursor cursor) {
-            return cursor.getNotificationUri();
-        }
-
-
-        /**
-         * Returns true if this is a low-RAM device.  Exactly whether a device is low-RAM
-         * is ultimately up to the device configuration, but currently it generally means
-         * something with 1GB or less of RAM.  This is mostly intended to be used by apps
-         * to determine whether they should turn off certain features that require more RAM.
-         *
-         * @hide
-         */
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-        public static boolean isLowRamDevice(@NonNull ActivityManager activityManager) {
-            return activityManager.isLowRamDevice();
-        }
-
-        private Api19Impl() {}
-    }
-
-    /**
-     * Helper for accessing functions that require SDK version 21 and higher.
-     *
-     * @hide
-     */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    @RequiresApi(21)
-    public static final class Api21Impl {
-
-        /**
-         * Returns the absolute path to the directory on the filesystem.
-         *
-         * @return The path of the directory holding application files that will not
-         *         be automatically backed up to remote storage.
-         *
-         * @hide
-         */
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-        @NonNull
-        public static File getNoBackupFilesDir(@NonNull Context context) {
-            return context.getNoBackupFilesDir();
-        }
-
-        private Api21Impl() {}
-    }
-
-    /**
-     * Helper for accessing functions that require SDK version 23 and higher.
-     *
-     * @hide
-     */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    @RequiresApi(23)
-    public static final class Api23Impl {
-
-        /**
-         * Sets a {@link Bundle} that will be returned by {@link Cursor#getExtras()}.
-         *
-         * @param extras {@link Bundle} to set, or null to set an empty bundle.
-         *
-         * @hide
-         */
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-        public static void setExtras(@NonNull Cursor cursor, @NonNull Bundle extras) {
-            cursor.setExtras(extras);
-        }
-
-        private Api23Impl() {}
-    }
-
-    /**
-     * Helper for accessing functions that require SDK version 29 and higher.
-     *
-     * @hide
-     */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    @RequiresApi(29)
-    public static final class Api29Impl {
-
-        /**
-         * Similar to {@link Cursor#setNotificationUri(ContentResolver, Uri)}, except this version
-         * allows to watch multiple content URIs for changes.
-         *
-         * @param cr The content resolver from the caller's context. The listener attached to
-         * this resolver will be notified.
-         * @param uris The content URIs to watch.
-         *
-         * @hide
-         */
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-        public static void setNotificationUris(@NonNull Cursor cursor, @NonNull ContentResolver cr,
-                @NonNull List<Uri> uris) {
-            cursor.setNotificationUris(cr, uris);
-        }
-
-        /**
-         * Return the URIs at which notifications of changes in this Cursor's data
-         * will be delivered, as previously set by {@link #setNotificationUris}.
-         *
-         * @return Returns URIs that can be used with
-         * {@link ContentResolver#registerContentObserver(android.net.Uri, boolean, ContentObserver)
-         * ContentResolver.registerContentObserver} to find out about changes to this Cursor's
-         * data. May be null if no notification URI has been set.
-         *
-         * @hide
-         */
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-        @NonNull
-        public static List<Uri> getNotificationUris(@NonNull Cursor cursor) {
-            return cursor.getNotificationUris();
-        }
-
-        private Api29Impl() {}
-    }
-
-}
diff --git a/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteCompat.kt b/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteCompat.kt
new file mode 100644
index 0000000..c0d7fd8
--- /dev/null
+++ b/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteCompat.kt
@@ -0,0 +1,315 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.sqlite.db
+
+import android.app.ActivityManager
+import android.content.ContentResolver
+import android.content.Context
+import android.database.Cursor
+import android.database.sqlite.SQLiteDatabase
+import android.database.sqlite.SQLiteDatabase.CursorFactory
+import android.database.sqlite.SQLiteOpenHelper
+import android.net.Uri
+import android.os.Bundle
+import android.os.CancellationSignal
+import androidx.annotation.RequiresApi
+import androidx.annotation.RestrictTo
+import java.io.File
+
+/**
+ * Helper for accessing features in [SupportSQLiteOpenHelper].
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+class SupportSQLiteCompat private constructor() {
+    /**
+     * Class for accessing functions that require SDK version 16 and higher.
+     *
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    @RequiresApi(16)
+    object Api16Impl {
+        /**
+         * Cancels the operation and signals the cancellation listener. If the operation has not yet
+         * started, then it will be canceled as soon as it does.
+         *
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        @JvmStatic
+        fun cancel(cancellationSignal: CancellationSignal) {
+            cancellationSignal.cancel()
+        }
+
+        /**
+         * Creates a cancellation signal, initially not canceled.
+         *
+         * @return a new cancellation signal
+         *
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        @JvmStatic
+        fun createCancellationSignal(): CancellationSignal {
+            return CancellationSignal()
+        }
+
+        /**
+         * Deletes a database including its journal file and other auxiliary files
+         * that may have been created by the database engine.
+         *
+         * @param file The database file path.
+         * @return True if the database was successfully deleted.
+         *
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        @JvmStatic
+        fun deleteDatabase(file: File): Boolean {
+            return SQLiteDatabase.deleteDatabase(file)
+        }
+
+        /**
+         * Runs the provided SQL and returns a cursor over the result set.
+         *
+         * @param sql the SQL query. The SQL string must not be ; terminated
+         * @param selectionArgs You may include ?s in where clause in the query,
+         * which will be replaced by the values from selectionArgs. The
+         * values will be bound as Strings.
+         * @param editTable the name of the first table, which is editable
+         * @param cancellationSignal A signal to cancel the operation in progress, or null if none.
+         * If the operation is canceled, then [OperationCanceledException] will be thrown
+         * when the query is executed.
+         * @param cursorFactory the cursor factory to use, or null for the default factory
+         * @return A [Cursor] object, which is positioned before the first entry. Note that
+         * [Cursor]s are not synchronized, see the documentation for more details.
+         *
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        @JvmStatic
+        fun rawQueryWithFactory(
+            sQLiteDatabase: SQLiteDatabase,
+            sql: String,
+            selectionArgs: Array<String?>,
+            editTable: String?,
+            cancellationSignal: CancellationSignal,
+            cursorFactory: CursorFactory
+        ): Cursor {
+            return sQLiteDatabase.rawQueryWithFactory(
+                cursorFactory, sql, selectionArgs, editTable,
+                cancellationSignal
+            )
+        }
+
+        /**
+         * Sets whether foreign key constraints are enabled for the database.
+         *
+         * @param enable True to enable foreign key constraints, false to disable them.
+         *
+         * @throws [IllegalStateException] if the are transactions is in progress
+         * when this method is called.
+         *
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        @JvmStatic
+        fun setForeignKeyConstraintsEnabled(
+            sQLiteDatabase: SQLiteDatabase,
+            enable: Boolean
+        ) {
+            sQLiteDatabase.setForeignKeyConstraintsEnabled(enable)
+        }
+
+        /**
+         * This method disables the features enabled by
+         * [SQLiteDatabase.enableWriteAheadLogging].
+         *
+         * @throws - if there are transactions in progress at the
+         * time this method is called.  WAL mode can only be changed when there are no
+         * transactions in progress.
+         *
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        @JvmStatic
+        fun disableWriteAheadLogging(sQLiteDatabase: SQLiteDatabase) {
+            sQLiteDatabase.disableWriteAheadLogging()
+        }
+
+        /**
+         * Returns true if [SQLiteDatabase.enableWriteAheadLogging] logging has been enabled for
+         * this database.
+         *
+         * For details, see [SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING].
+         *
+         * @return True if write-ahead logging has been enabled for this database.
+         *
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        @JvmStatic
+        fun isWriteAheadLoggingEnabled(sQLiteDatabase: SQLiteDatabase): Boolean {
+            return sQLiteDatabase.isWriteAheadLoggingEnabled
+        }
+
+        /**
+         * Sets [SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING] flag if `enabled` is `true`, unsets
+         * otherwise.
+         *
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        @JvmStatic
+        fun setWriteAheadLoggingEnabled(
+            sQLiteOpenHelper: SQLiteOpenHelper,
+            enabled: Boolean
+        ) {
+            sQLiteOpenHelper.setWriteAheadLoggingEnabled(enabled)
+        }
+    }
+
+    /**
+     * Helper for accessing functions that require SDK version 19 and higher.
+     *
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    @RequiresApi(19)
+    object Api19Impl {
+        /**
+         * Return the URI at which notifications of changes in this Cursor's data
+         * will be delivered.
+         *
+         * @return Returns a URI that can be used with [ContentResolver.registerContentObserver] to
+         * find out about changes to this Cursor's data. May be null if no notification URI has been
+         * set.
+         *
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        @JvmStatic
+        fun getNotificationUri(cursor: Cursor): Uri {
+            return cursor.notificationUri
+        }
+
+        /**
+         * Returns true if this is a low-RAM device.  Exactly whether a device is low-RAM
+         * is ultimately up to the device configuration, but currently it generally means
+         * something with 1GB or less of RAM.  This is mostly intended to be used by apps
+         * to determine whether they should turn off certain features that require more RAM.
+         *
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        @JvmStatic
+        fun isLowRamDevice(activityManager: ActivityManager): Boolean {
+            return activityManager.isLowRamDevice
+        }
+    }
+
+    /**
+     * Helper for accessing functions that require SDK version 21 and higher.
+     *
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    @RequiresApi(21)
+    object Api21Impl {
+        /**
+         * Returns the absolute path to the directory on the filesystem.
+         *
+         * @return The path of the directory holding application files that will not be
+         * automatically backed up to remote storage.
+         *
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        @JvmStatic
+        fun getNoBackupFilesDir(context: Context): File {
+            return context.noBackupFilesDir
+        }
+    }
+
+    /**
+     * Helper for accessing functions that require SDK version 23 and higher.
+     *
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    @RequiresApi(23)
+    object Api23Impl {
+        /**
+         * Sets a [Bundle] that will be returned by [Cursor.getExtras].
+         *
+         * @param extras [Bundle] to set, or null to set an empty bundle.
+         *
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        @JvmStatic
+        fun setExtras(cursor: Cursor, extras: Bundle) {
+            cursor.extras = extras
+        }
+    }
+
+    /**
+     * Helper for accessing functions that require SDK version 29 and higher.
+     *
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    @RequiresApi(29)
+    object Api29Impl {
+        /**
+         * Similar to [Cursor.setNotificationUri], except this version
+         * allows to watch multiple content URIs for changes.
+         *
+         * @param cr The content resolver from the caller's context. The listener attached to
+         * this resolver will be notified.
+         * @param uris The content URIs to watch.
+         *
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        @JvmStatic
+        fun setNotificationUris(
+            cursor: Cursor,
+            cr: ContentResolver,
+            uris: List<Uri?>
+        ) {
+            cursor.setNotificationUris(cr, uris)
+        }
+
+        /**
+         * Return the URIs at which notifications of changes in this Cursor's data
+         * will be delivered, as previously set by [setNotificationUris].
+         *
+         * @return Returns URIs that can be used with [ContentResolver.registerContentObserver]
+         * to find out about changes to this Cursor's data. May be null if no notification URI has
+         * been set.
+         *
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        @JvmStatic
+        fun getNotificationUris(cursor: Cursor): List<Uri> {
+            return cursor.notificationUris!!
+        }
+    }
+}
\ No newline at end of file
diff --git a/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteProgram.java b/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteProgram.java
deleted file mode 100644
index cd0a5ef..0000000
--- a/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteProgram.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.sqlite.db;
-
-import androidx.annotation.NonNull;
-
-import java.io.Closeable;
-
-/**
- * An interface to map the behavior of {@link android.database.sqlite.SQLiteProgram}.
- */
-
-@SuppressWarnings("unused")
-public interface SupportSQLiteProgram extends Closeable {
-    /**
-     * Bind a NULL value to this statement. The value remains bound until
-     * {@link #clearBindings} is called.
-     *
-     * @param index The 1-based index to the parameter to bind null to
-     */
-    void bindNull(int index);
-
-    /**
-     * Bind a long value to this statement. The value remains bound until
-     * {@link #clearBindings} is called.
-     *addToBindArgs
-     * @param index The 1-based index to the parameter to bind
-     * @param value The value to bind
-     */
-    void bindLong(int index, long value);
-
-    /**
-     * Bind a double value to this statement. The value remains bound until
-     * {@link #clearBindings} is called.
-     *
-     * @param index The 1-based index to the parameter to bind
-     * @param value The value to bind
-     */
-    void bindDouble(int index, double value);
-
-    /**
-     * Bind a String value to this statement. The value remains bound until
-     * {@link #clearBindings} is called.
-     *
-     * @param index The 1-based index to the parameter to bind
-     * @param value The value to bind, must not be null
-     */
-    void bindString(int index, @NonNull String value);
-
-    /**
-     * Bind a byte array value to this statement. The value remains bound until
-     * {@link #clearBindings} is called.
-     *
-     * @param index The 1-based index to the parameter to bind
-     * @param value The value to bind, must not be null
-     */
-    void bindBlob(int index, @NonNull byte[] value);
-
-    /**
-     * Clears all existing bindings. Unset bindings are treated as NULL.
-     */
-    void clearBindings();
-}
diff --git a/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteProgram.kt b/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteProgram.kt
new file mode 100644
index 0000000..2397f94
--- /dev/null
+++ b/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteProgram.kt
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.sqlite.db
+
+import java.io.Closeable
+
+/**
+ * An interface to map the behavior of [android.database.sqlite.SQLiteProgram].
+ */
+interface SupportSQLiteProgram : Closeable {
+    /**
+     * Bind a NULL value to this statement. The value remains bound until
+     * [.clearBindings] is called.
+     *
+     * @param index The 1-based index to the parameter to bind null to
+     */
+    fun bindNull(index: Int)
+
+    /**
+     * Bind a long value to this statement. The value remains bound until
+     * [clearBindings] is called.
+     * addToBindArgs
+     * @param index The 1-based index to the parameter to bind
+     * @param value The value to bind
+     */
+    fun bindLong(index: Int, value: Long)
+
+    /**
+     * Bind a double value to this statement. The value remains bound until
+     * [.clearBindings] is called.
+     *
+     * @param index The 1-based index to the parameter to bind
+     * @param value The value to bind
+     */
+    fun bindDouble(index: Int, value: Double)
+
+    /**
+     * Bind a String value to this statement. The value remains bound until
+     * [.clearBindings] is called.
+     *
+     * @param index The 1-based index to the parameter to bind
+     * @param value The value to bind, must not be null
+     */
+    fun bindString(index: Int, value: String)
+
+    /**
+     * Bind a byte array value to this statement. The value remains bound until
+     * [.clearBindings] is called.
+     *
+     * @param index The 1-based index to the parameter to bind
+     * @param value The value to bind, must not be null
+     */
+    fun bindBlob(index: Int, value: ByteArray)
+
+    /**
+     * Clears all existing bindings. Unset bindings are treated as NULL.
+     */
+    fun clearBindings()
+}
\ No newline at end of file
diff --git a/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteQuery.java b/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteQuery.java
deleted file mode 100644
index 82909fc..0000000
--- a/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteQuery.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.sqlite.db;
-
-import androidx.annotation.NonNull;
-
-/**
- * A query with typed bindings. It is better to use this API instead of
- * {@link android.database.sqlite.SQLiteDatabase#rawQuery(String, String[])} because it allows
- * binding type safe parameters.
- */
-public interface SupportSQLiteQuery {
-    /**
-     * The SQL query. This query can have placeholders(?) for bind arguments.
-     *
-     * @return The SQL query to compile
-     */
-    @NonNull
-    String getSql();
-
-    /**
-     * Callback to bind the query parameters to the compiled statement.
-     *
-     * @param statement The compiled statement
-     */
-    void bindTo(@NonNull SupportSQLiteProgram statement);
-
-    /**
-     * Returns the number of arguments in this query. This is equal to the number of placeholders
-     * in the query string. See: https://www.sqlite.org/c3ref/bind_blob.html for details.
-     *
-     * @return The number of arguments in the query.
-     */
-    int getArgCount();
-}
diff --git a/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteQuery.kt b/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteQuery.kt
new file mode 100644
index 0000000..8108f2d
--- /dev/null
+++ b/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteQuery.kt
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.sqlite.db
+
+/**
+ * A query with typed bindings. It is better to use this API instead of
+ * [android.database.sqlite.SQLiteDatabase.rawQuery] because it allows
+ * binding type safe parameters.
+ */
+interface SupportSQLiteQuery {
+    /**
+     * The SQL query. This query can have placeholders(?) for bind arguments.
+     */
+    val sql: String
+
+    /**
+     * Callback to bind the query parameters to the compiled statement.
+     *
+     * @param statement The compiled statement
+     */
+    fun bindTo(statement: SupportSQLiteProgram)
+
+    /**
+     * Is the number of arguments in this query. This is equal to the number of placeholders
+     * in the query string. See: https://www.sqlite.org/c3ref/bind_blob.html for details.
+     */
+    val argCount: Int
+}
\ No newline at end of file
diff --git a/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteStatement.java b/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteStatement.java
deleted file mode 100644
index ed00b46..0000000
--- a/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteStatement.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.sqlite.db;
-
-import androidx.annotation.Nullable;
-
-/**
- * An interface to map the behavior of {@link android.database.sqlite.SQLiteStatement}.
- */
-@SuppressWarnings("unused")
-public interface SupportSQLiteStatement extends SupportSQLiteProgram {
-    /**
-     * Execute this SQL statement, if it is not a SELECT / INSERT / DELETE / UPDATE, for example
-     * CREATE / DROP table, view, trigger, index etc.
-     *
-     * @throws android.database.SQLException If the SQL string is invalid for
-     *         some reason
-     */
-    void execute();
-
-    /**
-     * Execute this SQL statement, if the the number of rows affected by execution of this SQL
-     * statement is of any importance to the caller - for example, UPDATE / DELETE SQL statements.
-     *
-     * @return the number of rows affected by this SQL statement execution.
-     * @throws android.database.SQLException If the SQL string is invalid for
-     *         some reason
-     */
-    int executeUpdateDelete();
-
-    /**
-     * Execute this SQL statement and return the ID of the row inserted due to this call.
-     * The SQL statement should be an INSERT for this to be a useful call.
-     *
-     * @return the row ID of the last row inserted, if this insert is successful. -1 otherwise.
-     *
-     * @throws android.database.SQLException If the SQL string is invalid for
-     *         some reason
-     */
-    long executeInsert();
-
-    /**
-     * Execute a statement that returns a 1 by 1 table with a numeric value.
-     * For example, SELECT COUNT(*) FROM table;
-     *
-     * @return The result of the query.
-     *
-     * @throws android.database.sqlite.SQLiteDoneException if the query returns zero rows
-     */
-    long simpleQueryForLong();
-    /**
-     * Execute a statement that returns a 1 by 1 table with a text value.
-     * For example, SELECT COUNT(*) FROM table;
-     *
-     * @return The result of the query.
-     *
-     * @throws android.database.sqlite.SQLiteDoneException if the query returns zero rows
-     */
-    @Nullable
-    String simpleQueryForString();
-}
diff --git a/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteStatement.kt b/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteStatement.kt
new file mode 100644
index 0000000..097ffb5
--- /dev/null
+++ b/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteStatement.kt
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.sqlite.db
+
+/**
+ * An interface to map the behavior of [android.database.sqlite.SQLiteStatement].
+ */
+interface SupportSQLiteStatement : SupportSQLiteProgram {
+    /**
+     * Execute this SQL statement, if it is not a SELECT / INSERT / DELETE / UPDATE, for example
+     * CREATE / DROP table, view, trigger, index etc.
+     *
+     * @throws [android.database.SQLException] If the SQL string is invalid for
+     * some reason
+     */
+    fun execute()
+
+    /**
+     * Execute this SQL statement, if the the number of rows affected by execution of this SQL
+     * statement is of any importance to the caller - for example, UPDATE / DELETE SQL statements.
+     *
+     * @return the number of rows affected by this SQL statement execution.
+     * @throws [android.database.SQLException] If the SQL string is invalid for
+     * some reason
+     */
+    fun executeUpdateDelete(): Int
+
+    /**
+     * Execute this SQL statement and return the ID of the row inserted due to this call.
+     * The SQL statement should be an INSERT for this to be a useful call.
+     *
+     * @return the row ID of the last row inserted, if this insert is successful. -1 otherwise.
+     *
+     * @throws [android.database.SQLException] If the SQL string is invalid for
+     * some reason
+     */
+    fun executeInsert(): Long
+
+    /**
+     * Execute a statement that returns a 1 by 1 table with a numeric value.
+     * For example, SELECT COUNT(*) FROM table;
+     *
+     * @return The result of the query.
+     *
+     * @throws [android.database.sqlite.SQLiteDoneException] if the query returns zero rows
+     */
+    fun simpleQueryForLong(): Long
+
+    /**
+     * Execute a statement that returns a 1 by 1 table with a text value.
+     * For example, SELECT COUNT(*) FROM table;
+     *
+     * @return The result of the query.
+     *
+     * @throws [android.database.sqlite.SQLiteDoneException] if the query returns zero rows
+     */
+    fun simpleQueryForString(): String?
+}
\ No newline at end of file
diff --git a/sqlite/sqlite/src/test/java/androidx/sqlite/db/SimpleSQLiteQueryTest.kt b/sqlite/sqlite/src/test/java/androidx/sqlite/db/SimpleSQLiteQueryTest.kt
new file mode 100644
index 0000000..bf6edb4
--- /dev/null
+++ b/sqlite/sqlite/src/test/java/androidx/sqlite/db/SimpleSQLiteQueryTest.kt
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.sqlite.db
+import org.hamcrest.CoreMatchers.`is`
+import org.hamcrest.MatcherAssert.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.mockito.Mockito
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
+@RunWith(JUnit4::class)
+class SimpleSQLiteQueryTest {
+    @Test
+    fun sql() {
+        val query = SimpleSQLiteQuery("foo", emptyArray())
+        assertThat(query.sql, `is`("foo"))
+    }
+    @Test
+    fun bindTo_noArgs() {
+        val query = SimpleSQLiteQuery("foo", emptyArray())
+        val program: SupportSQLiteProgram = Mockito.mock(SupportSQLiteProgram::class.java)
+        query.bindTo(program)
+        verifyNoMoreInteractions(program)
+    }
+    @Test
+    fun bindTo_withArgs() {
+        val bytes = ByteArray(3)
+        val query = SimpleSQLiteQuery("foo", arrayOf("bar", 2, true, 0.5f, null, bytes))
+        val program: SupportSQLiteProgram = Mockito.mock(SupportSQLiteProgram::class.java)
+        query.bindTo(program)
+        verify(program).bindString(1, "bar")
+        verify(program).bindLong(2, 2)
+        verify(program).bindLong(3, 1)
+        verify(program).bindDouble(
+            4,
+            (0.5f).toDouble()
+        )
+        verify(program).bindNull(5)
+        verify(program).bindBlob(6, bytes)
+        verifyNoMoreInteractions(program)
+    }
+    @Test
+    fun argCount_withArgs() {
+        val query = SimpleSQLiteQuery("foo", arrayOf("bar", 2, true))
+        assertThat(query.argCount, `is`(3))
+    }
+    @Test
+    fun argCount_noArgs() {
+        val query = SimpleSQLiteQuery("foo", emptyArray())
+        assertThat(query.argCount, `is`(0))
+    }
+}
\ No newline at end of file
diff --git a/sqlite/sqlite/src/test/java/androidx/sqlite/db/SimpleSQLiteQueryTestTest.java b/sqlite/sqlite/src/test/java/androidx/sqlite/db/SimpleSQLiteQueryTestTest.java
deleted file mode 100644
index 7b04a2b..0000000
--- a/sqlite/sqlite/src/test/java/androidx/sqlite/db/SimpleSQLiteQueryTestTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.sqlite.db;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-import org.mockito.Mockito;
-
-@RunWith(JUnit4.class)
-public class SimpleSQLiteQueryTestTest {
-
-    @Test
-    public void getSql() {
-        SimpleSQLiteQuery query = new SimpleSQLiteQuery("foo");
-        assertThat(query.getSql(), is("foo"));
-    }
-
-    @Test
-    public void bindTo_noArgs() {
-        SimpleSQLiteQuery query = new SimpleSQLiteQuery("foo");
-        SupportSQLiteProgram program = Mockito.mock(SupportSQLiteProgram.class);
-        query.bindTo(program);
-        verifyNoMoreInteractions(program);
-    }
-
-    @Test
-    public void bindTo_withArgs() {
-        byte[] bytes = new byte[3];
-        SimpleSQLiteQuery query = new SimpleSQLiteQuery("foo",
-                new Object[]{"bar", 2, true, .5f, null, bytes});
-        SupportSQLiteProgram program = Mockito.mock(SupportSQLiteProgram.class);
-        query.bindTo(program);
-        verify(program).bindString(1, "bar");
-        verify(program).bindLong(2, 2);
-        verify(program).bindLong(3, 1);
-        verify(program).bindDouble(4, .5f);
-        verify(program).bindNull(5);
-        verify(program).bindBlob(6, bytes);
-        verifyNoMoreInteractions(program);
-    }
-
-    @Test
-    public void getArgCount_withArgs() {
-        SimpleSQLiteQuery query = new SimpleSQLiteQuery("foo",
-                new Object[]{"bar", 2, true});
-        assertThat(query.getArgCount(), is(3));
-    }
-
-    @Test
-    public void getArgCount_noArgs() {
-        SimpleSQLiteQuery query = new SimpleSQLiteQuery("foo");
-        assertThat(query.getArgCount(), is(0));
-    }
-}
diff --git a/test/ext/junit-gtest/build.gradle b/test/ext/junit-gtest/build.gradle
index fb53f30..3d11e8f 100644
--- a/test/ext/junit-gtest/build.gradle
+++ b/test/ext/junit-gtest/build.gradle
@@ -57,6 +57,11 @@
             version libs.versions.cmake.get()
             path "src/main/cpp/CMakeLists.txt"
         }
+        experimentalProperties["prefab.junit-gtest.exportLibraries"] = [
+                "-uJava_androidx_test_ext_junitgtest_GtestRunner_initialize",
+                "-uJava_androidx_test_ext_junitgtest_GtestRunner_run",
+                "-uJava_androidx_test_ext_junitgtest_GtestRunner_addTest"
+        ]
     }
 
     buildFeatures {
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 795e746..c4e203a 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
@@ -19,6 +19,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
+import androidx.test.filters.FlakyTest;
 import androidx.test.filters.LargeTest;
 import androidx.test.uiautomator.By;
 import androidx.test.uiautomator.UiObject2;
@@ -42,6 +43,7 @@
     @Rule
     public TemporaryFolder mTmpDir = new TemporaryFolder();
 
+    @FlakyTest(bugId = 242767707)
     @Test
     public void testClick() {
         launchTestActivity(UiDeviceTestClickActivity.class);
diff --git a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiObject2Tests.java b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiObject2Tests.java
index ef94ee4..fa4f09d 100644
--- a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiObject2Tests.java
+++ b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiObject2Tests.java
@@ -48,7 +48,7 @@
 
     @Test
     public void testClear() {
-        launchTestActivity(UiObject2TestClearTextActivity.class);
+        launchTestActivity(ClearTextTestActivity.class);
 
         UiObject2 object = mDevice.findObject(By.res(TEST_APP, "edit_text"));
         // Verify the text field has text before clear()
@@ -60,7 +60,7 @@
 
     @Test
     public void testClick() {
-        launchTestActivity(UiObject2TestClickActivity.class);
+        launchTestActivity(ClickTestActivity.class);
 
         // Short click with no parameter (`click()`).
         UiObject2 button1 = mDevice.findObject(By.res(TEST_APP, "button1"));
@@ -72,7 +72,7 @@
 
     @Test
     public void testClick_point() {
-        launchTestActivity(UiObject2TestClickActivity.class);
+        launchTestActivity(ClickTestActivity.class);
 
         // Short click with a point position as a parameter (`click(Point point)`).
 
@@ -93,7 +93,7 @@
 
     @Test
     public void testClick_duration() {
-        launchTestActivity(UiObject2TestClickActivity.class);
+        launchTestActivity(ClickTestActivity.class);
 
         // Short click with a time duration as a parameter (`click(long duration)`).
         UiObject2 button4 = mDevice.findObject(By.res(TEST_APP, "button4"));
@@ -112,7 +112,7 @@
 
     @Test
     public void testClick_pointAndDuration() {
-        launchTestActivity(UiObject2TestClickActivity.class);
+        launchTestActivity(ClickTestActivity.class);
 
         // Short click with two parameters (`click(Point point, long duration)`).
         UiObject2 button6 = mDevice.findObject(By.res(TEST_APP, "button6"));
@@ -133,7 +133,7 @@
 
     @Test
     public void testClickAndWait_conditionAndTimeout() {
-        launchTestActivity(UiObject2TestClickAndWaitActivity.class);
+        launchTestActivity(ClickAndWaitTestActivity.class);
 
         // Click the button and wait for a new window
         UiObject2 button = mDevice.findObject(By.res(TEST_APP, "new_window_button"));
@@ -142,7 +142,7 @@
 
     @Test
     public void testClickAndWait_pointAndConditionAndTimeout() {
-        launchTestActivity(UiObject2TestClickAndWaitActivity.class);
+        launchTestActivity(ClickAndWaitTestActivity.class);
 
         // Click point inside the button.
         UiObject2 button1 = mDevice.findObject(By.res(TEST_APP, "new_window_button"));
@@ -272,12 +272,12 @@
 
     @Test
     public void testGetClassName() {
-        launchTestActivity(UiObject2TestGetClassNameActivity.class);
+        launchTestActivity(MainActivity.class);
 
         UiObject2 button = mDevice.findObject(By.res(TEST_APP, "button"));
         assertEquals("android.widget.Button", button.getClassName());
 
-        UiObject2 textView = mDevice.findObject(By.res(TEST_APP, "text_view"));
+        UiObject2 textView = mDevice.findObject(By.res(TEST_APP, "example_id"));
         assertEquals("android.widget.TextView", textView.getClassName());
     }
 
@@ -318,50 +318,40 @@
     public void testGetText() {
         launchTestActivity(MainActivity.class);
 
-        UiObject2 object = mDevice.findObject(By.text("Sample text"));
-        assertEquals("Sample text", object.getText());
+        UiObject2 sampleTextObject = mDevice.findObject(By.text("Sample text"));
+        assertEquals("Sample text", sampleTextObject.getText());
 
-        UiObject2 nestedObject = mDevice.findObject(By.res(TEST_APP, "nested_elements"));
-        assertNull(nestedObject.getText());
+        UiObject2 nullTextObject = mDevice.findObject(By.res(TEST_APP, "nested_elements"));
+        assertNull(nullTextObject.getText());
     }
 
     @Test
     public void testGetVisibleBounds() {
-        launchTestActivity(MainActivity.class);
+        launchTestActivity(VisibleBoundsTestActivity.class);
 
-        UiObject2 object = mDevice.findObject(By.pkg(TEST_APP));
-        Rect bounds = object.getVisibleBounds();
-        int top = bounds.top;
-        int bottom = bounds.bottom;
-        int left = bounds.left;
-        int right = bounds.right;
-        int boundsHeight = bounds.height();
-        int boundsWidth = bounds.width();
-        int displayHeight = mDevice.getDisplayHeight();
-        int displayWidth = mDevice.getDisplayWidth();
-        // Test the lower bounds
-        assertTrue(0 <= top);
-        assertTrue(0 <= left);
-        assertTrue(top < bottom);
-        assertTrue(left < right);
-        // Test the upper bounds
-        assertTrue(boundsHeight < displayHeight);
-        assertTrue(boundsWidth < displayWidth);
+        UiObject2 partlyInvisibleRegion = mDevice.findObject(
+                By.res(TEST_APP, "partly_invisible_region"));
+        UiObject2 regionInsideScrollable = mDevice.findObject(
+                By.res(TEST_APP, "region_inside_scrollable"));
+
+        partlyInvisibleRegion.click();
+        regionInsideScrollable.click();
+        assertEquals(partlyInvisibleRegion.getText(),
+                partlyInvisibleRegion.getVisibleBounds().toString());
+        assertEquals(regionInsideScrollable.getText(),
+                regionInsideScrollable.getVisibleBounds().toString());
     }
 
     @Test
     public void testGetVisibleCenter() {
-        launchTestActivity(MainActivity.class);
+        launchTestActivity(VisibleBoundsTestActivity.class);
 
-        UiObject2 object = mDevice.findObject(By.pkg(TEST_APP));
-        Rect bounds = object.getVisibleBounds();
-        Point center = object.getVisibleCenter();
-        int top = bounds.top;
-        int bottom = bounds.bottom;
-        int left = bounds.left;
-        int right = bounds.right;
-        assertEquals((left + right) / 2, center.x);
-        assertEquals((top + bottom) / 2, center.y);
+        UiObject2 partlyInvisibleRegion = mDevice.findObject(
+                By.res(TEST_APP, "partly_invisible_region"));
+
+        partlyInvisibleRegion.click((long) (ViewConfiguration.getLongPressTimeout() * 1.5));
+        assertEquals(partlyInvisibleRegion.getText(),
+                partlyInvisibleRegion.getVisibleCenter().toString());
     }
 
     @Test
@@ -391,7 +381,7 @@
 
     @Test
     public void testIsCheckable() {
-        launchTestActivity(UiObject2TestClickActivity.class);
+        launchTestActivity(ClickTestActivity.class);
 
         // CheckBox objects are checkable by default.
         UiObject2 checkBox = mDevice.findObject(By.res(TEST_APP, "check_box"));
@@ -403,7 +393,7 @@
 
     @Test
     public void testIsChecked() {
-        launchTestActivity(UiObject2TestClickActivity.class);
+        launchTestActivity(ClickTestActivity.class);
 
         UiObject2 checkBox = mDevice.findObject(By.res(TEST_APP, "check_box"));
         assertFalse(checkBox.isChecked());
@@ -425,7 +415,7 @@
 
     @Test
     public void testIsEnabled() {
-        launchTestActivity(UiObject2TestIsEnabledActivity.class);
+        launchTestActivity(IsEnabledTestActivity.class);
 
         UiObject2 disabledObject = mDevice.findObject(By.res(TEST_APP, "disabled_text_view"));
         assertFalse(disabledObject.isEnabled());
@@ -435,7 +425,7 @@
 
     @Test
     public void testIsFocusable() {
-        launchTestActivity(UiObject2TestIsFocusedActivity.class);
+        launchTestActivity(IsFocusedTestActivity.class);
 
         UiObject2 nonFocusableTextView = mDevice.findObject(By.res(TEST_APP,
                 "non_focusable_text_view"));
@@ -446,7 +436,7 @@
 
     @Test
     public void testIsFocused() {
-        launchTestActivity(UiObject2TestIsFocusedActivity.class);
+        launchTestActivity(IsFocusedTestActivity.class);
 
         UiObject2 textView = mDevice.findObject(By.res(TEST_APP, "focusable_text_view"));
         assertFalse(textView.isFocused());
@@ -457,7 +447,7 @@
 
     @Test
     public void testIsLongClickable() {
-        launchTestActivity(UiObject2TestIsLongClickableActivity.class);
+        launchTestActivity(IsLongClickableTestActivity.class);
 
         UiObject2 longClickableButton = mDevice.findObject(By.res(TEST_APP,
                 "long_clickable_button"));
@@ -469,7 +459,7 @@
 
     @Test
     public void testIsScrollable() {
-        launchTestActivity(UiObject2TestVerticalScrollActivity.class);
+        launchTestActivity(VerticalScrollTestActivity.class);
 
         // ScrollView objects are scrollable by default.
         UiObject2 scrollView = mDevice.findObject(By.res(TEST_APP, "scroll_view"));
@@ -481,7 +471,7 @@
 
     @Test
     public void testIsSelected() {
-        launchTestActivity(UiObject2TestIsSelectedActivity.class);
+        launchTestActivity(IsSelectedTestActivity.class);
 
         UiObject2 button = mDevice.findObject(By.res(TEST_APP, "selected_button"));
         button.click();
@@ -491,7 +481,7 @@
 
     @Test
     public void testLongClick() {
-        launchTestActivity(UiObject2TestLongClickActivity.class);
+        launchTestActivity(LongClickTestActivity.class);
 
         // Find the button and verify its initial state
         UiObject2 button = mDevice.findObject(By.res(TEST_APP, "button"));
@@ -499,58 +489,57 @@
 
         // Click on the button and verify that the text has changed
         button.longClick();
-        button.wait(Until.textEquals("I've been long clicked!"), TIMEOUT_MS);
-        assertEquals("I've been long clicked!", button.getText());
+        assertTrue(button.wait(Until.textEquals("I've been long clicked!"), TIMEOUT_MS));
     }
 
     @Test
     public void testPinchClose() {
-        launchTestActivity(UiObject2TestPinchActivity.class);
+        launchTestActivity(PinchTestActivity.class);
 
         UiObject2 pinchArea = mDevice.findObject(By.res(TEST_APP, "pinch_area"));
         UiObject2 scaleText = pinchArea.findObject(By.res(TEST_APP, "scale_factor"));
         pinchArea.pinchClose(1f);
         scaleText.wait(Until.textNotEquals("1.0f"), TIMEOUT_MS);
-        float scaleValueAfterPinch = Float.valueOf(scaleText.getText());
+        float scaleValueAfterPinch = Float.parseFloat(scaleText.getText());
         assertTrue(String.format("Expected scale value to be less than 1f after pinchClose(), "
                 + "but got [%f]", scaleValueAfterPinch), scaleValueAfterPinch < 1f);
     }
 
     @Test
     public void testPinchClose_withSpeed() {
-        launchTestActivity(UiObject2TestPinchActivity.class);
+        launchTestActivity(PinchTestActivity.class);
 
         UiObject2 pinchArea = mDevice.findObject(By.res(TEST_APP, "pinch_area"));
         UiObject2 scaleText = pinchArea.findObject(By.res(TEST_APP, "scale_factor"));
         pinchArea.pinchClose(.75f, SPEED_MS);
         scaleText.wait(Until.textNotEquals("1.0f"), TIMEOUT_MS);
-        float scaleValueAfterPinch = Float.valueOf(scaleText.getText());
+        float scaleValueAfterPinch = Float.parseFloat(scaleText.getText());
         assertTrue(String.format("Expected scale value to be less than 1f after pinchClose(), "
                 + "but got [%f]", scaleValueAfterPinch), scaleValueAfterPinch < 1f);
     }
 
     @Test
     public void testPinchOpen() {
-        launchTestActivity(UiObject2TestPinchActivity.class);
+        launchTestActivity(PinchTestActivity.class);
 
         UiObject2 pinchArea = mDevice.findObject(By.res(TEST_APP, "pinch_area"));
         UiObject2 scaleText = pinchArea.findObject(By.res(TEST_APP, "scale_factor"));
         pinchArea.pinchOpen(.5f);
         scaleText.wait(Until.textNotEquals("1.0f"), TIMEOUT_MS);
-        float scaleValueAfterPinch = Float.valueOf(scaleText.getText());
+        float scaleValueAfterPinch = Float.parseFloat(scaleText.getText());
         assertTrue(String.format("Expected scale text to be greater than 1f after pinchOpen(), "
                 + "but got [%f]", scaleValueAfterPinch), scaleValueAfterPinch > 1f);
     }
 
     @Test
     public void testPinchOpen_withSpeed() {
-        launchTestActivity(UiObject2TestPinchActivity.class);
+        launchTestActivity(PinchTestActivity.class);
 
         UiObject2 pinchArea = mDevice.findObject(By.res(TEST_APP, "pinch_area"));
         UiObject2 scaleText = pinchArea.findObject(By.res(TEST_APP, "scale_factor"));
         pinchArea.pinchOpen(.25f, SPEED_MS);
         scaleText.wait(Until.textNotEquals("1.0f"), TIMEOUT_MS);
-        float scaleValueAfterPinch = Float.valueOf(scaleText.getText());
+        float scaleValueAfterPinch = Float.parseFloat(scaleText.getText());
         assertTrue(String.format("Expected scale text to be greater than 1f after pinchOpen(), "
                 + "but got [%f]", scaleValueAfterPinch), scaleValueAfterPinch > 1f);
     }
@@ -562,17 +551,17 @@
         UiObject2 swipeRegion = mDevice.findObject(By.res(TEST_APP, "swipe_region"));
         swipeRegion.setGestureMargin(SCROLL_MARGIN);
 
-        swipeRegion.swipe(Direction.LEFT, 0.5f);
-        assertEquals("swipe_left", swipeRegion.getText());
+        swipeRegion.swipe(Direction.LEFT, 0.9f);
+        assertTrue(swipeRegion.wait(Until.textEquals("swipe_left"), TIMEOUT_MS));
 
         swipeRegion.swipe(Direction.RIGHT, 1.0f);
-        assertEquals("swipe_right", swipeRegion.getText());
+        assertTrue(swipeRegion.wait(Until.textEquals("swipe_right"), TIMEOUT_MS));
 
-        swipeRegion.swipe(Direction.UP, 0.5f, 1000);
-        assertEquals("swipe_up", swipeRegion.getText());
+        swipeRegion.swipe(Direction.UP, 0.9f, 1000);
+        assertTrue(swipeRegion.wait(Until.textEquals("swipe_up"), TIMEOUT_MS));
 
         swipeRegion.swipe(Direction.DOWN, 1.0f, 1000);
-        assertEquals("swipe_down", swipeRegion.getText());
+        assertTrue(swipeRegion.wait(Until.textEquals("swipe_down"), TIMEOUT_MS));
     }
 
     @Test
@@ -606,7 +595,7 @@
 
     @Test
     public void testScroll() {
-        launchTestActivity(UiObject2TestVerticalScrollActivity.class);
+        launchTestActivity(VerticalScrollTestActivity.class);
         assertTrue(mDevice.hasObject(By.res(TEST_APP, "top_text"))); // Initially at top.
 
         // Scroll down to bottom (20000px) in increments of 5000px.
@@ -630,7 +619,7 @@
 
     @Test
     public void testScroll_untilEnd() {
-        launchTestActivity(UiObject2TestVerticalScrollActivity.class);
+        launchTestActivity(VerticalScrollTestActivity.class);
         assertTrue(mDevice.hasObject(By.res(TEST_APP, "top_text"))); // Initially at top.
 
         // Scroll until end (scroll method returns false).
@@ -656,7 +645,7 @@
         while (flingRegion.fling(Direction.LEFT)) {
             // Continue until left bound.
         }
-        assertEquals("fling_left", flingRegion.getText());
+        assertTrue(flingRegion.wait(Until.textEquals("fling_left"), TIMEOUT_MS));
     }
 
     @Test
@@ -673,7 +662,7 @@
         while (flingRegion.fling(Direction.UP, 5000)) {
             // Continue until up bound.
         }
-        assertEquals("fling_up", flingRegion.getText());
+        assertTrue(flingRegion.wait(Until.textEquals("fling_up"), TIMEOUT_MS));
     }
 
     @Test
@@ -694,7 +683,7 @@
 
     @Test
     public void testSetGestureMargin() {
-        launchTestActivity(UiObject2TestPinchActivity.class);
+        launchTestActivity(PinchTestActivity.class);
 
         UiObject2 pinchArea = mDevice.findObject(By.res(TEST_APP, "pinch_area"));
         UiObject2 scaleText = pinchArea.findObject(By.res(TEST_APP, "scale_factor"));
@@ -722,7 +711,7 @@
 
     @Test
     public void testSetGestureMargins() {
-        launchTestActivity(UiObject2TestPinchActivity.class);
+        launchTestActivity(PinchTestActivity.class);
 
         UiObject2 pinchArea = mDevice.findObject(By.res(TEST_APP, "pinch_area"));
         UiObject2 scaleText = pinchArea.findObject(By.res(TEST_APP, "scale_factor"));
@@ -750,7 +739,7 @@
 
     @Test
     public void testSetText() {
-        launchTestActivity(UiObject2TestClearTextActivity.class);
+        launchTestActivity(ClearTextTestActivity.class);
 
         UiObject2 object = mDevice.findObject(By.res(TEST_APP, "edit_text"));
         // Verify the text field has "sample_text" before setText()
diff --git a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiObjectTest.java b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiObjectTest.java
index 5301a70..7d76076 100644
--- a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiObjectTest.java
+++ b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiObjectTest.java
@@ -23,6 +23,7 @@
 
 import android.graphics.Rect;
 
+import androidx.test.filters.FlakyTest;
 import androidx.test.filters.SdkSuppress;
 import androidx.test.uiautomator.UiObject;
 import androidx.test.uiautomator.UiObjectNotFoundException;
@@ -74,8 +75,7 @@
 
         UiObject noNode = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id/no_node"));
 
-        assertThrows(noNode.getSelector().toString(), UiObjectNotFoundException.class,
-                noNode::getChildCount);
+        assertThrows(UiObjectNotFoundException.class, noNode::getChildCount);
     }
 
     @Test
@@ -87,6 +87,7 @@
                 + "/drag_button"));
         UiObject dragDestination = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
                 + "/drag_destination"));
+
         UiObject expectedDragDest = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
                 + "/drag_destination").text("drag_received"));
 
@@ -107,6 +108,7 @@
                 + "/drag_button"));
         UiObject dragDestination = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
                 + "/drag_destination"));
+
         UiObject expectedDragDest = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
                 + "/drag_destination").text("drag_received"));
         Rect destBounds = dragDestination.getVisibleBounds();
@@ -122,10 +124,19 @@
 
         UiObject swipeRegion = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
                 + "/swipe_region"));
+        UiObject verySmallRegion = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/very_small_region"));
 
+        UiObject expectedSwipeRegion = mDevice.findObject(
+                new UiSelector().resourceId(TEST_APP + ":id"
+                        + "/swipe_region").text("swipe_up"));
+
+        // Note that the `swipeRegion` will always show the swipe direction, even if the swipe
+        // action does not happen inside `swipeRegion`.
+        assertFalse(verySmallRegion.swipeUp(100));
         assertEquals("no_swipe", swipeRegion.getText());
         assertTrue(swipeRegion.swipeUp(100));
-        assertEquals("swipe_up", swipeRegion.getText());
+        assertTrue(expectedSwipeRegion.waitForExists(TIMEOUT_MS));
     }
 
     @Test
@@ -134,22 +145,37 @@
 
         UiObject swipeRegion = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
                 + "/swipe_region"));
+        UiObject verySmallRegion = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/very_small_region"));
 
+        UiObject expectedSwipeRegion = mDevice.findObject(
+                new UiSelector().resourceId(TEST_APP + ":id"
+                        + "/swipe_region").text("swipe_down"));
+
+        assertFalse(verySmallRegion.swipeDown(100));
         assertEquals("no_swipe", swipeRegion.getText());
         assertTrue(swipeRegion.swipeDown(100));
-        assertEquals("swipe_down", swipeRegion.getText());
+        assertTrue(expectedSwipeRegion.waitForExists(TIMEOUT_MS));
     }
 
+    @FlakyTest(bugId = 242761733)
     @Test
     public void testSwipeLeft() throws Exception {
         launchTestActivity(SwipeTestActivity.class);
 
         UiObject swipeRegion = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
                 + "/swipe_region"));
+        UiObject verySmallRegion = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/very_small_region"));
 
+        UiObject expectedSwipeRegion = mDevice.findObject(
+                new UiSelector().resourceId(TEST_APP + ":id"
+                        + "/swipe_region").text("swipe_left"));
+
+        assertFalse(verySmallRegion.swipeLeft(100));
         assertEquals("no_swipe", swipeRegion.getText());
         assertTrue(swipeRegion.swipeLeft(100));
-        assertEquals("swipe_left", swipeRegion.getText());
+        assertTrue(expectedSwipeRegion.waitForExists(TIMEOUT_MS));
     }
 
     @Test
@@ -158,76 +184,502 @@
 
         UiObject swipeRegion = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
                 + "/swipe_region"));
+        UiObject verySmallRegion = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/very_small_region"));
 
+        UiObject expectedSwipeRegion = mDevice.findObject(
+                new UiSelector().resourceId(TEST_APP + ":id"
+                        + "/swipe_region").text("swipe_right"));
+
+        assertFalse(verySmallRegion.swipeRight(100));
         assertEquals("no_swipe", swipeRegion.getText());
         assertTrue(swipeRegion.swipeRight(100));
-        assertEquals("swipe_right", swipeRegion.getText());
+        assertTrue(expectedSwipeRegion.waitForExists(TIMEOUT_MS));
+    }
+
+    @Test
+    public void testClick() throws Exception {
+        launchTestActivity(ClickTestActivity.class);
+
+        UiObject button1 = mDevice.findObject(
+                new UiSelector().resourceId(TEST_APP + ":id/button1"));
+
+        UiObject expectedButton1 = mDevice.findObject(
+                new UiSelector().resourceId(TEST_APP + ":id/button1").text("text1_clicked"));
+
+        assertEquals("text1", button1.getText());
+        assertTrue(button1.click());
+        assertTrue(expectedButton1.waitForExists(TIMEOUT_MS));
+    }
+
+    @Test
+    public void testClickAndWaitForNewWindow() throws Exception {
+        launchTestActivity(ClickAndWaitTestActivity.class);
+
+        UiObject newWindowsButton = mDevice.findObject(
+                new UiSelector().resourceId(TEST_APP + ":id/new_window_button"));
+
+        assertTrue(newWindowsButton.clickAndWaitForNewWindow());
+    }
+
+    @Test
+    public void testClickAndWaitForNewWindow_timeout() throws Exception {
+        launchTestActivity(ClickAndWaitTestActivity.class);
+
+        UiObject newWindowsButton = mDevice.findObject(
+                new UiSelector().resourceId(TEST_APP + ":id/new_window_button"));
+
+        assertTrue(newWindowsButton.clickAndWaitForNewWindow(4_000));
+    }
+
+    @Test
+    public void testClickTopLeft() throws Exception {
+        launchTestActivity(ClickOnPositionTestActivity.class);
+
+        UiObject clickRegion = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/click_region"));
+
+        assertEquals("click_region", clickRegion.getText());
+        assertTrue(clickRegion.clickTopLeft());
+        assertEquals("top_left_clicked", clickRegion.getText());
+    }
+
+    @Test
+    public void testLongClickBottomRight() throws Exception {
+        launchTestActivity(ClickOnPositionTestActivity.class);
+
+        UiObject clickRegion = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/click_region"));
+
+        assertEquals("click_region", clickRegion.getText());
+        assertTrue(clickRegion.longClickBottomRight());
+        assertEquals("bottom_right_long_clicked", clickRegion.getText());
+    }
+
+    @Test
+    public void testClickBottomRight() throws Exception {
+        launchTestActivity(ClickOnPositionTestActivity.class);
+
+        UiObject clickRegion = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/click_region"));
+
+        assertEquals("click_region", clickRegion.getText());
+        assertTrue(clickRegion.clickBottomRight());
+        assertEquals("bottom_right_clicked", clickRegion.getText());
+    }
+
+    @Test
+    public void testLongClick() throws Exception {
+        launchTestActivity(ClickOnPositionTestActivity.class);
+
+        UiObject clickRegion = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/click_region"));
+
+        assertEquals("click_region", clickRegion.getText());
+        assertTrue(clickRegion.longClick());
+        assertTrue(clickRegion.getText().contains("long"));
+    }
+
+    @Test
+    public void testLongClickTopLeft() throws Exception {
+        launchTestActivity(ClickOnPositionTestActivity.class);
+
+        UiObject clickRegion = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/click_region"));
+
+        assertEquals("click_region", clickRegion.getText());
+        assertTrue(clickRegion.longClickTopLeft());
+        assertEquals("top_left_long_clicked", clickRegion.getText());
+    }
+
+    @Test
+    public void testClickFamily_throwsUiObjectNotFoundException() {
+        launchTestActivity(ClickTestActivity.class);
+
+        UiObject noNode = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id/no_node"));
+
+        assertThrows(UiObjectNotFoundException.class, noNode::click);
+        assertThrows(UiObjectNotFoundException.class, noNode::clickAndWaitForNewWindow);
+        assertThrows(UiObjectNotFoundException.class, noNode::clickTopLeft);
+        assertThrows(UiObjectNotFoundException.class, noNode::longClickBottomRight);
+        assertThrows(UiObjectNotFoundException.class, noNode::clickBottomRight);
+        assertThrows(UiObjectNotFoundException.class, noNode::longClick);
+        assertThrows(UiObjectNotFoundException.class, noNode::longClickTopLeft);
+    }
+
+    @Test
+    public void testGetText() throws Exception {
+        launchTestActivity(MainActivity.class);
+
+        UiObject sampleTextObject = mDevice.findObject(new UiSelector().text("Sample text"));
+        UiObject nullTextObject = mDevice.findObject(
+                new UiSelector().resourceId(TEST_APP + ":id/nested_elements"));
+
+        assertEquals("Sample text", sampleTextObject.getText());
+        assertEquals("", nullTextObject.getText());
+    }
+
+    @Test
+    public void testGetClassName() throws Exception {
+        launchTestActivity(MainActivity.class);
+
+        UiObject button = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id/button"));
+        UiObject textView = mDevice.findObject(
+                new UiSelector().resourceId(TEST_APP + ":id/example_id"));
+
+        assertEquals("android.widget.Button", button.getClassName());
+        assertEquals("android.widget.TextView", textView.getClassName());
+    }
+
+    @Test
+    public void testGetContentDescription() throws Exception {
+        launchTestActivity(MainActivity.class);
+
+        UiObject button = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id/button"));
+        UiObject textView = mDevice.findObject(new UiSelector().text("Text View 1"));
+
+        assertEquals("I'm accessible!", button.getContentDescription());
+        assertEquals("", textView.getContentDescription());
+    }
+
+    @Test
+    public void testLegacySetText() throws Exception {
+        launchTestActivity(ClearTextTestActivity.class);
+
+        UiObject editText = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/edit_text"));
+
+        assertEquals("sample_text", editText.getText());
+        editText.legacySetText("new_text");
+        assertEquals("new_text", editText.getText());
+    }
+
+    @Test
+    public void testSetText() throws Exception {
+        launchTestActivity(ClearTextTestActivity.class);
+
+        UiObject editText = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/edit_text"));
+
+        assertEquals("sample_text", editText.getText());
+        editText.setText("new_text");
+        assertEquals("new_text", editText.getText());
+    }
+
+    @Test
+    public void testClearTextField() throws Exception {
+        launchTestActivity(ClearTextTestActivity.class);
+
+        UiObject editText = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/edit_text"));
+
+        assertEquals("sample_text", editText.getText());
+        editText.clearTextField();
+        assertEquals("", editText.getText());
+    }
+
+    @Test
+    public void testTextFamily_throwsUiObjectNotFoundException() {
+        launchTestActivity(ClearTextTestActivity.class);
+
+        UiObject noNode = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id/no_node"));
+
+        assertThrows(UiObjectNotFoundException.class, noNode::getText);
+        assertThrows(UiObjectNotFoundException.class, noNode::getClassName);
+        assertThrows(UiObjectNotFoundException.class, noNode::getContentDescription);
+        assertThrows(UiObjectNotFoundException.class, () -> noNode.legacySetText("new_text"));
+        assertThrows(UiObjectNotFoundException.class, () -> noNode.setText("new_text"));
+        assertThrows(UiObjectNotFoundException.class, noNode::clearTextField);
+        assertThrows(UiObjectNotFoundException.class, noNode::getPackageName);
+    }
+
+    @Test
+    public void testIsChecked() throws Exception {
+        launchTestActivity(ClickTestActivity.class);
+
+        UiObject checkBox = mDevice.findObject(
+                new UiSelector().resourceId(TEST_APP + ":id/check_box"));
+
+        assertFalse(checkBox.isChecked());
+        checkBox.click();
+        assertTrue(checkBox.isChecked());
+    }
+
+    @Test
+    public void testIsSelected() throws Exception {
+        launchTestActivity(IsSelectedTestActivity.class);
+
+        UiObject selectedButton = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/selected_button"));
+        UiObject selectedTarget = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/selected_target"));
+
+        selectedButton.click();
+        assertTrue(selectedTarget.isSelected());
+    }
+
+    @Test
+    public void testIsCheckable() throws Exception {
+        launchTestActivity(ClickTestActivity.class);
+
+        UiObject checkBox = mDevice.findObject(
+                new UiSelector().resourceId(TEST_APP + ":id/check_box"));
+        UiObject button1 = mDevice.findObject(
+                new UiSelector().resourceId(TEST_APP + ":id/button1"));
+
+        assertTrue(checkBox.isCheckable());
+        assertFalse(button1.isCheckable());
+    }
+
+    @Test
+    public void testIsEnabled() throws Exception {
+        launchTestActivity(IsEnabledTestActivity.class);
+
+        UiObject disabledObject = mDevice.findObject(
+                new UiSelector().resourceId(TEST_APP + ":id/disabled_text_view"));
+        UiObject enabledObject = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/enabled_text_view"));
+
+        assertFalse(disabledObject.isEnabled());
+        assertTrue(enabledObject.isEnabled());
+    }
+
+    @Test
+    public void testIsClickable() throws Exception {
+        launchTestActivity(MainActivity.class);
+
+        UiObject textView = mDevice.findObject(new UiSelector().text("Sample text"));
+        UiObject button = mDevice.findObject(new UiSelector().text("Accessible button"));
+
+        assertFalse(textView.isClickable());
+        assertTrue(button.isClickable());
+    }
+
+    @Test
+    public void testIsFocused() throws Exception {
+        launchTestActivity(IsFocusedTestActivity.class);
+
+        UiObject textView = mDevice.findObject(
+                new UiSelector().resourceId(TEST_APP + ":id/focusable_text_view"));
+        UiObject button = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id/button"));
+
+        assertFalse(textView.isFocused());
+        button.click();
+        assertTrue(textView.isFocused());
+    }
+
+    @Test
+    public void testIsFocusable() throws Exception {
+        launchTestActivity(IsFocusedTestActivity.class);
+
+        UiObject nonFocusableTextView =
+                mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                        + "/non_focusable_text_view"));
+        UiObject focusableTextView = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/focusable_text_view"));
+
+        assertFalse(nonFocusableTextView.isFocusable());
+        assertTrue(focusableTextView.isFocusable());
+    }
+
+    @Test
+    public void testIsScrollable() throws Exception {
+        launchTestActivity(VerticalScrollTestActivity.class);
+
+        UiObject scrollView = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/scroll_view"));
+        UiObject textView = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/top_text"));
+
+        assertTrue(scrollView.isScrollable());
+        assertFalse(textView.isScrollable());
+    }
+
+    @Test
+    public void testIsLongClickable() throws Exception {
+        launchTestActivity(LongClickTestActivity.class);
+
+        UiObject button = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id/button"));
+        UiObject expectedButton = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/button").text("I've been long clicked!"));
+
+        assertEquals("Long Click Me!", button.getText());
+        button.longClick();
+        assertTrue(expectedButton.waitForExists(TIMEOUT_MS));
+    }
+
+    @Test
+    public void testAttributeCheckingMethods_throwsUiObjectNotFoundException() {
+        launchTestActivity(ClickTestActivity.class);
+
+        UiObject noNode = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id/no_node"));
+
+        assertThrows(UiObjectNotFoundException.class, noNode::isChecked);
+        assertThrows(UiObjectNotFoundException.class, noNode::isSelected);
+        assertThrows(UiObjectNotFoundException.class, noNode::isCheckable);
+        assertThrows(UiObjectNotFoundException.class, noNode::isEnabled);
+        assertThrows(UiObjectNotFoundException.class, noNode::isClickable);
+        assertThrows(UiObjectNotFoundException.class, noNode::isFocused);
+        assertThrows(UiObjectNotFoundException.class, noNode::isFocusable);
+        assertThrows(UiObjectNotFoundException.class, noNode::isScrollable);
+        assertThrows(UiObjectNotFoundException.class, noNode::isLongClickable);
+    }
+
+    @Test
+    public void testGetPackageName() throws Exception {
+        launchTestActivity(MainActivity.class);
+
+        UiObject sampleTextObject = mDevice.findObject(new UiSelector().text("Sample text"));
+
+        assertEquals(TEST_APP, sampleTextObject.getPackageName());
+    }
+
+    @Test
+    public void testGetVisibleBounds() throws Exception {
+        launchTestActivity(VisibleBoundsTestActivity.class);
+
+        UiObject partlyInvisibleRegion =
+                mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                        + "/partly_invisible_region"));
+        UiObject regionInsideScrollable =
+                mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                        + "/region_inside_scrollable"));
+
+        partlyInvisibleRegion.click();
+        regionInsideScrollable.click();
+        assertEquals(partlyInvisibleRegion.getText(),
+                partlyInvisibleRegion.getVisibleBounds().toString());
+        assertEquals(regionInsideScrollable.getText(),
+                regionInsideScrollable.getVisibleBounds().toString());
+    }
+
+    @Test
+    public void testGetBounds() throws Exception {
+        launchTestActivity(VisibleBoundsTestActivity.class);
+
+        UiObject partlyInvisibleRegion =
+                mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                        + "/partly_invisible_region"));
+
+        partlyInvisibleRegion.click();
+        assertEquals(partlyInvisibleRegion.getText(),
+                partlyInvisibleRegion.getBounds().toString());
+    }
+
+    @Test
+    public void testWaitForExists() throws Exception {
+        launchTestActivity(WaitTestActivity.class);
+
+        UiObject text1 = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id/text_1"));
+        assertEquals("text_1_not_changed", text1.getText());
+
+        UiObject expectedText1 = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/text_1").text("text_1_changed"));
+
+        text1.click();
+        assertTrue(expectedText1.waitForExists(TIMEOUT_MS));
+    }
+
+    @Test
+    public void testWaitForExist_timeout() throws Exception {
+        launchTestActivity(WaitTestActivity.class);
+
+        UiObject text1 = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id/text_1"));
+        assertEquals("text_1_not_changed", text1.getText());
+
+        UiObject expectedText1 = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/text_1").text("text_1_changed"));
+
+        assertFalse(expectedText1.waitForExists(1_000));
+    }
+
+    @Test
+    public void testWaitUntilGone() throws Exception {
+        launchTestActivity(WaitTestActivity.class);
+
+        UiObject expectedText1 = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/text_1").text("text_1_not_changed"));
+        assertTrue(expectedText1.exists());
+        expectedText1.click();
+        assertTrue(expectedText1.waitUntilGone(TIMEOUT_MS));
+    }
+
+    @Test
+    public void testWaitUntilGone_timeout() {
+        launchTestActivity(WaitTestActivity.class);
+
+        UiObject expectedText1 = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/text_1").text("text_1_not_changed"));
+        assertTrue(expectedText1.exists());
+        assertFalse(expectedText1.waitUntilGone(1_000));
+    }
+
+    @Test
+    public void testExists() {
+        launchTestActivity(WaitTestActivity.class);
+
+        UiObject text1 = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id/text_1"));
+        UiObject text3 = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id/text_3"));
+
+        assertTrue(text1.exists());
+        assertFalse(text3.exists());
+    }
+
+    @Test
+    public void testPinchOut() throws Exception {
+        launchTestActivity(PinchTestActivity.class);
+
+        UiObject pinchArea = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/pinch_area"));
+        UiObject scaleText = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/scale_factor"));
+
+        UiObject expectedScaleText = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/scale_factor").text("1.0f"));
+
+        assertTrue(pinchArea.pinchOut(100, 10));
+        assertTrue(expectedScaleText.waitUntilGone(TIMEOUT_MS));
+        float scaleValueAfterPinch = Float.parseFloat(scaleText.getText());
+        assertTrue(String.format(
+                "Expected scale text to be greater than 1f after pinchOut(), but got [%f]",
+                scaleValueAfterPinch), scaleValueAfterPinch > 1f);
+    }
+
+    @Test
+    public void testPinchIn() throws Exception {
+        launchTestActivity(PinchTestActivity.class);
+
+        UiObject pinchArea = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/pinch_area"));
+        UiObject scaleText = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/scale_factor"));
+
+        UiObject expectedScaleText = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/scale_factor").text("1.0f"));
+
+        assertTrue(pinchArea.pinchIn(100, 10));
+        assertTrue(expectedScaleText.waitUntilGone(TIMEOUT_MS));
+        float scaleValueAfterPinch = Float.parseFloat(scaleText.getText());
+        assertTrue(String.format("Expected scale value to be less than 1f after pinchIn(), "
+                + "but got [%f]", scaleValueAfterPinch), scaleValueAfterPinch < 1f);
+    }
+
+    @Test
+    public void testPinchFamily_throwsExceptions() {
+        launchTestActivity(PinchTestActivity.class);
+
+        UiObject noNode = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id/no_node"));
+        UiObject smallArea = mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id"
+                + "/small_area"));
+
+        assertThrows(UiObjectNotFoundException.class, () -> noNode.pinchOut(100, 10));
+        assertThrows(UiObjectNotFoundException.class, () -> noNode.pinchIn(100, 10));
+        assertThrows(IllegalStateException.class, () -> smallArea.pinchOut(100, 10));
+        assertThrows(IllegalStateException.class, () -> smallArea.pinchIn(100, 10));
     }
 
     /* TODO(b/241158642): Implement these tests, and the tests for exceptions of each tested method.
 
-    public void testClick() {}
-
-    public void testClickAndWaitForNewWindow() {}
-
-    public void testClickAndWaitForNewWindow_timeout() {}
-
-    public void testClickTopLeft() {}
-
-    public void testLongClickBottomRight() {}
-
-    public void testClickBottomRight() {}
-
-    public void testLongClick() {}
-
-    public void testLongClickTopLeft() {}
-
-    public void testGetText() {}
-
-    public void testGetClassName() {}
-
-    public void testGetContentDescription() {}
-
-    public void testLegacySetText() {}
-
-    public void testSetText() {}
-
-    public void testClearTextField() {}
-
-    public void testIsChecked() {}
-
-    public void testIsSelected() {}
-
-    public void testIsCheckable() {}
-
-    public void testIsEnabled() {}
-
-    public void testIsClickable() {}
-
-    public void testIsFocused() {}
-
-    public void testIsFocusable() {}
-
-    public void testIsScrollable() {}
-
-    public void testIsLongClickable() {}
-
-    public void testGetPackageName() {}
-
-    public void testGetVisibleBounds() {}
-
-    public void testGetBounds() {}
-
-    public void testWaitForExists() {}
-
-    public void testWaitUntilGone() {}
-
-    public void testExists() {}
-
-    public void testPinchOut() {}
-
-    public void testPinchIn() {}
-
     public void testPerformTwoPointerGesture() {}
 
     public void testPerformMultiPointerGesture() {}
diff --git a/test/uiautomator/integration-tests/testapp/src/main/AndroidManifest.xml b/test/uiautomator/integration-tests/testapp/src/main/AndroidManifest.xml
index 99fd1c1..2e3d6d6 100644
--- a/test/uiautomator/integration-tests/testapp/src/main/AndroidManifest.xml
+++ b/test/uiautomator/integration-tests/testapp/src/main/AndroidManifest.xml
@@ -41,6 +41,34 @@
                 <action android:name="android.intent.action.MAIN" />
             </intent-filter>
         </activity>
+        <activity android:name=".ClearTextTestActivity"
+            android:exported="true"
+            android:theme="@android:style/Theme.Holo.NoActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+            </intent-filter>
+        </activity>
+        <activity android:name=".ClickAndWaitTestActivity"
+            android:exported="true"
+            android:theme="@android:style/Theme.Holo.NoActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+            </intent-filter>
+        </activity>
+        <activity android:name=".ClickOnPositionTestActivity"
+            android:exported="true"
+            android:theme="@android:style/Theme.Holo.NoActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+            </intent-filter>
+        </activity>
+        <activity android:name=".ClickTestActivity"
+            android:exported="true"
+            android:theme="@android:style/Theme.Holo.NoActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+            </intent-filter>
+        </activity>
         <activity android:name=".DragTestActivity"
             android:exported="true"
             android:theme="@android:style/Theme.Holo.NoActionBar">
@@ -48,6 +76,41 @@
                 <action android:name="android.intent.action.MAIN" />
             </intent-filter>
         </activity>
+        <activity android:name=".IsEnabledTestActivity"
+            android:exported="true"
+            android:theme="@android:style/Theme.Holo.NoActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+            </intent-filter>
+        </activity>
+        <activity android:name=".IsFocusedTestActivity"
+            android:exported="true"
+            android:theme="@android:style/Theme.Holo.NoActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+            </intent-filter>
+        </activity>
+        <activity android:name=".IsLongClickableTestActivity"
+            android:exported="true"
+            android:theme="@android:style/Theme.Holo.NoActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+            </intent-filter>
+        </activity>
+        <activity android:name=".IsSelectedTestActivity"
+            android:exported="true"
+            android:theme="@android:style/Theme.Holo.NoActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+            </intent-filter>
+        </activity>
+        <activity android:name=".LongClickTestActivity"
+            android:exported="true"
+            android:theme="@android:style/Theme.Holo.NoActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+            </intent-filter>
+        </activity>
         <activity android:name=".ParentChildTestActivity"
             android:exported="true"
             android:theme="@android:style/Theme.Holo.NoActionBar">
@@ -64,6 +127,13 @@
                 <action android:name="android.intent.action.MAIN" />
             </intent-filter>
         </activity>
+        <activity android:name=".PinchTestActivity"
+            android:exported="true"
+            android:theme="@android:style/Theme.Holo.NoActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+            </intent-filter>
+        </activity>
         <activity android:name=".SplitScreenTestActivity"
             android:exported="true"
             android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
@@ -87,27 +157,6 @@
                 <action android:name="android.intent.action.MAIN" />
             </intent-filter>
         </activity>
-        <activity android:name=".UiObject2TestClearTextActivity"
-            android:exported="true"
-            android:theme="@android:style/Theme.Holo.NoActionBar">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-            </intent-filter>
-        </activity>
-        <activity android:name=".UiObject2TestClickActivity"
-            android:exported="true"
-            android:theme="@android:style/Theme.Holo.NoActionBar">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-            </intent-filter>
-        </activity>
-        <activity android:name=".UiObject2TestClickAndWaitActivity"
-            android:exported="true"
-            android:theme="@android:style/Theme.Holo.NoActionBar">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-            </intent-filter>
-        </activity>
         <activity android:name=".UiObject2TestFlingActivity"
             android:exported="true"
             android:theme="@android:style/Theme.Holo.NoActionBar">
@@ -115,62 +164,6 @@
                 <action android:name="android.intent.action.MAIN" />
             </intent-filter>
         </activity>
-        <activity android:name=".UiObject2TestIsEnabledActivity"
-            android:exported="true"
-            android:theme="@android:style/Theme.Holo.NoActionBar">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-            </intent-filter>
-        </activity>
-        <activity android:name=".UiObject2TestIsFocusedActivity"
-            android:exported="true"
-            android:theme="@android:style/Theme.Holo.NoActionBar">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-            </intent-filter>
-        </activity>
-        <activity android:name=".UiObject2TestIsLongClickableActivity"
-            android:exported="true"
-            android:theme="@android:style/Theme.Holo.NoActionBar">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-            </intent-filter>
-        </activity>
-        <activity android:name=".UiObject2TestIsSelectedActivity"
-            android:exported="true"
-            android:theme="@android:style/Theme.Holo.NoActionBar">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-            </intent-filter>
-        </activity>
-        <activity android:name=".UiObject2TestLongClickActivity"
-            android:exported="true"
-            android:theme="@android:style/Theme.Holo.NoActionBar">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-            </intent-filter>
-        </activity>
-        <activity android:name=".UiObject2TestGetClassNameActivity"
-            android:exported="true"
-            android:theme="@android:style/Theme.Holo.NoActionBar">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-            </intent-filter>
-        </activity>
-        <activity android:name=".UiObject2TestPinchActivity"
-            android:exported="true"
-            android:theme="@android:style/Theme.Holo.NoActionBar">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-            </intent-filter>
-        </activity>
-        <activity android:name=".UiObject2TestVerticalScrollActivity"
-            android:exported="true"
-            android:theme="@android:style/Theme.Holo.NoActionBar">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-            </intent-filter>
-        </activity>
         <activity android:name=".UntilTestActivity"
             android:exported="true"
             android:theme="@android:style/Theme.Holo.NoActionBar">
@@ -178,6 +171,27 @@
                 <action android:name="android.intent.action.MAIN" />
             </intent-filter>
         </activity>
+        <activity android:name=".VerticalScrollTestActivity"
+            android:exported="true"
+            android:theme="@android:style/Theme.Holo.NoActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+            </intent-filter>
+        </activity>
+        <activity android:name=".VisibleBoundsTestActivity"
+            android:exported="true"
+            android:theme="@android:style/Theme.Holo.NoActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+            </intent-filter>
+        </activity>
+        <activity android:name=".WaitTestActivity"
+            android:exported="true"
+            android:theme="@android:style/Theme.Holo.NoActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+            </intent-filter>
+        </activity>
     </application>
 
 </manifest>
diff --git a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/ClearTextTestActivity.java b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/ClearTextTestActivity.java
new file mode 100644
index 0000000..988472f
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/ClearTextTestActivity.java
@@ -0,0 +1,32 @@
+/*
+ * 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.test.uiautomator.testapp;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+import androidx.annotation.Nullable;
+
+public class ClearTextTestActivity extends Activity {
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.clear_text_test_activity);
+    }
+}
diff --git a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/ClickAndWaitTestActivity.java b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/ClickAndWaitTestActivity.java
new file mode 100644
index 0000000..5f82e37
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/ClickAndWaitTestActivity.java
@@ -0,0 +1,46 @@
+/*
+ * 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.test.uiautomator.testapp;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.view.View;
+import android.widget.Button;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+public class ClickAndWaitTestActivity extends Activity {
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.click_and_wait_test_activity);
+    }
+
+    public void launchNewWindow(@NonNull View v) {
+        ((Button) v).append("_clicked");
+        new Handler().postDelayed(() -> {
+            Intent intent = new Intent(getApplicationContext(),
+                    ClickAndWaitTestActivity.class);
+            startActivity(intent);
+        }, 2_000);
+    }
+}
diff --git a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/ClickOnPositionTestActivity.java b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/ClickOnPositionTestActivity.java
new file mode 100644
index 0000000..d300677
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/ClickOnPositionTestActivity.java
@@ -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.test.uiautomator.testapp;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.MotionEvent;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+
+public class ClickOnPositionTestActivity extends Activity {
+    private String mTouchMessage = "";
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.click_on_position_test_activity);
+
+        TextView clickRegion = findViewById(R.id.click_region);
+
+        clickRegion.setOnTouchListener((view, motionEvent) -> {
+            if (motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN) {
+                mTouchMessage += motionEvent.getY() < view.getHeight() / 2.0 ? "top_" : "bottom_";
+                mTouchMessage += motionEvent.getX() < view.getWidth() / 2.0 ? "left" : "right";
+            }
+            return false;
+        });
+        clickRegion.setOnClickListener(view -> clickRegion.setText(mTouchMessage + "_clicked"));
+        clickRegion.setOnLongClickListener(view -> {
+            clickRegion.setText(mTouchMessage + "_long_clicked");
+            return true;
+        });
+    }
+}
diff --git a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/ClickTestActivity.java b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/ClickTestActivity.java
new file mode 100644
index 0000000..452b42e
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/ClickTestActivity.java
@@ -0,0 +1,59 @@
+/*
+ * 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.test.uiautomator.testapp;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.View;
+import android.view.View.OnLongClickListener;
+import android.widget.Button;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+public class ClickTestActivity extends Activity {
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.click_test_activity);
+
+        // Set up the long-clickable buttons.
+        Button button4 = findViewById(R.id.button4);
+        Button button5 = findViewById(R.id.button5);
+        Button button6 = findViewById(R.id.button6);
+        Button button7 = findViewById(R.id.button7);
+
+        button4.setOnLongClickListener(new OnButtonLongClick());
+        button5.setOnLongClickListener(new OnButtonLongClick());
+        button6.setOnLongClickListener(new OnButtonLongClick());
+        button7.setOnLongClickListener(new OnButtonLongClick());
+    }
+
+    public void onButtonClick(@NonNull View v) {
+        ((Button) v).append("_clicked");
+    }
+
+    static class OnButtonLongClick implements OnLongClickListener {
+        @Override
+        public boolean onLongClick(View v) {
+            ((Button) v).append("_long_clicked");
+            return true;
+        }
+    }
+}
diff --git a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/IsEnabledTestActivity.java b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/IsEnabledTestActivity.java
new file mode 100644
index 0000000..20d1836
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/IsEnabledTestActivity.java
@@ -0,0 +1,32 @@
+/*
+ * 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.test.uiautomator.testapp;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+import androidx.annotation.Nullable;
+
+public class IsEnabledTestActivity extends Activity {
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.is_enabled_test_activity);
+    }
+}
diff --git a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/IsFocusedTestActivity.java b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/IsFocusedTestActivity.java
new file mode 100644
index 0000000..43fe902
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/IsFocusedTestActivity.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.test.uiautomator.testapp;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.widget.Button;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+
+public class IsFocusedTestActivity extends Activity {
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.is_focused_test_activity);
+
+        Button focusedButton = (Button) findViewById(R.id.button);
+        TextView focusedTarget = (TextView) findViewById(R.id.focusable_text_view);
+        focusedButton.setOnClickListener(v -> focusedTarget.requestFocus());
+    }
+}
diff --git a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/IsLongClickableTestActivity.java b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/IsLongClickableTestActivity.java
new file mode 100644
index 0000000..106f563
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/IsLongClickableTestActivity.java
@@ -0,0 +1,32 @@
+/*
+ * 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.test.uiautomator.testapp;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+import androidx.annotation.Nullable;
+
+public class IsLongClickableTestActivity extends Activity {
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.is_long_clickable_test_activity);
+    }
+}
diff --git a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/IsSelectedTestActivity.java b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/IsSelectedTestActivity.java
new file mode 100644
index 0000000..6b61ae6
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/IsSelectedTestActivity.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.test.uiautomator.testapp;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.widget.Button;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+
+public class IsSelectedTestActivity extends Activity {
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.is_selected_test_activity);
+
+        Button selectedButton = (Button) findViewById(R.id.selected_button);
+        TextView selectedTarget = (TextView) findViewById(R.id.selected_target);
+        selectedButton.setOnClickListener(v -> selectedTarget.setSelected(true));
+    }
+}
diff --git a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/LongClickTestActivity.java b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/LongClickTestActivity.java
new file mode 100644
index 0000000..b4b9e84
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/LongClickTestActivity.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.test.uiautomator.testapp;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+public class LongClickTestActivity extends Activity {
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.long_click_test_activity);
+
+        Button button = (Button) findViewById(R.id.button);
+        button.setOnClickListener(this::onButtonLongClick);
+    }
+
+    public void onButtonLongClick(@NonNull View v) {
+        ((Button) v).setText("I've been long clicked!");
+    }
+}
diff --git a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/PinchTestActivity.java b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/PinchTestActivity.java
new file mode 100644
index 0000000..3c30df3
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/PinchTestActivity.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.test.uiautomator.testapp;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.MotionEvent;
+import android.view.ScaleGestureDetector;
+import android.view.ScaleGestureDetector.SimpleOnScaleGestureListener;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+
+public class PinchTestActivity extends Activity {
+
+    private ScaleGestureDetector mScaleDetector;
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.pinch_test_activity);
+
+        final TextView scaleFactor = findViewById(R.id.scale_factor);
+
+        mScaleDetector = new ScaleGestureDetector(this, new SimpleOnScaleGestureListener() {
+            @Override
+            public void onScaleEnd(ScaleGestureDetector detector) {
+                float scale = detector.getScaleFactor();
+                scaleFactor.setText(Float.toString(scale));
+            }
+        });
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent event) {
+        return mScaleDetector.onTouchEvent(event);
+    }
+}
diff --git a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestClearTextActivity.java b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestClearTextActivity.java
deleted file mode 100644
index 6a816ba..0000000
--- a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestClearTextActivity.java
+++ /dev/null
@@ -1,32 +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.test.uiautomator.testapp;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-import androidx.annotation.Nullable;
-
-public class UiObject2TestClearTextActivity extends Activity {
-
-    @Override
-    public void onCreate(@Nullable Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        setContentView(R.layout.uiobject2_testcleartext_activity);
-    }
-}
diff --git a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestClickActivity.java b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestClickActivity.java
deleted file mode 100644
index 35e4738..0000000
--- a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestClickActivity.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.test.uiautomator.testapp;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.View;
-import android.view.View.OnLongClickListener;
-import android.widget.Button;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-public class UiObject2TestClickActivity extends Activity {
-
-    @Override
-    public void onCreate(@Nullable Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        setContentView(R.layout.uiobject2_testclick_activity);
-
-        // Set up the long-clickable buttons.
-        Button button4 = (Button) findViewById(R.id.button4);
-        Button button5 = (Button) findViewById(R.id.button5);
-        Button button6 = (Button) findViewById(R.id.button6);
-        Button button7 = (Button) findViewById(R.id.button7);
-
-        button4.setOnLongClickListener(new OnButtonLongClick());
-        button5.setOnLongClickListener(new OnButtonLongClick());
-        button6.setOnLongClickListener(new OnButtonLongClick());
-        button7.setOnLongClickListener(new OnButtonLongClick());
-    }
-
-    public void onButtonClick(@NonNull View v) {
-        ((Button) v).append("_clicked");
-    }
-
-    static class OnButtonLongClick implements OnLongClickListener {
-        @Override
-        public boolean onLongClick(View v) {
-            ((Button) v).append("_long_clicked");
-            return true;
-        }
-    }
-}
diff --git a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestClickAndWaitActivity.java b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestClickAndWaitActivity.java
deleted file mode 100644
index 96a6adb..0000000
--- a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestClickAndWaitActivity.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.test.uiautomator.testapp;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.Handler;
-import android.view.View;
-import android.widget.Button;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-public class UiObject2TestClickAndWaitActivity extends Activity {
-
-    @Override
-    public void onCreate(@Nullable Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        setContentView(R.layout.uiobject2_testclickandwait_activity);
-    }
-
-    public void launchNewWindow(@NonNull View v) {
-        ((Button) v).append("_clicked");
-        new Handler().postDelayed(() -> {
-            Intent intent = new Intent(getApplicationContext(),
-                    UiObject2TestClickAndWaitActivity.class);
-            startActivity(intent);
-        }, 2_000);
-    }
-}
diff --git a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestGetClassNameActivity.java b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestGetClassNameActivity.java
deleted file mode 100644
index 6777abc..0000000
--- a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestGetClassNameActivity.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.test.uiautomator.testapp;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-import androidx.annotation.Nullable;
-
-public class UiObject2TestGetClassNameActivity extends Activity {
-
-    @Override
-    public void onCreate(@Nullable Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        // Reuse layout from BySelectorTestClazz
-        setContentView(R.layout.byselector_testclazz_activity);
-    }
-}
diff --git a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestIsEnabledActivity.java b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestIsEnabledActivity.java
deleted file mode 100644
index e5059b2..0000000
--- a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestIsEnabledActivity.java
+++ /dev/null
@@ -1,32 +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.test.uiautomator.testapp;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-import androidx.annotation.Nullable;
-
-public class UiObject2TestIsEnabledActivity extends Activity {
-
-    @Override
-    public void onCreate(@Nullable Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        setContentView(R.layout.uiobject2_testisenabled_activity);
-    }
-}
diff --git a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestIsFocusedActivity.java b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestIsFocusedActivity.java
deleted file mode 100644
index a2bbb18..0000000
--- a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestIsFocusedActivity.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.test.uiautomator.testapp;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.widget.Button;
-import android.widget.TextView;
-
-import androidx.annotation.Nullable;
-
-public class UiObject2TestIsFocusedActivity extends Activity {
-
-    @Override
-    public void onCreate(@Nullable Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        setContentView(R.layout.uiobject2_testisfocused_activity);
-
-        Button focusedButton = (Button) findViewById(R.id.button);
-        TextView focusedTarget = (TextView) findViewById(R.id.focusable_text_view);
-        focusedButton.setOnClickListener(v -> focusedTarget.requestFocus());
-    }
-}
diff --git a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestIsLongClickableActivity.java b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestIsLongClickableActivity.java
deleted file mode 100644
index 6684417..0000000
--- a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestIsLongClickableActivity.java
+++ /dev/null
@@ -1,32 +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.test.uiautomator.testapp;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-import androidx.annotation.Nullable;
-
-public class UiObject2TestIsLongClickableActivity extends Activity {
-
-    @Override
-    public void onCreate(@Nullable Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        setContentView(R.layout.uiobject2_testislongclickable_activity);
-    }
-}
diff --git a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestIsSelectedActivity.java b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestIsSelectedActivity.java
deleted file mode 100644
index fc468af..0000000
--- a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestIsSelectedActivity.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.test.uiautomator.testapp;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.widget.Button;
-import android.widget.TextView;
-
-import androidx.annotation.Nullable;
-
-public class UiObject2TestIsSelectedActivity extends Activity {
-
-    @Override
-    public void onCreate(@Nullable Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        setContentView(R.layout.uiobject2_testisselected_activity);
-
-        Button selectedButton = (Button) findViewById(R.id.selected_button);
-        TextView selectedTarget = (TextView) findViewById(R.id.selected_target);
-        selectedButton.setOnClickListener(v -> selectedTarget.setSelected(true));
-    }
-}
diff --git a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestLongClickActivity.java b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestLongClickActivity.java
deleted file mode 100644
index 30d3627..0000000
--- a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestLongClickActivity.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.test.uiautomator.testapp;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.View;
-import android.widget.Button;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-public class UiObject2TestLongClickActivity extends Activity {
-
-    @Override
-    public void onCreate(@Nullable Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        setContentView(R.layout.uiobject2_testlongclick_activity);
-
-        Button button = (Button)findViewById(R.id.button);
-        button.setOnClickListener(this::onButtonLongClick);
-    }
-
-    public void onButtonLongClick(@NonNull View v) {
-        ((Button)v).setText("I've been long clicked!");
-    }
-}
diff --git a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestPinchActivity.java b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestPinchActivity.java
deleted file mode 100644
index d205048..0000000
--- a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestPinchActivity.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.test.uiautomator.testapp;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.MotionEvent;
-import android.view.ScaleGestureDetector;
-import android.view.ScaleGestureDetector.SimpleOnScaleGestureListener;
-import android.widget.TextView;
-
-import androidx.annotation.Nullable;
-
-public class UiObject2TestPinchActivity extends Activity {
-
-    private ScaleGestureDetector mScaleDetector;
-
-    @Override
-    public void onCreate(@Nullable Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        setContentView(R.layout.uiobject2_testpinch_activity);
-
-        final TextView scaleFactor = (TextView)findViewById(R.id.scale_factor);
-
-        mScaleDetector = new ScaleGestureDetector(this, new SimpleOnScaleGestureListener() {
-            @Override
-            public boolean onScaleBegin(ScaleGestureDetector detector) {
-                float scale = detector.getScaleFactor();
-                Log.d("FOO", String.format("Beginning scale: %s", scale));
-                float span = detector.getCurrentSpan();
-                Log.d("FOO", String.format("Beginning span: %s", span));
-                Log.d("FOO", String.format("Beginning span, X: %s, Y:%s", detector.getCurrentSpanX(), detector.getCurrentSpanY()));
-                Log.d("FOO", String.format("Beginning focus: %s, %s", detector.getFocusX(), detector.getFocusY()));
-                return true;
-
-            }
-
-            @Override
-            public void onScaleEnd(ScaleGestureDetector detector) {
-                float scale = detector.getScaleFactor();
-                Log.d("FOO", String.format("Ending scale: %s", scale));
-                float span = detector.getCurrentSpan();
-                Log.d("FOO", String.format("Ending span: %s", span));
-                Log.d("FOO", String.format("Ending span, X: %s, Y:%s", detector.getCurrentSpanX(), detector.getCurrentSpanY()));
-                Log.d("FOO", String.format("Ending focus: %s, %s", detector.getFocusX(), detector.getFocusY()));
-                scaleFactor.setText(Float.toString(scale));
-            }
-        });
-    }
-
-    @Override
-    public boolean onTouchEvent(MotionEvent event) {
-        return mScaleDetector.onTouchEvent(event);
-    }
-}
diff --git a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestVerticalScrollActivity.java b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestVerticalScrollActivity.java
deleted file mode 100644
index a28f5b6..0000000
--- a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestVerticalScrollActivity.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.test.uiautomator.testapp;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.GestureDetector;
-import android.view.GestureDetector.SimpleOnGestureListener;
-import android.view.MotionEvent;
-
-import androidx.annotation.Nullable;
-
-public class UiObject2TestVerticalScrollActivity extends Activity {
-
-    private GestureDetector mGestureDetector;
-
-    @Override
-    public void onCreate(@Nullable Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        setContentView(R.layout.uiobject2_testverticalscroll_activity);
-
-        mGestureDetector = new GestureDetector(this, new SimpleOnGestureListener() {
-            @Override
-            public boolean onDown(MotionEvent event) {
-                return true;
-            }
-        });
-    }
-
-    @Override
-    public boolean onTouchEvent(MotionEvent event) {
-        return mGestureDetector.onTouchEvent(event);
-    }
-}
diff --git a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/VerticalScrollTestActivity.java b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/VerticalScrollTestActivity.java
new file mode 100644
index 0000000..8f39574
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/VerticalScrollTestActivity.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.test.uiautomator.testapp;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.GestureDetector;
+import android.view.GestureDetector.SimpleOnGestureListener;
+import android.view.MotionEvent;
+
+import androidx.annotation.Nullable;
+
+public class VerticalScrollTestActivity extends Activity {
+
+    private GestureDetector mGestureDetector;
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.vertical_scroll_test_activity);
+
+        mGestureDetector = new GestureDetector(this, new SimpleOnGestureListener() {
+            @Override
+            public boolean onDown(MotionEvent event) {
+                return true;
+            }
+        });
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent event) {
+        return mGestureDetector.onTouchEvent(event);
+    }
+}
diff --git a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/VisibleBoundsTestActivity.java b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/VisibleBoundsTestActivity.java
new file mode 100644
index 0000000..4b40426
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/VisibleBoundsTestActivity.java
@@ -0,0 +1,63 @@
+/*
+ * 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.test.uiautomator.testapp;
+
+import android.app.Activity;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+
+public class VisibleBoundsTestActivity extends Activity {
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.visible_bounds_test_activity);
+
+        TextView partlyInvisibleRegion = findViewById(R.id.partly_invisible_region);
+        TextView regionInsideScrollable = findViewById(R.id.region_inside_scrollable);
+
+        partlyInvisibleRegion.setOnClickListener(new OnRegionClick());
+        partlyInvisibleRegion.setOnLongClickListener(new OnRegionLongClick());
+        regionInsideScrollable.setOnClickListener(new OnRegionClick());
+    }
+
+    static class OnRegionClick implements View.OnClickListener {
+        @Override
+        public void onClick(View view) {
+            Rect visibleRegion = new Rect();
+            view.getGlobalVisibleRect(visibleRegion);
+            ((TextView) view).setText(visibleRegion.toString());
+        }
+    }
+
+    static class OnRegionLongClick implements View.OnLongClickListener {
+        @Override
+        public boolean onLongClick(View view) {
+            Rect visibleRegion = new Rect();
+            view.getGlobalVisibleRect(visibleRegion);
+            Point visibleRegionCenter = new Point(visibleRegion.centerX(), visibleRegion.centerY());
+            ((TextView) view).setText(visibleRegionCenter.toString());
+            return true;
+        }
+    }
+}
diff --git a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/WaitTestActivity.java b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/WaitTestActivity.java
new file mode 100644
index 0000000..ec6f962
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/WaitTestActivity.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.test.uiautomator.testapp;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.Handler;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+
+public class WaitTestActivity extends Activity {
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.wait_test_activity);
+
+        TextView text1 = findViewById(R.id.text_1);
+
+        text1.setOnClickListener(view -> {
+            // Unlike in `UiObject2`, the {@link UiObject#click()} will block the process until
+            // either accessibility event `TYPE_WINDOW_CONTENT_CHANGED` or `TYPE_VIEW_SELECTED`
+            // is received (as in {@link InteractionController#clickAndSync(final int x, final
+            // int y, long timeout)}).
+            // So we have to change the text right after the click to initialize a
+            // `TYPE_WINDOW_CONTENT_CHANGED` event.
+            // Otherwise, the click action will only block everything until the delayed text change
+            // (as the `postDelayed()` method doing), which invalidates this testing mechanism.
+            ((TextView) view).setText("text_1_clicked");
+            new Handler().postDelayed(() -> ((TextView) view).setText("text_1_changed"),
+                    3_000);
+        });
+    }
+}
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/clear_text_test_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/clear_text_test_activity.xml
new file mode 100644
index 0000000..e581c09
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/main/res/layout/clear_text_test_activity.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.
+  -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    tools:context=".ClearTextTestActivity">
+
+    <EditText
+        android:id="@+id/edit_text"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:inputType="text"
+        android:text="sample_text" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/click_and_wait_test_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/click_and_wait_test_activity.xml
new file mode 100644
index 0000000..d7cf9da
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/main/res/layout/click_and_wait_test_activity.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ * 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.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    tools:context=".ClickAndWaitTestActivity">
+
+    <Button
+        android:id="@+id/new_window_button"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:onClick="launchNewWindow"
+        android:text="new_window_button" />
+
+</LinearLayout>
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/click_on_position_test_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/click_on_position_test_activity.xml
new file mode 100644
index 0000000..3dbe9ab
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/main/res/layout/click_on_position_test_activity.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ * 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.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    tools:context=".SwipeTestActivity">
+
+    <TextView
+        android:id="@+id/click_region"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_margin="30dp"
+        android:background="@android:color/white"
+        android:gravity="center"
+        android:text="click_region" />
+
+</LinearLayout>
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/click_test_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/click_test_activity.xml
new file mode 100644
index 0000000..48fa666
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/main/res/layout/click_test_activity.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    tools:context=".ClickTestActivity">
+
+    <!-- For `testClick()` in both `UiObjectTest` and `UiObject2Test`. -->
+    <Button
+        android:id="@+id/button1"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:onClick="onButtonClick"
+        android:text="text1" />
+
+    <!-- For `testClickOnPoint()`. -->
+    <Button
+        android:id="@+id/button2"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:onClick="onButtonClick"
+        android:text="text2" />
+
+    <!-- For `testClickOnPoint()`. -->
+    <Button
+        android:id="@+id/button3"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:onClick="onButtonClick"
+        android:text="text3" />
+
+    <!-- For `testClickForDuration()`. -->
+    <Button
+        android:id="@+id/button4"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:longClickable="true"
+        android:onClick="onButtonClick"
+        android:text="text4" />
+
+    <!-- For `testClickForDuration()`. -->
+    <Button
+        android:id="@+id/button5"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:longClickable="true"
+        android:onClick="onButtonClick"
+        android:text="text5" />
+
+    <!-- For `testClickOnPointForDuration()`. -->
+    <Button
+        android:id="@+id/button6"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:longClickable="true"
+        android:onClick="onButtonClick"
+        android:text="text6" />
+
+    <!-- For `testClickOnPointForDuration()`. -->
+    <Button
+        android:id="@+id/button7"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:longClickable="true"
+        android:onClick="onButtonClick"
+        android:text="text7" />
+
+    <!-- For `testIsCheckable()`. -->
+    <CheckBox
+        android:id="@+id/check_box"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="check_box"
+        android:checked="false" />
+
+</LinearLayout>
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/is_enabled_test_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/is_enabled_test_activity.xml
new file mode 100644
index 0000000..8cdf0e5
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/main/res/layout/is_enabled_test_activity.xml
@@ -0,0 +1,38 @@
+<?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:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    tools:context=".IsEnabledTestActivity">
+
+    <TextView
+        android:id="@+id/disabled_text_view"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:enabled="false"
+        android:text="Disabled Text View" />
+
+    <TextView
+        android:id="@+id/enabled_text_view"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:enabled="true"
+        android:text="Enabled Text View" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/is_focused_test_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/is_focused_test_activity.xml
new file mode 100644
index 0000000..c6afd72
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/main/res/layout/is_focused_test_activity.xml
@@ -0,0 +1,48 @@
+<?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:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:focusable="true"
+    android:focusableInTouchMode="true"
+    android:orientation="vertical"
+    tools:context=".IsFocusedTestActivity">
+
+    <Button
+        android:id="@+id/button"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="button" />
+
+    <TextView
+        android:id="@+id/focusable_text_view"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:focusable="true"
+        android:focusableInTouchMode="true"
+        android:text="focusable_text_view" />
+
+    <TextView
+        android:id="@+id/non_focusable_text_view"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:focusable="false"
+        android:focusableInTouchMode="false"
+        android:text="non_focusable_text_view" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/is_long_clickable_test_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/is_long_clickable_test_activity.xml
new file mode 100644
index 0000000..d345ebb
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/main/res/layout/is_long_clickable_test_activity.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    tools:context=".IsLongClickableTestActivity">
+
+    <Button
+        android:id="@+id/long_clickable_button"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:longClickable="true"
+        android:text="long_clickable_button" />
+
+    <Button
+        android:id="@+id/non_long_clickable_button"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="non_long_clickable_button" />
+
+</LinearLayout>
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/is_selected_test_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/is_selected_test_activity.xml
new file mode 100644
index 0000000..49030dd
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/main/res/layout/is_selected_test_activity.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.
+  -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    tools:context=".IsSelectedTestActivity">
+
+    <Button
+        android:id="@+id/selected_button"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="selected_button" />
+
+    <TextView
+        android:id="@+id/selected_target"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="selected_target" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/long_click_test_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/long_click_test_activity.xml
new file mode 100644
index 0000000..f404d32
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/main/res/layout/long_click_test_activity.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    tools:context=".LongClickTestActivity">
+
+    <Button
+        android:id="@+id/button"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="Long Click Me!" />
+
+</LinearLayout>
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/main_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/main_activity.xml
index 5ef2fc7..239def8 100644
--- a/test/uiautomator/integration-tests/testapp/src/main/res/layout/main_activity.xml
+++ b/test/uiautomator/integration-tests/testapp/src/main/res/layout/main_activity.xml
@@ -64,7 +64,7 @@
     <ListView
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:entries="@array/list_view_entries"></ListView>
+        android:entries="@array/list_view_entries" />
 
     <TextView
         android:layout_width="wrap_content"
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/pinch_test_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/pinch_test_activity.xml
new file mode 100644
index 0000000..f952013
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/main/res/layout/pinch_test_activity.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    tools:context=".PinchTestActivity">
+
+    <LinearLayout
+        android:id="@+id/pinch_area"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:layout_margin="30dp"
+        android:background="@android:color/white">
+
+        <TextView
+            android:id="@+id/scale_factor"
+            android:layout_width="27mm"
+            android:layout_height="wrap_content"
+            android:background="@android:color/black"
+            android:text="1.0f"
+            android:textColor="@android:color/white" />
+
+        <TextView
+            android:id="@+id/small_area"
+            android:layout_width="1dp"
+            android:layout_height="1dp"
+            android:text="small area" />
+
+    </LinearLayout>
+
+</LinearLayout>
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/swipe_test_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/swipe_test_activity.xml
index c9936e2..460e451 100644
--- a/test/uiautomator/integration-tests/testapp/src/main/res/layout/swipe_test_activity.xml
+++ b/test/uiautomator/integration-tests/testapp/src/main/res/layout/swipe_test_activity.xml
@@ -21,6 +21,12 @@
     tools:context=".SwipeTestActivity">
 
     <TextView
+        android:id="@+id/very_small_region"
+        android:layout_width="1dp"
+        android:layout_height="1dp"
+        android:text="very_small_region" />
+
+    <TextView
         android:id="@+id/swipe_region"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testcleartext_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testcleartext_activity.xml
deleted file mode 100644
index 49df9a2..0000000
--- a/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testcleartext_activity.xml
+++ /dev/null
@@ -1,31 +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"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical"
-    tools:context=".UiObject2TestClearTextActivity">
-
-    <EditText
-        android:id="@+id/edit_text"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:inputType="text"
-        android:text="sample_text" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testclick_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testclick_activity.xml
deleted file mode 100644
index 54a4ccd..0000000
--- a/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testclick_activity.xml
+++ /dev/null
@@ -1,91 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical"
-    tools:context=".UiObject2TestClickActivity">
-
-    <!-- For `testClick()`. -->
-    <Button
-        android:id="@+id/button1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:onClick="onButtonClick"
-        android:text="text1" />
-
-    <!-- For `testClickOnPoint()`. -->
-    <Button
-        android:id="@+id/button2"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:onClick="onButtonClick"
-        android:text="text2" />
-
-    <!-- For `testClickOnPoint()`. -->
-    <Button
-        android:id="@+id/button3"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:onClick="onButtonClick"
-        android:text="text3" />
-
-    <!-- For `testClickForDuration()`. -->
-    <Button
-        android:id="@+id/button4"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:longClickable="true"
-        android:onClick="onButtonClick"
-        android:text="text4" />
-
-    <!-- For `testClickForDuration()`. -->
-    <Button
-        android:id="@+id/button5"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:longClickable="true"
-        android:onClick="onButtonClick"
-        android:text="text5" />
-
-    <!-- For `testClickOnPointForDuration()`. -->
-    <Button
-        android:id="@+id/button6"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:longClickable="true"
-        android:onClick="onButtonClick"
-        android:text="text6" />
-
-    <!-- For `testClickOnPointForDuration()`. -->
-    <Button
-        android:id="@+id/button7"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:longClickable="true"
-        android:onClick="onButtonClick"
-        android:text="text7" />
-
-    <!-- For `testIsCheckable()`. -->
-    <CheckBox
-        android:id="@+id/check_box"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="check_box"
-        android:checked="false" />
-
-</LinearLayout>
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testclickandwait_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testclickandwait_activity.xml
deleted file mode 100644
index 36150b9..0000000
--- a/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testclickandwait_activity.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical"
-    tools:context=".UiObject2TestClickAndWaitActivity">
-
-    <Button
-        android:id="@+id/new_window_button"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:onClick="launchNewWindow"
-        android:text="new_window_button" />
-
-</LinearLayout>
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testisenabled_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testisenabled_activity.xml
deleted file mode 100644
index 4db7bac..0000000
--- a/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testisenabled_activity.xml
+++ /dev/null
@@ -1,38 +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"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical"
-    tools:context=".UiObject2TestIsEnabledActivity">
-
-    <TextView
-        android:id="@+id/disabled_text_view"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:enabled="false"
-        android:text="Disabled Text View" />
-
-    <TextView
-        android:id="@+id/enabled_text_view"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:enabled="true"
-        android:text="Enabled Text View" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testisfocused_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testisfocused_activity.xml
deleted file mode 100644
index 5fd9105..0000000
--- a/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testisfocused_activity.xml
+++ /dev/null
@@ -1,48 +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"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:focusable="true"
-    android:focusableInTouchMode="true"
-    android:orientation="vertical"
-    tools:context=".UiObject2TestIsFocusedActivity">
-
-    <Button
-        android:id="@+id/button"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="button" />
-
-    <TextView
-        android:id="@+id/focusable_text_view"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:focusable="true"
-        android:focusableInTouchMode="true"
-        android:text="focusable_text_view" />
-
-    <TextView
-        android:id="@+id/non_focusable_text_view"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:focusable="false"
-        android:focusableInTouchMode="false"
-        android:text="non_focusable_text_view" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testislongclickable_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testislongclickable_activity.xml
deleted file mode 100644
index 99cd6e7..0000000
--- a/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testislongclickable_activity.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical"
-    tools:context=".UiObject2TestIsLongClickableActivity">
-
-    <Button
-        android:id="@+id/long_clickable_button"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:longClickable="true"
-        android:text="long_clickable_button" />
-
-    <Button
-        android:id="@+id/non_long_clickable_button"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="non_long_clickable_button" />
-
-</LinearLayout>
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testisselected_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testisselected_activity.xml
deleted file mode 100644
index 67ba8b4..0000000
--- a/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testisselected_activity.xml
+++ /dev/null
@@ -1,36 +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"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical"
-    tools:context=".UiObject2TestIsSelectedActivity">
-
-    <Button
-        android:id="@+id/selected_button"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="selected_button" />
-
-    <TextView
-        android:id="@+id/selected_target"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="selected_target" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testlongclick_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testlongclick_activity.xml
deleted file mode 100644
index 0e77eb2..0000000
--- a/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testlongclick_activity.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical"
-    tools:context=".UiObject2TestLongClickActivity">
-
-    <Button
-        android:id="@+id/button"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="Long Click Me!" />
-
-</LinearLayout>
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testpinch_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testpinch_activity.xml
deleted file mode 100644
index 5f1ecbd..0000000
--- a/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testpinch_activity.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical"
-    tools:context=".UiObject2TestPinchActivity">
-
-    <LinearLayout
-        android:id="@+id/pinch_area"
-        android:layout_width="fill_parent"
-        android:layout_height="fill_parent"
-        android:layout_margin="30dp"
-        android:background="@android:color/white">
-
-        <TextView
-            android:id="@+id/scale_factor"
-            android:layout_width="27mm"
-            android:layout_height="wrap_content"
-            android:background="@android:color/black"
-            android:text="1.0f"
-            android:textColor="@android:color/white" />
-
-    </LinearLayout>
-
-</LinearLayout>
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testverticalscroll_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testverticalscroll_activity.xml
deleted file mode 100644
index 2af186a..0000000
--- a/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testverticalscroll_activity.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical"
-    tools:context=".UiObject2TestVerticalScrollActivity">
-
-    <ScrollView
-        android:id="@+id/scroll_view"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content">
-
-        <RelativeLayout
-            android:layout_width="fill_parent"
-            android:layout_height="20000px">
-
-            <TextView
-                android:id="@+id/top_text"
-                android:layout_width="wrap_content"
-                android:layout_height="50px"
-                android:layout_alignParentTop="true"
-                android:text="This is the top" />
-
-            <TextView
-                android:id="@+id/from_top_5000"
-                android:layout_width="wrap_content"
-                android:layout_height="50px"
-                android:layout_alignParentTop="true"
-                android:layout_marginTop="5000px"
-                android:text="This is 5000px from the top" />
-
-            <TextView
-                android:id="@+id/from_top_10000"
-                android:layout_width="wrap_content"
-                android:layout_height="50px"
-                android:layout_alignParentTop="true"
-                android:layout_marginTop="10000px"
-                android:text="This is 10000px from the top" />
-
-            <TextView
-                android:id="@+id/from_top_15000"
-                android:layout_width="wrap_content"
-                android:layout_height="50px"
-                android:layout_alignParentTop="true"
-                android:layout_marginTop="15000px"
-                android:text="This is 15000px from the top" />
-
-            <TextView
-                android:id="@+id/bottom_text"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_alignParentBottom="true"
-                android:text="This is the bottom" />
-
-        </RelativeLayout>
-
-    </ScrollView>
-
-</LinearLayout>
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/vertical_scroll_test_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/vertical_scroll_test_activity.xml
new file mode 100644
index 0000000..2708e14
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/main/res/layout/vertical_scroll_test_activity.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    tools:context=".VerticalScrollTestActivity">
+
+    <ScrollView
+        android:id="@+id/scroll_view"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content">
+
+        <RelativeLayout
+            android:layout_width="fill_parent"
+            android:layout_height="20000px">
+
+            <TextView
+                android:id="@+id/top_text"
+                android:layout_width="wrap_content"
+                android:layout_height="50px"
+                android:layout_alignParentTop="true"
+                android:text="This is the top" />
+
+            <TextView
+                android:id="@+id/from_top_5000"
+                android:layout_width="wrap_content"
+                android:layout_height="50px"
+                android:layout_alignParentTop="true"
+                android:layout_marginTop="5000px"
+                android:text="This is 5000px from the top" />
+
+            <TextView
+                android:id="@+id/from_top_10000"
+                android:layout_width="wrap_content"
+                android:layout_height="50px"
+                android:layout_alignParentTop="true"
+                android:layout_marginTop="10000px"
+                android:text="This is 10000px from the top" />
+
+            <TextView
+                android:id="@+id/from_top_15000"
+                android:layout_width="wrap_content"
+                android:layout_height="50px"
+                android:layout_alignParentTop="true"
+                android:layout_marginTop="15000px"
+                android:text="This is 15000px from the top" />
+
+            <TextView
+                android:id="@+id/bottom_text"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignParentBottom="true"
+                android:text="This is the bottom" />
+
+        </RelativeLayout>
+
+    </ScrollView>
+
+</LinearLayout>
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/visible_bounds_test_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/visible_bounds_test_activity.xml
new file mode 100644
index 0000000..c799d26
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/main/res/layout/visible_bounds_test_activity.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ * 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.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    tools:context=".VisibleBoundsTestActivity">
+
+    <TextView
+        android:id="@+id/partly_invisible_region"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:layout_marginTop="30dp"
+        android:layout_marginBottom="30dp"
+        android:layout_marginLeft="-30dp"
+        android:layout_marginRight="30dp"
+        android:background="@android:color/white"
+        android:gravity="center"
+        android:text="partly_invisible_region" />
+
+    <ScrollView
+        android:id="@+id/scroll_view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_weight="1">
+
+        <RelativeLayout
+            android:layout_width="match_parent"
+            android:layout_height="20000px">
+
+            <TextView
+                android:id="@+id/region_inside_scrollable"
+                android:layout_width="match_parent"
+                android:layout_height="20000px"
+                android:background="@android:color/white"
+                android:text="region_inside_scrollable" />
+
+        </RelativeLayout>
+
+    </ScrollView>
+
+</LinearLayout>
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/wait_test_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/wait_test_activity.xml
new file mode 100644
index 0000000..530760e
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/main/res/layout/wait_test_activity.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ * 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.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    tools:context=".WaitTestActivity">
+
+    <LinearLayout
+        android:id="@+id/wait_layout"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/text_1"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:clickable="true"
+            android:text="text_1_not_changed" />
+
+    </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/test/uiautomator/uiautomator/lint-baseline.xml b/test/uiautomator/uiautomator/lint-baseline.xml
index db1f99c..89c3bf6 100644
--- a/test/uiautomator/uiautomator/lint-baseline.xml
+++ b/test/uiautomator/uiautomator/lint-baseline.xml
@@ -2,33 +2,6 @@
 <issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
 
     <issue
-        id="NewApi"
-        message="Call requires API level 21 (current min is 18): `android.view.accessibility.AccessibilityNodeInfo#getWindow`"
-        errorLine1="            if (node.getWindow() != null) {"
-        errorLine2="                     ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/test/uiautomator/AccessibilityNodeInfoHelper.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 21 (current min is 18): `android.view.accessibility.AccessibilityNodeInfo#getWindow`"
-        errorLine1="              node.getWindow().getBoundsInScreen(window);"
-        errorLine2="                   ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/test/uiautomator/AccessibilityNodeInfoHelper.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 21 (current min is 18): `android.view.accessibility.AccessibilityWindowInfo#getBoundsInScreen`"
-        errorLine1="              node.getWindow().getBoundsInScreen(window);"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/test/uiautomator/AccessibilityNodeInfoHelper.java"/>
-    </issue>
-
-    <issue
         id="BanUncheckedReflection"
         message="Calling `Method.invoke` without an SDK check"
         errorLine1="                    sMotionEvent_setDisplayId.invoke(ev, displayId);"
@@ -38,33 +11,6 @@
     </issue>
 
     <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 21; however, the containing class androidx.test.uiautomator.AccessibilityNodeInfoHelper is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            if (node.getWindow() != null) {"
-        errorLine2="                     ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/test/uiautomator/AccessibilityNodeInfoHelper.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 21; however, the containing class androidx.test.uiautomator.AccessibilityNodeInfoHelper is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="              node.getWindow().getBoundsInScreen(window);"
-        errorLine2="                   ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/test/uiautomator/AccessibilityNodeInfoHelper.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 21; however, the containing class androidx.test.uiautomator.AccessibilityNodeInfoHelper is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="              node.getWindow().getBoundsInScreen(window);"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/test/uiautomator/AccessibilityNodeInfoHelper.java"/>
-    </issue>
-
-    <issue
         id="PrivateConstructorForUtilityClass"
         message="Utility class is missing private constructor"
         errorLine1="public class Until {"
diff --git a/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/AccessibilityNodeInfoHelper.java b/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/AccessibilityNodeInfoHelper.java
index 6729da0..7f8f775 100644
--- a/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/AccessibilityNodeInfoHelper.java
+++ b/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/AccessibilityNodeInfoHelper.java
@@ -19,6 +19,10 @@
 import android.graphics.Rect;
 import android.os.Build;
 import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.accessibility.AccessibilityWindowInfo;
+
+import androidx.annotation.DoNotInline;
+import androidx.annotation.RequiresApi;
 
 /**
  * This class contains static helper methods to work with
@@ -54,15 +58,33 @@
         nodeRect.intersect(displayRect);
 
         // On platforms that give us access to the node's window
-        if (UiDevice.API_LEVEL_ACTUAL >= Build.VERSION_CODES.LOLLIPOP) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
             // Trim any portion of the bounds that are outside the window
-            Rect window = new Rect();
-            if (node.getWindow() != null) {
-              node.getWindow().getBoundsInScreen(window);
-              nodeRect.intersect(window);
+            Rect bounds = new Rect();
+            AccessibilityWindowInfo window = Api21Impl.getWindow(node);
+            if (window != null) {
+                Api21Impl.getBoundsInScreen(window, bounds);
+                nodeRect.intersect(bounds);
             }
         }
 
         return nodeRect;
     }
+
+    @RequiresApi(21)
+    static class Api21Impl {
+        private Api21Impl() {
+        }
+
+        @DoNotInline
+        static void getBoundsInScreen(AccessibilityWindowInfo accessibilityWindowInfo,
+                Rect outBounds) {
+            accessibilityWindowInfo.getBoundsInScreen(outBounds);
+        }
+
+        @DoNotInline
+        static AccessibilityWindowInfo getWindow(AccessibilityNodeInfo accessibilityNodeInfo) {
+            return accessibilityNodeInfo.getWindow();
+        }
+    }
 }
diff --git a/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/Gestures.java b/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/Gestures.java
index 1b0fc66..8addb3a 100644
--- a/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/Gestures.java
+++ b/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/Gestures.java
@@ -21,9 +21,6 @@
 import android.graphics.Rect;
 import android.view.ViewConfiguration;
 
-import java.util.HashMap;
-import java.util.Map;
-
 /**
  * The {@link Gestures} class provides factory methods for constructing common
  * {@link PointerGesture}s.
@@ -49,10 +46,8 @@
     /** Returns the {@link Gestures} instance for the given {@link Context}. */
     public static Gestures getInstance(UiDevice device) {
         if (sInstance == null) {
-            Context context = device.getInstrumentation().getContext();
-            sInstance = new Gestures(ViewConfiguration.get(context));
+            sInstance = new Gestures(ViewConfiguration.get(device.getUiContext()));
         }
-
         return sInstance;
     }
 
diff --git a/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/InteractionController.java b/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/InteractionController.java
index 6883eb3..f4d2ecb 100644
--- a/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/InteractionController.java
+++ b/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/InteractionController.java
@@ -659,8 +659,7 @@
      */
     public boolean wakeDevice() throws RemoteException {
         if(!isScreenOn()) {
-            boolean supportsWakeButton = 
-                UiDevice.API_LEVEL_ACTUAL >= Build.VERSION_CODES.KITKAT_WATCH;
+            boolean supportsWakeButton = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH;
             sendKey(supportsWakeButton ? KeyEvent.KEYCODE_WAKEUP : KeyEvent.KEYCODE_POWER, 0);
             return true;
         }
@@ -676,8 +675,7 @@
      */
     public boolean sleepDevice() throws RemoteException {
         if(isScreenOn()) {
-            boolean supportsSleepButton = 
-                UiDevice.API_LEVEL_ACTUAL >= Build.VERSION_CODES.KITKAT_WATCH;
+            boolean supportsSleepButton = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH;
             sendKey(supportsSleepButton ? KeyEvent.KEYCODE_SLEEP : KeyEvent.KEYCODE_POWER, 0);
             return true;
         }
diff --git a/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/UiDevice.java b/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/UiDevice.java
index 3a9700e..5f43d03 100644
--- a/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/UiDevice.java
+++ b/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/UiDevice.java
@@ -21,11 +21,13 @@
 import android.app.Service;
 import android.app.UiAutomation;
 import android.app.UiAutomation.AccessibilityEventFilter;
+import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.graphics.Bitmap;
 import android.graphics.Point;
+import android.hardware.display.DisplayManager;
 import android.os.Build;
 import android.os.ParcelFileDescriptor;
 import android.os.RemoteException;
@@ -82,6 +84,7 @@
     private Instrumentation mInstrumentation;
     private QueryController mQueryController;
     private InteractionController mInteractionController;
+    private DisplayManager mDisplayManager;
 
     // Singleton instance
     private static UiDevice sInstance;
@@ -89,17 +92,6 @@
     // Get wait functionality from a mixin
     private WaitMixin<UiDevice> mWaitMixin = new WaitMixin<UiDevice>(this);
 
-
-    /**
-     * A forward-looking API Level for development platform builds
-     *
-     * This will be the actual API level on a released platform build, and will be last released
-     * API Level + 1 on development platform build
-     * @hide
-     */
-    static final int API_LEVEL_ACTUAL = Build.VERSION.SDK_INT
-            + ("REL".equals(Build.VERSION.CODENAME) ? 0 : 1);
-
     /**
      * @deprecated Should use {@link UiDevice#UiDevice(Instrumentation)} instead.
      */
@@ -111,9 +103,11 @@
         mInstrumentation = instrumentation;
         mQueryController = new QueryController(instrumentation);
         mInteractionController = new InteractionController(instrumentation);
+        mDisplayManager = (DisplayManager) instrumentation.getContext().getSystemService(
+                Service.DISPLAY_SERVICE);
 
         // Enable multi-window support for API level 21 and up
-        if (UiDevice.API_LEVEL_ACTUAL >= Build.VERSION_CODES.LOLLIPOP) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
             // Subscribe to window information
             AccessibilityServiceInfo info = getUiAutomation().getServiceInfo();
             info.flags |= AccessibilityServiceInfo.FLAG_RETRIEVE_INTERACTIVE_WINDOWS;
@@ -1084,9 +1078,7 @@
     }
 
     private Display getDefaultDisplay() {
-        WindowManager windowManager = (WindowManager)getInstrumentation().getContext()
-                .getSystemService(Service.WINDOW_SERVICE);
-        return windowManager.getDefaultDisplay();
+        return mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY);
     }
 
     private List<AccessibilityWindowInfo> getWindows() {
@@ -1137,6 +1129,14 @@
         return mInstrumentation;
     }
 
+    Context getUiContext() {
+        Context context = mInstrumentation.getContext();
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+            return Api31Impl.createWindowContext(context, getDefaultDisplay());
+        }
+        return context;
+    }
+
     static UiAutomation getUiAutomation(final Instrumentation instrumentation) {
         int flags = Configurator.getInstance().getUiAutomationFlags();
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
@@ -1205,4 +1205,16 @@
             return uiAutomation.getWindowsOnAllDisplays();
         }
     }
+
+    @RequiresApi(31)
+    static class Api31Impl {
+        private Api31Impl() {
+        }
+
+        @DoNotInline
+        static Context createWindowContext(Context context, Display display) {
+            return context.createWindowContext(display,
+                    WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY, null);
+        }
+    }
 }
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 86ca021..22c1a0f 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
@@ -661,8 +661,8 @@
             text = "";
         }
         Tracer.trace(text);
-        if (UiDevice.API_LEVEL_ACTUAL > Build.VERSION_CODES.KITKAT) {
-            // do this for API Level above 19 (exclusive)
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            // ACTION_SET_TEXT is added in API 21.
             AccessibilityNodeInfo node = findAccessibilityNodeInfo(
                     mConfig.getWaitForSelectorTimeout());
             if (node == null) {
@@ -698,7 +698,7 @@
         CharSequence text = node.getText();
         // do nothing if already empty
         if (text != null && text.length() > 0) {
-            if (UiDevice.API_LEVEL_ACTUAL > Build.VERSION_CODES.KITKAT) {
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                 setText("");
             } else {
                 Bundle selectionArgs = new Bundle();
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 2712266..19ede49 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
@@ -668,7 +668,7 @@
      * @return Whether the object can still scroll in the given direction.
      */
     public boolean fling(final Direction direction, final int speed) {
-        ViewConfiguration vc = ViewConfiguration.get(getDevice().getInstrumentation().getContext());
+        ViewConfiguration vc = ViewConfiguration.get(getDevice().getUiContext());
         if (speed < vc.getScaledMinimumFlingVelocity()) {
             throw new IllegalArgumentException("Speed is less than the minimum fling velocity");
         }
@@ -729,8 +729,8 @@
         }
         Log.v(TAG, String.format("setText(text=\"%s\")", text));
 
-        if (UiDevice.API_LEVEL_ACTUAL > Build.VERSION_CODES.KITKAT) {
-            // do this for API Level above 19 (exclusive)
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            // ACTION_SET_TEXT is added in API 21.
             Bundle args = new Bundle();
             args.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, text);
             if (!node.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, args)) {
diff --git a/testutils/testutils-fonts/src/commonMain/resources/font/sample_font.ttf b/testutils/testutils-fonts/src/commonMain/resources/font/sample_font.ttf
index 1bb23ec..6fc6c3e 100644
--- a/testutils/testutils-fonts/src/commonMain/resources/font/sample_font.ttf
+++ b/testutils/testutils-fonts/src/commonMain/resources/font/sample_font.ttf
Binary files differ
diff --git a/testutils/testutils-fonts/src/font_ttx/sample_font.ttx b/testutils/testutils-fonts/src/font_ttx/sample_font.ttx
index 82e0181..bb40268 100644
--- a/testutils/testutils-fonts/src/font_ttx/sample_font.ttx
+++ b/testutils/testutils-fonts/src/font_ttx/sample_font.ttx
@@ -224,6 +224,8 @@
         <map code="0x05E9" name="1em_rtl"/>	<!-- ש Shin -->
         <map code="0x05EA" name="1em_rtl"/>	<!-- ת Tav -->
 
+        <map code="0x2026" name="1em"/> <!-- ELLIPSIS -->
+
         <map code="0x1d11e" name="1em"/><!-- MUSICAL SYMBOL G CLEF -->
         <map code="0x1d11f" name="1em"/><!-- MUSICAL SYMBOL G CLEF OTTAVA ALTA -->
         <map code="0x1f600" name="1em"/><!-- GRINNING FACE -->
diff --git a/text/text/src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt b/text/text/src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt
index e2c9747..53d17d4 100644
--- a/text/text/src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt
+++ b/text/text/src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt
@@ -104,7 +104,7 @@
      * Returns whether fallbackLineSpacing is enabled for the given layout.
      *
      * @param layout StaticLayout instance
-     * @param useFallbackLineSpacing fallbackLineSpacing canfiguration passed while creating the
+     * @param useFallbackLineSpacing fallbackLineSpacing configuration passed while creating the
      * StaticLayout.
      */
     fun isFallbackLineSpacingEnabled(
diff --git a/text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt b/text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt
index a6298b6..0e8900c 100644
--- a/text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt
+++ b/text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt
@@ -19,6 +19,7 @@
 import android.graphics.Paint.FontMetricsInt
 import android.graphics.Path
 import android.graphics.RectF
+import android.os.Trace
 import android.text.BoringLayout
 import android.text.Layout
 import android.text.SpannableString
@@ -56,6 +57,8 @@
 import androidx.compose.ui.text.android.LayoutCompat.TextLayoutAlignment
 import androidx.compose.ui.text.android.style.BaselineShiftSpan
 import androidx.compose.ui.text.android.style.LineHeightStyleSpan
+import androidx.compose.ui.text.android.style.getEllipsizedLeftPadding
+import androidx.compose.ui.text.android.style.getEllipsizedRightPadding
 import kotlin.math.abs
 import kotlin.math.ceil
 import kotlin.math.max
@@ -161,6 +164,24 @@
     internal val bottomPadding: Int
 
     /**
+     * When letter spacing, align and ellipsize applied to text, the ellipsized line is indented
+     * wrong. For example for an LTR text, the last line is indented in a way where the beginning
+     * of the line is less than 0 and the text is cut at the beginning.
+     *
+     * This attribute is used to fix the line left pixel positions accordingly.
+     */
+    private val leftPadding: Float
+
+    /**
+     * When letter spacing, align and ellipsize applied to text, the ellipsized line is indented
+     * wrong. For example for an RTL text, the last line is indented in a way where the beginning
+     * of the line is more than layout width and the text is cut at the beginning.
+     *
+     * This attribute is used to fix the line right pixel positions accordingly.
+     */
+    private val rightPadding: Float
+
+    /**
      * When true the wrapped layout that was created is a BoringLayout.
      */
     private val isBoringLayout: Boolean
@@ -194,47 +215,52 @@
             false
         }
 
-        val boringMetrics = layoutIntrinsics.boringMetrics
+        Trace.beginSection("TextLayout:initLayout")
+        try {
+            val boringMetrics = layoutIntrinsics.boringMetrics
 
-        val widthInt = ceil(width).toInt()
-        layout = if (boringMetrics != null && layoutIntrinsics.maxIntrinsicWidth <= width &&
-            !hasBaselineShiftSpans
-        ) {
-            isBoringLayout = true
-            BoringLayoutFactory.create(
-                text = charSequence,
-                paint = textPaint,
-                width = widthInt,
-                metrics = boringMetrics,
-                alignment = frameworkAlignment,
-                includePadding = includePadding,
-                useFallbackLineSpacing = fallbackLineSpacing,
-                ellipsize = ellipsize,
-                ellipsizedWidth = widthInt
-            )
-        } else {
-            isBoringLayout = false
-            StaticLayoutFactory.create(
-                text = charSequence,
-                start = 0,
-                end = charSequence.length,
-                paint = textPaint,
-                width = widthInt,
-                textDir = frameworkTextDir,
-                alignment = frameworkAlignment,
-                maxLines = maxLines,
-                ellipsize = ellipsize,
-                ellipsizedWidth = ceil(width).toInt(),
-                lineSpacingMultiplier = lineSpacingMultiplier,
-                lineSpacingExtra = lineSpacingExtra,
-                justificationMode = justificationMode,
-                includePadding = includePadding,
-                useFallbackLineSpacing = fallbackLineSpacing,
-                breakStrategy = breakStrategy,
-                hyphenationFrequency = hyphenationFrequency,
-                leftIndents = leftIndents,
-                rightIndents = rightIndents
-            )
+            val widthInt = ceil(width).toInt()
+            layout = if (boringMetrics != null && layoutIntrinsics.maxIntrinsicWidth <= width &&
+                !hasBaselineShiftSpans
+            ) {
+                isBoringLayout = true
+                BoringLayoutFactory.create(
+                    text = charSequence,
+                    paint = textPaint,
+                    width = widthInt,
+                    metrics = boringMetrics,
+                    alignment = frameworkAlignment,
+                    includePadding = includePadding,
+                    useFallbackLineSpacing = fallbackLineSpacing,
+                    ellipsize = ellipsize,
+                    ellipsizedWidth = widthInt
+                )
+            } else {
+                isBoringLayout = false
+                StaticLayoutFactory.create(
+                    text = charSequence,
+                    start = 0,
+                    end = charSequence.length,
+                    paint = textPaint,
+                    width = widthInt,
+                    textDir = frameworkTextDir,
+                    alignment = frameworkAlignment,
+                    maxLines = maxLines,
+                    ellipsize = ellipsize,
+                    ellipsizedWidth = ceil(width).toInt(),
+                    lineSpacingMultiplier = lineSpacingMultiplier,
+                    lineSpacingExtra = lineSpacingExtra,
+                    justificationMode = justificationMode,
+                    includePadding = includePadding,
+                    useFallbackLineSpacing = fallbackLineSpacing,
+                    breakStrategy = breakStrategy,
+                    hyphenationFrequency = hyphenationFrequency,
+                    leftIndents = leftIndents,
+                    rightIndents = rightIndents
+                )
+            }
+        } finally {
+            Trace.endSection()
         }
 
         /* When ellipsis is false:
@@ -284,6 +310,9 @@
         val lastLineMetricsPair = getLastLineMetrics(textPaint, frameworkTextDir, lineHeightSpans)
         lastLineFontMetrics = lastLineMetricsPair.first
         lastLineExtra = lastLineMetricsPair.second
+
+        leftPadding = layout.getEllipsizedLeftPadding(lineCount - 1)
+        rightPadding = layout.getEllipsizedRightPadding(lineCount - 1)
     }
 
     private val layoutHelper by lazy(LazyThreadSafetyMode.NONE) { LayoutHelper(layout) }
@@ -298,12 +327,22 @@
             layout.height
         } + topPadding + bottomPadding + lastLineExtra
 
-    fun getLineLeft(lineIndex: Int): Float = layout.getLineLeft(lineIndex)
+    private fun getHorizontalPadding(line: Int): Float {
+        return if (line == lineCount - 1) {
+            leftPadding + rightPadding
+        } else {
+            0f
+        }
+    }
+
+    fun getLineLeft(lineIndex: Int): Float = layout.getLineLeft(lineIndex) +
+        if (lineIndex == lineCount - 1) leftPadding else 0f
 
     /**
      * Return the horizontal leftmost position of the line in pixels.
      */
-    fun getLineRight(lineIndex: Int): Float = layout.getLineRight(lineIndex)
+    fun getLineRight(lineIndex: Int): Float = layout.getLineRight(lineIndex) +
+        if (lineIndex == lineCount - 1) rightPadding else 0f
 
     /**
      * Return the vertical position of the top of the line in pixels. If the line is equal to the
@@ -404,7 +443,7 @@
             layout.getLineStart(lineIndex) + layout.getEllipsisStart(lineIndex)
         }
 
-    fun isLineEllipsized(lineIndex: Int) = layout.getEllipsisStart(lineIndex) != 0
+    fun isLineEllipsized(lineIndex: Int) = layout.isLineEllipsized(lineIndex)
 
     fun getLineEllipsisOffset(lineIndex: Int): Int = layout.getEllipsisStart(lineIndex)
 
@@ -412,15 +451,85 @@
 
     fun getLineForVertical(vertical: Int): Int = layout.getLineForVertical(topPadding + vertical)
 
-    fun getOffsetForHorizontal(line: Int, horizontal: Float): Int =
-        layout.getOffsetForHorizontal(line, horizontal)
+    fun getOffsetForHorizontal(line: Int, horizontal: Float): Int {
+        return layout.getOffsetForHorizontal(line, horizontal + -1 * getHorizontalPadding(line))
+    }
 
-    fun getPrimaryHorizontal(offset: Int, upstream: Boolean = false): Float =
-        layoutHelper.getHorizontalPosition(offset, usePrimaryDirection = true, upstream = upstream)
+    /**
+     * Returns horizontal position for an offset from the drawing origin of a new character would
+     * be inserted at that offset.
+     *
+     * *primary* means that the inserting character's direction will be resolved to the
+     * *same* direction to the paragraph direction. For example, the insertion position for an LTR
+     * character in an LTR paragraph or RTL character in an RTL paragraph.
+     *
+     * The location that is being queried can also be different based on line breaks. Consider the
+     * following example:
+     *
+     * <pre>
+     *    aa
+     *    bb
+     * <pre/>
+     *
+     *
+     * In the example above, if offset is the end of the first line then it is required to know if
+     * the position to be returned is the end of the first line ("aa") or the beginning of the next
+     * line ("bb").
+     *
+     * When the end of line is needed [upstream] should be set to true; when the beginning of next
+     * line is needed [upstream] should be set to false (therefore it is downstream).
+     *
+     * @param offset offset the character index
+     * @param upstream to return the end of the line for offsets that are at the end
+     * of a line. false returns the beginning of the next line
+     *
+     * @return the horizontal position of an offset from the drawing origin
+     */
+    fun getPrimaryHorizontal(offset: Int, upstream: Boolean = false): Float {
+        return layoutHelper.getHorizontalPosition(
+            offset,
+            usePrimaryDirection = true,
+            upstream = upstream
+        ) + getHorizontalPadding(getLineForOffset(offset))
+    }
 
-    fun getSecondaryHorizontal(offset: Int, upstream: Boolean = false): Float =
-        layoutHelper.getHorizontalPosition(offset, usePrimaryDirection = false, upstream = upstream)
-
+    /**
+     * Returns horizontal position for an offset from the drawing origin of a new character would
+     * be inserted at that offset.
+     *
+     * *secondary* means that the inserting character's direction will be resolved to the
+     * *opposite* direction to the paragraph direction. For example, the insertion position for an
+     * RTL character in an LTR paragraph or LTR character in an RTL paragraph.
+     *
+     * The location that is being queried can also be different based on line breaks. Consider the
+     * following example:
+     *
+     * <pre>
+     *    aa
+     *    bb
+     * <pre/>
+     *
+     *
+     * In the example above, if offset is the end of the first line then it is required to know if
+     * the position to be returned is the end of the first line ("aa") or the beginning of the next
+     * line ("bb").
+     *
+     * When the end of line is needed [upstream] should be set to true; when the beginning of next
+     * line is needed [upstream] should be set to false (therefore it is downstream).
+     *
+     * @param offset offset the character index
+     * @param upstream true to return the end of the line for offsets that are at the end
+     * of a line. false returns the beginning of the next line.
+     *
+     * @return the horizontal position of an offset from the drawing origin
+     */
+    fun getSecondaryHorizontal(offset: Int, upstream: Boolean = false): Float {
+        return layoutHelper.getHorizontalPosition(
+            offset,
+            usePrimaryDirection = false,
+            upstream = upstream
+        ) + getHorizontalPadding(getLineForOffset(offset))
+    }
     fun getLineForOffset(offset: Int): Int = layout.getLineForOffset(offset)
 
     fun isRtlCharAt(offset: Int): Boolean = layout.isRtlCharAt(offset)
@@ -871,3 +980,5 @@
     if (lineHeightStyleSpans.isEmpty()) return emptyArray()
     return lineHeightStyleSpans
 }
+
+internal fun Layout.isLineEllipsized(lineIndex: Int) = this.getEllipsisStart(lineIndex) != 0
\ No newline at end of file
diff --git a/text/text/src/main/java/androidx/compose/ui/text/android/style/IndentationFixSpan.kt b/text/text/src/main/java/androidx/compose/ui/text/android/style/IndentationFixSpan.kt
new file mode 100644
index 0000000..4e38948
--- /dev/null
+++ b/text/text/src/main/java/androidx/compose/ui/text/android/style/IndentationFixSpan.kt
@@ -0,0 +1,134 @@
+/*
+ * 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.text.android.style
+
+import android.graphics.Canvas
+import android.graphics.Paint
+import android.text.Layout
+import android.text.Layout.Alignment
+import android.text.style.LeadingMarginSpan
+import androidx.compose.ui.text.android.InternalPlatformTextApi
+import androidx.compose.ui.text.android.isLineEllipsized
+import kotlin.math.abs
+
+/**
+ * When letter spacing, align and ellipsize applied to text, the ellipsized line is indented wrong.
+ * For example for an LTR text, the last line is indented in a way where the beginning of the line
+ * is less than 0 and the text is cut.
+ *
+ * This class fixes the indentation for the last broken line by translating the canvas on the
+ * opposite direction.
+ *
+ * It should be applied to a text only when those three attributes are set.
+ *
+ * @suppress
+ */
+@InternalPlatformTextApi
+class IndentationFixSpan : LeadingMarginSpan {
+    override fun getLeadingMargin(firstLine: Boolean): Int {
+        return 0
+    }
+
+    override fun drawLeadingMargin(
+        canvas: Canvas?,
+        paint: Paint?,
+        left: Int,
+        dir: Int,
+        top: Int,
+        baseline: Int,
+        bottom: Int,
+        text: CharSequence?,
+        start: Int,
+        end: Int,
+        first: Boolean,
+        layout: Layout?
+    ) {
+        if (layout != null && paint != null) {
+            val lineIndex = layout.getLineForOffset(start)
+            if (lineIndex == layout.lineCount - 1 && layout.isLineEllipsized(lineIndex)) {
+                val padding = layout.getEllipsizedLeftPadding(lineIndex, paint) +
+                    layout.getEllipsizedRightPadding(lineIndex, paint)
+                if (padding != 0f) {
+                    canvas!!.translate(padding, 0f)
+                }
+            }
+        }
+    }
+}
+
+/**
+ * Returns a positive number that describes the error amount so that we can translate the canvas
+ * with the padding amount.
+ *
+ * Returns a non-zero value only if the line is ellipsized, the alignment is opposite and there is
+ * an error in the line position calculation.
+ *
+ * Used to correct the LTR line with the line position calculation error.
+ */
+internal fun Layout.getEllipsizedLeftPadding(lineIndex: Int, paint: Paint = this.paint): Float {
+    val lineLeft = getLineLeft(lineIndex)
+    if (isLineEllipsized(lineIndex) &&
+        getParagraphDirection(lineIndex) == Layout.DIR_LEFT_TO_RIGHT &&
+        lineLeft < 0
+    ) {
+        val ellipsisIndex = getLineStart(lineIndex) + getEllipsisStart(lineIndex)
+        val horizontal = getPrimaryHorizontal(ellipsisIndex)
+        val length = (horizontal - lineLeft) + paint.measureText(EllipsisChar)
+
+        return when (getParagraphAlignment(lineIndex)) {
+            Alignment.ALIGN_CENTER -> {
+                abs(lineLeft) + ((width - length) / 2f)
+            }
+            else -> { // align right
+                abs(lineLeft) + (width - length)
+            }
+        }
+    }
+    return 0f
+}
+
+/**
+ * Returns a negative number that describes the error amount so that we can translate the canvas
+ * with the padding amount.
+ *
+ * Returns a non-zero value only if the line is ellipsized, the alignment is opposite and there is
+ * an error in the line position calculation.
+ *
+ * Used to correct the RTL line with the line position calculation error.
+ */
+internal fun Layout.getEllipsizedRightPadding(lineIndex: Int, paint: Paint = this.paint): Float {
+    if (isLineEllipsized(lineIndex) &&
+        getParagraphDirection(lineIndex) == Layout.DIR_RIGHT_TO_LEFT &&
+        width < getLineRight(lineIndex)
+    ) {
+        val ellipsisIndex = getLineStart(lineIndex) + getEllipsisStart(lineIndex)
+        val horizontal = getPrimaryHorizontal(ellipsisIndex)
+        val length = (getLineRight(lineIndex) - horizontal) + paint.measureText(EllipsisChar)
+
+        return when (getParagraphAlignment(lineIndex)) {
+            Alignment.ALIGN_CENTER -> {
+                width - getLineRight(lineIndex) - ((width - length) / 2f)
+            }
+            else -> { // align left
+                width - getLineRight(lineIndex) - (width - length)
+            }
+        }
+    }
+    return 0f
+}
+
+private const val EllipsisChar = "\u2026"
\ No newline at end of file
diff --git a/wear/compose/compose-foundation/api/current.ignore b/wear/compose/compose-foundation/api/current.ignore
new file mode 100644
index 0000000..fe9b752
--- /dev/null
+++ b/wear/compose/compose-foundation/api/current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedMethod: androidx.wear.compose.foundation.CurvedTextStyle#equals(Object):
+    Removed method androidx.wear.compose.foundation.CurvedTextStyle.equals(Object)
diff --git a/wear/compose/compose-foundation/api/current.txt b/wear/compose/compose-foundation/api/current.txt
index 78a48d4..26f3b10 100644
--- a/wear/compose/compose-foundation/api/current.txt
+++ b/wear/compose/compose-foundation/api/current.txt
@@ -150,7 +150,6 @@
     ctor public CurvedTextStyle(optional long background, optional long color, optional long fontSize);
     ctor public CurvedTextStyle(androidx.compose.ui.text.TextStyle style);
     method public androidx.wear.compose.foundation.CurvedTextStyle copy(optional long background, optional long color, optional long fontSize);
-    method public operator boolean equals(Object? other);
     method public long getBackground();
     method public long getColor();
     method public long getFontSize();
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 78a48d4..26f3b10 100644
--- a/wear/compose/compose-foundation/api/public_plus_experimental_current.txt
+++ b/wear/compose/compose-foundation/api/public_plus_experimental_current.txt
@@ -150,7 +150,6 @@
     ctor public CurvedTextStyle(optional long background, optional long color, optional long fontSize);
     ctor public CurvedTextStyle(androidx.compose.ui.text.TextStyle style);
     method public androidx.wear.compose.foundation.CurvedTextStyle copy(optional long background, optional long color, optional long fontSize);
-    method public operator boolean equals(Object? other);
     method public long getBackground();
     method public long getColor();
     method public long getFontSize();
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..fe9b752
--- /dev/null
+++ b/wear/compose/compose-foundation/api/restricted_current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedMethod: androidx.wear.compose.foundation.CurvedTextStyle#equals(Object):
+    Removed method androidx.wear.compose.foundation.CurvedTextStyle.equals(Object)
diff --git a/wear/compose/compose-foundation/api/restricted_current.txt b/wear/compose/compose-foundation/api/restricted_current.txt
index 78a48d4..26f3b10 100644
--- a/wear/compose/compose-foundation/api/restricted_current.txt
+++ b/wear/compose/compose-foundation/api/restricted_current.txt
@@ -150,7 +150,6 @@
     ctor public CurvedTextStyle(optional long background, optional long color, optional long fontSize);
     ctor public CurvedTextStyle(androidx.compose.ui.text.TextStyle style);
     method public androidx.wear.compose.foundation.CurvedTextStyle copy(optional long background, optional long color, optional long fontSize);
-    method public operator boolean equals(Object? other);
     method public long getBackground();
     method public long getColor();
     method public long getFontSize();
diff --git a/wear/compose/compose-foundation/src/commonMain/kotlin/androidx/wear/compose/foundation/CurvedTextStyle.kt b/wear/compose/compose-foundation/src/commonMain/kotlin/androidx/wear/compose/foundation/CurvedTextStyle.kt
index c42c947..d262933 100644
--- a/wear/compose/compose-foundation/src/commonMain/kotlin/androidx/wear/compose/foundation/CurvedTextStyle.kt
+++ b/wear/compose/compose-foundation/src/commonMain/kotlin/androidx/wear/compose/foundation/CurvedTextStyle.kt
@@ -103,7 +103,7 @@
         }
     }
 
-    override operator fun equals(other: Any?): Boolean {
+    override fun equals(other: Any?): Boolean {
         if (this === other) return true
 
         return other is CurvedTextStyle &&
diff --git a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ScalingLazyColumnTest.kt b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ScalingLazyColumnTest.kt
index a66038b..10c0072 100644
--- a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ScalingLazyColumnTest.kt
+++ b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ScalingLazyColumnTest.kt
@@ -50,7 +50,6 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
 import org.junit.Before
-import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -83,7 +82,38 @@
     }
 
     @Test
-    fun initializationCorrectWithAutoCenteringAndNormalItemPadding() {
+    fun initializationCorrectWithAutoCenteringAndNormalItemPaddingForZeroItemList() {
+        initializationCorrectWithAutoCenteringAndNormalItemPaddingForNItemList(0)
+    }
+
+    @Test
+    fun initializationCorrectWithAutoCenteringAndNormalItemPaddingForOneItemList() {
+        initializationCorrectWithAutoCenteringAndNormalItemPaddingForNItemList(1)
+    }
+
+    @Test
+    fun initializationCorrectWithAutoCenteringAndNormalItemPaddingForTwoItemList() {
+        initializationCorrectWithAutoCenteringAndNormalItemPaddingForNItemList(2)
+    }
+
+    @Test
+    fun initializationCorrectWithAutoCenteringAndNormalItemPaddingForThreeItemList() {
+        initializationCorrectWithAutoCenteringAndNormalItemPaddingForNItemList(3)
+    }
+
+    @Test
+    fun initializationCorrectWithAutoCenteringAndNormalItemPaddingForFourItemList() {
+        initializationCorrectWithAutoCenteringAndNormalItemPaddingForNItemList(4)
+    }
+
+    @Test
+    fun initializationCorrectWithAutoCenteringAndNormalItemPaddingForFiveItemList() {
+        initializationCorrectWithAutoCenteringAndNormalItemPaddingForNItemList(5)
+    }
+
+    private fun initializationCorrectWithAutoCenteringAndNormalItemPaddingForNItemList(
+        itemCount: Int
+    ) {
         lateinit var state: ScalingLazyListState
         val listSize = itemSizeDp * 3.5f
         rule.setContent {
@@ -92,7 +122,7 @@
                     state = rememberScalingLazyListState().also { state = it },
                     modifier = Modifier.testTag(TEST_TAG).requiredSize(listSize),
                 ) {
-                    items(5) {
+                    items(itemCount) {
                         Box(Modifier.requiredSize(itemSizeDp))
                     }
                 }
@@ -902,7 +932,6 @@
         assertThat(state.centerItemScrollOffset).isEqualTo(0)
     }
 
-    @Ignore("Disabled due to b/239054957")
     @Test
     fun scrollToNonExistentItemWorks() {
         lateinit var state: ScalingLazyListState
diff --git a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Colors.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Colors.kt
index c8e7675..f66a294 100644
--- a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Colors.kt
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Colors.kt
@@ -29,18 +29,18 @@
 @Stable
 public class Colors(
     primary: Color = Color(0xFFAECBFA),
-    primaryVariant: Color = Color(0xFF669DF6),
+    primaryVariant: Color = Color(0xFF8AB4F8),
     secondary: Color = Color(0xFFFDE293),
     secondaryVariant: Color = Color(0xFF594F33),
     background: Color = Color.Black,
-    surface: Color = Color(0xFF202124),
+    surface: Color = Color(0xFF303133),
     error: Color = Color(0xFFEE675C),
-    onPrimary: Color = Color(0xFF202124),
-    onSecondary: Color = Color(0xFF202124),
+    onPrimary: Color = Color(0xFF303133),
+    onSecondary: Color = Color(0xFF303133),
     onBackground: Color = Color.White,
     onSurface: Color = Color.White,
     onSurfaceVariant: Color = Color(0xFFDADCE0),
-    onError: Color = Color(0xFF202124)
+    onError: Color = Color(0xFF000000)
 ) {
     public var primary: Color by mutableStateOf(primary, structuralEqualityPolicy())
         internal set
diff --git a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/ScalingLazyListState.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/ScalingLazyListState.kt
index 90f782b..2723814 100644
--- a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/ScalingLazyListState.kt
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/ScalingLazyListState.kt
@@ -570,10 +570,10 @@
         if (lazyListState.layoutInfo.visibleItemsInfo.first().size > 0) return true
 
         // Work out the index we want to find - if there are less items in the list than would be
-        // needed to make initialItemIndex be visible then use the last visible item. The -3 is to
+        // needed to make initialItemIndex be visible then use the last visible item. The -2 is to
         // allow for the spacers, i.e. an underlying list of size 3 has 2 spacers in index 0 and 2
-        // and one real item in index 1.
-        val itemIndexToFind = (autoCentering.value!!.itemIndex + 1).coerceAtMost(totalItemCount - 3)
+        // and one real item in underlying lazy column index 1.
+        val itemIndexToFind = (autoCentering.value!!.itemIndex + 1).coerceAtMost(totalItemCount - 2)
 
         // Find the initialCenterItem, if it is null that means it is not in view - therefore
         // we have more than enough content before it to make sure it can be scrolled to the center
diff --git a/wear/compose/integration-tests/demos/build.gradle b/wear/compose/integration-tests/demos/build.gradle
index 520b5b6..1c28b7f 100644
--- a/wear/compose/integration-tests/demos/build.gradle
+++ b/wear/compose/integration-tests/demos/build.gradle
@@ -26,8 +26,8 @@
         applicationId "androidx.wear.compose.integration.demos"
         minSdk 25
         targetSdk 30
-        versionCode 10
-        versionName "1.9"
+        versionCode 11
+        versionName "1.10"
         // Change the APK name to match the *testapp regex we use to pick up APKs for testing as
         // part of CI.
         archivesBaseName = "wear-compose-demos-testapp"
diff --git a/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/testapp/GoldenTestActivity.java b/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/testapp/GoldenTestActivity.java
index c9c23f7e..36a28fb 100644
--- a/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/testapp/GoldenTestActivity.java
+++ b/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/testapp/GoldenTestActivity.java
@@ -21,6 +21,7 @@
 
 import android.app.Activity;
 import android.content.Context;
+import android.graphics.Color;
 import android.os.Bundle;
 import android.view.Gravity;
 import android.view.View;
@@ -65,6 +66,7 @@
 
         Context appContext = getApplicationContext();
         FrameLayout root = new FrameLayout(appContext);
+        root.setBackgroundColor(Color.BLACK);
         root.setLayoutParams(new LayoutParams(SCREEN_WIDTH, SCREEN_HEIGHT));
 
         Layout layout = new Layout.Builder().setRoot(rootLayoutElement).build();
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Chip.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Chip.java
index db84840..c704d3f 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Chip.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Chip.java
@@ -99,6 +99,9 @@
  * <pre>{@code
  * Chip myChip = Chip.fromLayoutElement(box.getContents().get(0));
  * }</pre>
+ *
+ * @see  androidx.wear.tiles.material.layouts.PrimaryLayout.Builder#setContent if this Chip is used
+ * inside of {@link androidx.wear.tiles.material.layouts.PrimaryLayout}.
  */
 public class Chip implements LayoutElement {
     /**
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Colors.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Colors.java
index 101e306..08bfbd0 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Colors.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Colors.java
@@ -45,7 +45,7 @@
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
     @ColorInt
-    public static final int ON_PRIMARY = 0xFF202124;
+    public static final int ON_PRIMARY = 0xFF303133;
 
     /**
      * The default color used for secondary elements (i.e. background color).
@@ -54,7 +54,7 @@
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
     @ColorInt
-    public static final int SURFACE = 0xFF202124;
+    public static final int SURFACE = 0xFF303133;
 
     /**
      * The default color used on secondary elements (i.e. content color).
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/TitleChip.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/TitleChip.java
index 056089b..d220e42 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/TitleChip.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/TitleChip.java
@@ -68,6 +68,9 @@
  * <pre>{@code
  * TitleChip myChip = TitleChip.fromLayoutElement(box.getContents().get(0));
  * }</pre>
+ *
+ * @see  androidx.wear.tiles.material.layouts.PrimaryLayout.Builder#setContent if this TitleChip is
+ * used inside of {@link androidx.wear.tiles.material.layouts.PrimaryLayout}.
  */
 public class TitleChip implements LayoutElement {
     /** Tool tag for Metadata in Modifiers, so we know that Box is actually a TitleChip. */
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/PrimaryLayout.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/PrimaryLayout.java
index d33a785..4125e6c 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/PrimaryLayout.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/PrimaryLayout.java
@@ -217,7 +217,16 @@
             return this;
         }
 
-        /** Sets the additional content to this layout, above the primary chip. */
+        /**
+         * Sets the additional content to this layout, above the primary chip.
+         *
+         * The content slot will wrap the elements' height, so the height of the given content must
+         * be fixed or set to wrap ({@code expand} can't be used).
+         *
+         * This layout has built-in horizontal margins, so the given content should have width set
+         * to {@code expand} to use all the available space, rather than an explicit width which may
+         * lead to clipping.
+         */
         @NonNull
         public Builder setContent(@NonNull LayoutElement content) {
             this.mContent = content;
diff --git a/wear/watchface/watchface-client-guava/api/current.ignore b/wear/watchface/watchface-client-guava/api/current.ignore
deleted file mode 100644
index 6bcf2d9..0000000
--- a/wear/watchface/watchface-client-guava/api/current.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-ParameterNameChange: androidx.wear.watchface.client.ListenableWatchFaceControlClient#getOrCreateInteractiveWatchFaceClient(String, androidx.wear.watchface.client.DeviceConfig, androidx.wear.watchface.client.WatchUiState, androidx.wear.watchface.style.UserStyleData, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>) parameter #5:
-    Attempted to remove parameter name from parameter arg6 in androidx.wear.watchface.client.ListenableWatchFaceControlClient.getOrCreateInteractiveWatchFaceClient
diff --git a/wear/watchface/watchface-client-guava/api/restricted_current.ignore b/wear/watchface/watchface-client-guava/api/restricted_current.ignore
deleted file mode 100644
index 6bcf2d9..0000000
--- a/wear/watchface/watchface-client-guava/api/restricted_current.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-ParameterNameChange: androidx.wear.watchface.client.ListenableWatchFaceControlClient#getOrCreateInteractiveWatchFaceClient(String, androidx.wear.watchface.client.DeviceConfig, androidx.wear.watchface.client.WatchUiState, androidx.wear.watchface.style.UserStyleData, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>) parameter #5:
-    Attempted to remove parameter name from parameter arg6 in androidx.wear.watchface.client.ListenableWatchFaceControlClient.getOrCreateInteractiveWatchFaceClient
diff --git a/wear/watchface/watchface-client-guava/lint-baseline.xml b/wear/watchface/watchface-client-guava/lint-baseline.xml
deleted file mode 100644
index a4e3c85..0000000
--- a/wear/watchface/watchface-client-guava/lint-baseline.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 27 (current min is 26): `WatchFaceControlService`"
-        errorLine1="    private val realService = object : WatchFaceControlService() {"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/wear/watchface/client/guava/ListenableWatchFaceMetadataClientTest.kt"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Extending WatchFaceControlService requires API level 27 (current min is 26): `WatchFaceControlService`"
-        errorLine1="    private val realService = object : WatchFaceControlService() {"
-        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/wear/watchface/client/guava/ListenableWatchFaceMetadataClientTest.kt"/>
-    </issue>
-
-</issues>
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 05be0f5..43b28e3 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
@@ -22,7 +22,9 @@
 import android.content.Context
 import android.content.Intent
 import android.content.res.XmlResourceParser
+import android.os.Build
 import android.os.IBinder
+import androidx.annotation.RequiresApi
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
@@ -43,6 +45,7 @@
  * [ListenableWatchFaceMetadataClientTest] and to optionally override the reported API version.
  */
 public class WatchFaceControlTestService : Service() {
+    @RequiresApi(Build.VERSION_CODES.O_MR1)
     private val realService = object : WatchFaceControlService() {
         @SuppressLint("NewApi")
         override fun createServiceStub(): IWatchFaceInstanceServiceStub =
diff --git a/wear/watchface/watchface-client/api/current.txt b/wear/watchface/watchface-client/api/current.txt
index aca452d..f7ce408 100644
--- a/wear/watchface/watchface-client/api/current.txt
+++ b/wear/watchface/watchface-client/api/current.txt
@@ -127,6 +127,7 @@
 
   public interface InteractiveWatchFaceClient extends java.lang.AutoCloseable {
     method @AnyThread public void addClientDisconnectListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.ClientDisconnectListener listener, java.util.concurrent.Executor executor);
+    method public default void addOnWatchFaceColorsListener(java.util.concurrent.Executor executor, androidx.wear.watchface.client.InteractiveWatchFaceClient.OnWatchFaceColorsListener 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();
@@ -138,6 +139,7 @@
     method @AnyThread public boolean isConnectionAlive();
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void performAmbientTick() throws android.os.RemoteException;
     method @AnyThread public void removeClientDisconnectListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.ClientDisconnectListener listener);
+    method public default void removeOnWatchFaceColorsListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.OnWatchFaceColorsListener 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;
@@ -167,6 +169,10 @@
     field public static final int TAP_TYPE_UP = 2; // 0x2
   }
 
+  public static fun interface InteractiveWatchFaceClient.OnWatchFaceColorsListener {
+    method public void onWatchFaceColors(androidx.wear.watchface.WatchFaceColors? watchFaceColors);
+  }
+
   public static fun interface InteractiveWatchFaceClient.OnWatchFaceReadyListener {
     method public void onWatchFaceReady();
   }
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 3697506..593b015 100644
--- a/wear/watchface/watchface-client/api/public_plus_experimental_current.txt
+++ b/wear/watchface/watchface-client/api/public_plus_experimental_current.txt
@@ -131,6 +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 public default void addOnWatchFaceColorsListener(java.util.concurrent.Executor executor, androidx.wear.watchface.client.InteractiveWatchFaceClient.OnWatchFaceColorsListener 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();
@@ -142,6 +143,7 @@
     method @AnyThread public boolean isConnectionAlive();
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void performAmbientTick() throws android.os.RemoteException;
     method @AnyThread public void removeClientDisconnectListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.ClientDisconnectListener listener);
+    method public default void removeOnWatchFaceColorsListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.OnWatchFaceColorsListener 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;
@@ -171,6 +173,10 @@
     field public static final int TAP_TYPE_UP = 2; // 0x2
   }
 
+  public static fun interface InteractiveWatchFaceClient.OnWatchFaceColorsListener {
+    method public void onWatchFaceColors(androidx.wear.watchface.WatchFaceColors? watchFaceColors);
+  }
+
   public static fun interface InteractiveWatchFaceClient.OnWatchFaceReadyListener {
     method public void onWatchFaceReady();
   }
diff --git a/wear/watchface/watchface-client/api/restricted_current.txt b/wear/watchface/watchface-client/api/restricted_current.txt
index aca452d..f7ce408 100644
--- a/wear/watchface/watchface-client/api/restricted_current.txt
+++ b/wear/watchface/watchface-client/api/restricted_current.txt
@@ -127,6 +127,7 @@
 
   public interface InteractiveWatchFaceClient extends java.lang.AutoCloseable {
     method @AnyThread public void addClientDisconnectListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.ClientDisconnectListener listener, java.util.concurrent.Executor executor);
+    method public default void addOnWatchFaceColorsListener(java.util.concurrent.Executor executor, androidx.wear.watchface.client.InteractiveWatchFaceClient.OnWatchFaceColorsListener 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();
@@ -138,6 +139,7 @@
     method @AnyThread public boolean isConnectionAlive();
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void performAmbientTick() throws android.os.RemoteException;
     method @AnyThread public void removeClientDisconnectListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.ClientDisconnectListener listener);
+    method public default void removeOnWatchFaceColorsListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.OnWatchFaceColorsListener 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;
@@ -167,6 +169,10 @@
     field public static final int TAP_TYPE_UP = 2; // 0x2
   }
 
+  public static fun interface InteractiveWatchFaceClient.OnWatchFaceColorsListener {
+    method public void onWatchFaceColors(androidx.wear.watchface.WatchFaceColors? watchFaceColors);
+  }
+
   public static fun interface InteractiveWatchFaceClient.OnWatchFaceReadyListener {
     method public void onWatchFaceReady();
   }
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 c6e980f..3a44339 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
@@ -60,6 +60,7 @@
 import androidx.wear.watchface.RenderParameters
 import androidx.wear.watchface.Renderer
 import androidx.wear.watchface.WatchFace
+import androidx.wear.watchface.WatchFaceColors
 import androidx.wear.watchface.WatchFaceService
 import androidx.wear.watchface.WatchFaceType
 import androidx.wear.watchface.WatchState
@@ -1684,6 +1685,82 @@
             "WatchFaceService.onDestroy"
         )
     }
+
+    @Test
+    fun watchFaceColors() {
+        val deferredInteractiveInstance = handlerCoroutineScope.async {
+            service.getOrCreateInteractiveWatchFaceClient(
+                "testId",
+                deviceConfig,
+                systemState,
+                null,
+                complications
+            )
+        }
+
+        // Create the engine which triggers creation of InteractiveWatchFaceClient.
+        createEngine()
+
+        val interactiveInstance = awaitWithTimeout(deferredInteractiveInstance)
+
+        try {
+            val watchFaceColorsLatch = CountDownLatch(1)
+            var watchFaceColors: WatchFaceColors? = null
+
+            interactiveInstance.addOnWatchFaceColorsListener(
+                { runnable -> runnable.run() }
+            ) {
+                watchFaceColors = it
+                if (watchFaceColors != null) {
+                    watchFaceColorsLatch.countDown()
+                }
+            }
+
+            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)
+                )
+            )
+
+            val watchFaceColorsLatch2 = CountDownLatch(1)
+            var watchFaceColors2: WatchFaceColors? = null
+
+            interactiveInstance.updateWatchFaceInstance(
+                "testId",
+                UserStyleData(
+                    mapOf(
+                        COLOR_STYLE_SETTING to BLUE_STYLE.encodeToByteArray(),
+                        WATCH_HAND_LENGTH_STYLE_SETTING to DoubleRangeOption(0.9).id.value,
+                    )
+                )
+            )
+
+            interactiveInstance.addOnWatchFaceColorsListener(
+                { runnable -> runnable.run() }
+            ) {
+                watchFaceColors2 = it
+                if (watchFaceColors2 != null) {
+                    watchFaceColorsLatch2.countDown()
+                }
+            }
+
+            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)
+                )
+            )
+        } finally {
+            interactiveInstance.close()
+        }
+    }
 }
 
 internal class TestExampleCanvasAnalogWatchFaceService(
diff --git a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/InteractiveWatchFaceClient.kt b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/InteractiveWatchFaceClient.kt
index 1a3718d..6d4f535 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
@@ -30,18 +30,23 @@
 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.control.IWatchfaceListener
 import androidx.wear.watchface.control.IWatchfaceReadyListener
 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.UserStyleSchema
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting
 import androidx.wear.watchface.style.UserStyleData
+import androidx.wear.watchface.toApiFormat
 import java.time.Instant
 import java.util.concurrent.Executor
 
@@ -258,6 +263,39 @@
      * Stops listening for events registered by [addOnWatchFaceReadyListener].
      */
     public fun removeOnWatchFaceReadyListener(listener: OnWatchFaceReadyListener)
+
+    /**
+     * Interface passed to [addOnWatchFaceReadyListener] which calls
+     * [OnWatchFaceColorsListener.onWatchFaceColors] initially with the current
+     * [Renderer.watchfaceColors] if known or `null` if not, and subsequently whenever the watch
+     * face's [Renderer.watchfaceColors] change.
+     */
+    public fun interface OnWatchFaceColorsListener {
+        /**
+         * Called initially with the current [Renderer.watchfaceColors] if known or `null` if not,
+         * and subsequently whenever the watch face's [Renderer.watchfaceColors] change.
+         */
+        public fun onWatchFaceColors(watchFaceColors: WatchFaceColors?)
+    }
+
+    /**
+     * Registers a [OnWatchFaceColorsListener] which gets called initially with the current
+     * [Renderer.watchfaceColors] if known or `null` if not, and subsequently whenever the watch
+     * face's [Renderer.watchfaceColors] change.
+     *
+     * @param executor The [Executor] on which to run [OnWatchFaceReadyListener].
+     * @param listener The [OnWatchFaceColorsListener] to run whenever the watch face's
+     * [Renderer.watchfaceColors] change.
+     */
+    public fun addOnWatchFaceColorsListener(
+        executor: Executor,
+        listener: OnWatchFaceColorsListener
+    ) {}
+
+    /**
+     * Stops listening for events registered by [addOnWatchFaceColorsListener].
+     */
+    public fun removeOnWatchFaceColorsListener(listener: OnWatchFaceColorsListener) {}
 }
 
 /** Controls a stateful remote interactive watch face. */
@@ -270,9 +308,36 @@
         HashMap<InteractiveWatchFaceClient.ClientDisconnectListener, Executor>()
     private val readyListeners =
         HashMap<InteractiveWatchFaceClient.OnWatchFaceReadyListener, Executor>()
+    private val watchFaceColorsChangeListeners =
+        HashMap<InteractiveWatchFaceClient.OnWatchFaceColorsListener, Executor>()
     private var watchfaceReadyListenerRegistered = false
+    private var lastWatchFaceColors: WatchFaceColors? = null
     private var closed = false
 
+    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<InteractiveWatchFaceClient.OnWatchFaceColorsListener, Executor>
+
+            synchronized(lock) {
+                listenerCopy = HashMap(watchFaceColorsChangeListeners)
+                lastWatchFaceColors = watchFaceColors?.toApiFormat()
+            }
+
+            for ((listener, executor) in listenerCopy) {
+                executor.execute {
+                    listener.onWatchFaceColors(lastWatchFaceColors)
+                }
+            }
+        }
+    }
+
     init {
         iInteractiveWatchFace.asBinder().linkToDeath(
             {
@@ -291,6 +356,10 @@
             },
             0
         )
+
+        if (iInteractiveWatchFace.apiVersion >= 6) {
+            iInteractiveWatchFace.addWatchFaceListener(iWatchFaceListener)
+        }
     }
 
     override fun updateComplicationData(
@@ -371,6 +440,9 @@
         )
 
     override fun close() = TraceEvent("InteractiveWatchFaceClientImpl.close").use {
+        if (iInteractiveWatchFace.apiVersion >= 6) {
+            iInteractiveWatchFace.removeWatchFaceListener(iWatchFaceListener)
+        }
         iInteractiveWatchFace.release()
         synchronized(lock) {
             closed = true
@@ -436,31 +508,38 @@
     override fun isConnectionAlive() =
         iInteractiveWatchFace.asBinder().isBinderAlive && synchronized(lock) { !closed }
 
-    private fun registerWatchfaceReadyListener() {
+    private fun maybeRegisterWatchfaceReadyListener() {
         if (watchfaceReadyListenerRegistered) {
             return
         }
-        if (iInteractiveWatchFace.apiVersion >= 2) {
-            iInteractiveWatchFace.addWatchfaceReadyListener(
-                object : IWatchfaceReadyListener.Stub() {
-                    override fun getApiVersion(): Int = IWatchfaceReadyListener.API_VERSION
+        when {
+            // From version 6 we want to use IWatchFaceListener instead.
+            iInteractiveWatchFace.apiVersion >= 6 -> return
 
-                    override fun onWatchfaceReady() {
-                        this@InteractiveWatchFaceClientImpl.onWatchFaceReady()
+            iInteractiveWatchFace.apiVersion >= 2 -> {
+                iInteractiveWatchFace.addWatchfaceReadyListener(
+                    object : IWatchfaceReadyListener.Stub() {
+                        override fun getApiVersion(): Int = IWatchfaceReadyListener.API_VERSION
+
+                        override fun onWatchfaceReady() {
+                            this@InteractiveWatchFaceClientImpl.onWatchFaceReady()
+                        }
                     }
+                )
+            }
+
+            else -> {
+                // We can emulate this on an earlier API by using a call to get userStyleSchema that
+                // will block until the watch face is ready. to Avoid blocking the current thread we
+                // spin up a temporary thread.
+                val thread = HandlerThread("addWatchFaceReadyListener")
+                thread.start()
+                val handler = Handler(thread.looper)
+                handler.post {
+                    iInteractiveWatchFace.userStyleSchema
+                    this@InteractiveWatchFaceClientImpl.onWatchFaceReady()
+                    thread.quitSafely()
                 }
-            )
-        } else {
-            // We can emulate this on an earlier API by using a call to get userStyleSchema that
-            // will block until the watch face is ready. to Avoid blocking the current thread we
-            // spin up a temporary thread.
-            val thread = HandlerThread("addWatchFaceReadyListener")
-            thread.start()
-            val handler = Handler(thread.looper)
-            handler.post {
-                iInteractiveWatchFace.userStyleSchema
-                this@InteractiveWatchFaceClientImpl.onWatchFaceReady()
-                thread.quitSafely()
             }
         }
         watchfaceReadyListenerRegistered = true
@@ -488,7 +567,7 @@
             require(!readyListeners.contains(listener)) {
                 "Don't call addWatchFaceReadyListener multiple times for the same listener"
             }
-            registerWatchfaceReadyListener()
+            maybeRegisterWatchfaceReadyListener()
             readyListeners.put(listener, executor)
         }
     }
@@ -500,4 +579,29 @@
             readyListeners.remove(listener)
         }
     }
+
+    override fun addOnWatchFaceColorsListener(
+        executor: Executor,
+        listener: InteractiveWatchFaceClient.OnWatchFaceColorsListener
+    ) {
+        val colors = synchronized(lock) {
+            require(!watchFaceColorsChangeListeners.contains(listener)) {
+                "Don't call addOnWatchFaceColorsListener multiple times for the same listener"
+            }
+            maybeRegisterWatchfaceReadyListener()
+            watchFaceColorsChangeListeners.put(listener, executor)
+
+            lastWatchFaceColors
+        }
+
+        listener.onWatchFaceColors(colors)
+    }
+
+    override fun removeOnWatchFaceColorsListener(
+        listener: InteractiveWatchFaceClient.OnWatchFaceColorsListener
+    ) {
+        synchronized(lock) {
+            watchFaceColorsChangeListeners.remove(listener)
+        }
+    }
 }
diff --git a/wear/watchface/watchface-complications-data-source-ktx/api/current.ignore b/wear/watchface/watchface-complications-data-source-ktx/api/current.ignore
deleted file mode 100644
index 775c3ad..0000000
--- a/wear/watchface/watchface-complications-data-source-ktx/api/current.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-ParameterNameChange: androidx.wear.watchface.complications.datasource.SuspendingComplicationDataSourceService#onComplicationRequest(androidx.wear.watchface.complications.datasource.ComplicationRequest, kotlin.coroutines.Continuation<? super androidx.wear.watchface.complications.data.ComplicationData>) parameter #1:
-    Attempted to remove parameter name from parameter arg2 in androidx.wear.watchface.complications.datasource.SuspendingComplicationDataSourceService.onComplicationRequest
diff --git a/wear/watchface/watchface-complications-data-source-ktx/api/restricted_current.ignore b/wear/watchface/watchface-complications-data-source-ktx/api/restricted_current.ignore
deleted file mode 100644
index 775c3ad..0000000
--- a/wear/watchface/watchface-complications-data-source-ktx/api/restricted_current.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-ParameterNameChange: androidx.wear.watchface.complications.datasource.SuspendingComplicationDataSourceService#onComplicationRequest(androidx.wear.watchface.complications.datasource.ComplicationRequest, kotlin.coroutines.Continuation<? super androidx.wear.watchface.complications.data.ComplicationData>) parameter #1:
-    Attempted to remove parameter name from parameter arg2 in androidx.wear.watchface.complications.datasource.SuspendingComplicationDataSourceService.onComplicationRequest
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 706ae3d..fd936bf 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
@@ -65,11 +65,12 @@
     public val complicationType: ComplicationType = complicationType
 
     /**
-     * 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.
+     * 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 which will not be
+     * called unless the [ComplicationDataSourceService] has privileged permission
+     * `com.google.android.wearable.permission.USE_IMMEDIATE_COMPLICATION_UPDATE`.
      */
     @get:JvmName("isImmediateResponseRequired")
     public val immediateResponseRequired = immediateResponseRequired
@@ -296,7 +297,7 @@
     /**
      * 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
+     * `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
      * [ComplicationRequest.immediateResponseRequired] is `true`, ending with a call to
@@ -312,7 +313,7 @@
     /**
      * 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
+     * `com.google.android.wearable.permission.USE_IMMEDIATE_COMPLICATION_UPDATE`, then
      * [onStartImmediateComplicationRequests] will be called when the watch face ceases to be
      * visible and non-ambient. No subsequent calls to [onComplicationRequest] where
      * [ComplicationRequest.immediateResponseRequired] is `true` will be made unless the
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 72baad8..96dec62 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
@@ -130,24 +130,24 @@
     @Test
     public void timeEntryToString() {
         assertThat(TIMELINE_A.toString()).isEqualTo(
-                "ComplicationDataTimeline(defaultComplicationData=ShortTextComplicationData"
-                        + "(text=ComplicationText{mSurroundingText=Hello, mTimeDependentText=null},"
-                        + " title=null, monochromaticImage=null, contentDescription="
-                        + "ComplicationText{mSurroundingText=, mTimeDependentText=null}, "
-                        + "tapActionLostDueToSerialization=false, tapAction=null, "
-                        + "validTimeRange=TimeRange(startDateTimeMillis="
-                        + "-1000000000-01-01T00:00:00Z, endDateTimeMillis="
-                        + "+1000000000-12-31T23:59:59.999999999Z), dataSource=null), "
-                        + "timelineEntries=[TimelineEntry"
-                        + "(validity=TimeInterval(start=1970-01-02T03:46:40Z, "
-                        + "end=1970-01-03T07:33:20Z), complicationData=ShortTextComplicationData"
-                        + "(text=ComplicationText{mSurroundingText=Updated, "
-                        + "mTimeDependentText=null}, title=null, monochromaticImage=null, "
+                "ComplicationDataTimeline(defaultComplicationData=ShortTextComplicationData("
+                        + "text=ComplicationText{mSurroundingText=Hello, mTimeDependentText=null}, "
+                        + "title=null, monochromaticImage=null, smallImage=null, "
                         + "contentDescription=ComplicationText{mSurroundingText=, "
                         + "mTimeDependentText=null}, tapActionLostDueToSerialization=false, "
-                        + "tapAction=null, validTimeRange=TimeRange(startDateTimeMillis="
-                        + "-1000000000-01-01T00:00:00Z, endDateTimeMillis="
-                        + "+1000000000-12-31T23:59:59.999999999Z), dataSource=null))])"
+                        + "tapAction=null, validTimeRange=TimeRange("
+                        + "startDateTimeMillis=-1000000000-01-01T00:00:00Z, "
+                        + "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), "
+                        + "dataSource=null), timelineEntries=[TimelineEntry(validity=TimeInterval("
+                        + "start=1970-01-02T03:46:40Z, end=1970-01-03T07:33:20Z), "
+                        + "complicationData=ShortTextComplicationData(text=ComplicationText{"
+                        + "mSurroundingText=Updated, mTimeDependentText=null}, title=null, "
+                        + "monochromaticImage=null, smallImage=null, contentDescription="
+                        + "ComplicationText{mSurroundingText=, mTimeDependentText=null}, "
+                        + "tapActionLostDueToSerialization=false, tapAction=null, validTimeRange="
+                        + "TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, "
+                        + "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), "
+                        + "dataSource=null))])"
         );
     }
 
diff --git a/wear/watchface/watchface-complications-data/api/current.txt b/wear/watchface/watchface-complications-data/api/current.txt
index e0cb603..890e4a6 100644
--- a/wear/watchface/watchface-complications-data/api/current.txt
+++ b/wear/watchface/watchface-complications-data/api/current.txt
@@ -135,9 +135,11 @@
 
   public final class NoPermissionComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
     method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
+    method public androidx.wear.watchface.complications.data.SmallImage? getSmallImage();
     method public androidx.wear.watchface.complications.data.ComplicationText? getText();
     method public androidx.wear.watchface.complications.data.ComplicationText? getTitle();
     property public final androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage;
+    property public final androidx.wear.watchface.complications.data.SmallImage? smallImage;
     property public final androidx.wear.watchface.complications.data.ComplicationText? text;
     property public final androidx.wear.watchface.complications.data.ComplicationText? title;
     field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
@@ -148,6 +150,7 @@
     method public androidx.wear.watchface.complications.data.NoPermissionComplicationData build();
     method public androidx.wear.watchface.complications.data.NoPermissionComplicationData.Builder setDataSource(android.content.ComponentName? dataSource);
     method public androidx.wear.watchface.complications.data.NoPermissionComplicationData.Builder setMonochromaticImage(androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage);
+    method public androidx.wear.watchface.complications.data.NoPermissionComplicationData.Builder setSmallImage(androidx.wear.watchface.complications.data.SmallImage? smallImage);
     method public androidx.wear.watchface.complications.data.NoPermissionComplicationData.Builder setText(androidx.wear.watchface.complications.data.ComplicationText? text);
     method public androidx.wear.watchface.complications.data.NoPermissionComplicationData.Builder setTitle(androidx.wear.watchface.complications.data.ComplicationText? title);
   }
@@ -191,6 +194,7 @@
     method public float getMax();
     method public float getMin();
     method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
+    method public androidx.wear.watchface.complications.data.SmallImage? getSmallImage();
     method public androidx.wear.watchface.complications.data.ComplicationText? getText();
     method public androidx.wear.watchface.complications.data.ComplicationText? getTitle();
     method public float getValue();
@@ -198,6 +202,7 @@
     property public final float max;
     property public final float min;
     property public final androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage;
+    property public final androidx.wear.watchface.complications.data.SmallImage? smallImage;
     property public final androidx.wear.watchface.complications.data.ComplicationText? text;
     property public final androidx.wear.watchface.complications.data.ComplicationText? title;
     property public final float value;
@@ -210,6 +215,7 @@
     method public androidx.wear.watchface.complications.data.RangedValueComplicationData build();
     method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setDataSource(android.content.ComponentName? dataSource);
     method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setMonochromaticImage(androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage);
+    method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setSmallImage(androidx.wear.watchface.complications.data.SmallImage? smallImage);
     method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setText(androidx.wear.watchface.complications.data.ComplicationText? text);
     method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setTitle(androidx.wear.watchface.complications.data.ComplicationText? title);
@@ -219,10 +225,12 @@
   public final class ShortTextComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
     method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
     method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
+    method public androidx.wear.watchface.complications.data.SmallImage? getSmallImage();
     method public androidx.wear.watchface.complications.data.ComplicationText getText();
     method public androidx.wear.watchface.complications.data.ComplicationText? getTitle();
     property public final androidx.wear.watchface.complications.data.ComplicationText? contentDescription;
     property public final androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage;
+    property public final androidx.wear.watchface.complications.data.SmallImage? smallImage;
     property public final androidx.wear.watchface.complications.data.ComplicationText text;
     property public final androidx.wear.watchface.complications.data.ComplicationText? title;
     field public static final int MAX_TEXT_LENGTH;
@@ -234,6 +242,7 @@
     method public androidx.wear.watchface.complications.data.ShortTextComplicationData build();
     method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setDataSource(android.content.ComponentName? dataSource);
     method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setMonochromaticImage(androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage);
+    method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setSmallImage(androidx.wear.watchface.complications.data.SmallImage? smallImage);
     method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setTitle(androidx.wear.watchface.complications.data.ComplicationText? title);
     method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setValidTimeRange(androidx.wear.watchface.complications.data.TimeRange? validTimeRange);
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 7f5215b..fb8258ea 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
@@ -81,6 +81,7 @@
     method public int getMax();
     method public int getMin();
     method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
+    method public androidx.wear.watchface.complications.data.SmallImage? getSmallImage();
     method public androidx.wear.watchface.complications.data.ComplicationText? getText();
     method public androidx.wear.watchface.complications.data.ComplicationText? getTitle();
     method public int getValue();
@@ -88,6 +89,7 @@
     property public final int max;
     property public final int min;
     property public final androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage;
+    property public final androidx.wear.watchface.complications.data.SmallImage? smallImage;
     property public final androidx.wear.watchface.complications.data.ComplicationText? text;
     property public final androidx.wear.watchface.complications.data.ComplicationText? title;
     property public final int value;
@@ -100,6 +102,7 @@
     method public androidx.wear.watchface.complications.data.DiscreteRangedValueComplicationData build();
     method public androidx.wear.watchface.complications.data.DiscreteRangedValueComplicationData.Builder setDataSource(android.content.ComponentName? dataSource);
     method public androidx.wear.watchface.complications.data.DiscreteRangedValueComplicationData.Builder setMonochromaticImage(androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage);
+    method public androidx.wear.watchface.complications.data.DiscreteRangedValueComplicationData.Builder setSmallImage(androidx.wear.watchface.complications.data.SmallImage? smallImage);
     method public androidx.wear.watchface.complications.data.DiscreteRangedValueComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.watchface.complications.data.DiscreteRangedValueComplicationData.Builder setText(androidx.wear.watchface.complications.data.ComplicationText? text);
     method public androidx.wear.watchface.complications.data.DiscreteRangedValueComplicationData.Builder setTitle(androidx.wear.watchface.complications.data.ComplicationText? title);
@@ -115,6 +118,7 @@
     method @androidx.wear.watchface.complications.data.ComplicationExperimental public androidx.wear.watchface.complications.data.ColorRamp? getColorRamp();
     method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
     method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
+    method public androidx.wear.watchface.complications.data.SmallImage? getSmallImage();
     method public float getTargetValue();
     method public androidx.wear.watchface.complications.data.ComplicationText? getText();
     method public androidx.wear.watchface.complications.data.ComplicationText? getTitle();
@@ -122,6 +126,7 @@
     property @androidx.wear.watchface.complications.data.ComplicationExperimental public final androidx.wear.watchface.complications.data.ColorRamp? colorRamp;
     property public final androidx.wear.watchface.complications.data.ComplicationText? contentDescription;
     property public final androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage;
+    property public final androidx.wear.watchface.complications.data.SmallImage? smallImage;
     property public final float targetValue;
     property public final androidx.wear.watchface.complications.data.ComplicationText? text;
     property public final androidx.wear.watchface.complications.data.ComplicationText? title;
@@ -136,6 +141,7 @@
     method @androidx.wear.watchface.complications.data.ComplicationExperimental public androidx.wear.watchface.complications.data.GoalProgressComplicationData.Builder setColorRamp(androidx.wear.watchface.complications.data.ColorRamp? colorRamp);
     method public androidx.wear.watchface.complications.data.GoalProgressComplicationData.Builder setDataSource(android.content.ComponentName? dataSource);
     method public androidx.wear.watchface.complications.data.GoalProgressComplicationData.Builder setMonochromaticImage(androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage);
+    method public androidx.wear.watchface.complications.data.GoalProgressComplicationData.Builder setSmallImage(androidx.wear.watchface.complications.data.SmallImage? smallImage);
     method public androidx.wear.watchface.complications.data.GoalProgressComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.watchface.complications.data.GoalProgressComplicationData.Builder setText(androidx.wear.watchface.complications.data.ComplicationText? text);
     method public androidx.wear.watchface.complications.data.GoalProgressComplicationData.Builder setTitle(androidx.wear.watchface.complications.data.ComplicationText? title);
@@ -238,9 +244,11 @@
 
   public final class NoPermissionComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
     method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
+    method public androidx.wear.watchface.complications.data.SmallImage? getSmallImage();
     method public androidx.wear.watchface.complications.data.ComplicationText? getText();
     method public androidx.wear.watchface.complications.data.ComplicationText? getTitle();
     property public final androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage;
+    property public final androidx.wear.watchface.complications.data.SmallImage? smallImage;
     property public final androidx.wear.watchface.complications.data.ComplicationText? text;
     property public final androidx.wear.watchface.complications.data.ComplicationText? title;
     field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
@@ -251,6 +259,7 @@
     method public androidx.wear.watchface.complications.data.NoPermissionComplicationData build();
     method public androidx.wear.watchface.complications.data.NoPermissionComplicationData.Builder setDataSource(android.content.ComponentName? dataSource);
     method public androidx.wear.watchface.complications.data.NoPermissionComplicationData.Builder setMonochromaticImage(androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage);
+    method public androidx.wear.watchface.complications.data.NoPermissionComplicationData.Builder setSmallImage(androidx.wear.watchface.complications.data.SmallImage? smallImage);
     method public androidx.wear.watchface.complications.data.NoPermissionComplicationData.Builder setText(androidx.wear.watchface.complications.data.ComplicationText? text);
     method public androidx.wear.watchface.complications.data.NoPermissionComplicationData.Builder setTitle(androidx.wear.watchface.complications.data.ComplicationText? title);
   }
@@ -316,6 +325,7 @@
     method public float getMax();
     method public float getMin();
     method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
+    method public androidx.wear.watchface.complications.data.SmallImage? getSmallImage();
     method public androidx.wear.watchface.complications.data.ComplicationText? getText();
     method public androidx.wear.watchface.complications.data.ComplicationText? getTitle();
     method public float getValue();
@@ -324,6 +334,7 @@
     property public final float max;
     property public final float min;
     property public final androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage;
+    property public final androidx.wear.watchface.complications.data.SmallImage? smallImage;
     property public final androidx.wear.watchface.complications.data.ComplicationText? text;
     property public final androidx.wear.watchface.complications.data.ComplicationText? title;
     property public final float value;
@@ -337,6 +348,7 @@
     method @androidx.wear.watchface.complications.data.ComplicationExperimental public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setColorRamp(androidx.wear.watchface.complications.data.ColorRamp? colorRamp);
     method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setDataSource(android.content.ComponentName? dataSource);
     method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setMonochromaticImage(androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage);
+    method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setSmallImage(androidx.wear.watchface.complications.data.SmallImage? smallImage);
     method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setText(androidx.wear.watchface.complications.data.ComplicationText? text);
     method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setTitle(androidx.wear.watchface.complications.data.ComplicationText? title);
@@ -346,10 +358,12 @@
   public final class ShortTextComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
     method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
     method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
+    method public androidx.wear.watchface.complications.data.SmallImage? getSmallImage();
     method public androidx.wear.watchface.complications.data.ComplicationText getText();
     method public androidx.wear.watchface.complications.data.ComplicationText? getTitle();
     property public final androidx.wear.watchface.complications.data.ComplicationText? contentDescription;
     property public final androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage;
+    property public final androidx.wear.watchface.complications.data.SmallImage? smallImage;
     property public final androidx.wear.watchface.complications.data.ComplicationText text;
     property public final androidx.wear.watchface.complications.data.ComplicationText? title;
     field public static final int MAX_TEXT_LENGTH;
@@ -361,6 +375,7 @@
     method public androidx.wear.watchface.complications.data.ShortTextComplicationData build();
     method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setDataSource(android.content.ComponentName? dataSource);
     method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setMonochromaticImage(androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage);
+    method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setSmallImage(androidx.wear.watchface.complications.data.SmallImage? smallImage);
     method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setTitle(androidx.wear.watchface.complications.data.ComplicationText? title);
     method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setValidTimeRange(androidx.wear.watchface.complications.data.TimeRange? validTimeRange);
@@ -484,11 +499,13 @@
     method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
     method public java.util.List<androidx.wear.watchface.complications.data.WeightedElementsComplicationData.Element> getElements();
     method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
+    method public androidx.wear.watchface.complications.data.SmallImage? getSmallImage();
     method public androidx.wear.watchface.complications.data.ComplicationText? getText();
     method public androidx.wear.watchface.complications.data.ComplicationText? getTitle();
     property public final androidx.wear.watchface.complications.data.ComplicationText? contentDescription;
     property public final java.util.List<androidx.wear.watchface.complications.data.WeightedElementsComplicationData.Element> elements;
     property public final androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage;
+    property public final androidx.wear.watchface.complications.data.SmallImage? smallImage;
     property public final androidx.wear.watchface.complications.data.ComplicationText? text;
     property public final androidx.wear.watchface.complications.data.ComplicationText? title;
     field public static final java.util.List<androidx.wear.watchface.complications.data.WeightedElementsComplicationData.Element> PLACEHOLDER;
@@ -500,6 +517,7 @@
     method public androidx.wear.watchface.complications.data.WeightedElementsComplicationData build();
     method public androidx.wear.watchface.complications.data.WeightedElementsComplicationData.Builder setDataSource(android.content.ComponentName? dataSource);
     method public androidx.wear.watchface.complications.data.WeightedElementsComplicationData.Builder setMonochromaticImage(androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage);
+    method public androidx.wear.watchface.complications.data.WeightedElementsComplicationData.Builder setSmallImage(androidx.wear.watchface.complications.data.SmallImage? smallImage);
     method public androidx.wear.watchface.complications.data.WeightedElementsComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.watchface.complications.data.WeightedElementsComplicationData.Builder setText(androidx.wear.watchface.complications.data.ComplicationText? text);
     method public androidx.wear.watchface.complications.data.WeightedElementsComplicationData.Builder setTitle(androidx.wear.watchface.complications.data.ComplicationText? title);
diff --git a/wear/watchface/watchface-complications-data/api/restricted_current.ignore b/wear/watchface/watchface-complications-data/api/restricted_current.ignore
index 58469b1..6d9ba01 100644
--- a/wear/watchface/watchface-complications-data/api/restricted_current.ignore
+++ b/wear/watchface/watchface-complications-data/api/restricted_current.ignore
@@ -1,21 +1,3 @@
 // Baseline format: 1.0
-RemovedMethod: androidx.wear.watchface.complications.data.EmptyComplicationData#asWireComplicationData():
-    Removed method androidx.wear.watchface.complications.data.EmptyComplicationData.asWireComplicationData()
-RemovedMethod: androidx.wear.watchface.complications.data.LongTextComplicationData#asWireComplicationData():
-    Removed method androidx.wear.watchface.complications.data.LongTextComplicationData.asWireComplicationData()
-RemovedMethod: androidx.wear.watchface.complications.data.MonochromaticImageComplicationData#asWireComplicationData():
-    Removed method androidx.wear.watchface.complications.data.MonochromaticImageComplicationData.asWireComplicationData()
-RemovedMethod: androidx.wear.watchface.complications.data.NoDataComplicationData#asWireComplicationData():
-    Removed method androidx.wear.watchface.complications.data.NoDataComplicationData.asWireComplicationData()
-RemovedMethod: androidx.wear.watchface.complications.data.NoPermissionComplicationData#asWireComplicationData():
-    Removed method androidx.wear.watchface.complications.data.NoPermissionComplicationData.asWireComplicationData()
-RemovedMethod: androidx.wear.watchface.complications.data.NotConfiguredComplicationData#asWireComplicationData():
-    Removed method androidx.wear.watchface.complications.data.NotConfiguredComplicationData.asWireComplicationData()
-RemovedMethod: androidx.wear.watchface.complications.data.PhotoImageComplicationData#asWireComplicationData():
-    Removed method androidx.wear.watchface.complications.data.PhotoImageComplicationData.asWireComplicationData()
-RemovedMethod: androidx.wear.watchface.complications.data.RangedValueComplicationData#asWireComplicationData():
-    Removed method androidx.wear.watchface.complications.data.RangedValueComplicationData.asWireComplicationData()
-RemovedMethod: androidx.wear.watchface.complications.data.ShortTextComplicationData#asWireComplicationData():
-    Removed method androidx.wear.watchface.complications.data.ShortTextComplicationData.asWireComplicationData()
-RemovedMethod: androidx.wear.watchface.complications.data.SmallImageComplicationData#asWireComplicationData():
-    Removed method androidx.wear.watchface.complications.data.SmallImageComplicationData.asWireComplicationData()
+RemovedClass: androidx.wear.watchface.complications.data.DefaultComplicationDataSourcePolicyWireFormat:
+    Removed class androidx.wear.watchface.complications.data.DefaultComplicationDataSourcePolicyWireFormat
diff --git a/wear/watchface/watchface-complications-data/api/restricted_current.txt b/wear/watchface/watchface-complications-data/api/restricted_current.txt
index dfe4444..2cbf36c 100644
--- a/wear/watchface/watchface-complications-data/api/restricted_current.txt
+++ b/wear/watchface/watchface-complications-data/api/restricted_current.txt
@@ -60,18 +60,6 @@
   public final class DataKt {
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public final class DefaultComplicationDataSourcePolicyWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
-    ctor public DefaultComplicationDataSourcePolicyWireFormat(java.util.List<android.content.ComponentName!>, int, int, int, int);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.complications.data.DefaultComplicationDataSourcePolicyWireFormat!>! CREATOR;
-    field @androidx.versionedparcelable.ParcelField(1) public java.util.List<android.content.ComponentName!> mDefaultDataSourcesToTry;
-    field @androidx.versionedparcelable.ParcelField(3) public int mDefaultType;
-    field @androidx.versionedparcelable.ParcelField(2) public int mFallbackSystemDataSource;
-    field @androidx.versionedparcelable.ParcelField(4) public int mPrimaryDataSourceDefaultType;
-    field @androidx.versionedparcelable.ParcelField(5) public int mSecondaryDataSourceDefaultType;
-  }
-
   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;
@@ -147,9 +135,11 @@
 
   public final class NoPermissionComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
     method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
+    method public androidx.wear.watchface.complications.data.SmallImage? getSmallImage();
     method public androidx.wear.watchface.complications.data.ComplicationText? getText();
     method public androidx.wear.watchface.complications.data.ComplicationText? getTitle();
     property public final androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage;
+    property public final androidx.wear.watchface.complications.data.SmallImage? smallImage;
     property public final androidx.wear.watchface.complications.data.ComplicationText? text;
     property public final androidx.wear.watchface.complications.data.ComplicationText? title;
     field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
@@ -160,6 +150,7 @@
     method public androidx.wear.watchface.complications.data.NoPermissionComplicationData build();
     method public androidx.wear.watchface.complications.data.NoPermissionComplicationData.Builder setDataSource(android.content.ComponentName? dataSource);
     method public androidx.wear.watchface.complications.data.NoPermissionComplicationData.Builder setMonochromaticImage(androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage);
+    method public androidx.wear.watchface.complications.data.NoPermissionComplicationData.Builder setSmallImage(androidx.wear.watchface.complications.data.SmallImage? smallImage);
     method public androidx.wear.watchface.complications.data.NoPermissionComplicationData.Builder setText(androidx.wear.watchface.complications.data.ComplicationText? text);
     method public androidx.wear.watchface.complications.data.NoPermissionComplicationData.Builder setTitle(androidx.wear.watchface.complications.data.ComplicationText? title);
   }
@@ -204,6 +195,7 @@
     method public float getMax();
     method public float getMin();
     method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
+    method public androidx.wear.watchface.complications.data.SmallImage? getSmallImage();
     method public androidx.wear.watchface.complications.data.ComplicationText? getText();
     method public androidx.wear.watchface.complications.data.ComplicationText? getTitle();
     method public float getValue();
@@ -211,6 +203,7 @@
     property public final float max;
     property public final float min;
     property public final androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage;
+    property public final androidx.wear.watchface.complications.data.SmallImage? smallImage;
     property public final androidx.wear.watchface.complications.data.ComplicationText? text;
     property public final androidx.wear.watchface.complications.data.ComplicationText? title;
     property public final float value;
@@ -223,6 +216,7 @@
     method public androidx.wear.watchface.complications.data.RangedValueComplicationData build();
     method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setDataSource(android.content.ComponentName? dataSource);
     method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setMonochromaticImage(androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage);
+    method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setSmallImage(androidx.wear.watchface.complications.data.SmallImage? smallImage);
     method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setText(androidx.wear.watchface.complications.data.ComplicationText? text);
     method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setTitle(androidx.wear.watchface.complications.data.ComplicationText? title);
@@ -232,10 +226,12 @@
   public final class ShortTextComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
     method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
     method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
+    method public androidx.wear.watchface.complications.data.SmallImage? getSmallImage();
     method public androidx.wear.watchface.complications.data.ComplicationText getText();
     method public androidx.wear.watchface.complications.data.ComplicationText? getTitle();
     property public final androidx.wear.watchface.complications.data.ComplicationText? contentDescription;
     property public final androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage;
+    property public final androidx.wear.watchface.complications.data.SmallImage? smallImage;
     property public final androidx.wear.watchface.complications.data.ComplicationText text;
     property public final androidx.wear.watchface.complications.data.ComplicationText? title;
     field public static final int MAX_TEXT_LENGTH;
@@ -247,6 +243,7 @@
     method public androidx.wear.watchface.complications.data.ShortTextComplicationData build();
     method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setDataSource(android.content.ComponentName? dataSource);
     method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setMonochromaticImage(androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage);
+    method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setSmallImage(androidx.wear.watchface.complications.data.SmallImage? smallImage);
     method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setTitle(androidx.wear.watchface.complications.data.ComplicationText? title);
     method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setValidTimeRange(androidx.wear.watchface.complications.data.TimeRange? validTimeRange);
diff --git a/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/ComplicationData.java b/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/ComplicationData.java
index f2876d3..ec2444f 100644
--- a/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/ComplicationData.java
+++ b/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/ComplicationData.java
@@ -370,6 +370,9 @@
                     FIELD_SHORT_TITLE,
                     FIELD_ICON,
                     FIELD_ICON_BURN_IN_PROTECTION,
+                    FIELD_SMALL_IMAGE,
+                    FIELD_SMALL_IMAGE_BURN_IN_PROTECTION,
+                    FIELD_IMAGE_STYLE,
                     FIELD_TAP_ACTION,
                     FIELD_CONTENT_DESCRIPTION,
                     FIELD_DATA_SOURCE
@@ -390,6 +393,9 @@
                     FIELD_SHORT_TITLE,
                     FIELD_ICON,
                     FIELD_ICON_BURN_IN_PROTECTION,
+                    FIELD_SMALL_IMAGE,
+                    FIELD_SMALL_IMAGE_BURN_IN_PROTECTION,
+                    FIELD_IMAGE_STYLE,
                     FIELD_TAP_ACTION,
                     FIELD_CONTENT_DESCRIPTION,
                     FIELD_DATA_SOURCE,
@@ -416,6 +422,9 @@
                     FIELD_SHORT_TITLE,
                     FIELD_ICON,
                     FIELD_ICON_BURN_IN_PROTECTION,
+                    FIELD_SMALL_IMAGE,
+                    FIELD_SMALL_IMAGE_BURN_IN_PROTECTION,
+                    FIELD_IMAGE_STYLE,
                     FIELD_CONTENT_DESCRIPTION,
                     FIELD_DATA_SOURCE
             }, // TYPE_NO_PERMISSION
@@ -453,6 +462,9 @@
                     FIELD_SHORT_TITLE,
                     FIELD_ICON,
                     FIELD_ICON_BURN_IN_PROTECTION,
+                    FIELD_SMALL_IMAGE,
+                    FIELD_SMALL_IMAGE_BURN_IN_PROTECTION,
+                    FIELD_IMAGE_STYLE,
                     FIELD_TAP_ACTION,
                     FIELD_CONTENT_DESCRIPTION,
                     FIELD_DATA_SOURCE,
@@ -464,6 +476,9 @@
                     FIELD_SHORT_TITLE,
                     FIELD_ICON,
                     FIELD_ICON_BURN_IN_PROTECTION,
+                    FIELD_SMALL_IMAGE,
+                    FIELD_SMALL_IMAGE_BURN_IN_PROTECTION,
+                    FIELD_IMAGE_STYLE,
                     FIELD_TAP_ACTION,
                     FIELD_CONTENT_DESCRIPTION,
                     FIELD_DATA_SOURCE,
@@ -473,6 +488,9 @@
                     FIELD_SHORT_TITLE,
                     FIELD_ICON,
                     FIELD_ICON_BURN_IN_PROTECTION,
+                    FIELD_SMALL_IMAGE,
+                    FIELD_SMALL_IMAGE_BURN_IN_PROTECTION,
+                    FIELD_IMAGE_STYLE,
                     FIELD_TAP_ACTION,
                     FIELD_CONTENT_DESCRIPTION,
                     FIELD_DATA_SOURCE,
@@ -518,7 +536,7 @@
 
     @RequiresApi(api = Build.VERSION_CODES.P)
     private static class SerializedForm implements Serializable {
-        private static final int VERSION_NUMBER = 14;
+        private static final int VERSION_NUMBER = 15;
 
         @NonNull
         ComplicationData mComplicationData;
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 84217e3..02a8d14 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
@@ -303,6 +303,12 @@
  * 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
+ * [monochromaticImage] and apply a tint. If the complication is rendered with multiple colors it's
+ * recommended to choose the [smallImage]. It's best practice for a ComplicationDataSource to
+ * 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
@@ -323,12 +329,17 @@
  * 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 contentDescription The content description field for accessibility.
  */
 public class ShortTextComplicationData internal constructor(
     public val text: ComplicationText,
     public val title: ComplicationText?,
     public val monochromaticImage: MonochromaticImage?,
+    public val smallImage: SmallImage?,
     public val contentDescription: ComplicationText?,
     tapAction: PendingIntent?,
     validTimeRange: TimeRange?,
@@ -357,6 +368,7 @@
         private var validTimeRange: TimeRange? = null
         private var title: ComplicationText? = null
         private var monochromaticImage: MonochromaticImage? = null
+        private var smallImage: SmallImage? = null
         private var cachedWireComplicationData: WireComplicationData? = null
         private var dataSource: ComponentName? = null
 
@@ -381,6 +393,11 @@
             this.monochromaticImage = monochromaticImage
         }
 
+        /** Sets optional image associated with the complication data. */
+        public fun setSmallImage(smallImage: SmallImage?): Builder = apply {
+            this.smallImage = smallImage
+        }
+
         /**
          * Sets the [ComponentName] of the ComplicationDataSourceService that provided this
          * ComplicationData, if any.
@@ -404,6 +421,7 @@
                 text,
                 title,
                 monochromaticImage,
+                smallImage,
                 contentDescription,
                 tapAction,
                 validTimeRange,
@@ -433,6 +451,7 @@
             }
         )
         monochromaticImage?.addToWireComplicationData(builder)
+        smallImage?.addToWireComplicationData(builder)
         builder.setTapAction(tapAction)
         setValidTimeRange(validTimeRange, builder)
         builder.setTapActionLostDueToSerialization(tapActionLostDueToSerialization)
@@ -447,6 +466,7 @@
         if (text != other.text) return false
         if (title != other.title) return false
         if (monochromaticImage != other.monochromaticImage) return false
+        if (smallImage != other.smallImage) return false
         if (contentDescription != other.contentDescription) return false
         if (tapActionLostDueToSerialization != other.tapActionLostDueToSerialization) return false
         if (tapAction != other.tapAction) return false
@@ -460,6 +480,7 @@
         var result = text.hashCode()
         result = 31 * result + (title?.hashCode() ?: 0)
         result = 31 * result + (monochromaticImage?.hashCode() ?: 0)
+        result = 31 * result + (smallImage?.hashCode() ?: 0)
         result = 31 * result + (contentDescription?.hashCode() ?: 0)
         result = 31 * result + tapActionLostDueToSerialization.hashCode()
         result = 31 * result + (tapAction?.hashCode() ?: 0)
@@ -470,13 +491,14 @@
 
     override fun toString(): String {
         return "ShortTextComplicationData(text=$text, title=$title, " +
-            "monochromaticImage=$monochromaticImage, contentDescription=$contentDescription, " +
+            "monochromaticImage=$monochromaticImage, smallImage=$smallImage, " +
+            "contentDescription=$contentDescription, " +
             "tapActionLostDueToSerialization=$tapActionLostDueToSerialization, " +
             "tapAction=$tapAction, validTimeRange=$validTimeRange, dataSource=$dataSource)"
     }
 
     override fun hasPlaceholderFields() = text.isPlaceholder() || title?.isPlaceholder() == true ||
-        monochromaticImage?.isPlaceholder() == true
+        monochromaticImage?.isPlaceholder() == true || smallImage?.isPlaceholder() == true
 
     override fun getNextChangeInstant(afterInstant: Instant): Instant {
         if (title != null) {
@@ -512,7 +534,11 @@
  *
  * The title, if provided, it is expected that this field will be displayed.
  *
- * If at least one of the icon and image is provided, one of these should 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
+ * [monochromaticImage] and apply a tint. If the complication is rendered with multiple colors it's
+ * recommended to choose the [smallImage]. It's best practice for a ComplicationDataSource to
+ * 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
@@ -778,6 +804,12 @@
  * 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
+ * [monochromaticImage] and apply a tint. If the complication is rendered with multiple colors it's
+ * recommended to choose the [smallImage]. It's best practice for a ComplicationDataSource to
+ * 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
@@ -788,6 +820,10 @@
  * 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
@@ -812,6 +848,7 @@
     public val min: Float,
     public val max: Float,
     public val monochromaticImage: MonochromaticImage?,
+    public val smallImage: SmallImage?,
     public val title: ComplicationText?,
     public val text: ComplicationText?,
     public val contentDescription: ComplicationText?,
@@ -879,7 +916,7 @@
      * Builder for [RangedValueComplicationData].
      *
      * You must at a minimum set the [value], [min], [max] and [contentDescription] fields and at
-     * least one of [monochromaticImage], [text] or [title].
+     * least one of [monochromaticImage], [smallImage], [text] or [title].
      *
      * @param value The value of the ranged complication which should be in the range
      * [[min]] .. [[max]]
@@ -897,6 +934,7 @@
         private var tapAction: PendingIntent? = null
         private var validTimeRange: TimeRange? = null
         private var monochromaticImage: MonochromaticImage? = null
+        private var smallImage: SmallImage? = null
         private var title: ComplicationText? = null
         private var text: ComplicationText? = null
         private var cachedWireComplicationData: WireComplicationData? = null
@@ -926,6 +964,11 @@
             this.monochromaticImage = monochromaticImage
         }
 
+        /** Sets optional image associated with the complication data. */
+        public fun setSmallImage(smallImage: SmallImage?): Builder = apply {
+            this.smallImage = smallImage
+        }
+
         /** Sets optional title associated with the complication data. */
         public fun setTitle(title: ComplicationText?): Builder = apply {
             this.title = title
@@ -965,14 +1008,17 @@
         /** Builds the [RangedValueComplicationData]. */
         @OptIn(ComplicationExperimental::class)
         public fun build(): RangedValueComplicationData {
-            require(monochromaticImage != null || text != null || title != null) {
-                "At least one of monochromaticImage, text or title must be set"
+            require(
+                monochromaticImage != null || smallImage != null || text != null || title != null
+            ) {
+                "At least one of monochromaticImage, smallImage, text or title must be set"
             }
             return RangedValueComplicationData(
                 value,
                 min,
                 max,
                 monochromaticImage,
+                smallImage,
                 title,
                 text,
                 contentDescription,
@@ -1002,6 +1048,7 @@
         builder.setRangedMinValue(min)
         builder.setRangedMaxValue(max)
         monochromaticImage?.addToWireComplicationData(builder)
+        smallImage?.addToWireComplicationData(builder)
         builder.setShortText(text?.toWireComplicationText())
         builder.setShortTitle(title?.toWireComplicationText())
         builder.setTapAction(tapAction)
@@ -1030,6 +1077,7 @@
         if (min != other.min) return false
         if (max != other.max) return false
         if (monochromaticImage != other.monochromaticImage) return false
+        if (smallImage != other.smallImage) return false
         if (title != other.title) return false
         if (text != other.text) return false
         if (contentDescription != other.contentDescription) return false
@@ -1048,6 +1096,7 @@
         result = 31 * result + min.hashCode()
         result = 31 * result + max.hashCode()
         result = 31 * result + (monochromaticImage?.hashCode() ?: 0)
+        result = 31 * result + (smallImage?.hashCode() ?: 0)
         result = 31 * result + (title?.hashCode() ?: 0)
         result = 31 * result + (text?.hashCode() ?: 0)
         result = 31 * result + (contentDescription?.hashCode() ?: 0)
@@ -1067,15 +1116,16 @@
             value.toString()
         }
         return "RangedValueComplicationData(value=$valueString, min=$min, max=$max, " +
-            "monochromaticImage=$monochromaticImage, title=$title, text=$text, " +
-            "contentDescription=$contentDescription), " +
+            "monochromaticImage=$monochromaticImage, smallImage=$smallImage, title=$title, " +
+            "text=$text, contentDescription=$contentDescription), " +
             "tapActionLostDueToSerialization=$tapActionLostDueToSerialization, " +
             "tapAction=$tapAction, validTimeRange=$validTimeRange, dataSource=$dataSource, " +
             "colorRamp=$colorRamp)"
     }
 
     override fun hasPlaceholderFields() = value == PLACEHOLDER || text?.isPlaceholder() == true ||
-        title?.isPlaceholder() == true || monochromaticImage?.isPlaceholder() == true
+        title?.isPlaceholder() == true || monochromaticImage?.isPlaceholder() == true ||
+        smallImage?.isPlaceholder() == true
 
     override fun getNextChangeInstant(afterInstant: Instant): Instant {
         val titleChangeInstant = title?.getNextChangeTime(afterInstant) ?: Instant.MAX
@@ -1118,6 +1168,12 @@
  * 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
+ * [monochromaticImage] and apply a tint. If the complication is rendered with multiple colors it's
+ * recommended to choose the [smallImage]. It's best practice for a ComplicationDataSource to
+ * specify both a [monochromaticImage] and a [smallImage].
+ *
  * @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
@@ -1127,6 +1183,10 @@
  * 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
@@ -1151,6 +1211,7 @@
     public val value: Float,
     public val targetValue: Float,
     public val monochromaticImage: MonochromaticImage?,
+    public val smallImage: SmallImage?,
     public val title: ComplicationText?,
     public val text: ComplicationText?,
     public val contentDescription: ComplicationText?,
@@ -1176,7 +1237,7 @@
      * Builder for [GoalProgressComplicationData].
      *
      * You must at a minimum set the [value], [targetValue] and [contentDescription] fields and at
-     * least one of [monochromaticImage], [text] or [title].
+     * least one of [monochromaticImage], [smallImage], [text] or [title].
      *
      * @param value The value of the ranged complication which should be >= 0.
      * @param targetValue The target value. This must be less than [Float.MAX_VALUE].
@@ -1191,6 +1252,7 @@
         private var tapAction: PendingIntent? = null
         private var validTimeRange: TimeRange? = null
         private var monochromaticImage: MonochromaticImage? = null
+        private var smallImage: SmallImage? = null
         private var title: ComplicationText? = null
         private var text: ComplicationText? = null
         private var cachedWireComplicationData: WireComplicationData? = null
@@ -1220,6 +1282,11 @@
             this.monochromaticImage = monochromaticImage
         }
 
+        /** Sets optional image associated with the complication data. */
+        public fun setSmallImage(smallImage: SmallImage?): Builder = apply {
+            this.smallImage = smallImage
+        }
+
         /** Sets optional title associated with the complication data. */
         public fun setTitle(title: ComplicationText?): Builder = apply {
             this.title = title
@@ -1259,13 +1326,16 @@
         /** Builds the [GoalProgressComplicationData]. */
         @OptIn(ComplicationExperimental::class)
         public fun build(): GoalProgressComplicationData {
-            require(monochromaticImage != null || text != null || title != null) {
-                "At least one of monochromaticImage, text or title must be set"
+            require(
+                monochromaticImage != null || smallImage != null || text != null || title != null
+            ) {
+                "At least one of monochromaticImage, smallImage, text or title must be set"
             }
             return GoalProgressComplicationData(
                 value,
                 targetValue,
                 monochromaticImage,
+                smallImage,
                 title,
                 text,
                 contentDescription,
@@ -1294,6 +1364,7 @@
         builder.setRangedValue(value)
         builder.setTargetValue(targetValue)
         monochromaticImage?.addToWireComplicationData(builder)
+        smallImage?.addToWireComplicationData(builder)
         builder.setShortText(text?.toWireComplicationText())
         builder.setShortTitle(title?.toWireComplicationText())
         builder.setTapAction(tapAction)
@@ -1321,6 +1392,7 @@
         if (value != other.value) return false
         if (targetValue != other.targetValue) return false
         if (monochromaticImage != other.monochromaticImage) return false
+        if (smallImage != other.smallImage) return false
         if (title != other.title) return false
         if (text != other.text) return false
         if (contentDescription != other.contentDescription) return false
@@ -1338,6 +1410,7 @@
         var result = value.hashCode()
         result = 31 * result + targetValue.hashCode()
         result = 31 * result + (monochromaticImage?.hashCode() ?: 0)
+        result = 31 * result + (smallImage?.hashCode() ?: 0)
         result = 31 * result + (title?.hashCode() ?: 0)
         result = 31 * result + (text?.hashCode() ?: 0)
         result = 31 * result + (contentDescription?.hashCode() ?: 0)
@@ -1357,15 +1430,16 @@
             value.toString()
         }
         return "GoalProgressComplicationData(value=$valueString, targetValue=$targetValue, " +
-            "monochromaticImage=$monochromaticImage, title=$title, text=$text, " +
-            "contentDescription=$contentDescription), " +
+            "monochromaticImage=$monochromaticImage, smallImage=$smallImage, title=$title, " +
+            "text=$text, contentDescription=$contentDescription), " +
             "tapActionLostDueToSerialization=$tapActionLostDueToSerialization, " +
             "tapAction=$tapAction, validTimeRange=$validTimeRange, dataSource=$dataSource, " +
             "colorRamp=$colorRamp)"
     }
 
     override fun hasPlaceholderFields() = value == PLACEHOLDER || text?.isPlaceholder() == true ||
-        title?.isPlaceholder() == true || monochromaticImage?.isPlaceholder() == true
+        title?.isPlaceholder() == true || monochromaticImage?.isPlaceholder() == true ||
+        smallImage?.isPlaceholder() == true
 
     override fun getNextChangeInstant(afterInstant: Instant): Instant {
         val titleChangeInstant = title?.getNextChangeTime(afterInstant) ?: Instant.MAX
@@ -1404,8 +1478,14 @@
  *
  * The [elements] field is required for this type and is expected to always be displayed.
  *
- * The icon, title, and text fields are optional but at least one of them must be set. The watch
- * face may choose which of these fields to display, if any.
+ * The [monochromaticImage], [smallImage], [title], and [text] fields are optional but at least one
+ * of them must be set. 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
+ * [monochromaticImage] and apply a tint. If the complication is rendered with multiple colors it's
+ * recommended to choose the [smallImage]. It's best practice for a ComplicationDataSource to
+ * 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... If this is equal to [PLACEHOLDER] then
@@ -1415,6 +1495,10 @@
  * 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
@@ -1438,6 +1522,7 @@
 internal constructor(
     public val elements: List<Element>,
     public val monochromaticImage: MonochromaticImage?,
+    public val smallImage: SmallImage?,
     public val title: ComplicationText?,
     public val text: ComplicationText?,
     public val contentDescription: ComplicationText?,
@@ -1498,7 +1583,7 @@
      * Builder for [WeightedElementsComplicationData].
      *
      * You must at a minimum set the [elements] field and at least one of [monochromaticImage],
-     * [text] or [title].
+     * [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
@@ -1513,6 +1598,7 @@
         private var tapAction: PendingIntent? = null
         private var validTimeRange: TimeRange? = null
         private var monochromaticImage: MonochromaticImage? = null
+        private var smallImage: SmallImage? = null
         private var title: ComplicationText? = null
         private var text: ComplicationText? = null
         private var cachedWireComplicationData: WireComplicationData? = null
@@ -1534,6 +1620,11 @@
             this.monochromaticImage = monochromaticImage
         }
 
+        /** Sets optional image associated with the complication data. */
+        public fun setSmallImage(smallImage: SmallImage?): Builder = apply {
+            this.smallImage = smallImage
+        }
+
         /** Sets optional title associated with the complication data. */
         public fun setTitle(title: ComplicationText?): Builder = apply {
             this.title = title
@@ -1564,12 +1655,15 @@
         /** Builds the [GoalProgressComplicationData]. */
         @OptIn(ComplicationExperimental::class)
         public fun build(): WeightedElementsComplicationData {
-            require(monochromaticImage != null || text != null || title != null) {
-                "At least one of monochromaticImage, text or title must be set"
+            require(
+                monochromaticImage != null || smallImage != null || text != null || title != null
+            ) {
+                "At least one of monochromaticImage, smallImage, text or title must be set"
             }
             return WeightedElementsComplicationData(
                 elements,
                 monochromaticImage,
+                smallImage,
                 title,
                 text,
                 contentDescription,
@@ -1597,6 +1691,7 @@
         builder.setElementWeights(elements.map { it.weight }.toFloatArray())
         builder.setElementColors(elements.map { it.color }.toIntArray())
         monochromaticImage?.addToWireComplicationData(builder)
+        smallImage?.addToWireComplicationData(builder)
         builder.setShortText(text?.toWireComplicationText())
         builder.setShortTitle(title?.toWireComplicationText())
         builder.setTapAction(tapAction)
@@ -1628,15 +1723,15 @@
             elements.joinToString()
         }
         return "WeightedElementsComplicationData(elements=$elementsString, " +
-            "monochromaticImage=$monochromaticImage, title=$title, text=$text, " +
-            "contentDescription=$contentDescription), " +
+            "monochromaticImage=$monochromaticImage, smallImage=$smallImage, title=$title, " +
+            "text=$text, contentDescription=$contentDescription), " +
             "tapActionLostDueToSerialization=$tapActionLostDueToSerialization, " +
             "tapAction=$tapAction, validTimeRange=$validTimeRange, dataSource=$dataSource)"
     }
 
     override fun hasPlaceholderFields() = elements == PLACEHOLDER ||
         text?.isPlaceholder() == true || title?.isPlaceholder() == true ||
-        monochromaticImage?.isPlaceholder() == true
+        monochromaticImage?.isPlaceholder() == true || smallImage?.isPlaceholder() == true
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
@@ -1646,6 +1741,7 @@
 
         if (elements != other.elements) return false
         if (monochromaticImage != other.monochromaticImage) return false
+        if (smallImage != other.smallImage) return false
         if (title != other.title) return false
         if (text != other.text) return false
         if (contentDescription != other.contentDescription) return false
@@ -1656,6 +1752,7 @@
     override fun hashCode(): Int {
         var result = elements.hashCode()
         result = 31 * result + (monochromaticImage?.hashCode() ?: 0)
+        result = 31 * result + (smallImage?.hashCode() ?: 0)
         result = 31 * result + (title?.hashCode() ?: 0)
         result = 31 * result + (text?.hashCode() ?: 0)
         result = 31 * result + (contentDescription?.hashCode() ?: 0)
@@ -1696,6 +1793,12 @@
  * ramp, this is because the ranged value is expected to be rendered using solid colored segments
  * with watch face selected colors.
  *
+ * 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
+ * [monochromaticImage] and apply a tint. If the complication is rendered with multiple colors it's
+ * recommended to choose the [smallImage]. It's best practice for a ComplicationDataSource to
+ * specify both a [monochromaticImage] and a [smallImage].
+ *
  * @property value The [Int] 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
@@ -1731,6 +1834,7 @@
     public val min: Int,
     public val max: Int,
     public val monochromaticImage: MonochromaticImage?,
+    public val smallImage: SmallImage?,
     public val title: ComplicationText?,
     public val text: ComplicationText?,
     public val contentDescription: ComplicationText?,
@@ -1749,7 +1853,7 @@
      * Builder for [DiscreteRangedValueComplicationData].
      *
      * You must at a minimum set the [value], [min], [max] and [contentDescription] fields and at
-     * least one of [monochromaticImage], [text] or [title].
+     * least one of [monochromaticImage], [smallImage], [text] or [title].
      *
      * @param value The value of the ranged complication which should be in the range
      * [[min]] .. [[max]]
@@ -1767,6 +1871,7 @@
         private var tapAction: PendingIntent? = null
         private var validTimeRange: TimeRange? = null
         private var monochromaticImage: MonochromaticImage? = null
+        private var smallImage: SmallImage? = null
         private var title: ComplicationText? = null
         private var text: ComplicationText? = null
         private var cachedWireComplicationData: WireComplicationData? = null
@@ -1794,6 +1899,11 @@
             this.monochromaticImage = monochromaticImage
         }
 
+        /** Sets optional image associated with the complication data. */
+        public fun setSmallImage(smallImage: SmallImage?): Builder = apply {
+            this.smallImage = smallImage
+        }
+
         /** Sets optional title associated with the complication data. */
         public fun setTitle(title: ComplicationText?): Builder = apply {
             this.title = title
@@ -1824,14 +1934,17 @@
         /** Builds the [DiscreteRangedValueComplicationData]. */
         @OptIn(ComplicationExperimental::class)
         public fun build(): DiscreteRangedValueComplicationData {
-            require(monochromaticImage != null || text != null || title != null) {
-                "At least one of monochromaticImage, text or title must be set"
+            require(
+                monochromaticImage != null || smallImage != null || text != null || title != null
+            ) {
+                "At least one of monochromaticImage, smallImage, text or title must be set"
             }
             return DiscreteRangedValueComplicationData(
                 value,
                 min,
                 max,
                 monochromaticImage,
+                smallImage,
                 title,
                 text,
                 contentDescription,
@@ -1859,6 +1972,7 @@
         builder.setDiscreteRangedMinValue(min)
         builder.setDiscreteRangedMaxValue(max)
         monochromaticImage?.addToWireComplicationData(builder)
+        smallImage?.addToWireComplicationData(builder)
         builder.setShortText(text?.toWireComplicationText())
         builder.setShortTitle(title?.toWireComplicationText())
         builder.setTapAction(tapAction)
@@ -1883,6 +1997,7 @@
         if (min != other.min) return false
         if (max != other.max) return false
         if (monochromaticImage != other.monochromaticImage) return false
+        if (smallImage != other.smallImage) return false
         if (title != other.title) return false
         if (text != other.text) return false
         if (contentDescription != other.contentDescription) return false
@@ -1900,6 +2015,7 @@
         result = 31 * result + min.hashCode()
         result = 31 * result + max.hashCode()
         result = 31 * result + (monochromaticImage?.hashCode() ?: 0)
+        result = 31 * result + (smallImage?.hashCode() ?: 0)
         result = 31 * result + (title?.hashCode() ?: 0)
         result = 31 * result + (text?.hashCode() ?: 0)
         result = 31 * result + (contentDescription?.hashCode() ?: 0)
@@ -1917,14 +2033,15 @@
             value.toString()
         }
         return "DiscreteRangedValueComplicationData(value=$valueString, min=$min, max=$max, " +
-            "monochromaticImage=$monochromaticImage, title=$title, text=$text, " +
-            "contentDescription=$contentDescription), " +
+            "monochromaticImage=$monochromaticImage, smallImage=$smallImage, title=$title, " +
+            "text=$text, contentDescription=$contentDescription), " +
             "tapActionLostDueToSerialization=$tapActionLostDueToSerialization, " +
             "tapAction=$tapAction, validTimeRange=$validTimeRange, dataSource=$dataSource)"
     }
 
     override fun hasPlaceholderFields() = value == PLACEHOLDER || text?.isPlaceholder() == true ||
-        title?.isPlaceholder() == true || monochromaticImage?.isPlaceholder() == true
+        title?.isPlaceholder() == true || monochromaticImage?.isPlaceholder() == true ||
+        smallImage?.isPlaceholder() == true
 
     override fun getNextChangeInstant(afterInstant: Instant): Instant {
         val titleChangeInstant = title?.getNextChangeTime(afterInstant) ?: Instant.MAX
@@ -1962,9 +2079,9 @@
  * The image is expected to always be displayed.
  *
  * @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 (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
@@ -2890,11 +3007,14 @@
  * truncated.
  * @property monochromaticImage A simple [MonochromaticImage] image that can be tinted by the watch
  * face.
+ * @property smallImage A [SmallImage] that is expected to cover a small fraction of a watch face
+ * occupied by a single complication
  */
 public class NoPermissionComplicationData internal constructor(
     public val text: ComplicationText?,
     public val title: ComplicationText?,
     public val monochromaticImage: MonochromaticImage?,
+    public val smallImage: SmallImage?,
     cachedWireComplicationData: WireComplicationData?,
     dataSource: ComponentName?
 ) : ComplicationData(
@@ -2910,6 +3030,7 @@
         private var text: ComplicationText? = null
         private var title: ComplicationText? = null
         private var monochromaticImage: MonochromaticImage? = null
+        private var smallImage: SmallImage? = null
         private var cachedWireComplicationData: WireComplicationData? = null
         private var dataSource: ComponentName? = null
 
@@ -2928,6 +3049,11 @@
             this.monochromaticImage = monochromaticImage
         }
 
+        /** Sets optional image associated with the complication data. */
+        public fun setSmallImage(smallImage: SmallImage?): Builder = apply {
+            this.smallImage = smallImage
+        }
+
         /**
          * Sets the [ComponentName] of the ComplicationDataSourceService that provided this
          * ComplicationData, if any.
@@ -2951,6 +3077,7 @@
                 text,
                 title,
                 monochromaticImage,
+                smallImage,
                 cachedWireComplicationData,
                 dataSource
             )
@@ -2966,6 +3093,7 @@
             setShortText(text?.toWireComplicationText())
             setShortTitle(title?.toWireComplicationText())
             monochromaticImage?.addToWireComplicationData(this)
+            smallImage?.addToWireComplicationData(this)
         }.build().also { cachedWireComplicationData = it }
     }
 
@@ -2978,6 +3106,7 @@
         if (text != other.text) return false
         if (title != other.title) return false
         if (monochromaticImage != other.monochromaticImage) return false
+        if (smallImage != other.smallImage) return false
         if (tapActionLostDueToSerialization != other.tapActionLostDueToSerialization) return false
         if (tapAction != other.tapAction) return false
         if (validTimeRange != other.validTimeRange) return false
@@ -2990,6 +3119,7 @@
         var result = text?.hashCode() ?: 0
         result = 31 * result + (title?.hashCode() ?: 0)
         result = 31 * result + (monochromaticImage?.hashCode() ?: 0)
+        result = 31 * result + (smallImage?.hashCode() ?: 0)
         result = 31 * result + tapActionLostDueToSerialization.hashCode()
         result = 31 * result + (tapAction?.hashCode() ?: 0)
         result = 31 * result + validTimeRange.hashCode()
@@ -2999,9 +3129,9 @@
 
     override fun toString(): String {
         return "NoPermissionComplicationData(text=$text, title=$title, " +
-            "monochromaticImage=$monochromaticImage, tapActionLostDueToSerialization=" +
-            "$tapActionLostDueToSerialization, tapAction=$tapAction, " +
-            "validTimeRange=$validTimeRange, dataSource=$dataSource)"
+            "monochromaticImage=$monochromaticImage, smallImage=$smallImage, " +
+            "tapActionLostDueToSerialization=$tapActionLostDueToSerialization, " +
+            "tapAction=$tapAction, validTimeRange=$validTimeRange, dataSource=$dataSource)"
     }
 
     override fun getNextChangeInstant(afterInstant: Instant): Instant {
@@ -3034,6 +3164,7 @@
             setTapAction(tapAction)
             setValidTimeRange(parseTimeRange())
             setMonochromaticImage(parseIconPlaceholderAware())
+            setSmallImage(parseSmallImagePlaceholderAware())
             setTitle(shortTitle?.toApiComplicationTextPlaceholderAware())
             setDataSource(dataSource)
         }.build()
@@ -3063,6 +3194,7 @@
             setTapAction(tapAction)
             setValidTimeRange(parseTimeRange())
             setMonochromaticImage(parseIconPlaceholderAware())
+            setSmallImage(parseSmallImagePlaceholderAware())
             setTitle(shortTitle?.toApiComplicationTextPlaceholderAware())
             setText(shortText?.toApiComplicationTextPlaceholderAware())
             setDataSource(dataSource)
@@ -3138,6 +3270,7 @@
             setTapAction(tapAction)
             setValidTimeRange(parseTimeRange())
             setMonochromaticImage(parseIconPlaceholderAware())
+            setSmallImage(parseSmallImagePlaceholderAware())
             setTitle(shortTitle?.toApiComplicationTextPlaceholderAware())
             setText(shortText?.toApiComplicationTextPlaceholderAware())
             setDataSource(dataSource)
@@ -3156,6 +3289,7 @@
             setTapAction(tapAction)
             setValidTimeRange(parseTimeRange())
             setMonochromaticImage(parseIconPlaceholderAware())
+            setSmallImage(parseSmallImagePlaceholderAware())
             setTitle(shortTitle?.toApiComplicationTextPlaceholderAware())
             setText(shortText?.toApiComplicationTextPlaceholderAware())
             setDataSource(dataSource)
@@ -3180,6 +3314,7 @@
             setTapAction(tapAction)
             setValidTimeRange(parseTimeRange())
             setMonochromaticImage(parseIconPlaceholderAware())
+            setSmallImage(parseSmallImagePlaceholderAware())
             setTitle(shortTitle?.toApiComplicationTextPlaceholderAware())
             setText(shortText?.toApiComplicationTextPlaceholderAware())
             setDataSource(dataSource)
@@ -3216,6 +3351,7 @@
                 setValidTimeRange(parseTimeRange())
                 setTitle(shortTitle?.toApiComplicationText())
                 setMonochromaticImage(parseIcon())
+                setSmallImage(parseSmallImage())
                 setCachedWireComplicationData(wireComplicationData)
                 setDataSource(dataSource)
             }.build()
@@ -3244,6 +3380,7 @@
                 setTapAction(tapAction)
                 setValidTimeRange(parseTimeRange())
                 setMonochromaticImage(parseIcon())
+                setSmallImage(parseSmallImage())
                 setTitle(shortTitle?.toApiComplicationText())
                 setText(shortText?.toApiComplicationText())
                 setCachedWireComplicationData(wireComplicationData)
@@ -3318,6 +3455,7 @@
         NoPermissionComplicationData.TYPE.toWireComplicationType() ->
             NoPermissionComplicationData.Builder().apply {
                 setMonochromaticImage(parseIcon())
+                setSmallImage(parseSmallImage())
                 setTitle(shortTitle?.toApiComplicationText())
                 setText(shortText?.toApiComplicationText())
                 setCachedWireComplicationData(wireComplicationData)
@@ -3334,6 +3472,7 @@
                 setTapAction(tapAction)
                 setValidTimeRange(parseTimeRange())
                 setMonochromaticImage(parseIcon())
+                setSmallImage(parseSmallImage())
                 setTitle(shortTitle?.toApiComplicationText())
                 setText(shortText?.toApiComplicationText())
                 setCachedWireComplicationData(wireComplicationData)
@@ -3354,6 +3493,7 @@
                 setTapAction(tapAction)
                 setValidTimeRange(parseTimeRange())
                 setMonochromaticImage(parseIcon())
+                setSmallImage(parseSmallImage())
                 setTitle(shortTitle?.toApiComplicationText())
                 setText(shortText?.toApiComplicationText())
                 setCachedWireComplicationData(wireComplicationData)
@@ -3375,6 +3515,7 @@
                 setTapAction(tapAction)
                 setValidTimeRange(parseTimeRange())
                 setMonochromaticImage(parseIcon())
+                setSmallImage(parseSmallImage())
                 setTitle(shortTitle?.toApiComplicationText())
                 setText(shortText?.toApiComplicationText())
                 setCachedWireComplicationData(wireComplicationData)
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 96ae732..7f78b06 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
@@ -32,7 +32,7 @@
 import java.util.List;
 
 /** @hide */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
 public final class DefaultComplicationDataSourcePolicyWireFormat
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 ab8c15f..c5463bf 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
@@ -29,12 +29,16 @@
 /**
  * A simple, monochromatic image that can be tinted by the watch face.
  *
+ * A monochromatic image doesn't have to be black and white, it can have a single color associated
+ * 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.
  *
- * @param[image] the image itself
- * @param[ambientImage] the image to be shown when the device is in ambient mode to save power or
- * avoid burn in
+ * @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
  */
 public class MonochromaticImage internal constructor(
     public val image: Icon,
@@ -43,7 +47,7 @@
     /**
      * Builder for [MonochromaticImage].
      *
-     * @param[image] the [Icon] representing the image
+     * @param [image] the [Icon] representing the image
      */
     public class Builder(private var image: Icon) {
         private var ambientImage: Icon? = null
@@ -135,30 +139,29 @@
     /**
      * 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 may be tinted to fit
-     * the complication style.
+     * 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 my not be recolored.
+     * may be cropped to a circle. Photos must not be recolored.
      */
     PHOTO
 }
 
 /**
  * An image that is expected to cover a small fraction of a watch face occupied by a single
- * complication.
+ * 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.
  *
- * @param[image] the image itself
- * @param[type] the style of the image provided, to guide how it should be displayed
- * @param[ambientImage] the image to be shown when the device is in ambient mode to save power or
- * avoid burn in
+ * @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
  */
 public class SmallImage internal constructor(
     public val image: Icon,
@@ -166,10 +169,10 @@
     public val ambientImage: Icon?
 ) {
     /**
-     * Builder for [MonochromaticImage].
+     * Builder for [SmallImage].
      *
-     * @param[image] the [Icon] representing the image
-     * @param[type] the style of the image provided, to guide how it should be displayed
+     * @param [image] The [Icon] representing the image
+     * @param [type] The style of the image provided, to guide how it should be displayed
      */
     public class Builder(private val image: Icon, private val type: SmallImageType) {
         private var ambientImage: Icon? = null
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 263c5bc..905b056a 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
@@ -85,6 +85,9 @@
                 PHOTO_IMAGE.wireType -> PHOTO_IMAGE
                 NO_PERMISSION.wireType -> NO_PERMISSION
                 PROTO_LAYOUT.wireType -> PROTO_LAYOUT
+                GOAL_PROGRESS.wireType -> GOAL_PROGRESS
+                DISCRETE_RANGED_VALUE.wireType -> DISCRETE_RANGED_VALUE
+                WEIGHTED_ELEMENTS.wireType -> WEIGHTED_ELEMENTS
                 LIST.wireType -> LIST
                 else -> EMPTY
             }
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 14731de..37edec2 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
@@ -42,6 +42,20 @@
     val resources = ApplicationProvider.getApplicationContext<Context>().resources
     val dataSourceA = ComponentName("com.pkg_a", "com.a")
     val dataSourceB = ComponentName("com.pkg_a", "com.a")
+    val monochromaticImageIcon = Icon.createWithContentUri("someuri")
+    val smallImageIcon = Icon.createWithContentUri("someuri2")
+    val monochromaticImage = MonochromaticImage.Builder(monochromaticImageIcon).build()
+    val smallImage = SmallImage.Builder(smallImageIcon, SmallImageType.PHOTO).build()
+    val monochromaticImageIcon2 = Icon.createWithContentUri("someuri")
+    val smallImageIcon2 = Icon.createWithContentUri("someuri2")
+    val monochromaticImage2 = MonochromaticImage.Builder(monochromaticImageIcon2).build()
+    val smallImage2 = SmallImage.Builder(smallImageIcon2, SmallImageType.PHOTO).build()
+    val icon = Icon.createWithContentUri("someuri")
+    val image = MonochromaticImage.Builder(icon).build()
+    val icon2 = Icon.createWithContentUri("someuri")
+    val image2 = MonochromaticImage.Builder(icon2).build()
+    val icon3 = Icon.createWithContentUri("someuri3")
+    val image3 = MonochromaticImage.Builder(icon3).build()
 
     @Before
     fun setup() {
@@ -150,15 +164,88 @@
         assertThat(data.toString()).isEqualTo(
             "ShortTextComplicationData(text=ComplicationText{mSurroundingText=text, " +
                 "mTimeDependentText=null}, title=ComplicationText{mSurroundingText=title, " +
-                "mTimeDependentText=null}, monochromaticImage=null, contentDescription=" +
-                "ComplicationText{mSurroundingText=content description, mTimeDependentText=null}," +
-                " tapActionLostDueToSerialization=false, tapAction=null, validTimeRange=" +
-                "TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                "mTimeDependentText=null}, monochromaticImage=null, smallImage=null, " +
+                "contentDescription=ComplicationText{mSurroundingText=content description, " +
+                "mTimeDependentText=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})"
         )
     }
 
+    @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(dataSourceA)
+            .build()
+        ParcelableSubject.assertThat(data.asWireComplicationData())
+            .hasSameSerializationAs(
+                WireComplicationDataBuilder(WireComplicationData.TYPE_SHORT_TEXT)
+                    .setShortText(WireComplicationText.plainText("text"))
+                    .setShortTitle(WireComplicationText.plainText("title"))
+                    .setIcon(monochromaticImageIcon)
+                    .setSmallImage(smallImageIcon)
+                    .setSmallImageStyle(WireComplicationData.IMAGE_STYLE_PHOTO)
+                    .setContentDescription(WireComplicationText.plainText("content description"))
+                    .setDataSource(dataSourceA)
+                    .build()
+            )
+        testRoundTripConversions(data)
+        val deserialized = serializeAndDeserialize(data) as ShortTextComplicationData
+        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.smallImage!!.type).isEqualTo(SmallImageType.PHOTO)
+
+        val data2 = ShortTextComplicationData.Builder(
+            "text".complicationText,
+            "content description".complicationText
+        )
+            .setTitle("title".complicationText)
+            .setMonochromaticImage(monochromaticImage2)
+            .setSmallImage(smallImage2)
+            .setDataSource(dataSourceA)
+            .build()
+        val data3 = ShortTextComplicationData.Builder(
+            "text3".complicationText,
+            "content description3".complicationText
+        )
+            .setTitle("title3".complicationText)
+            .setDataSource(dataSourceB)
+            .build()
+
+        assertThat(data).isEqualTo(data2)
+        assertThat(data).isNotEqualTo(data3)
+        assertThat(data.hashCode()).isEqualTo(data2.hashCode())
+        assertThat(data.hashCode()).isNotEqualTo(data3.hashCode())
+        assertThat(data.toString()).isEqualTo(
+            "ShortTextComplicationData(text=ComplicationText{mSurroundingText=text, " +
+                "mTimeDependentText=null}, title=ComplicationText{mSurroundingText=title, " +
+                "mTimeDependentText=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}, 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})"
+        )
+    }
+
     @Test
     public fun longTextComplicationData() {
         val data = LongTextComplicationData.Builder(
@@ -217,6 +304,79 @@
         )
     }
 
+    @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(dataSourceA)
+            .build()
+        ParcelableSubject.assertThat(data.asWireComplicationData())
+            .hasSameSerializationAs(
+                WireComplicationDataBuilder(WireComplicationData.TYPE_LONG_TEXT)
+                    .setLongText(WireComplicationText.plainText("text"))
+                    .setLongTitle(WireComplicationText.plainText("title"))
+                    .setIcon(monochromaticImageIcon)
+                    .setSmallImage(smallImageIcon)
+                    .setSmallImageStyle(WireComplicationData.IMAGE_STYLE_PHOTO)
+                    .setContentDescription(WireComplicationText.plainText("content description"))
+                    .setDataSource(dataSourceA)
+                    .build()
+            )
+        testRoundTripConversions(data)
+        val deserialized = serializeAndDeserialize(data) as LongTextComplicationData
+        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.smallImage!!.type).isEqualTo(SmallImageType.PHOTO)
+
+        val data2 = LongTextComplicationData.Builder(
+            "text".complicationText,
+            "content description".complicationText
+        )
+            .setTitle("title".complicationText)
+            .setMonochromaticImage(monochromaticImage2)
+            .setSmallImage(smallImage2)
+            .setDataSource(dataSourceA)
+            .build()
+        val data3 = LongTextComplicationData.Builder(
+            "text3".complicationText,
+            "content description3".complicationText
+        )
+            .setTitle("title3".complicationText)
+            .setDataSource(dataSourceB)
+            .build()
+
+        assertThat(data).isEqualTo(data2)
+        assertThat(data).isNotEqualTo(data3)
+        assertThat(data.hashCode()).isEqualTo(data2.hashCode())
+        assertThat(data.hashCode()).isNotEqualTo(data3.hashCode())
+        assertThat(data.toString()).isEqualTo(
+            "LongTextComplicationData(text=ComplicationText{mSurroundingText=text, " +
+                "mTimeDependentText=null}, title=ComplicationText{mSurroundingText=title, " +
+                "mTimeDependentText=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}), 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})"
+        )
+    }
+
     @OptIn(ComplicationExperimental::class)
     @Test
     public fun rangedValueComplicationData() {
@@ -270,16 +430,95 @@
         assertThat(data.hashCode()).isNotEqualTo(data3.hashCode())
         assertThat(data.toString()).isEqualTo(
             "RangedValueComplicationData(value=95.0, min=0.0, max=100.0, " +
-                "monochromaticImage=null, title=ComplicationText{mSurroundingText=battery, " +
-                "mTimeDependentText=null}, text=null, contentDescription=ComplicationText" +
-                "{mSurroundingText=content description, mTimeDependentText=null}), " +
-                "tapActionLostDueToSerialization=false, tapAction=null, validTimeRange=" +
-                "TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, endDateTimeMillis=" +
-                "+1000000000-12-31T23:59:59.999999999Z), dataSource=" +
+                "monochromaticImage=null, smallImage=null, title=ComplicationText{" +
+                "mSurroundingText=battery, mTimeDependentText=null}, text=null, " +
+                "contentDescription=ComplicationText{mSurroundingText=content description, " +
+                "mTimeDependentText=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)"
         )
     }
 
+    @RequiresApi(Build.VERSION_CODES.P)
+    @OptIn(ComplicationExperimental::class)
+    @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(dataSourceA)
+            .build()
+        ParcelableSubject.assertThat(data.asWireComplicationData())
+            .hasSameSerializationAs(
+                WireComplicationDataBuilder(WireComplicationData.TYPE_RANGED_VALUE)
+                    .setRangedValue(95f)
+                    .setRangedMinValue(0f)
+                    .setRangedMaxValue(100f)
+                    .setIcon(monochromaticImageIcon)
+                    .setSmallImage(smallImageIcon)
+                    .setSmallImageStyle(WireComplicationData.IMAGE_STYLE_PHOTO)
+                    .setShortTitle(WireComplicationText.plainText("battery"))
+                    .setContentDescription(WireComplicationText.plainText("content description"))
+                    .setDataSource(dataSourceA)
+                    .build()
+            )
+        testRoundTripConversions(data)
+        val deserialized = serializeAndDeserialize(data) as RangedValueComplicationData
+        assertThat(deserialized.max).isEqualTo(100f)
+        assertThat(deserialized.min).isEqualTo(0f)
+        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.smallImage!!.type).isEqualTo(SmallImageType.PHOTO)
+
+        val data2 = RangedValueComplicationData.Builder(
+            value = 95f, min = 0f, max = 100f,
+            contentDescription = "content description".complicationText
+        )
+            .setTitle("battery".complicationText)
+            .setMonochromaticImage(monochromaticImage2)
+            .setSmallImage(smallImage2)
+            .setDataSource(dataSourceA)
+            .build()
+
+        val data3 = RangedValueComplicationData.Builder(
+            value = 95f, min = 0f, max = 100f,
+            contentDescription = "content description2".complicationText
+        )
+            .setTitle("battery2".complicationText)
+            .setDataSource(dataSourceB)
+            .build()
+
+        assertThat(data).isEqualTo(data2)
+        assertThat(data).isNotEqualTo(data3)
+        assertThat(data.hashCode()).isEqualTo(data2.hashCode())
+        assertThat(data.hashCode()).isNotEqualTo(data3.hashCode())
+        assertThat(data.toString()).isEqualTo(
+            "RangedValueComplicationData(value=95.0, 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}, text=null, contentDescription=ComplicationText{" +
+                "mSurroundingText=content description, mTimeDependentText=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)"
+        )
+    }
+
     @OptIn(ComplicationExperimental::class)
     @Test
     public fun goalProgressComplicationData_with_ColorRamp() {
@@ -336,17 +575,100 @@
         assertThat(data.hashCode()).isNotEqualTo(data3.hashCode())
         assertThat(data.toString()).isEqualTo(
             "GoalProgressComplicationData(value=1200.0, targetValue=10000.0, " +
-                "monochromaticImage=null, title=ComplicationText{mSurroundingText=steps, " +
-                "mTimeDependentText=null}, text=null, contentDescription=ComplicationText" +
-                "{mSurroundingText=content description, mTimeDependentText=null}), " +
-                "tapActionLostDueToSerialization=false, tapAction=null, validTimeRange=" +
-                "TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, endDateTimeMillis=" +
+                "monochromaticImage=null, smallImage=null, title=ComplicationText{" +
+                "mSurroundingText=steps, mTimeDependentText=null}, text=null, " +
+                "contentDescription=ComplicationText{mSurroundingText=content description, " +
+                "mTimeDependentText=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))"
         )
     }
 
+    @RequiresApi(Build.VERSION_CODES.P)
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    public fun goalProgressComplicationData_with_ColorRamp_andiImages() {
+        val data = GoalProgressComplicationData.Builder(
+            value = 1200f, targetValue = 10000f,
+            contentDescription = "content description".complicationText
+        )
+            .setTitle("steps".complicationText)
+            .setMonochromaticImage(monochromaticImage)
+            .setSmallImage(smallImage)
+            .setDataSource(dataSourceA)
+            .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), true))
+            .build()
+        ParcelableSubject.assertThat(data.asWireComplicationData())
+            .hasSameSerializationAs(
+                WireComplicationDataBuilder(WireComplicationData.TYPE_GOAL_PROGRESS)
+                    .setRangedValue(1200f)
+                    .setTargetValue(10000f)
+                    .setIcon(monochromaticImageIcon)
+                    .setSmallImage(smallImageIcon)
+                    .setSmallImageStyle(WireComplicationData.IMAGE_STYLE_PHOTO)
+                    .setShortTitle(WireComplicationText.plainText("steps"))
+                    .setContentDescription(WireComplicationText.plainText("content description"))
+                    .setDataSource(dataSourceA)
+                    .setColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE))
+                    .setColorRampIsSmoothShaded(true)
+                    .build()
+            )
+        testRoundTripConversions(data)
+        val deserialized = serializeAndDeserialize(data) as GoalProgressComplicationData
+        assertThat(deserialized.value).isEqualTo(1200f)
+        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.smallImage!!.type).isEqualTo(SmallImageType.PHOTO)
+
+        val data2 = GoalProgressComplicationData.Builder(
+            value = 1200f, targetValue = 10000f,
+            contentDescription = "content description".complicationText
+        )
+            .setTitle("steps".complicationText)
+            .setMonochromaticImage(monochromaticImage2)
+            .setSmallImage(smallImage2)
+            .setDataSource(dataSourceA)
+            .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), true))
+            .build()
+
+        val data3 = GoalProgressComplicationData.Builder(
+            value = 1200f, targetValue = 10000f,
+            contentDescription = "content description".complicationText
+        )
+            .setTitle("steps".complicationText)
+            .setDataSource(dataSourceB)
+            .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), false))
+            .build()
+
+        assertThat(data).isEqualTo(data2)
+        assertThat(data).isNotEqualTo(data3)
+        assertThat(data.hashCode()).isEqualTo(data2.hashCode())
+        assertThat(data.hashCode()).isNotEqualTo(data3.hashCode())
+        assertThat(data.toString()).isEqualTo(
+            "GoalProgressComplicationData(value=1200.0, 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}, text=null, contentDescription=ComplicationText{" +
+                "mSurroundingText=content description, mTimeDependentText=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))"
+        )
+    }
+
     @OptIn(ComplicationExperimental::class)
     @Test
     public fun discreteRangedValueComplicationData() {
@@ -400,11 +722,90 @@
         assertThat(data.hashCode()).isNotEqualTo(data3.hashCode())
         assertThat(data.toString()).isEqualTo(
             "DiscreteRangedValueComplicationData(value=95, min=0, max=100, " +
-                "monochromaticImage=null, title=ComplicationText{mSurroundingText=battery, " +
-                "mTimeDependentText=null}, text=null, contentDescription=ComplicationText" +
-                "{mSurroundingText=content description, mTimeDependentText=null}), " +
-                "tapActionLostDueToSerialization=false, tapAction=null, validTimeRange=" +
-                "TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, endDateTimeMillis=" +
+                "monochromaticImage=null, smallImage=null, title=ComplicationText{" +
+                "mSurroundingText=battery, mTimeDependentText=null}, text=null, " +
+                "contentDescription=ComplicationText{mSurroundingText=content description, " +
+                "mTimeDependentText=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})"
+        )
+    }
+
+    @RequiresApi(Build.VERSION_CODES.P)
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    public fun discreteRangedValueComplicationData_withImages() {
+        val data = DiscreteRangedValueComplicationData.Builder(
+            value = 95, min = 0, max = 100,
+            contentDescription = "content description".complicationText
+        )
+            .setTitle("battery".complicationText)
+            .setMonochromaticImage(monochromaticImage)
+            .setSmallImage(smallImage)
+            .setDataSource(dataSourceA)
+            .build()
+        ParcelableSubject.assertThat(data.asWireComplicationData())
+            .hasSameSerializationAs(
+                WireComplicationDataBuilder(WireComplicationData.TYPE_DISCRETE_RANGED_VALUE)
+                    .setDiscreteRangedValue(95)
+                    .setDiscreteRangedMinValue(0)
+                    .setDiscreteRangedMaxValue(100)
+                    .setIcon(monochromaticImageIcon)
+                    .setSmallImage(smallImageIcon)
+                    .setSmallImageStyle(WireComplicationData.IMAGE_STYLE_PHOTO)
+                    .setShortTitle(WireComplicationText.plainText("battery"))
+                    .setContentDescription(WireComplicationText.plainText("content description"))
+                    .setDataSource(dataSourceA)
+                    .build()
+            )
+        testRoundTripConversions(data)
+        val deserialized = serializeAndDeserialize(data) as DiscreteRangedValueComplicationData
+        assertThat(deserialized.max).isEqualTo(100)
+        assertThat(deserialized.min).isEqualTo(0)
+        assertThat(deserialized.value).isEqualTo(95)
+        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.smallImage!!.type).isEqualTo(SmallImageType.PHOTO)
+
+        val data2 = DiscreteRangedValueComplicationData.Builder(
+            value = 95, min = 0, max = 100,
+            contentDescription = "content description".complicationText
+        )
+            .setMonochromaticImage(monochromaticImage2)
+            .setSmallImage(smallImage2)
+            .setTitle("battery".complicationText)
+            .setDataSource(dataSourceA)
+            .build()
+
+        val data3 = DiscreteRangedValueComplicationData.Builder(
+            value = 95, min = 0, max = 100,
+            contentDescription = "content description2".complicationText
+        )
+            .setTitle("battery2".complicationText)
+            .setDataSource(dataSourceB)
+            .build()
+
+        assertThat(data).isEqualTo(data2)
+        assertThat(data).isNotEqualTo(data3)
+        assertThat(data.hashCode()).isEqualTo(data2.hashCode())
+        assertThat(data.hashCode()).isNotEqualTo(data3.hashCode())
+        assertThat(data.toString()).isEqualTo(
+            "DiscreteRangedValueComplicationData(value=95, min=0, max=100, " +
+                "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}, text=null," +
+                " contentDescription=ComplicationText{mSurroundingText=content description, " +
+                "mTimeDependentText=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})"
         )
     }
@@ -467,11 +868,12 @@
         assertThat(data.hashCode()).isNotEqualTo(data3.hashCode())
         assertThat(data.toString()).isEqualTo(
             "RangedValueComplicationData(value=95.0, min=0.0, max=100.0, " +
-                "monochromaticImage=null, title=ComplicationText{mSurroundingText=battery, " +
-                "mTimeDependentText=null}, text=null, contentDescription=ComplicationText" +
-                "{mSurroundingText=content description, mTimeDependentText=null}), " +
-                "tapActionLostDueToSerialization=false, tapAction=null, validTimeRange=" +
-                "TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, endDateTimeMillis=" +
+                "monochromaticImage=null, smallImage=null, title=ComplicationText{" +
+                "mSurroundingText=battery, mTimeDependentText=null}, text=null, " +
+                "contentDescription=ComplicationText{mSurroundingText=content description, " +
+                "mTimeDependentText=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))"
@@ -547,20 +949,113 @@
         assertThat(data.toString()).isEqualTo(
             "WeightedElementsComplicationData(elements=Element(color=-65536, weight=0.5)," +
                 " Element(color=-16711936, weight=1.0), Element(color=-16776961, weight=2.0), " +
-                "monochromaticImage=null, title=ComplicationText{mSurroundingText=calories, " +
-                "mTimeDependentText=null}, text=null, contentDescription=ComplicationText{" +
-                "mSurroundingText=content description, mTimeDependentText=null}), " +
-                "tapActionLostDueToSerialization=false, tapAction=null, validTimeRange=TimeRange(" +
+                "monochromaticImage=null, smallImage=null, title=ComplicationText{" +
+                "mSurroundingText=calories, mTimeDependentText=null}, text=null, " +
+                "contentDescription=ComplicationText{mSurroundingText=content description, " +
+                "mTimeDependentText=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})"
         )
     }
 
     @RequiresApi(Build.VERSION_CODES.P)
+    @OptIn(ComplicationExperimental::class)
+    @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(dataSourceA)
+            .build()
+        ParcelableSubject.assertThat(data.asWireComplicationData())
+            .hasSameSerializationAs(
+                WireComplicationDataBuilder(WireComplicationData.TYPE_WEIGHTED_ELEMENTS)
+                    .setElementWeights(floatArrayOf(0.5f, 1f, 2f))
+                    .setElementColors(intArrayOf(Color.RED, Color.GREEN, Color.BLUE))
+                    .setShortTitle(WireComplicationText.plainText("calories"))
+                    .setIcon(monochromaticImageIcon)
+                    .setSmallImage(smallImageIcon)
+                    .setSmallImageStyle(WireComplicationData.IMAGE_STYLE_PHOTO)
+                    .setContentDescription(WireComplicationText.plainText("content description"))
+                    .setDataSource(dataSourceA)
+                    .build()
+            )
+        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.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.smallImage!!.type).isEqualTo(SmallImageType.PHOTO)
+
+        val data2 = 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(monochromaticImage2)
+            .setSmallImage(smallImage2)
+            .setDataSource(dataSourceA)
+            .build()
+
+        val data3 = WeightedElementsComplicationData.Builder(
+            listOf(
+                WeightedElementsComplicationData.Element(0.5f, Color.RED),
+                WeightedElementsComplicationData.Element(10f, Color.GREEN),
+                WeightedElementsComplicationData.Element(2f, Color.BLUE),
+            ),
+            contentDescription = "content description".complicationText
+        )
+            .setTitle("battery".complicationText)
+            .setDataSource(dataSourceA)
+            .build()
+
+        assertThat(data).isEqualTo(data2)
+        assertThat(data).isNotEqualTo(data3)
+        assertThat(data.hashCode()).isEqualTo(data2.hashCode())
+        assertThat(data.hashCode()).isNotEqualTo(data3.hashCode())
+        assertThat(data.toString()).isEqualTo(
+            "WeightedElementsComplicationData(elements=Element(color=-65536, weight=0.5)," +
+                " Element(color=-16711936, weight=1.0), Element(color=-16776961, weight=2.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}, text=null, " +
+                "contentDescription=ComplicationText{mSurroundingText=content description, " +
+                "mTimeDependentText=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})"
+        )
+    }
+
+    @RequiresApi(Build.VERSION_CODES.P)
     @Test
     public fun monochromaticImageComplicationData() {
-        val icon = Icon.createWithContentUri("someuri")
-        val image = MonochromaticImage.Builder(icon).build()
         val data = MonochromaticImageComplicationData.Builder(
             image, "content description".complicationText
         ).setDataSource(dataSourceA).build()
@@ -579,14 +1074,10 @@
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
 
-        val icon2 = Icon.createWithContentUri("someuri")
-        val image2 = MonochromaticImage.Builder(icon2).build()
         val data2 = MonochromaticImageComplicationData.Builder(
             image2, "content description".complicationText
         ).setDataSource(dataSourceA).build()
 
-        val icon3 = Icon.createWithContentUri("someuri3")
-        val image3 = MonochromaticImage.Builder(icon3).build()
         val data3 = MonochromaticImageComplicationData.Builder(
             image3, "content description".complicationText
         ).setDataSource(dataSourceB).build()
@@ -608,7 +1099,6 @@
     @RequiresApi(Build.VERSION_CODES.P)
     @Test
     public fun smallImageComplicationData() {
-        val icon = Icon.createWithContentUri("someuri")
         val image = SmallImage.Builder(icon, SmallImageType.PHOTO).build()
         val data = SmallImageComplicationData.Builder(
             image, "content description".complicationText
@@ -630,13 +1120,11 @@
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
 
-        val icon2 = Icon.createWithContentUri("someuri")
         val image2 = SmallImage.Builder(icon2, SmallImageType.PHOTO).build()
         val data2 = SmallImageComplicationData.Builder(
             image2, "content description".complicationText
         ).setDataSource(dataSourceA).build()
 
-        val icon3 = Icon.createWithContentUri("someuri3")
         val image3 = SmallImage.Builder(icon3, SmallImageType.PHOTO).build()
         val data3 = SmallImageComplicationData.Builder(
             image3, "content description".complicationText
@@ -735,14 +1223,65 @@
         assertThat(data.hashCode()).isNotEqualTo(data3.hashCode())
         assertThat(data.toString()).isEqualTo(
             "NoPermissionComplicationData(text=ComplicationText{mSurroundingText=needs location," +
-                " mTimeDependentText=null}, title=null, monochromaticImage=null, " +
-                "tapActionLostDueToSerialization=false, tapAction=null, validTimeRange=" +
+                " mTimeDependentText=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})"
         )
     }
 
     @Test
+    public fun noPermissionComplicationData_withImages() {
+        val data = NoPermissionComplicationData.Builder()
+            .setText("needs location".complicationText)
+            .setMonochromaticImage(monochromaticImage)
+            .setSmallImage(smallImage)
+            .setDataSource(dataSourceA)
+            .build()
+        ParcelableSubject.assertThat(data.asWireComplicationData())
+            .hasSameSerializationAs(
+                WireComplicationDataBuilder(WireComplicationData.TYPE_NO_PERMISSION)
+                    .setShortText(WireComplicationText.plainText("needs location"))
+                    .setIcon(monochromaticImageIcon)
+                    .setSmallImage(smallImageIcon)
+                    .setSmallImageStyle(WireComplicationData.IMAGE_STYLE_PHOTO)
+                    .setDataSource(dataSourceA)
+                    .build()
+            )
+        testRoundTripConversions(data)
+        val deserialized = serializeAndDeserialize(data) as NoPermissionComplicationData
+        assertThat(deserialized.text!!.getTextAt(resources, Instant.EPOCH))
+            .isEqualTo("needs location")
+
+        val data2 = NoPermissionComplicationData.Builder()
+            .setText("needs location".complicationText)
+            .setMonochromaticImage(monochromaticImage)
+            .setSmallImage(smallImage)
+            .setDataSource(dataSourceA)
+            .build()
+
+        val data3 = NoPermissionComplicationData.Builder()
+            .setText("needs location3".complicationText)
+            .setDataSource(dataSourceB)
+            .build()
+
+        assertThat(data).isEqualTo(data2)
+        assertThat(data).isNotEqualTo(data3)
+        assertThat(data.hashCode()).isEqualTo(data2.hashCode())
+        assertThat(data.hashCode()).isNotEqualTo(data3.hashCode())
+        assertThat(data.toString()).isEqualTo(
+            "NoPermissionComplicationData(text=ComplicationText{mSurroundingText=" +
+                "needs location, mTimeDependentText=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})"
+        )
+    }
+
+    @Test
     @OptIn(ComplicationExperimental::class)
     public fun listComplicationData() {
         val data = ListComplicationData.Builder(
@@ -840,13 +1379,13 @@
         assertThat(data.toString()).isEqualTo(
             "ListComplicationData(complicationList=[ShortTextComplicationData(" +
                 "text=ComplicationText{mSurroundingText=text, mTimeDependentText=null}, " +
-                "title=null, monochromaticImage=null, contentDescription=ComplicationText{" +
-                "mSurroundingText=, mTimeDependentText=null}, " +
-                "tapActionLostDueToSerialization=false, tapAction=null, validTimeRange=TimeRange(" +
-                "startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                "title=null, monochromaticImage=null, smallImage=null, " +
+                "contentDescription=ComplicationText{mSurroundingText=, mTimeDependentText=null}," +
+                " tapActionLostDueToSerialization=false, tapAction=null, " +
+                "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
                 "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), dataSource=null), " +
                 "RangedValueComplicationData(value=95.0, min=0.0, max=100.0, " +
-                "monochromaticImage=null, title=null, text=ComplicationText{" +
+                "monochromaticImage=null, smallImage=null, title=null, text=ComplicationText{" +
                 "mSurroundingText=battery, mTimeDependentText=null}, contentDescription=" +
                 "ComplicationText{mSurroundingText=, mTimeDependentText=null}), " +
                 "tapActionLostDueToSerialization=false, tapAction=null, validTimeRange=TimeRange(" +
@@ -921,7 +1460,8 @@
                 "ComplicationText{mSurroundingText=__placeholder__, mTimeDependentText=null}, " +
                 "title=ComplicationText{mSurroundingText=__placeholder__, mTimeDependentText" +
                 "=null}, monochromaticImage=MonochromaticImage(image=Icon(typ=RESOURCE pkg= " +
-                "id=0xffffffff), ambientImage=null), contentDescription=ComplicationText{" +
+                "id=0xffffffff), ambientImage=null), smallImage=null, " +
+                "contentDescription=ComplicationText{" +
                 "mSurroundingText=content description, mTimeDependentText=null}, " +
                 "tapActionLostDueToSerialization=false, tapAction=null, validTimeRange=" +
                 "TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
@@ -1056,11 +1596,13 @@
         assertThat(data.hashCode()).isNotEqualTo(data3.hashCode())
         assertThat(data.toString()).isEqualTo(
             "NoDataComplicationData(placeholder=RangedValueComplicationData(" +
-                "value=3.4028235E38, min=0.0, max=100.0, monochromaticImage=null, title=null, " +
-                "text=ComplicationText{mSurroundingText=__placeholder__, mTimeDependentText=null" +
-                "}, contentDescription=ComplicationText{mSurroundingText=content description, " +
-                "mTimeDependentText=null}), tapActionLostDueToSerialization=false, tapAction=" +
-                "null, validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                "value=3.4028235E38, min=0.0, max=100.0, monochromaticImage=null, " +
+                "smallImage=null, title=null, text=ComplicationText{" +
+                "mSurroundingText=__placeholder__, mTimeDependentText=null}, " +
+                "contentDescription=ComplicationText{mSurroundingText=" +
+                "content description, mTimeDependentText=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), tapActionLostDueToSerialization=false, tapAction=null, " +
@@ -1133,11 +1675,12 @@
         assertThat(data.hashCode()).isNotEqualTo(data3.hashCode())
         assertThat(data.toString()).isEqualTo(
             "NoDataComplicationData(placeholder=GoalProgressComplicationData(" +
-                "value=3.4028235E38, targetValue=10000.0, monochromaticImage=null, title=null, " +
-                "text=ComplicationText{mSurroundingText=__placeholder__, " +
-                "mTimeDependentText=null}, contentDescription=ComplicationText{" +
-                "mSurroundingText=content description, mTimeDependentText=null}), " +
-                "tapActionLostDueToSerialization=false, tapAction=null, validTimeRange=TimeRange(" +
+                "value=3.4028235E38, targetValue=10000.0, monochromaticImage=null, " +
+                "smallImage=null, title=null, text=ComplicationText{" +
+                "mSurroundingText=__placeholder__, mTimeDependentText=null}, " +
+                "contentDescription=ComplicationText{mSurroundingText=content description, " +
+                "mTimeDependentText=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}, " +
@@ -1213,11 +1756,12 @@
         assertThat(data.hashCode()).isNotEqualTo(data3.hashCode())
         assertThat(data.toString()).isEqualTo(
             "NoDataComplicationData(placeholder=DiscreteRangedValueComplicationData(" +
-                "value=2147483647, min=0, max=100, monochromaticImage=null, title=null, " +
-                "text=ComplicationText{mSurroundingText=__placeholder__, mTimeDependentText=null" +
-                "}, contentDescription=ComplicationText{mSurroundingText=content description, " +
-                "mTimeDependentText=null}), tapActionLostDueToSerialization=false, tapAction=" +
-                "null, validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                "value=2147483647, min=0, max=100, monochromaticImage=null, smallImage=null, " +
+                "title=null, text=ComplicationText{mSurroundingText=__placeholder__, " +
+                "mTimeDependentText=null}, contentDescription=ComplicationText{mSurroundingText=" +
+                "content description, mTimeDependentText=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}), " +
                 "tapActionLostDueToSerialization=false, tapAction=null, " +
@@ -1297,11 +1841,11 @@
             "NoDataComplicationData(placeholder=WeightedElementsComplicationData(" +
                 "elements=Element(color=-65536, weight=0.5), Element(color=-16711936, " +
                 "weight=1.0), Element(color=-16776961, weight=2.0), monochromaticImage=null, " +
-                "title=ComplicationText{mSurroundingText=calories, mTimeDependentText=null}, " +
-                "text=null, contentDescription=ComplicationText{mSurroundingText=content " +
-                "description, mTimeDependentText=null}), tapActionLostDueToSerialization=false, " +
-                "tapAction=null, validTimeRange=TimeRange(startDateTimeMillis=" +
-                "-1000000000-01-01T00:00:00Z, " +
+                "smallImage=null, title=ComplicationText{mSurroundingText=calories, " +
+                "mTimeDependentText=null}, text=null, contentDescription=ComplicationText{" +
+                "mSurroundingText=content description, mTimeDependentText=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}), " +
                 "tapActionLostDueToSerialization=false, tapAction=null, " +
@@ -1378,11 +1922,13 @@
         assertThat(data.hashCode()).isNotEqualTo(data3.hashCode())
         assertThat(data.toString()).isEqualTo(
             "NoDataComplicationData(placeholder=RangedValueComplicationData(" +
-                "value=3.4028235E38, min=0.0, max=100.0, monochromaticImage=null, title=null, " +
-                "text=ComplicationText{mSurroundingText=__placeholder__, mTimeDependentText=null" +
-                "}, contentDescription=ComplicationText{mSurroundingText=content description, " +
-                "mTimeDependentText=null}), tapActionLostDueToSerialization=false, tapAction=" +
-                "null, validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                "value=3.4028235E38, min=0.0, max=100.0, monochromaticImage=null, " +
+                "smallImage=null, title=null, text=ComplicationText{" +
+                "mSurroundingText=__placeholder__, mTimeDependentText=null}, " +
+                "contentDescription=ComplicationText{mSurroundingText=" +
+                "content description, mTimeDependentText=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)), " +
@@ -1426,7 +1972,6 @@
             ).setDataSource(dataSourceA).build()
         )
 
-        val icon = Icon.createWithContentUri("someuri")
         val image = MonochromaticImage.Builder(icon).build()
         val data3 = NoDataComplicationData(
             MonochromaticImageComplicationData.Builder(
@@ -1489,7 +2034,6 @@
             ).setDataSource(dataSourceA).build()
         )
 
-        val icon = Icon.createWithContentUri("someuri")
         val image = SmallImage.Builder(icon, SmallImageType.PHOTO).build()
         val data3 = NoDataComplicationData(
             SmallImageComplicationData.Builder(
@@ -1551,7 +2095,6 @@
             ).setDataSource(dataSourceA).build()
         )
 
-        val icon = Icon.createWithContentUri("someuri")
         val data3 = NoDataComplicationData(
             PhotoImageComplicationData.Builder(
                 icon,
@@ -2995,10 +3538,10 @@
         assertThat(data.toString()).isEqualTo(
             "ShortTextComplicationData(text=ComplicationText{mSurroundingText=REDACTED, " +
                 "mTimeDependentText=null}, title=ComplicationText{mSurroundingText=REDACTED, " +
-                "mTimeDependentText=null}, monochromaticImage=null, contentDescription=" +
-                "ComplicationText{mSurroundingText=REDACTED, mTimeDependentText=null}, " +
-                "tapActionLostDueToSerialization=false, tapAction=null, validTimeRange=" +
-                "TimeRange(REDACTED), dataSource=null)"
+                "mTimeDependentText=null}, monochromaticImage=null, smallImage=null, " +
+                "contentDescription=ComplicationText{mSurroundingText=REDACTED, " +
+                "mTimeDependentText=null}, tapActionLostDueToSerialization=false, tapAction=null," +
+                " validTimeRange=TimeRange(REDACTED), dataSource=null)"
         )
         assertThat(data.asWireComplicationData().toString()).isEqualTo(
             "ComplicationData{mType=3, mFields=REDACTED}"
@@ -3040,10 +3583,11 @@
             .build()
 
         assertThat(data.toString()).isEqualTo("RangedValueComplicationData(value=REDACTED, " +
-            "min=0.0, max=100.0, monochromaticImage=null, title=ComplicationText{mSurroundingText" +
-            "=REDACTED, mTimeDependentText=null}, text=ComplicationText{mSurroundingText=REDACTED" +
-            ", mTimeDependentText=null}, contentDescription=ComplicationText{mSurroundingText=" +
-            "REDACTED, mTimeDependentText=null}), tapActionLostDueToSerialization=false, " +
+            "min=0.0, max=100.0, monochromaticImage=null, smallImage=null, " +
+            "title=ComplicationText{mSurroundingText=REDACTED, mTimeDependentText=null}, " +
+            "text=ComplicationText{mSurroundingText=REDACTED, mTimeDependentText=null}, " +
+            "contentDescription=ComplicationText{mSurroundingText=REDACTED, " +
+            "mTimeDependentText=null}), tapActionLostDueToSerialization=false, " +
             "tapAction=null, validTimeRange=TimeRange(REDACTED), dataSource=null, colorRamp=null)"
         )
         assertThat(data.asWireComplicationData().toString()).isEqualTo(
@@ -3064,11 +3608,11 @@
 
         assertThat(data.toString()).isEqualTo(
             "GoalProgressComplicationData(value=REDACTED, targetValue=10000.0, " +
-                "monochromaticImage=null, title=ComplicationText{mSurroundingText=REDACTED, " +
-                "mTimeDependentText=null}, text=null, contentDescription=ComplicationText{" +
-                "mSurroundingText=REDACTED, mTimeDependentText=null}), " +
-                "tapActionLostDueToSerialization=false, tapAction=null, " +
-                "validTimeRange=TimeRange(REDACTED), dataSource=null, " +
+                "monochromaticImage=null, smallImage=null, title=ComplicationText{" +
+                "mSurroundingText=REDACTED, mTimeDependentText=null}, text=null, " +
+                "contentDescription=ComplicationText{mSurroundingText=REDACTED, " +
+                "mTimeDependentText=null}), tapActionLostDueToSerialization=false, " +
+                "tapAction=null, validTimeRange=TimeRange(REDACTED), dataSource=null, " +
                 "colorRamp=ColorRamp(colors=[-65536, -16711936, -16776961], interpolated=true))"
         )
         assertThat(data.asWireComplicationData().toString()).isEqualTo(
@@ -3091,11 +3635,12 @@
 
         assertThat(data.toString()).isEqualTo(
             "DiscreteRangedValueComplicationData(value=REDACTED, " +
-            "min=0, max=100, monochromaticImage=null, title=ComplicationText{mSurroundingText" +
-            "=REDACTED, mTimeDependentText=null}, text=ComplicationText{mSurroundingText=REDACTED" +
-            ", mTimeDependentText=null}, contentDescription=ComplicationText{mSurroundingText=" +
-            "REDACTED, mTimeDependentText=null}), tapActionLostDueToSerialization=false, " +
-            "tapAction=null, validTimeRange=TimeRange(REDACTED), dataSource=null)"
+            "min=0, max=100, monochromaticImage=null, smallImage=null, title=ComplicationText{" +
+            "mSurroundingText=REDACTED, mTimeDependentText=null}, text=ComplicationText{" +
+            "mSurroundingText=REDACTED, mTimeDependentText=null}, contentDescription=" +
+            "ComplicationText{mSurroundingText=REDACTED, mTimeDependentText=null}), " +
+            "tapActionLostDueToSerialization=false, tapAction=null, " +
+            "validTimeRange=TimeRange(REDACTED), dataSource=null)"
         )
         assertThat(data.asWireComplicationData().toString()).isEqualTo(
             "ComplicationData{mType=14, mFields=REDACTED}"
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 110cb73..1f16233 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
@@ -44,6 +44,7 @@
             ShortTextComplicationData.Builder(ComplicationText.PLACEHOLDER, contentDescription)
                 .setTitle(ComplicationText.PLACEHOLDER)
                 .setMonochromaticImage(MonochromaticImage.PLACEHOLDER)
+                .setSmallImage(SmallImage.PLACEHOLDER)
                 .build()
         ).toWireFormatRoundTrip().placeholder as ShortTextComplicationData
 
@@ -51,6 +52,7 @@
         assertThat(placeholderShortText.title).isEqualTo(ComplicationText.PLACEHOLDER)
         assertThat(placeholderShortText.monochromaticImage)
             .isEqualTo(MonochromaticImage.PLACEHOLDER)
+        assertThat(placeholderShortText.smallImage).isEqualTo(SmallImage.PLACEHOLDER)
         assertThat(placeholderShortText.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("description")
         assertThat(placeholderShortText.hasPlaceholderFields()).isTrue()
@@ -62,6 +64,7 @@
             ShortTextComplicationData.Builder(text, contentDescription)
                 .setTitle(title)
                 .setMonochromaticImage(monochromaticImage)
+                .setSmallImage(smallImage)
                 .build()
         ).toWireFormatRoundTrip().placeholder as ShortTextComplicationData
 
@@ -72,6 +75,7 @@
             title.getTextAt(resources, Instant.EPOCH)
         )
         assertThat(placeholderShortText.monochromaticImage).isEqualTo(monochromaticImage)
+        assertThat(placeholderShortText.smallImage).isEqualTo(smallImage)
         assertThat(placeholderShortText.hasPlaceholderFields()).isFalse()
     }
 
@@ -84,6 +88,7 @@
 
         assertThat(placeholderShortText.title).isNull()
         assertThat(placeholderShortText.monochromaticImage).isNull()
+        assertThat(placeholderShortText.smallImage).isNull()
     }
 
     @Test
@@ -151,6 +156,7 @@
                 .setText(ComplicationText.PLACEHOLDER)
                 .setTitle(ComplicationText.PLACEHOLDER)
                 .setMonochromaticImage(MonochromaticImage.PLACEHOLDER)
+                .setSmallImage(SmallImage.PLACEHOLDER)
                 .build()
         ).toWireFormatRoundTrip().placeholder as RangedValueComplicationData
 
@@ -159,6 +165,7 @@
         assertThat(placeholderRangedValue.title).isEqualTo(ComplicationText.PLACEHOLDER)
         assertThat(placeholderRangedValue.monochromaticImage)
             .isEqualTo(MonochromaticImage.PLACEHOLDER)
+        assertThat(placeholderRangedValue.smallImage).isEqualTo(SmallImage.PLACEHOLDER)
         assertThat(placeholderRangedValue.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("description")
         assertThat(placeholderRangedValue.hasPlaceholderFields()).isTrue()
@@ -171,6 +178,7 @@
                 .setText(text)
                 .setTitle(title)
                 .setMonochromaticImage(monochromaticImage)
+                .setSmallImage(smallImage)
                 .build()
         ).toWireFormatRoundTrip().placeholder as RangedValueComplicationData
 
@@ -181,6 +189,7 @@
             title.getTextAt(resources, Instant.EPOCH)
         )
         assertThat(placeholderRangedValue.monochromaticImage).isEqualTo(monochromaticImage)
+        assertThat(placeholderRangedValue.smallImage).isEqualTo(smallImage)
         assertThat(placeholderRangedValue.value).isEqualTo(7f)
         assertThat(placeholderRangedValue.min).isEqualTo(1f)
         assertThat(placeholderRangedValue.max).isEqualTo(10f)
@@ -203,6 +212,7 @@
         assertThat(placeholderRangedValue.text).isEqualTo(ComplicationText.PLACEHOLDER)
         assertThat(placeholderRangedValue.title).isNull()
         assertThat(placeholderRangedValue.monochromaticImage).isNull()
+        assertThat(placeholderRangedValue.smallImage).isNull()
     }
 
     @OptIn(ComplicationExperimental::class)
@@ -217,6 +227,7 @@
                 .setText(ComplicationText.PLACEHOLDER)
                 .setTitle(ComplicationText.PLACEHOLDER)
                 .setMonochromaticImage(MonochromaticImage.PLACEHOLDER)
+                .setSmallImage(SmallImage.PLACEHOLDER)
                 .build()
         ).toWireFormatRoundTrip().placeholder as GoalProgressComplicationData
 
@@ -225,6 +236,7 @@
         assertThat(placeholderGoalProgress.title).isEqualTo(ComplicationText.PLACEHOLDER)
         assertThat(placeholderGoalProgress.monochromaticImage)
             .isEqualTo(MonochromaticImage.PLACEHOLDER)
+        assertThat(placeholderGoalProgress.smallImage).isEqualTo(SmallImage.PLACEHOLDER)
         assertThat(placeholderGoalProgress.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("description")
         assertThat(placeholderGoalProgress.hasPlaceholderFields()).isTrue()
@@ -242,6 +254,7 @@
                 .setText(text)
                 .setTitle(title)
                 .setMonochromaticImage(monochromaticImage)
+                .setSmallImage(smallImage)
                 .build()
         ).toWireFormatRoundTrip().placeholder as GoalProgressComplicationData
 
@@ -252,6 +265,7 @@
             title.getTextAt(resources, Instant.EPOCH)
         )
         assertThat(placeholderGoalProgress.monochromaticImage).isEqualTo(monochromaticImage)
+        assertThat(placeholderGoalProgress.smallImage).isEqualTo(smallImage)
         assertThat(placeholderGoalProgress.value).isEqualTo(1200f)
         assertThat(placeholderGoalProgress.targetValue).isEqualTo(10000f)
         assertThat(placeholderGoalProgress.hasPlaceholderFields()).isFalse()
@@ -270,6 +284,7 @@
                 .setText(ComplicationText.PLACEHOLDER)
                 .setTitle(ComplicationText.PLACEHOLDER)
                 .setMonochromaticImage(MonochromaticImage.PLACEHOLDER)
+                .setSmallImage(SmallImage.PLACEHOLDER)
                 .build()
         ).toWireFormatRoundTrip().placeholder as DiscreteRangedValueComplicationData
 
@@ -279,6 +294,7 @@
         assertThat(placeholderRangedValue.title).isEqualTo(ComplicationText.PLACEHOLDER)
         assertThat(placeholderRangedValue.monochromaticImage)
             .isEqualTo(MonochromaticImage.PLACEHOLDER)
+        assertThat(placeholderRangedValue.smallImage).isEqualTo(SmallImage.PLACEHOLDER)
         assertThat(placeholderRangedValue.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("description")
         assertThat(placeholderRangedValue.hasPlaceholderFields()).isTrue()
@@ -297,6 +313,7 @@
                 .setText(text)
                 .setTitle(title)
                 .setMonochromaticImage(monochromaticImage)
+                .setSmallImage(smallImage)
                 .build()
         ).toWireFormatRoundTrip().placeholder as DiscreteRangedValueComplicationData
 
@@ -307,6 +324,7 @@
             title.getTextAt(resources, Instant.EPOCH)
         )
         assertThat(placeholderRangedValue.monochromaticImage).isEqualTo(monochromaticImage)
+        assertThat(placeholderRangedValue.smallImage).isEqualTo(smallImage)
         assertThat(placeholderRangedValue.value).isEqualTo(7)
         assertThat(placeholderRangedValue.min).isEqualTo(1)
         assertThat(placeholderRangedValue.max).isEqualTo(10)
@@ -324,6 +342,7 @@
                 .setText(ComplicationText.PLACEHOLDER)
                 .setTitle(ComplicationText.PLACEHOLDER)
                 .setMonochromaticImage(MonochromaticImage.PLACEHOLDER)
+                .setSmallImage(SmallImage.PLACEHOLDER)
                 .build()
         ).toWireFormatRoundTrip().placeholder as WeightedElementsComplicationData
 
@@ -333,6 +352,7 @@
         assertThat(placeholderWeightedElements.title).isEqualTo(ComplicationText.PLACEHOLDER)
         assertThat(placeholderWeightedElements.monochromaticImage)
             .isEqualTo(MonochromaticImage.PLACEHOLDER)
+        assertThat(placeholderWeightedElements.smallImage).isEqualTo(SmallImage.PLACEHOLDER)
         assertThat(placeholderWeightedElements.contentDescription!!
             .getTextAt(resources, Instant.EPOCH)).isEqualTo("description")
         assertThat(placeholderWeightedElements.hasPlaceholderFields()).isTrue()
@@ -353,6 +373,7 @@
                 .setText(text)
                 .setTitle(title)
                 .setMonochromaticImage(monochromaticImage)
+                .setSmallImage(smallImage)
                 .build()
         ).toWireFormatRoundTrip().placeholder as WeightedElementsComplicationData
 
@@ -366,6 +387,7 @@
         assertThat(weightedElements.text).isEqualTo(text)
         assertThat(weightedElements.title).isEqualTo(title)
         assertThat(weightedElements.monochromaticImage).isEqualTo(monochromaticImage)
+        assertThat(weightedElements.smallImage).isEqualTo(smallImage)
         assertThat(weightedElements.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("description")
         assertThat(weightedElements.hasPlaceholderFields()).isFalse()
@@ -388,6 +410,7 @@
         assertThat(placeholderRangedValue.text).isEqualTo(ComplicationText.PLACEHOLDER)
         assertThat(placeholderRangedValue.title).isNull()
         assertThat(placeholderRangedValue.monochromaticImage).isNull()
+        assertThat(placeholderRangedValue.smallImage).isNull()
     }
 
     @Test
diff --git a/wear/watchface/watchface-complications-rendering/api/current.ignore b/wear/watchface/watchface-complications-rendering/api/current.ignore
deleted file mode 100644
index 85aa9bc..0000000
--- a/wear/watchface/watchface-complications-rendering/api/current.ignore
+++ /dev/null
@@ -1,55 +0,0 @@
-// Baseline format: 1.0
-ParameterNameChange: androidx.wear.watchface.complications.rendering.CanvasComplicationDrawable#setDrawable(androidx.wear.watchface.complications.rendering.ComplicationDrawable) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.CanvasComplicationDrawable.setDrawable
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationDrawable#setBurnInProtectionOn(boolean) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationDrawable.setBurnInProtectionOn
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationDrawable#setCurrentTime(java.time.Instant) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationDrawable.setCurrentTime
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationDrawable#setHighlightDuration(long) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationDrawable.setHighlightDuration
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationDrawable#setHighlighted(boolean) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationDrawable.setHighlighted
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationDrawable#setInAmbientMode(boolean) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationDrawable.setInAmbientMode
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationDrawable#setLowBitAmbient(boolean) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationDrawable.setLowBitAmbient
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationDrawable#setNoDataText(CharSequence) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationDrawable.setNoDataText
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationDrawable#setRangedValueProgressHidden(boolean) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationDrawable.setRangedValueProgressHidden
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setBackgroundColor(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setBackgroundColor
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setBackgroundDrawable(android.graphics.drawable.Drawable) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setBackgroundDrawable
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setBorderColor(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setBorderColor
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setBorderDashGap(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setBorderDashGap
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setBorderDashWidth(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setBorderDashWidth
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setBorderRadius(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setBorderRadius
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setBorderStyle(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setBorderStyle
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setBorderWidth(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setBorderWidth
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setHighlightColor(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setHighlightColor
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setIconColor(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setIconColor
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setImageColorFilter(android.graphics.ColorFilter) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setImageColorFilter
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setRangedValuePrimaryColor(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setRangedValuePrimaryColor
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setRangedValueRingWidth(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setRangedValueRingWidth
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setRangedValueSecondaryColor(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setRangedValueSecondaryColor
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setTextColor(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setTextColor
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setTextSize(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setTextSize
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setTitleColor(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setTitleColor
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setTitleSize(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setTitleSize
diff --git a/wear/watchface/watchface-complications-rendering/api/restricted_current.ignore b/wear/watchface/watchface-complications-rendering/api/restricted_current.ignore
deleted file mode 100644
index 85aa9bc..0000000
--- a/wear/watchface/watchface-complications-rendering/api/restricted_current.ignore
+++ /dev/null
@@ -1,55 +0,0 @@
-// Baseline format: 1.0
-ParameterNameChange: androidx.wear.watchface.complications.rendering.CanvasComplicationDrawable#setDrawable(androidx.wear.watchface.complications.rendering.ComplicationDrawable) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.CanvasComplicationDrawable.setDrawable
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationDrawable#setBurnInProtectionOn(boolean) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationDrawable.setBurnInProtectionOn
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationDrawable#setCurrentTime(java.time.Instant) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationDrawable.setCurrentTime
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationDrawable#setHighlightDuration(long) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationDrawable.setHighlightDuration
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationDrawable#setHighlighted(boolean) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationDrawable.setHighlighted
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationDrawable#setInAmbientMode(boolean) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationDrawable.setInAmbientMode
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationDrawable#setLowBitAmbient(boolean) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationDrawable.setLowBitAmbient
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationDrawable#setNoDataText(CharSequence) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationDrawable.setNoDataText
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationDrawable#setRangedValueProgressHidden(boolean) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationDrawable.setRangedValueProgressHidden
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setBackgroundColor(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setBackgroundColor
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setBackgroundDrawable(android.graphics.drawable.Drawable) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setBackgroundDrawable
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setBorderColor(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setBorderColor
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setBorderDashGap(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setBorderDashGap
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setBorderDashWidth(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setBorderDashWidth
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setBorderRadius(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setBorderRadius
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setBorderStyle(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setBorderStyle
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setBorderWidth(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setBorderWidth
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setHighlightColor(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setHighlightColor
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setIconColor(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setIconColor
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setImageColorFilter(android.graphics.ColorFilter) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setImageColorFilter
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setRangedValuePrimaryColor(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setRangedValuePrimaryColor
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setRangedValueRingWidth(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setRangedValueRingWidth
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setRangedValueSecondaryColor(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setRangedValueSecondaryColor
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setTextColor(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setTextColor
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setTextSize(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setTextSize
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setTitleColor(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setTitleColor
-ParameterNameChange: androidx.wear.watchface.complications.rendering.ComplicationStyle#setTitleSize(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.complications.rendering.ComplicationStyle.setTitleSize
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 062f4f8..e5e18b1 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
@@ -78,22 +78,28 @@
         )
     }
 
-    init {
-        drawable.callback = 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()
-            }
-
-            override fun scheduleDrawable(who: Drawable, what: Runnable, `when`: Long) {}
+        @SuppressLint("SyntheticAccessor")
+        override fun invalidateDrawable(who: Drawable) {
+            invalidateCallback.onInvalidate()
         }
+
+        override fun scheduleDrawable(who: Drawable, what: Runnable, `when`: Long) {}
+    }
+
+    init {
+        drawable.callback = drawableCallback
     }
 
     /** The [ComplicationDrawable] to render with. */
     public var drawable: ComplicationDrawable = drawable
         set(value) {
+            // Assign the callback or we won't get notified when we need to redraw.
+            field.callback = null
+            value.callback = drawableCallback
+
             // Copy the ComplicationData otherwise the complication will be blank until the next
             // update.
             value.setComplicationData(field.complicationData, false)
diff --git a/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/utils/RangedValueLayoutHelper.java b/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/utils/RangedValueLayoutHelper.java
index 01b38a3..530fe91 100644
--- a/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/utils/RangedValueLayoutHelper.java
+++ b/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/utils/RangedValueLayoutHelper.java
@@ -108,7 +108,24 @@
 
     @Override
     public void getIconBounds(@NonNull Rect outRect) {
-        if (!hasIcon()) {
+        if (!hasIcon() || hasSmallImage()) {
+            outRect.setEmpty();
+        } else {
+            getBounds(outRect);
+            if (!hasShortText() || isWideRectangle(outRect)) {
+                // Show only an icon inside ranged value indicator
+                scaledAroundCenter(outRect, mRangedValueInnerSquare, 1 - ICON_PADDING_FRACTION * 2);
+            } else {
+                // Draw a short text complication inside ranged value bounds
+                mShortTextLayoutHelper.getIconBounds(outRect);
+                outRect.offset(mRangedValueInnerSquare.left, mRangedValueInnerSquare.top);
+            }
+        }
+    }
+
+    @Override
+    public void getSmallImageBounds(@NonNull Rect outRect) {
+        if (!hasSmallImage()) {
             outRect.setEmpty();
         } else {
             getBounds(outRect);
diff --git a/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/utils/ShortTextLayoutHelper.java b/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/utils/ShortTextLayoutHelper.java
index a7ec53e..8545138 100644
--- a/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/utils/ShortTextLayoutHelper.java
+++ b/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/utils/ShortTextLayoutHelper.java
@@ -44,7 +44,25 @@
 
     @Override
     public void getIconBounds(@NonNull Rect outRect) {
-        if (!hasIcon()) {
+        if (!hasIcon() || hasSmallImage()) {
+            outRect.setEmpty();
+        } else {
+            getBounds(outRect);
+            if (isWideRectangle(outRect)) {
+                // Left square part of the inner bounds
+                getLeftPart(outRect, outRect);
+            } else {
+                // Use top half of the central square
+                getCentralSquare(outRect, outRect);
+                getTopHalf(outRect, outRect);
+                getCentralSquare(outRect, outRect);
+            }
+        }
+    }
+
+    @Override
+    public void getSmallImageBounds(@NonNull Rect outRect) {
+        if (!hasSmallImage()) {
             outRect.setEmpty();
         } else {
             getBounds(outRect);
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 4d96d88..654f80f 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
@@ -18,6 +18,8 @@
 
 import static android.support.wearable.complications.ComplicationData.TYPE_ICON;
 import static android.support.wearable.complications.ComplicationData.TYPE_LONG_TEXT;
+import static android.support.wearable.complications.ComplicationData.TYPE_RANGED_VALUE;
+import static android.support.wearable.complications.ComplicationData.TYPE_SHORT_TEXT;
 import static android.support.wearable.complications.ComplicationData.TYPE_SMALL_IMAGE;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -126,7 +128,7 @@
         mComplicationRenderer.setComplicationData(
                 new ComplicationData.Builder(ComplicationData.TYPE_NO_DATA).build(), true);
         assertThat(mComplicationRenderer.getComplicationData().getType())
-                .isEqualTo(ComplicationData.TYPE_SHORT_TEXT);
+                .isEqualTo(TYPE_SHORT_TEXT);
         assertThat(mComplicationRenderer
                 .getComplicationData()
                 .getShortText()
@@ -339,7 +341,7 @@
     public void nothingIsDrawnForInactiveData() {
         // GIVEN a complication renderer with data that has passed its end time
         mComplicationRenderer.setComplicationData(
-                new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
+                new ComplicationData.Builder(TYPE_SHORT_TEXT)
                         .setShortText(ComplicationText.plainText("hello"))
                         .setEndDateTimeMillis(REFERENCE_TIME.toEpochMilli() - 100)
                         .build(),
@@ -356,7 +358,7 @@
     public void somethingIsDrawnForActiveData() {
         // GIVEN a complication renderer with data that has passed its end time
         mComplicationRenderer.setComplicationData(
-                new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
+                new ComplicationData.Builder(TYPE_SHORT_TEXT)
                         .setShortText(ComplicationText.plainText("hello"))
                         .setStartDateTimeMillis(REFERENCE_TIME.toEpochMilli() - 5000)
                         .setEndDateTimeMillis(REFERENCE_TIME.toEpochMilli() + 2000)
@@ -463,7 +465,7 @@
             setUp();
 
             mComplicationRenderer.setComplicationData(
-                    new ComplicationData.Builder(ComplicationData.TYPE_RANGED_VALUE)
+                    new ComplicationData.Builder(TYPE_RANGED_VALUE)
                             .setRangedValue(data.value)
                             .setRangedMinValue(data.min)
                             .setRangedMaxValue(data.max)
@@ -499,7 +501,7 @@
         int max = 100;
         int value = (max - min) / 2;
         mComplicationRenderer.setComplicationData(
-                new ComplicationData.Builder(ComplicationData.TYPE_RANGED_VALUE)
+                new ComplicationData.Builder(TYPE_RANGED_VALUE)
                         .setRangedValue(value)
                         .setRangedMinValue(min)
                         .setRangedMaxValue(max)
@@ -533,7 +535,7 @@
         int max = 100;
         int value = (max - min) / 2;
         mComplicationRenderer.setComplicationData(
-                new ComplicationData.Builder(ComplicationData.TYPE_RANGED_VALUE)
+                new ComplicationData.Builder(TYPE_RANGED_VALUE)
                         .setRangedValue(value)
                         .setRangedMinValue(min)
                         .setRangedMaxValue(max)
@@ -564,7 +566,7 @@
     public void bordersBackgroundAndHighlightAreDrawn() {
         // GIVEN a complication renderer with short text data
         mComplicationRenderer.setComplicationData(
-                new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
+                new ComplicationData.Builder(TYPE_SHORT_TEXT)
                         .setShortText(ComplicationText.plainText("Test text"))
                         .build(),
                 true);
@@ -625,7 +627,7 @@
         mComplicationRenderer.setComplicationData(
                 new ComplicationData.Builder(ComplicationData.TYPE_NO_DATA)
                         .setPlaceholder(new ComplicationData.Builder(
-                                ComplicationData.TYPE_SHORT_TEXT)
+                                TYPE_SHORT_TEXT)
                                 .setShortText(PLACEHOLDER_COMPLICATION_TEXT)
                                 .build())
                         .build(),
@@ -660,7 +662,7 @@
         mComplicationRenderer.setComplicationData(
                 new ComplicationData.Builder(ComplicationData.TYPE_NO_DATA)
                         .setPlaceholder(new ComplicationData.Builder(
-                                ComplicationData.TYPE_SHORT_TEXT)
+                                TYPE_SHORT_TEXT)
                                 .setShortText(ComplicationText.plainText("Hi"))
                                 .setShortTitle(PLACEHOLDER_COMPLICATION_TEXT)
                                 .build())
@@ -678,7 +680,7 @@
         mComplicationRenderer.setComplicationData(
                 new ComplicationData.Builder(ComplicationData.TYPE_NO_DATA)
                         .setPlaceholder(new ComplicationData.Builder(
-                                ComplicationData.TYPE_SHORT_TEXT)
+                                TYPE_SHORT_TEXT)
                                 .setShortText(ComplicationText.plainText("Hi"))
                                 .setIcon(Icon.createWithBitmap(
                                         Bitmap.createBitmap(100, 100, Bitmap.Config.RGB_565)))
@@ -697,7 +699,7 @@
     public void highlightIsNotDrawnInAmbientMode() {
         // GIVEN a complication renderer with short text data
         mComplicationRenderer.setComplicationData(
-                new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
+                new ComplicationData.Builder(TYPE_SHORT_TEXT)
                         .setShortText(ComplicationText.plainText("Test text"))
                         .build(),
                 true);
@@ -718,7 +720,7 @@
     public void antiAliasIsDisabledWhenInLowBitAmbientMode() {
         // GIVEN a complication renderer with short text data
         mComplicationRenderer.setComplicationData(
-                new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
+                new ComplicationData.Builder(TYPE_SHORT_TEXT)
                         .setShortText(ComplicationText.plainText("Test text"))
                         .build(),
                 true);
@@ -739,7 +741,7 @@
     public void antiAliasIsEnabledWhenNotInLowBitAmbientMode() {
         // GIVEN a complication renderer with short text data
         mComplicationRenderer.setComplicationData(
-                new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
+                new ComplicationData.Builder(TYPE_SHORT_TEXT)
                         .setShortText(ComplicationText.plainText("Test text"))
                         .build(),
                 true);
@@ -762,7 +764,7 @@
     public void notTintedWhenTapActionNotLostDueToSerialization() {
         // GIVEN a complication renderer with short text data
         mComplicationRenderer.setComplicationData(
-                new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
+                new ComplicationData.Builder(TYPE_SHORT_TEXT)
                         .setShortText(ComplicationText.plainText("Test text"))
                         .setTapActionLostDueToSerialization(false)
                         .build(),
@@ -781,7 +783,7 @@
     public void darkTintWhenTapActionLostDueToSerialization() {
         // GIVEN a complication renderer with short text data
         mComplicationRenderer.setComplicationData(
-                new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
+                new ComplicationData.Builder(TYPE_SHORT_TEXT)
                         .setShortText(ComplicationText.plainText("Test text"))
                         .setTapActionLostDueToSerialization(true)
                         .build(),
@@ -887,6 +889,43 @@
     }
 
     @Test
+    public void shortTextWithSmallImage() {
+        mComplicationRenderer.setBounds(new Rect(0, 0, 300, 100));
+        mComplicationRenderer.setComplicationData(
+                new ComplicationData.Builder(TYPE_SHORT_TEXT)
+                        .setShortText(ComplicationText.plainText("Foo"))
+                        .setSmallImage(mMockSmallImage)
+                        .build(),
+                true);
+
+        Drawable smallImage = loadIconFromMock(mMockSmallImage);
+        mComplicationRenderer.draw(mMockCanvas, REFERENCE_TIME, false, false, false, false);
+        Drawable activeDrawable = mComplicationRenderer.getRoundedSmallImage().getDrawable();
+
+        assertThat(activeDrawable).isEqualTo(smallImage);
+    }
+
+    @Test
+    public void rangedValueWithSmallImage() {
+        mComplicationRenderer.setBounds(new Rect(0, 0, 300, 100));
+        mComplicationRenderer.setComplicationData(
+                new ComplicationData.Builder(TYPE_RANGED_VALUE)
+                        .setShortText(ComplicationText.plainText("Foo"))
+                        .setSmallImage(mMockSmallImage)
+                        .setRangedValue(25f)
+                        .setRangedMinValue(0f)
+                        .setRangedMaxValue(100f)
+                        .build(),
+                true);
+
+        Drawable smallImage = loadIconFromMock(mMockSmallImage);
+        mComplicationRenderer.draw(mMockCanvas, REFERENCE_TIME, false, false, false, false);
+        Drawable activeDrawable = mComplicationRenderer.getRoundedSmallImage().getDrawable();
+
+        assertThat(activeDrawable).isEqualTo(smallImage);
+    }
+
+    @Test
     public void burnInProtectionSmallImageIsUsedInBurnInProtectionMode() {
         mComplicationRenderer.setBounds(new Rect(0, 0, 300, 100));
         mComplicationRenderer.setComplicationData(
@@ -962,7 +1001,7 @@
     @Test
     public void setRangedValueProgressHiddenForShortText() {
         mComplicationRenderer.setComplicationData(
-                new ComplicationData.Builder(ComplicationData.TYPE_RANGED_VALUE)
+                new ComplicationData.Builder(TYPE_RANGED_VALUE)
                         .setShortText(ComplicationText.plainText("foo"))
                         .setShortTitle(ComplicationText.plainText("bar"))
                         .setRangedMinValue(1)
@@ -975,7 +1014,7 @@
         ComplicationRenderer anotherRenderer =
                 createRendererWithBounds(mComplicationRenderer.getBounds());
         anotherRenderer.setComplicationData(
-                new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
+                new ComplicationData.Builder(TYPE_SHORT_TEXT)
                         .setShortText(ComplicationText.plainText("foo"))
                         .setShortTitle(ComplicationText.plainText("bar"))
                         .build(),
@@ -987,7 +1026,7 @@
     @Test
     public void setRangedValueProgressHiddenForIconOnly() {
         mComplicationRenderer.setComplicationData(
-                new ComplicationData.Builder(ComplicationData.TYPE_RANGED_VALUE)
+                new ComplicationData.Builder(TYPE_RANGED_VALUE)
                         .setIcon(mMockIcon)
                         .setRangedMinValue(1)
                         .setRangedValue(5)
diff --git a/wear/watchface/watchface-complications/api/current.ignore b/wear/watchface/watchface-complications/api/current.ignore
deleted file mode 100644
index d9a3a6c..0000000
--- a/wear/watchface/watchface-complications/api/current.ignore
+++ /dev/null
@@ -1,5 +0,0 @@
-// Baseline format: 1.0
-ParameterNameChange: androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever#retrieveComplicationDataSourceInfo(android.content.ComponentName, int[], kotlin.coroutines.Continuation<? super androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.Result[]>) parameter #2:
-    Attempted to remove parameter name from parameter arg3 in androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.retrieveComplicationDataSourceInfo
-ParameterNameChange: androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever#retrievePreviewComplicationData(android.content.ComponentName, androidx.wear.watchface.complications.data.ComplicationType, kotlin.coroutines.Continuation<? super androidx.wear.watchface.complications.data.ComplicationData>) parameter #2:
-    Attempted to remove parameter name from parameter arg3 in androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.retrievePreviewComplicationData
diff --git a/wear/watchface/watchface-complications/api/restricted_current.ignore b/wear/watchface/watchface-complications/api/restricted_current.ignore
index d9a3a6c..447539a 100644
--- a/wear/watchface/watchface-complications/api/restricted_current.ignore
+++ b/wear/watchface/watchface-complications/api/restricted_current.ignore
@@ -1,5 +1,5 @@
 // Baseline format: 1.0
-ParameterNameChange: androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever#retrieveComplicationDataSourceInfo(android.content.ComponentName, int[], kotlin.coroutines.Continuation<? super androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.Result[]>) parameter #2:
-    Attempted to remove parameter name from parameter arg3 in androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.retrieveComplicationDataSourceInfo
-ParameterNameChange: androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever#retrievePreviewComplicationData(android.content.ComponentName, androidx.wear.watchface.complications.data.ComplicationType, kotlin.coroutines.Continuation<? super androidx.wear.watchface.complications.data.ComplicationData>) parameter #2:
-    Attempted to remove parameter name from parameter arg3 in androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.retrievePreviewComplicationData
+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():
+    Removed method 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 b5e8b71..ad56e5f 100644
--- a/wear/watchface/watchface-complications/api/restricted_current.txt
+++ b/wear/watchface/watchface-complications/api/restricted_current.txt
@@ -57,7 +57,6 @@
     ctor public DefaultComplicationDataSourcePolicy(android.content.ComponentName primaryDataSource, androidx.wear.watchface.complications.data.ComplicationType primaryDataSourceDefaultType, int systemDataSourceFallback, androidx.wear.watchface.complications.data.ComplicationType systemDataSourceFallbackDefaultType);
     ctor @Deprecated public DefaultComplicationDataSourcePolicy(android.content.ComponentName primaryDataSource, android.content.ComponentName secondaryDataSource, int systemDataSourceFallback);
     ctor public DefaultComplicationDataSourcePolicy(android.content.ComponentName primaryDataSource, androidx.wear.watchface.complications.data.ComplicationType primaryDataSourceDefaultType, android.content.ComponentName secondaryDataSource, androidx.wear.watchface.complications.data.ComplicationType secondaryDataSourceDefaultType, int systemDataSourceFallback, androidx.wear.watchface.complications.data.ComplicationType systemDataSourceFallbackDefaultType);
-    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public DefaultComplicationDataSourcePolicy(androidx.wear.watchface.complications.data.DefaultComplicationDataSourcePolicyWireFormat wireFormat);
     method public android.content.ComponentName? getPrimaryDataSource();
     method public androidx.wear.watchface.complications.data.ComplicationType? getPrimaryDataSourceDefaultType();
     method public android.content.ComponentName? getSecondaryDataSource();
@@ -65,7 +64,6 @@
     method public int getSystemDataSourceFallback();
     method public androidx.wear.watchface.complications.data.ComplicationType getSystemDataSourceFallbackDefaultType();
     method public boolean isEmpty();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.complications.data.DefaultComplicationDataSourcePolicyWireFormat toWireFormat();
     property public final android.content.ComponentName? primaryDataSource;
     property public final androidx.wear.watchface.complications.data.ComplicationType? primaryDataSourceDefaultType;
     property public final android.content.ComponentName? secondaryDataSource;
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 4888999..b7ae041 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
@@ -17,6 +17,7 @@
 package androidx.wear.watchface.complications
 
 import android.content.ComponentName
+import android.content.res.Resources
 import android.content.res.XmlResourceParser
 import androidx.annotation.RestrictTo
 import androidx.wear.watchface.complications.SystemDataSources.DataSourceId
@@ -254,7 +255,7 @@
     }
 
     /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public constructor(wireFormat: DefaultComplicationDataSourcePolicyWireFormat) : this(
         wireFormat.mDefaultDataSourcesToTry,
         wireFormat.mFallbackSystemDataSource,
@@ -265,7 +266,7 @@
     }
 
     /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public fun toWireFormat(): DefaultComplicationDataSourcePolicyWireFormat {
         val systemDataSourceFallbackDefaultType = systemDataSourceFallbackDefaultType
             .toWireComplicationType()
@@ -321,11 +322,12 @@
         internal const val NO_DEFAULT_PROVIDER = SystemDataSources.NO_DATA_SOURCE
 
         fun inflate(
+            resources: Resources,
             parser: XmlResourceParser,
             nodeName: String,
         ): DefaultComplicationDataSourcePolicy {
             val primaryDataSource =
-                parser.getAttributeValue(NAMESPACE_APP, "primaryDataSource")?.let {
+                getStringRefAttribute(resources, parser, "primaryDataSource")?.let {
                     ComponentName.unflattenFromString(it)
                 }
             val primaryDataSourceDefaultType =
@@ -341,7 +343,7 @@
                     null
                 }
             val secondaryDataSource =
-                parser.getAttributeValue(NAMESPACE_APP, "secondaryDataSource")?.let {
+                getStringRefAttribute(resources, parser, "secondaryDataSource")?.let {
                     ComponentName.unflattenFromString(it)
                 }
 
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 f9c34ef..bb237b3 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
@@ -19,6 +19,7 @@
 
 package androidx.wear.watchface.complications
 
+import android.content.res.Resources
 import android.content.res.XmlResourceParser
 import androidx.annotation.RestrictTo
 import org.xmlpull.v1.XmlPullParser
@@ -34,6 +35,7 @@
  * Iterate through inner nodes of the current node.
  *
  * @param block called on each node.
+ * @hide
  */
 fun XmlResourceParser.iterate(block: () -> Unit) {
     val outerDepth = this.depth
@@ -46,3 +48,68 @@
         type = this.next()
     }
 }
+
+/**
+ * Move to the beginning of the expectedNode.
+ *
+ * @param expectedNode called on each node.
+ * @hide
+ */
+fun XmlPullParser.moveToStart(expectedNode: String) {
+    var type: Int
+    do {
+        type = next()
+    } while (type != XmlPullParser.END_DOCUMENT && type != XmlPullParser.START_TAG)
+
+    require(name == expectedNode) {
+        "Expected a $expectedNode node but is $name"
+    }
+}
+
+/**
+ * Gets the value of a string attribute from resource value, if not found, return the value itself
+ * or null if there is no value
+ *
+ * @param resources the [Resources] from which the value is loaded.
+ * @param parser The [XmlResourceParser] instance.
+ * @param name the name of the attribute.
+ * @hide
+ */
+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) {
+            parser.getAttributeValue(NAMESPACE_APP, name)
+        } else {
+            resources.getString(resId)
+        }
+    } else null
+}
+
+/**
+ * Gets the value of a integer attribute from resource value, if not found, return the value itself
+ * or null if there is no value
+ *
+ * @param resources the [Resources] from which the value is loaded.
+ * @param parser The [XmlResourceParser] instance.
+ * @param name the name of the attribute.
+ * @hide
+ */
+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) {
+            parser.getAttributeValue(NAMESPACE_APP, name).toInt()
+        } else {
+            resources.getInteger(resId)
+        }
+    } else null
+}
diff --git a/wear/watchface/watchface-data/api/current.txt b/wear/watchface/watchface-data/api/current.txt
index e6f50d0..7b1fd37 100644
--- a/wear/watchface/watchface-data/api/current.txt
+++ b/wear/watchface/watchface-data/api/current.txt
@@ -1 +1,15 @@
 // Signature format: 4.0
+package androidx.wear.watchface.data {
+
+  public final class WatchFaceColorsWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
+    ctor public WatchFaceColorsWireFormat(int, int, int);
+    method public int describeContents();
+    method public int getPrimaryColor();
+    method public int getSecondaryColor();
+    method public int getTertiaryColor();
+    method public void writeToParcel(android.os.Parcel?, int);
+    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.data.WatchFaceColorsWireFormat!> CREATOR;
+  }
+
+}
+
diff --git a/wear/watchface/watchface-data/api/public_plus_experimental_current.txt b/wear/watchface/watchface-data/api/public_plus_experimental_current.txt
index fdd04f4..0be96cf 100644
--- a/wear/watchface/watchface-data/api/public_plus_experimental_current.txt
+++ b/wear/watchface/watchface-data/api/public_plus_experimental_current.txt
@@ -11,5 +11,15 @@
     field public static final android.os.Parcelable.Creator<androidx.wear.watchface.data.BoundingArcWireFormat!> CREATOR;
   }
 
+  public final class WatchFaceColorsWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
+    ctor public WatchFaceColorsWireFormat(int, int, int);
+    method public int describeContents();
+    method public int getPrimaryColor();
+    method public int getSecondaryColor();
+    method public int getTertiaryColor();
+    method public void writeToParcel(android.os.Parcel?, int);
+    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.data.WatchFaceColorsWireFormat!> CREATOR;
+  }
+
 }
 
diff --git a/wear/watchface/watchface-data/api/restricted_current.ignore b/wear/watchface/watchface-data/api/restricted_current.ignore
new file mode 100644
index 0000000..36d7286
--- /dev/null
+++ b/wear/watchface/watchface-data/api/restricted_current.ignore
@@ -0,0 +1,29 @@
+// Baseline format: 1.0
+RemovedClass: androidx.wear.watchface.data.ComplicationSlotMetadataWireFormat:
+    Removed class androidx.wear.watchface.data.ComplicationSlotMetadataWireFormat
+RemovedClass: androidx.wear.watchface.data.ComplicationStateWireFormat:
+    Removed class androidx.wear.watchface.data.ComplicationStateWireFormat
+RemovedClass: androidx.wear.watchface.data.DeviceConfig:
+    Removed class androidx.wear.watchface.data.DeviceConfig
+RemovedClass: androidx.wear.watchface.data.IdAndComplicationDataWireFormat:
+    Removed class androidx.wear.watchface.data.IdAndComplicationDataWireFormat
+RemovedClass: androidx.wear.watchface.data.IdAndComplicationStateWireFormat:
+    Removed class androidx.wear.watchface.data.IdAndComplicationStateWireFormat
+RemovedClass: androidx.wear.watchface.data.IdAndTapEventWireFormat:
+    Removed class androidx.wear.watchface.data.IdAndTapEventWireFormat
+RemovedClass: androidx.wear.watchface.data.LayerParameterWireFormat:
+    Removed class androidx.wear.watchface.data.LayerParameterWireFormat
+RemovedClass: androidx.wear.watchface.data.RenderParametersWireFormat:
+    Removed class androidx.wear.watchface.data.RenderParametersWireFormat
+RemovedClass: androidx.wear.watchface.data.WatchFaceOverlayStyleWireFormat:
+    Removed class androidx.wear.watchface.data.WatchFaceOverlayStyleWireFormat
+RemovedClass: androidx.wear.watchface.data.WatchUiState:
+    Removed class androidx.wear.watchface.data.WatchUiState
+
+
+RemovedPackage: androidx.wear.watchface.control.data:
+    Removed package androidx.wear.watchface.control.data
+RemovedPackage: androidx.wear.watchface.editor.data:
+    Removed package androidx.wear.watchface.editor.data
+RemovedPackage: androidx.wear.watchface.style.data:
+    Removed package androidx.wear.watchface.style.data
diff --git a/wear/watchface/watchface-data/api/restricted_current.txt b/wear/watchface/watchface-data/api/restricted_current.txt
index 1686d18..3e709fb 100644
--- a/wear/watchface/watchface-data/api/restricted_current.txt
+++ b/wear/watchface/watchface-data/api/restricted_current.txt
@@ -1,404 +1,14 @@
 // Signature format: 4.0
-package androidx.wear.watchface.control.data {
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class ComplicationRenderParams implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
-    ctor public ComplicationRenderParams(int, androidx.wear.watchface.data.RenderParametersWireFormat, long, android.support.wearable.complications.ComplicationData?, androidx.wear.watchface.style.data.UserStyleWireFormat?);
-    method public int describeContents();
-    method public long getCalendarTimeMillis();
-    method public android.support.wearable.complications.ComplicationData? getComplicationData();
-    method public int getComplicationSlotId();
-    method public androidx.wear.watchface.data.RenderParametersWireFormat getRenderParametersWireFormat();
-    method public androidx.wear.watchface.style.data.UserStyleWireFormat? getUserStyle();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.control.data.ComplicationRenderParams!>! CREATOR;
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class CrashInfoParcel implements android.os.Parcelable {
-    ctor public CrashInfoParcel(Throwable);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.control.data.CrashInfoParcel!>! CREATOR;
-    field public final android.app.ApplicationErrorReport.CrashInfo crashInfo;
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class DefaultProviderPoliciesParams implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
-    ctor public DefaultProviderPoliciesParams(android.content.ComponentName);
-    method public int describeContents();
-    method public android.content.ComponentName getWatchFaceName();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.control.data.DefaultProviderPoliciesParams!>! CREATOR;
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class GetComplicationSlotMetadataParams implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
-    ctor public GetComplicationSlotMetadataParams(android.content.ComponentName);
-    method public int describeContents();
-    method public android.content.ComponentName getWatchFaceName();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.control.data.GetComplicationSlotMetadataParams!>! CREATOR;
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class GetUserStyleFlavorsParams implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
-    ctor public GetUserStyleFlavorsParams(android.content.ComponentName);
-    method public int describeContents();
-    method public android.content.ComponentName getWatchFaceName();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.control.data.GetUserStyleFlavorsParams!>! CREATOR;
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class GetUserStyleSchemaParams implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
-    ctor public GetUserStyleSchemaParams(android.content.ComponentName);
-    method public int describeContents();
-    method public android.content.ComponentName getWatchFaceName();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.control.data.GetUserStyleSchemaParams!>! CREATOR;
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class HeadlessWatchFaceInstanceParams implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
-    ctor @Deprecated public HeadlessWatchFaceInstanceParams(android.content.ComponentName, androidx.wear.watchface.data.DeviceConfig, int, int);
-    ctor public HeadlessWatchFaceInstanceParams(android.content.ComponentName, androidx.wear.watchface.data.DeviceConfig, int, int, String?);
-    method public int describeContents();
-    method public androidx.wear.watchface.data.DeviceConfig getDeviceConfig();
-    method public int getHeight();
-    method public String? getInstanceId();
-    method public android.content.ComponentName getWatchFaceName();
-    method public int getWidth();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.control.data.HeadlessWatchFaceInstanceParams!>! CREATOR;
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public final class IdTypeAndDefaultProviderPolicyWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
-    ctor public IdTypeAndDefaultProviderPolicyWireFormat(int, java.util.List<android.content.ComponentName!>?, int, int);
-    method public int describeContents();
-    method public int getDefaultProviderType();
-    method public java.util.List<android.content.ComponentName!>? getDefaultProvidersToTry();
-    method public int getFallbackSystemProvider();
-    method public int getId();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.control.data.IdTypeAndDefaultProviderPolicyWireFormat!>! CREATOR;
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize(allowSerialization=true) public class WallpaperInteractiveWatchFaceInstanceParams implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
-    ctor public WallpaperInteractiveWatchFaceInstanceParams(String, androidx.wear.watchface.data.DeviceConfig, androidx.wear.watchface.data.WatchUiState, androidx.wear.watchface.style.data.UserStyleWireFormat, java.util.List<androidx.wear.watchface.data.IdAndComplicationDataWireFormat!>?);
-    method public int describeContents();
-    method public androidx.wear.watchface.data.DeviceConfig getDeviceConfig();
-    method public java.util.List<androidx.wear.watchface.data.IdAndComplicationDataWireFormat!>? getIdAndComplicationDataWireFormats();
-    method public String getInstanceId();
-    method public androidx.wear.watchface.style.data.UserStyleWireFormat getUserStyle();
-    method public androidx.wear.watchface.data.WatchUiState getWatchUiState();
-    method public void setIdAndComplicationDataWireFormats(java.util.List<androidx.wear.watchface.data.IdAndComplicationDataWireFormat!>?);
-    method public void setUserStyle(androidx.wear.watchface.style.data.UserStyleWireFormat);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.control.data.WallpaperInteractiveWatchFaceInstanceParams!>! CREATOR;
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class WatchFaceRenderParams implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
-    ctor public WatchFaceRenderParams(androidx.wear.watchface.data.RenderParametersWireFormat, long, androidx.wear.watchface.style.data.UserStyleWireFormat?, java.util.List<androidx.wear.watchface.data.IdAndComplicationDataWireFormat!>?);
-    method public int describeContents();
-    method public long getCalendarTimeMillis();
-    method public java.util.List<androidx.wear.watchface.data.IdAndComplicationDataWireFormat!>? getIdAndComplicationDatumWireFormats();
-    method public androidx.wear.watchface.data.RenderParametersWireFormat getRenderParametersWireFormat();
-    method public androidx.wear.watchface.style.data.UserStyleWireFormat? getUserStyle();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.control.data.WatchFaceRenderParams!>! CREATOR;
-  }
-
-}
-
 package androidx.wear.watchface.data {
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public final class ComplicationSlotMetadataWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
-    ctor public ComplicationSlotMetadataWireFormat(int, int[], android.graphics.RectF![], int, int[], java.util.List<android.content.ComponentName!>?, int, int, int, int, boolean, boolean, android.os.Bundle);
-    ctor @Deprecated public ComplicationSlotMetadataWireFormat(int, int[], android.graphics.RectF![], int, int[], java.util.List<android.content.ComponentName!>?, int, int, boolean, boolean, android.os.Bundle);
+  @androidx.versionedparcelable.VersionedParcelize public final class WatchFaceColorsWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
+    ctor public WatchFaceColorsWireFormat(int, int, int);
     method public int describeContents();
-    method public int getBoundsType();
-    method public android.graphics.RectF![] getComplicationBounds();
-    method public int[] getComplicationBoundsType();
-    method public android.os.Bundle getComplicationConfigExtras();
-    method public java.util.List<android.graphics.RectF!>? getComplicationMargins();
-    method public int getDefaultDataSourceType();
-    method public java.util.List<android.content.ComponentName!>? getDefaultDataSourcesToTry();
-    method public int getFallbackSystemDataSource();
-    method public int getId();
-    method public int getPrimaryDataSourceDefaultType();
-    method public int getSecondaryDataSourceDefaultType();
-    method public int[] getSupportedTypes();
-    method public boolean isFixedComplicationDataSource();
-    method public boolean isInitiallyEnabled();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.data.ComplicationSlotMetadataWireFormat!>! CREATOR;
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public final class ComplicationStateWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
-    ctor public ComplicationStateWireFormat(android.graphics.Rect, int, int[], java.util.List<android.content.ComponentName!>?, int, int, int, int, boolean, boolean, int, boolean, android.os.Bundle, Integer?, Integer?);
-    ctor @Deprecated public ComplicationStateWireFormat(android.graphics.Rect, int, int[], java.util.List<android.content.ComponentName!>?, int, int, boolean, boolean, int, boolean, android.os.Bundle);
-    method public int describeContents();
-    method public android.graphics.Rect getBounds();
-    method public int getBoundsType();
-    method public android.graphics.Rect? getBoundsWithMargins();
-    method public android.os.Bundle getComplicationConfigExtras();
-    method public int getCurrentType();
-    method public int getDefaultDataSourceType();
-    method public java.util.List<android.content.ComponentName!>? getDefaultDataSourcesToTry();
-    method @Deprecated public int getDefaultProviderType();
-    method @Deprecated public java.util.List<android.content.ComponentName!>? getDefaultProvidersToTry();
-    method public int getFallbackSystemProvider();
-    method public Integer? getNameResourceId();
-    method public int getPrimaryDataSourceDefaultType();
-    method public Integer? getScreenReaderNameResourceId();
-    method public int getSecondaryDataSourceDefaultType();
-    method public int[] getSupportedTypes();
-    method public boolean isEnabled();
-    method public boolean isFixedComplicationProvider();
-    method public boolean isInitiallyEnabled();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.data.ComplicationStateWireFormat!>! CREATOR;
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize(allowSerialization=true) public final class DeviceConfig implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
-    ctor public DeviceConfig(boolean, boolean, long, long);
-    method public int describeContents();
-    method public long getAnalogPreviewReferenceTimeMillis();
-    method public long getDigitalPreviewReferenceTimeMillis();
-    method public boolean getHasBurnInProtection();
-    method public boolean getHasLowBitAmbient();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.data.DeviceConfig!>! CREATOR;
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public final class IdAndComplicationDataWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
-    ctor public IdAndComplicationDataWireFormat(int, android.support.wearable.complications.ComplicationData);
-    method public int describeContents();
-    method public android.support.wearable.complications.ComplicationData getComplicationData();
-    method public int getId();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.data.IdAndComplicationDataWireFormat!>! CREATOR;
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public final class IdAndComplicationStateWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
-    ctor public IdAndComplicationStateWireFormat(int, androidx.wear.watchface.data.ComplicationStateWireFormat);
-    method public int describeContents();
-    method public androidx.wear.watchface.data.ComplicationStateWireFormat getComplicationState();
-    method public int getId();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.data.IdAndComplicationStateWireFormat!>! CREATOR;
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize(allowSerialization=true) public final class IdAndTapEventWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
-    ctor public IdAndTapEventWireFormat(int, int, int, long);
-    method public int describeContents();
-    method public long getCalendarTapTimeMillis();
-    method public int getId();
-    method public int getX();
-    method public int getY();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.data.IdAndTapEventWireFormat!>! CREATOR;
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class LayerParameterWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
-    ctor public LayerParameterWireFormat(int, int);
-    method public int describeContents();
-    method public int getLayer();
-    method public int getLayerMode();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.data.LayerParameterWireFormat!>! CREATOR;
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class RenderParametersWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
-    ctor public RenderParametersWireFormat(int, int, int, int, String?, @ColorInt int, @ColorInt int, java.util.List<androidx.wear.watchface.data.IdAndTapEventWireFormat!>);
-    method public int describeContents();
-    method @ColorInt public int getBackgroundTint();
-    method public int getDrawMode();
-    method public int getElementComplicationSlotId();
-    method public int getElementType();
-    method public String? getElementUserStyleSettingId();
-    method @ColorInt public int getHighlightTint();
-    method public java.util.List<androidx.wear.watchface.data.IdAndTapEventWireFormat!>? getIdAndTapEventWireFormat();
-    method public int getWatchFaceLayerSetBitfield();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.data.RenderParametersWireFormat!>! CREATOR;
-    field public static int ELEMENT_TYPE_ALL_COMPLICATIONS;
-    field public static int ELEMENT_TYPE_COMPLICATION;
-    field public static int ELEMENT_TYPE_NONE;
-    field public static int ELEMENT_TYPE_USER_STYLE;
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class WatchFaceOverlayStyleWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
-    ctor public WatchFaceOverlayStyleWireFormat(android.graphics.Color?, android.graphics.Color?);
-    method public int describeContents();
-    method public android.graphics.Color? getBackgroundColor();
-    method public android.graphics.Color? getForegroundColor();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.data.WatchFaceOverlayStyleWireFormat!>! CREATOR;
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize(allowSerialization=true) public final class WatchUiState implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
-    ctor public WatchUiState(boolean, int);
-    method public int describeContents();
-    method public boolean getInAmbientMode();
-    method public int getInterruptionFilter();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.data.WatchUiState!>! CREATOR;
-  }
-
-}
-
-package androidx.wear.watchface.editor.data {
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize(allowSerialization=true) public final class EditorStateWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
-    ctor public EditorStateWireFormat(String?, androidx.wear.watchface.style.data.UserStyleWireFormat, java.util.List<androidx.wear.watchface.data.IdAndComplicationDataWireFormat!>, boolean, android.os.Bundle?);
-    method public int describeContents();
-    method public boolean getCommitChanges();
-    method public java.util.List<androidx.wear.watchface.data.IdAndComplicationDataWireFormat!> getPreviewComplicationData();
-    method public android.os.Bundle? getPreviewImageBundle();
-    method public androidx.wear.watchface.style.data.UserStyleWireFormat getUserStyle();
-    method public String? getWatchFaceInstanceId();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.editor.data.EditorStateWireFormat!>! CREATOR;
-  }
-
-}
-
-package androidx.wear.watchface.style.data {
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class BooleanOptionWireFormat extends androidx.wear.watchface.style.data.OptionWireFormat {
-    ctor public BooleanOptionWireFormat(byte[]);
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class BooleanUserStyleSettingWireFormat extends androidx.wear.watchface.style.data.UserStyleSettingWireFormat {
-    ctor @Deprecated public BooleanUserStyleSettingWireFormat(String, CharSequence, CharSequence, android.graphics.drawable.Icon?, java.util.List<androidx.wear.watchface.style.data.OptionWireFormat!>, int, java.util.List<java.lang.Integer!>);
-    ctor public BooleanUserStyleSettingWireFormat(String, CharSequence, CharSequence, android.graphics.drawable.Icon?, java.util.List<androidx.wear.watchface.style.data.OptionWireFormat!>, int, java.util.List<java.lang.Integer!>, android.os.Bundle?, java.util.List<android.os.Bundle!>?);
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class ComplicationOverlayWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
-    ctor public ComplicationOverlayWireFormat(int, Boolean?, java.util.Map<java.lang.Integer!,android.graphics.RectF!>?, Integer?);
-    method public int describeContents();
-    method public Integer? getAccessibilityTraversalIndex();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.style.data.ComplicationOverlayWireFormat!>! CREATOR;
-    field public static final int ENABLED_NO = 0; // 0x0
-    field public static final int ENABLED_UNKNOWN = -1; // 0xffffffff
-    field public static final int ENABLED_YES = 1; // 0x1
-    field public static final long NULL_ACCESSIBILITY_TRAVERSAL_INDEX = 4294967296L; // 0x100000000L
-    field @androidx.versionedparcelable.ParcelField(1) public int mComplicationSlotId;
-    field @androidx.versionedparcelable.ParcelField(2) public int mEnabled;
-    field @androidx.versionedparcelable.ParcelField(3) public java.util.Map<java.lang.Integer!,android.graphics.RectF!>? mPerComplicationTypeBounds;
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class ComplicationsOptionWireFormat extends androidx.wear.watchface.style.data.OptionWireFormat {
-    ctor public ComplicationsOptionWireFormat(byte[], CharSequence, android.graphics.drawable.Icon?, androidx.wear.watchface.style.data.ComplicationOverlayWireFormat![], java.util.List<androidx.wear.watchface.style.data.PerComplicationTypeMargins!>?);
-    ctor @Deprecated public ComplicationsOptionWireFormat(byte[], CharSequence, android.graphics.drawable.Icon?, androidx.wear.watchface.style.data.ComplicationOverlayWireFormat![]);
-    field @androidx.versionedparcelable.ParcelField(100) public androidx.wear.watchface.style.data.ComplicationOverlayWireFormat![] mComplicationOverlays;
-    field @androidx.versionedparcelable.ParcelField(value=101, defaultValue="null") public java.util.List<androidx.wear.watchface.style.data.PerComplicationTypeMargins!>? mComplicationOverlaysMargins;
-    field @androidx.versionedparcelable.ParcelField(2) public CharSequence mDisplayName;
-    field @androidx.versionedparcelable.ParcelField(3) public android.graphics.drawable.Icon? mIcon;
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class ComplicationsUserStyleSettingWireFormat extends androidx.wear.watchface.style.data.UserStyleSettingWireFormat {
-    ctor @Deprecated public ComplicationsUserStyleSettingWireFormat(String, CharSequence, CharSequence, android.graphics.drawable.Icon?, java.util.List<androidx.wear.watchface.style.data.OptionWireFormat!>, int, java.util.List<java.lang.Integer!>);
-    ctor public ComplicationsUserStyleSettingWireFormat(String, CharSequence, CharSequence, android.graphics.drawable.Icon?, java.util.List<androidx.wear.watchface.style.data.OptionWireFormat!>, int, java.util.List<java.lang.Integer!>, android.os.Bundle?, java.util.List<android.os.Bundle!>?);
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class CustomValueOptionWireFormat extends androidx.wear.watchface.style.data.OptionWireFormat {
-    ctor public CustomValueOptionWireFormat(byte[]);
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class CustomValueUserStyleSettingWireFormat extends androidx.wear.watchface.style.data.UserStyleSettingWireFormat {
-    ctor @Deprecated public CustomValueUserStyleSettingWireFormat(String, CharSequence, CharSequence, android.graphics.drawable.Icon?, java.util.List<androidx.wear.watchface.style.data.OptionWireFormat!>, java.util.List<java.lang.Integer!>);
-    ctor public CustomValueUserStyleSettingWireFormat(String, CharSequence, CharSequence, android.graphics.drawable.Icon?, java.util.List<androidx.wear.watchface.style.data.OptionWireFormat!>, java.util.List<java.lang.Integer!>, android.os.Bundle?, java.util.List<android.os.Bundle!>?);
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class DoubleRangeOptionWireFormat extends androidx.wear.watchface.style.data.OptionWireFormat {
-    ctor public DoubleRangeOptionWireFormat(byte[]);
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class DoubleRangeUserStyleSettingWireFormat extends androidx.wear.watchface.style.data.UserStyleSettingWireFormat {
-    ctor @Deprecated public DoubleRangeUserStyleSettingWireFormat(String, CharSequence, CharSequence, android.graphics.drawable.Icon?, java.util.List<androidx.wear.watchface.style.data.OptionWireFormat!>, int, java.util.List<java.lang.Integer!>);
-    ctor public DoubleRangeUserStyleSettingWireFormat(String, CharSequence, CharSequence, android.graphics.drawable.Icon?, java.util.List<androidx.wear.watchface.style.data.OptionWireFormat!>, int, java.util.List<java.lang.Integer!>, android.os.Bundle?, java.util.List<android.os.Bundle!>?);
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class ListOptionWireFormat extends androidx.wear.watchface.style.data.OptionWireFormat {
-    ctor public ListOptionWireFormat(byte[], CharSequence, android.graphics.drawable.Icon?);
-    field @androidx.versionedparcelable.ParcelField(2) public CharSequence mDisplayName;
-    field @androidx.versionedparcelable.ParcelField(3) public android.graphics.drawable.Icon? mIcon;
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class ListUserStyleSettingWireFormat extends androidx.wear.watchface.style.data.UserStyleSettingWireFormat {
-    ctor @Deprecated public ListUserStyleSettingWireFormat(String, CharSequence, CharSequence, android.graphics.drawable.Icon?, java.util.List<androidx.wear.watchface.style.data.OptionWireFormat!>, int, java.util.List<java.lang.Integer!>);
-    ctor public ListUserStyleSettingWireFormat(String, CharSequence, CharSequence, android.graphics.drawable.Icon?, java.util.List<androidx.wear.watchface.style.data.OptionWireFormat!>, int, java.util.List<java.lang.Integer!>, android.os.Bundle?, java.util.List<android.os.Bundle!>?);
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class LongRangeOptionWireFormat extends androidx.wear.watchface.style.data.OptionWireFormat {
-    ctor public LongRangeOptionWireFormat(byte[]);
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class LongRangeUserStyleSettingWireFormat extends androidx.wear.watchface.style.data.UserStyleSettingWireFormat {
-    ctor @Deprecated public LongRangeUserStyleSettingWireFormat(String, CharSequence, CharSequence, android.graphics.drawable.Icon?, java.util.List<androidx.wear.watchface.style.data.OptionWireFormat!>, int, java.util.List<java.lang.Integer!>);
-    ctor public LongRangeUserStyleSettingWireFormat(String, CharSequence, CharSequence, android.graphics.drawable.Icon?, java.util.List<androidx.wear.watchface.style.data.OptionWireFormat!>, int, java.util.List<java.lang.Integer!>, android.os.Bundle?, java.util.List<android.os.Bundle!>?);
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class OptionWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
-    ctor public OptionWireFormat(byte[]);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.style.data.OptionWireFormat!>! CREATOR;
-    field @androidx.versionedparcelable.ParcelField(1) public byte[] mId;
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class PerComplicationTypeMargins implements androidx.versionedparcelable.VersionedParcelable {
-    ctor public PerComplicationTypeMargins(java.util.Map<java.lang.Integer!,android.graphics.RectF!>);
-    field @androidx.versionedparcelable.ParcelField(1) public java.util.Map<java.lang.Integer!,android.graphics.RectF!> mPerComplicationTypeMargins;
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class UserStyleFlavorWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
-    ctor public UserStyleFlavorWireFormat(String, androidx.wear.watchface.style.data.UserStyleWireFormat, java.util.Map<java.lang.Integer!,androidx.wear.watchface.complications.data.DefaultComplicationDataSourcePolicyWireFormat!>);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.style.data.UserStyleFlavorWireFormat!>! CREATOR;
-    field @androidx.versionedparcelable.ParcelField(3) public java.util.Map<java.lang.Integer!,androidx.wear.watchface.complications.data.DefaultComplicationDataSourcePolicyWireFormat!> mComplications;
-    field @androidx.versionedparcelable.ParcelField(1) public String mId;
-    field @androidx.versionedparcelable.ParcelField(2) public androidx.wear.watchface.style.data.UserStyleWireFormat mStyle;
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class UserStyleFlavorsWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
-    ctor public UserStyleFlavorsWireFormat(java.util.List<androidx.wear.watchface.style.data.UserStyleFlavorWireFormat!>);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.style.data.UserStyleFlavorsWireFormat!>! CREATOR;
-    field @androidx.versionedparcelable.ParcelField(1) public java.util.List<androidx.wear.watchface.style.data.UserStyleFlavorWireFormat!> mFlavors;
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class UserStyleSchemaWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
-    ctor public UserStyleSchemaWireFormat(java.util.List<androidx.wear.watchface.style.data.UserStyleSettingWireFormat!>);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.style.data.UserStyleSchemaWireFormat!>! CREATOR;
-    field @androidx.versionedparcelable.ParcelField(1) public java.util.List<androidx.wear.watchface.style.data.UserStyleSettingWireFormat!> mSchema;
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class UserStyleSettingWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
-    ctor @Deprecated public UserStyleSettingWireFormat(String, CharSequence, CharSequence, android.graphics.drawable.Icon?, java.util.List<androidx.wear.watchface.style.data.OptionWireFormat!>, int, java.util.List<java.lang.Integer!>);
-    ctor public UserStyleSettingWireFormat(String, CharSequence, CharSequence, android.graphics.drawable.Icon?, java.util.List<androidx.wear.watchface.style.data.OptionWireFormat!>, int, java.util.List<java.lang.Integer!>, android.os.Bundle?, java.util.List<android.os.Bundle!>?);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.style.data.UserStyleSettingWireFormat!>! CREATOR;
-    field @androidx.versionedparcelable.ParcelField(6) public java.util.List<java.lang.Integer!> mAffectsLayers;
-    field @androidx.versionedparcelable.ParcelField(5) public int mDefaultOptionIndex;
-    field @androidx.versionedparcelable.ParcelField(3) public CharSequence mDescription;
-    field @androidx.versionedparcelable.ParcelField(2) public CharSequence mDisplayName;
-    field @androidx.versionedparcelable.ParcelField(4) public android.graphics.drawable.Icon? mIcon;
-    field @androidx.versionedparcelable.ParcelField(1) public String mId;
-    field @androidx.versionedparcelable.ParcelField(102) public android.os.Bundle? mOnWatchFaceEditorBundle;
-    field @androidx.versionedparcelable.ParcelField(101) public java.util.List<java.lang.Integer!>? mOptionChildIndices;
-    field @androidx.versionedparcelable.ParcelField(100) public java.util.List<androidx.wear.watchface.style.data.OptionWireFormat!> mOptions;
-    field @androidx.versionedparcelable.ParcelField(103) public java.util.List<android.os.Bundle!>? mPerOptionOnWatchFaceEditorBundles;
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize(allowSerialization=true) public class UserStyleWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
-    ctor public UserStyleWireFormat(java.util.Map<java.lang.String!,byte[]!>);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.style.data.UserStyleWireFormat!>! CREATOR;
-    field @androidx.versionedparcelable.ParcelField(1) public java.util.Map<java.lang.String!,byte[]!> mUserStyle;
+    method public int getPrimaryColor();
+    method public int getSecondaryColor();
+    method public int getTertiaryColor();
+    method public void writeToParcel(android.os.Parcel?, int);
+    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.data.WatchFaceColorsWireFormat!> CREATOR;
   }
 
 }
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 3eb0850..5c2520d 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
@@ -17,6 +17,7 @@
 package androidx.wear.watchface.control;
 
 import android.support.wearable.watchface.accessibility.ContentDescriptionLabel;
+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;
@@ -34,12 +35,12 @@
 interface IInteractiveWatchFace {
     // IMPORTANT NOTE: All methods must be given an explicit transaction id that must never change
     // in the future to remain binary backwards compatible.
-    // Next Id: 20
+    // Next Id: 23
 
     /**
      * API version number. This should be incremented every time a new method is added.
      */
-    const int API_VERSION = 4;
+    const int API_VERSION = 6;
 
     /** Indicates a "down" touch event on the watch face. */
     const int TAP_TYPE_DOWN = 0;
@@ -182,6 +183,7 @@
      * Adds a listener that will be called when the watch face is ready to render. If the watchface
      * is already ready this will be called immediately.
      *
+     * @Deprecated use IWatchfaceListener where possible instead.
      * @since API version 2.
      */
     oneway void addWatchfaceReadyListener(in IWatchfaceReadyListener listener) = 17;
@@ -195,4 +197,21 @@
      * @since API version 4.
      */
     WatchFaceOverlayStyleWireFormat getWatchFaceOverlayStyle() = 19;
+
+    /** Unused. */
+    void unused20() = 20;
+
+    /**
+     * Registers a {@link in IWatchfaceListener}.
+     *
+     * @since API version 6.
+     */
+    void addWatchFaceListener(in IWatchfaceListener listener) = 21;
+
+    /**
+     * Unregisters a {@link in IWatchfaceListener}.
+     *
+     * @since API version 6.
+     */
+    void removeWatchFaceListener(in IWatchfaceListener listener) = 22;
 }
diff --git a/wear/watchface/watchface-data/src/main/aidl/androidx/wear/watchface/control/IWatchfaceListener.aidl b/wear/watchface/watchface-data/src/main/aidl/androidx/wear/watchface/control/IWatchfaceListener.aidl
new file mode 100644
index 0000000..5b0836b
--- /dev/null
+++ b/wear/watchface/watchface-data/src/main/aidl/androidx/wear/watchface/control/IWatchfaceListener.aidl
@@ -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.wear.watchface.control;
+
+import androidx.wear.watchface.data.WatchFaceColorsWireFormat;
+
+/**
+ * Binder interface that allows the watch face to send notifications to its clients.
+ *
+ * @hide
+ */
+interface IWatchfaceListener {
+    // IMPORTANT NOTE: All methods must be given an explicit transaction id that must never change
+    // in the future to remain binary backwards compatible.
+    // Next Id: 4
+
+    /**
+     * API version number. This should be incremented every time a new method is added.
+     */
+    const int API_VERSION = 1;
+
+    /**
+     * Returns the version number for this API which the client can use to determine which methods
+     * are available.
+     *
+     * @since API version 1.
+     */
+    int getApiVersion() = 1;
+
+    /**
+     * Called when the watch face is ready to render.
+     *
+     * @since API version 1.
+     */
+    oneway void onWatchfaceReady() = 2;
+
+    /**
+     * Called when the watch face is ready to render.
+     *
+     * @since API version 1.
+     */
+    oneway void onWatchfaceColorsChanged(in WatchFaceColorsWireFormat watchFaceColors) = 3;
+}
\ No newline at end of file
diff --git a/wear/watchface/watchface-data/src/main/aidl/androidx/wear/watchface/control/IWatchfaceReadyListener.aidl b/wear/watchface/watchface-data/src/main/aidl/androidx/wear/watchface/control/IWatchfaceReadyListener.aidl
index 11bfaf4..986a932 100644
--- a/wear/watchface/watchface-data/src/main/aidl/androidx/wear/watchface/control/IWatchfaceReadyListener.aidl
+++ b/wear/watchface/watchface-data/src/main/aidl/androidx/wear/watchface/control/IWatchfaceReadyListener.aidl
@@ -19,6 +19,7 @@
 /**
  * Interface of a service that allows the user to create watch face instances.
  *
+ * @Deprecated Use IWatchfaceListener instead where possible.
  * @hide
  */
 interface IWatchfaceReadyListener {
diff --git a/wear/watchface/watchface-data/src/main/aidl/androidx/wear/watchface/data/WatchFaceColorsWireFormat.aidl b/wear/watchface/watchface-data/src/main/aidl/androidx/wear/watchface/data/WatchFaceColorsWireFormat.aidl
new file mode 100644
index 0000000..31ae53b
--- /dev/null
+++ b/wear/watchface/watchface-data/src/main/aidl/androidx/wear/watchface/data/WatchFaceColorsWireFormat.aidl
@@ -0,0 +1,20 @@
+/*
+ * 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.data;
+
+/** @hide */
+parcelable WatchFaceColorsWireFormat;
\ No newline at end of file
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/ComplicationRenderParams.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/ComplicationRenderParams.java
index fd7e897..47e0d8a 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/ComplicationRenderParams.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/ComplicationRenderParams.java
@@ -36,7 +36,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
 public class ComplicationRenderParams implements VersionedParcelable, Parcelable {
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 5f0fc51..fac6dbd 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
@@ -30,7 +30,7 @@
  * Used for sending details of an exception over aidl.
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @SuppressLint("BanParcelableUsage")
 public class CrashInfoParcel implements Parcelable {
     @NonNull public final CrashInfo crashInfo;
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/DefaultProviderPoliciesParams.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/DefaultProviderPoliciesParams.java
index d56be65..746f650 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/DefaultProviderPoliciesParams.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/DefaultProviderPoliciesParams.java
@@ -33,7 +33,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
 public class DefaultProviderPoliciesParams implements VersionedParcelable, Parcelable {
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/GetComplicationSlotMetadataParams.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/GetComplicationSlotMetadataParams.java
index dd327b3..de4d3e0 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/GetComplicationSlotMetadataParams.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/GetComplicationSlotMetadataParams.java
@@ -33,7 +33,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
 public class GetComplicationSlotMetadataParams implements VersionedParcelable, Parcelable {
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/GetUserStyleFlavorsParams.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/GetUserStyleFlavorsParams.java
index 1aaf789..2b3c24f 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/GetUserStyleFlavorsParams.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/GetUserStyleFlavorsParams.java
@@ -33,7 +33,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
 public class GetUserStyleFlavorsParams implements VersionedParcelable, Parcelable {
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/GetUserStyleSchemaParams.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/GetUserStyleSchemaParams.java
index 1f7ffb2..a7a0a78 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/GetUserStyleSchemaParams.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/GetUserStyleSchemaParams.java
@@ -33,7 +33,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
 public class GetUserStyleSchemaParams implements VersionedParcelable, Parcelable {
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 2c02cf9..5de4167 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
@@ -35,7 +35,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
 public class HeadlessWatchFaceInstanceParams implements VersionedParcelable, Parcelable {
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 0d236cf..80dbab7 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
@@ -37,7 +37,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 @SuppressLint("BanParcelableUsage")
 public final class IdTypeAndDefaultProviderPolicyWireFormat implements VersionedParcelable,
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 d6227a46c..80b8478 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
@@ -40,7 +40,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize(allowSerialization = true)
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
 public class WallpaperInteractiveWatchFaceInstanceParams
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 0e5f0d3..bc54dab 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
@@ -38,7 +38,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
 public class WatchFaceRenderParams implements VersionedParcelable, Parcelable {
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 8180132..d017c5c 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
@@ -36,7 +36,7 @@
 import java.util.List;
 
 /** @hide */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
 public final class ComplicationSlotMetadataWireFormat implements VersionedParcelable, Parcelable {
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 759bacf..8b34d3d 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
@@ -40,7 +40,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
 public final class ComplicationStateWireFormat implements VersionedParcelable, Parcelable {
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/DeviceConfig.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/DeviceConfig.java
index 5328fe0..76903bd 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/DeviceConfig.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/DeviceConfig.java
@@ -33,7 +33,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize(allowSerialization = true)
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
 public final class DeviceConfig implements VersionedParcelable, Parcelable {
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 8e4b748..07ccd8a 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
@@ -35,7 +35,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
 public final class IdAndComplicationDataWireFormat implements VersionedParcelable, Parcelable {
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 8242586..972aa55 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
@@ -32,7 +32,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
 public final class IdAndComplicationStateWireFormat implements VersionedParcelable, Parcelable {
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 7eefb77..db67687a 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
@@ -33,7 +33,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize(allowSerialization = true)
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
 public final class IdAndTapEventWireFormat implements VersionedParcelable, Parcelable {
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 09498b9..2993bba 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
@@ -36,7 +36,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
 public class LayerParameterWireFormat implements VersionedParcelable, Parcelable {
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 4e99c17..327e951 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
@@ -36,7 +36,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
 public class RenderParametersWireFormat implements VersionedParcelable, Parcelable {
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
new file mode 100644
index 0000000..19a72c7
--- /dev/null
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/WatchFaceColorsWireFormat.java
@@ -0,0 +1,98 @@
+/*
+ * 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.data;
+
+import android.annotation.SuppressLint;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.versionedparcelable.ParcelField;
+import androidx.versionedparcelable.ParcelUtils;
+import androidx.versionedparcelable.VersionedParcelable;
+import androidx.versionedparcelable.VersionedParcelize;
+
+/** Wire format for WatchFaceColorsWireFormat. */
+// TODO(b/230364881): Mark as @hide RestrictTo when BoundingArc is no longer experimental.
+@VersionedParcelize
+@SuppressLint("BanParcelableUsage")
+public final class WatchFaceColorsWireFormat implements VersionedParcelable, Parcelable {
+
+    @ParcelField(1)
+    int mPrimaryColor;
+
+    @ParcelField(2)
+    int mSecondaryColor;
+
+    @ParcelField(3)
+    int mTertiaryColor;
+
+    /** Used by VersionedParcelable. */
+    WatchFaceColorsWireFormat() {
+    }
+
+    public WatchFaceColorsWireFormat(
+            int primaryColor,
+            int secondaryColor,
+            int tertiaryColor) {
+        mPrimaryColor = primaryColor;
+        mSecondaryColor = secondaryColor;
+        mTertiaryColor = tertiaryColor;
+    }
+
+    public int getPrimaryColor() {
+        return mPrimaryColor;
+    }
+
+    public int getSecondaryColor() {
+        return mSecondaryColor;
+    }
+
+    public int getTertiaryColor() {
+        return mTertiaryColor;
+    }
+
+    /** Serializes this WatchFaceColorsWireFormat to the specified {@link Parcel}. */
+    @Override
+    public void writeToParcel(@Nullable Parcel parcel, int flags) {
+        if (parcel != null) {
+            parcel.writeParcelable(ParcelUtils.toParcelable(this), flags);
+        }
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @NonNull
+    public static final Parcelable.Creator<WatchFaceColorsWireFormat> CREATOR =
+            new Parcelable.Creator<WatchFaceColorsWireFormat>() {
+                @SuppressWarnings("deprecation")
+                @Override
+                public WatchFaceColorsWireFormat createFromParcel(Parcel source) {
+                    return ParcelUtils.fromParcelable(
+                            source.readParcelable(getClass().getClassLoader()));
+                }
+
+                @Override
+                public WatchFaceColorsWireFormat[] newArray(int size) {
+                    return new WatchFaceColorsWireFormat[size];
+                }
+            };
+}
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 410d089..35cafa0 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
@@ -34,7 +34,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 @SuppressLint("BanParcelableUsage")
 public class WatchFaceOverlayStyleWireFormat implements VersionedParcelable, Parcelable  {
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 ba6fe09..41ec071 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
@@ -32,7 +32,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize(allowSerialization = true)
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
 public final class WatchUiState implements VersionedParcelable, Parcelable {
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 34a32f61..5a9ea93 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
@@ -38,7 +38,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize(allowSerialization = true)
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
 public final class EditorStateWireFormat implements VersionedParcelable, Parcelable {
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 2b82b56..f2675ac 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
@@ -25,7 +25,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 public class BooleanOptionWireFormat extends OptionWireFormat {
 
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 1b2840d..a25fc96 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
@@ -31,7 +31,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 public class BooleanUserStyleSettingWireFormat extends UserStyleSettingWireFormat {
 
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 e72de56..b64f7ac 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
@@ -32,7 +32,7 @@
 import java.util.Map;
 
 /** @hide */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
 public class ComplicationOverlayWireFormat implements VersionedParcelable, Parcelable {
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 e15e08a..d6259da 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
@@ -32,7 +32,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 public class ComplicationsOptionWireFormat extends OptionWireFormat {
     @ParcelField(2)
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 8ec268a..1f81fc6 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
@@ -31,7 +31,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 public class ComplicationsUserStyleSettingWireFormat extends UserStyleSettingWireFormat {
 
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 60e73a7..e9bde47 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
@@ -26,7 +26,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 public class CustomValueOptionWireFormat extends OptionWireFormat {
     CustomValueOptionWireFormat() {
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 b54ae02..b0b2c4b 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
@@ -31,7 +31,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 public class CustomValueUserStyleSettingWireFormat extends UserStyleSettingWireFormat {
 
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 faf9fde..4a35f5e 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
@@ -26,7 +26,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 public class DoubleRangeOptionWireFormat extends OptionWireFormat {
     DoubleRangeOptionWireFormat() {
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 6738ac9..6d80e69 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
@@ -31,7 +31,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 public class DoubleRangeUserStyleSettingWireFormat extends UserStyleSettingWireFormat {
 
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 0ae3608..9f98992 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
@@ -30,7 +30,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 public class ListOptionWireFormat extends OptionWireFormat {
     /** Localized human readable name for the setting, used in the style selection UI. */
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 e4ce0bf..0c50c6c 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
@@ -31,7 +31,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 public class ListUserStyleSettingWireFormat extends UserStyleSettingWireFormat {
 
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 b01cdac..8819bef 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
@@ -26,7 +26,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 public class LongRangeOptionWireFormat extends OptionWireFormat {
     LongRangeOptionWireFormat() {
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 3d3e48a..8931d18 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
@@ -31,7 +31,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 public class LongRangeUserStyleSettingWireFormat extends UserStyleSettingWireFormat {
 
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 4bcb8ca..d3469fb 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
@@ -32,7 +32,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
 public class OptionWireFormat implements VersionedParcelable, Parcelable {
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 372dd4a..6d13989 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
@@ -27,7 +27,7 @@
 import java.util.Map;
 
 /** @hide */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 public class PerComplicationTypeMargins implements VersionedParcelable {
     @ParcelField(1)
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 051ad65..38d23cd 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
@@ -34,7 +34,7 @@
 /**
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
 public class UserStyleFlavorWireFormat implements VersionedParcelable, 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 db8d1d6..fb96d27 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
@@ -33,7 +33,7 @@
 /**
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
 public class UserStyleFlavorsWireFormat implements VersionedParcelable, 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 a8ed955..2bb0ad5 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
@@ -33,7 +33,7 @@
 /**
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
 public class UserStyleSchemaWireFormat implements VersionedParcelable, 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 d67145e..b101976 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
@@ -38,7 +38,7 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
 public class UserStyleSettingWireFormat implements VersionedParcelable, Parcelable {
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 520531c..f64c168 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
@@ -33,7 +33,7 @@
 /**
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize(allowSerialization = true)
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
 public class UserStyleWireFormat implements VersionedParcelable, Parcelable {
diff --git a/wear/watchface/watchface-editor-guava/api/current.ignore b/wear/watchface/watchface-editor-guava/api/current.ignore
deleted file mode 100644
index 190860b..0000000
--- a/wear/watchface/watchface-editor-guava/api/current.ignore
+++ /dev/null
@@ -1,5 +0,0 @@
-// Baseline format: 1.0
-ParameterNameChange: androidx.wear.watchface.editor.ListenableEditorSession#openComplicationDataSourceChooser(int, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.ChosenComplicationDataSource>) parameter #1:
-    Attempted to remove parameter name from parameter arg2 in androidx.wear.watchface.editor.ListenableEditorSession.openComplicationDataSourceChooser
-ParameterNameChange: androidx.wear.watchface.editor.ListenableEditorSession#setCommitChangesOnClose(boolean) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.editor.ListenableEditorSession.setCommitChangesOnClose
diff --git a/wear/watchface/watchface-editor-guava/api/restricted_current.ignore b/wear/watchface/watchface-editor-guava/api/restricted_current.ignore
deleted file mode 100644
index 190860b..0000000
--- a/wear/watchface/watchface-editor-guava/api/restricted_current.ignore
+++ /dev/null
@@ -1,5 +0,0 @@
-// Baseline format: 1.0
-ParameterNameChange: androidx.wear.watchface.editor.ListenableEditorSession#openComplicationDataSourceChooser(int, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.ChosenComplicationDataSource>) parameter #1:
-    Attempted to remove parameter name from parameter arg2 in androidx.wear.watchface.editor.ListenableEditorSession.openComplicationDataSourceChooser
-ParameterNameChange: androidx.wear.watchface.editor.ListenableEditorSession#setCommitChangesOnClose(boolean) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.editor.ListenableEditorSession.setCommitChangesOnClose
diff --git a/wear/watchface/watchface-editor/api/current.ignore b/wear/watchface/watchface-editor/api/current.ignore
deleted file mode 100644
index 0d08f7a..0000000
--- a/wear/watchface/watchface-editor/api/current.ignore
+++ /dev/null
@@ -1,9 +0,0 @@
-// Baseline format: 1.0
-ParameterNameChange: androidx.wear.watchface.editor.EditorSession#createOnWatchEditorSession(androidx.activity.ComponentActivity, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.EditorSession>) parameter #1:
-    Attempted to remove parameter name from parameter arg2 in androidx.wear.watchface.editor.EditorSession.createOnWatchEditorSession
-ParameterNameChange: androidx.wear.watchface.editor.EditorSession#openComplicationDataSourceChooser(int, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.ChosenComplicationDataSource>) parameter #1:
-    Attempted to remove parameter name from parameter arg2 in androidx.wear.watchface.editor.EditorSession.openComplicationDataSourceChooser
-ParameterNameChange: androidx.wear.watchface.editor.EditorSession#setCommitChangesOnClose(boolean) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.editor.EditorSession.setCommitChangesOnClose
-ParameterNameChange: androidx.wear.watchface.editor.EditorSession.Companion#createOnWatchEditorSession(androidx.activity.ComponentActivity, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.EditorSession>) parameter #1:
-    Attempted to remove parameter name from parameter arg2 in androidx.wear.watchface.editor.EditorSession.Companion.createOnWatchEditorSession
diff --git a/wear/watchface/watchface-editor/api/restricted_current.ignore b/wear/watchface/watchface-editor/api/restricted_current.ignore
deleted file mode 100644
index 0d08f7a..0000000
--- a/wear/watchface/watchface-editor/api/restricted_current.ignore
+++ /dev/null
@@ -1,9 +0,0 @@
-// Baseline format: 1.0
-ParameterNameChange: androidx.wear.watchface.editor.EditorSession#createOnWatchEditorSession(androidx.activity.ComponentActivity, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.EditorSession>) parameter #1:
-    Attempted to remove parameter name from parameter arg2 in androidx.wear.watchface.editor.EditorSession.createOnWatchEditorSession
-ParameterNameChange: androidx.wear.watchface.editor.EditorSession#openComplicationDataSourceChooser(int, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.ChosenComplicationDataSource>) parameter #1:
-    Attempted to remove parameter name from parameter arg2 in androidx.wear.watchface.editor.EditorSession.openComplicationDataSourceChooser
-ParameterNameChange: androidx.wear.watchface.editor.EditorSession#setCommitChangesOnClose(boolean) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.editor.EditorSession.setCommitChangesOnClose
-ParameterNameChange: androidx.wear.watchface.editor.EditorSession.Companion#createOnWatchEditorSession(androidx.activity.ComponentActivity, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.EditorSession>) parameter #1:
-    Attempted to remove parameter name from parameter arg2 in androidx.wear.watchface.editor.EditorSession.Companion.createOnWatchEditorSession
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 7de7ec0..fa68db6 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
@@ -787,6 +787,10 @@
 ) {
     private lateinit var editorDelegate: WatchFace.EditorDelegate
 
+    private companion object {
+        private const val TAG = "OnWatchFaceEditorSessionImpl"
+    }
+
     override val userStyleSchema by lazy {
         requireNotClosed()
         editorDelegate.userStyleSchema
@@ -846,7 +850,13 @@
                         validateAndUpdateUserStyle(args[1] as UserStyle)
                     }
                 }
-                else -> {}
+                else -> {
+                    Log.e(
+                        TAG,
+                        "userStyle proxy encountered unexpected method name '${method.name}'" +
+                            " please check your proguard rules."
+                    )
+                }
             }
             result
         }
diff --git a/wear/watchface/watchface-guava/api/current.ignore b/wear/watchface/watchface-guava/api/current.ignore
deleted file mode 100644
index 664332e..0000000
--- a/wear/watchface/watchface-guava/api/current.ignore
+++ /dev/null
@@ -1,13 +0,0 @@
-// Baseline format: 1.0
-ChangedThrows: androidx.wear.watchface.ListenableGlesRenderer#ListenableGlesRenderer(android.view.SurfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository, androidx.wear.watchface.WatchState, long, int[], int[]):
-    Constructor androidx.wear.watchface.ListenableGlesRenderer added thrown exception androidx.wear.watchface.Renderer.GlesRenderer.GlesException
-
-
-ParameterNameChange: androidx.wear.watchface.ListenableCanvasRenderer#init(kotlin.coroutines.Continuation<? super kotlin.Unit>) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.ListenableCanvasRenderer.init
-ParameterNameChange: androidx.wear.watchface.ListenableGlesRenderer#onBackgroundThreadGlContextCreated(kotlin.coroutines.Continuation<? super kotlin.Unit>) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.ListenableGlesRenderer.onBackgroundThreadGlContextCreated
-ParameterNameChange: androidx.wear.watchface.ListenableGlesRenderer#onUiThreadGlSurfaceCreated(int, int, kotlin.coroutines.Continuation<? super kotlin.Unit>) parameter #2:
-    Attempted to remove parameter name from parameter arg3 in androidx.wear.watchface.ListenableGlesRenderer.onUiThreadGlSurfaceCreated
-ParameterNameChange: androidx.wear.watchface.ListenableWatchFaceService#createWatchFace(android.view.SurfaceHolder, androidx.wear.watchface.WatchState, androidx.wear.watchface.ComplicationSlotsManager, androidx.wear.watchface.style.CurrentUserStyleRepository, kotlin.coroutines.Continuation<? super androidx.wear.watchface.WatchFace>) parameter #4:
-    Attempted to remove parameter name from parameter arg5 in androidx.wear.watchface.ListenableWatchFaceService.createWatchFace
diff --git a/wear/watchface/watchface-guava/api/restricted_current.ignore b/wear/watchface/watchface-guava/api/restricted_current.ignore
deleted file mode 100644
index 664332e..0000000
--- a/wear/watchface/watchface-guava/api/restricted_current.ignore
+++ /dev/null
@@ -1,13 +0,0 @@
-// Baseline format: 1.0
-ChangedThrows: androidx.wear.watchface.ListenableGlesRenderer#ListenableGlesRenderer(android.view.SurfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository, androidx.wear.watchface.WatchState, long, int[], int[]):
-    Constructor androidx.wear.watchface.ListenableGlesRenderer added thrown exception androidx.wear.watchface.Renderer.GlesRenderer.GlesException
-
-
-ParameterNameChange: androidx.wear.watchface.ListenableCanvasRenderer#init(kotlin.coroutines.Continuation<? super kotlin.Unit>) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.ListenableCanvasRenderer.init
-ParameterNameChange: androidx.wear.watchface.ListenableGlesRenderer#onBackgroundThreadGlContextCreated(kotlin.coroutines.Continuation<? super kotlin.Unit>) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.ListenableGlesRenderer.onBackgroundThreadGlContextCreated
-ParameterNameChange: androidx.wear.watchface.ListenableGlesRenderer#onUiThreadGlSurfaceCreated(int, int, kotlin.coroutines.Continuation<? super kotlin.Unit>) parameter #2:
-    Attempted to remove parameter name from parameter arg3 in androidx.wear.watchface.ListenableGlesRenderer.onUiThreadGlSurfaceCreated
-ParameterNameChange: androidx.wear.watchface.ListenableWatchFaceService#createWatchFace(android.view.SurfaceHolder, androidx.wear.watchface.WatchState, androidx.wear.watchface.ComplicationSlotsManager, androidx.wear.watchface.style.CurrentUserStyleRepository, kotlin.coroutines.Continuation<? super androidx.wear.watchface.WatchFace>) parameter #4:
-    Attempted to remove parameter name from parameter arg5 in androidx.wear.watchface.ListenableWatchFaceService.createWatchFace
diff --git a/wear/watchface/watchface-style/api/restricted_current.ignore b/wear/watchface/watchface-style/api/restricted_current.ignore
new file mode 100644
index 0000000..1c52092
--- /dev/null
+++ b/wear/watchface/watchface-style/api/restricted_current.ignore
@@ -0,0 +1,51 @@
+// Baseline format: 1.0
+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):
+    Removed constructor androidx.wear.watchface.style.UserStyleData(androidx.wear.watchface.style.data.UserStyleWireFormat)
+RemovedMethod: androidx.wear.watchface.style.UserStyleData#toWireFormat():
+    Removed method androidx.wear.watchface.style.UserStyleData.toWireFormat()
+RemovedMethod: androidx.wear.watchface.style.UserStyleSchema#UserStyleSchema(androidx.wear.watchface.style.data.UserStyleSchemaWireFormat):
+    Removed constructor androidx.wear.watchface.style.UserStyleSchema(androidx.wear.watchface.style.data.UserStyleSchemaWireFormat)
+RemovedMethod: androidx.wear.watchface.style.UserStyleSchema#getDefaultUserStyle():
+    Removed method androidx.wear.watchface.style.UserStyleSchema.getDefaultUserStyle()
+RemovedMethod: androidx.wear.watchface.style.UserStyleSchema#toWireFormat():
+    Removed method androidx.wear.watchface.style.UserStyleSchema.toWireFormat()
+RemovedMethod: androidx.wear.watchface.style.UserStyleSetting#getWireFormatOptionsList():
+    Removed method androidx.wear.watchface.style.UserStyleSetting.getWireFormatOptionsList()
+RemovedMethod: androidx.wear.watchface.style.UserStyleSetting#toWireFormat():
+    Removed method androidx.wear.watchface.style.UserStyleSetting.toWireFormat()
+RemovedMethod: androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting#toWireFormat():
+    Removed method androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting.toWireFormat()
+RemovedMethod: androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting.BooleanOption#toWireFormat():
+    Removed method androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting.BooleanOption.toWireFormat()
+RemovedMethod: androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting#toWireFormat():
+    Removed method androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.toWireFormat()
+RemovedMethod: androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption#toWireFormat():
+    Removed method androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption.toWireFormat()
+RemovedMethod: androidx.wear.watchface.style.UserStyleSetting.CustomValueUserStyleSetting#toWireFormat():
+    Removed method androidx.wear.watchface.style.UserStyleSetting.CustomValueUserStyleSetting.toWireFormat()
+RemovedMethod: androidx.wear.watchface.style.UserStyleSetting.CustomValueUserStyleSetting.CustomValueOption#toWireFormat():
+    Removed method androidx.wear.watchface.style.UserStyleSetting.CustomValueUserStyleSetting.CustomValueOption.toWireFormat()
+RemovedMethod: androidx.wear.watchface.style.UserStyleSetting.DoubleRangeUserStyleSetting#toWireFormat():
+    Removed method androidx.wear.watchface.style.UserStyleSetting.DoubleRangeUserStyleSetting.toWireFormat()
+RemovedMethod: androidx.wear.watchface.style.UserStyleSetting.DoubleRangeUserStyleSetting.DoubleRangeOption#toWireFormat():
+    Removed method androidx.wear.watchface.style.UserStyleSetting.DoubleRangeUserStyleSetting.DoubleRangeOption.toWireFormat()
+RemovedMethod: androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting#toWireFormat():
+    Removed method androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.toWireFormat()
+RemovedMethod: androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption#toWireFormat():
+    Removed method androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption.toWireFormat()
+RemovedMethod: androidx.wear.watchface.style.UserStyleSetting.LongRangeUserStyleSetting#toWireFormat():
+    Removed method androidx.wear.watchface.style.UserStyleSetting.LongRangeUserStyleSetting.toWireFormat()
+RemovedMethod: androidx.wear.watchface.style.UserStyleSetting.LongRangeUserStyleSetting.LongRangeOption#toWireFormat():
+    Removed method androidx.wear.watchface.style.UserStyleSetting.LongRangeUserStyleSetting.LongRangeOption.toWireFormat()
+RemovedMethod: androidx.wear.watchface.style.UserStyleSetting.Option#toWireFormat():
+    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 941219a..aeecd25 100644
--- a/wear/watchface/watchface-style/api/restricted_current.txt
+++ b/wear/watchface/watchface-style/api/restricted_current.txt
@@ -37,7 +37,6 @@
     method public boolean isEmpty();
     method public androidx.wear.watchface.style.MutableUserStyle toMutableUserStyle();
     method public androidx.wear.watchface.style.UserStyleData toUserStyleData();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.UserStyleWireFormat toWireFormat();
     property public java.util.Set<java.util.Map.Entry<androidx.wear.watchface.style.UserStyleSetting,androidx.wear.watchface.style.UserStyleSetting.Option>> entries;
     property public java.util.Set<androidx.wear.watchface.style.UserStyleSetting> keys;
     property public int size;
@@ -46,20 +45,16 @@
 
   public final class UserStyleData {
     ctor public UserStyleData(java.util.Map<java.lang.String,byte[]> userStyleMap);
-    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public UserStyleData(androidx.wear.watchface.style.data.UserStyleWireFormat userStyle);
     method public java.util.Map<java.lang.String,byte[]> getUserStyleMap();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.UserStyleWireFormat toWireFormat();
     property public final java.util.Map<java.lang.String,byte[]> userStyleMap;
   }
 
   public final class UserStyleFlavor {
     ctor public UserStyleFlavor(String id, androidx.wear.watchface.style.UserStyleData style, java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy> complications);
     ctor public UserStyleFlavor(String id, androidx.wear.watchface.style.UserStyle style, java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy> complications);
-    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public UserStyleFlavor(androidx.wear.watchface.style.data.UserStyleFlavorWireFormat wireFormat);
     method public java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy> getComplications();
     method public String getId();
     method public androidx.wear.watchface.style.UserStyleData getStyle();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.UserStyleFlavorWireFormat toWireFormat();
     property public final java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy> complications;
     property public final String id;
     property public final androidx.wear.watchface.style.UserStyleData style;
@@ -68,20 +63,15 @@
   public final class UserStyleFlavors {
     ctor public UserStyleFlavors(java.util.List<androidx.wear.watchface.style.UserStyleFlavor> flavors);
     ctor public UserStyleFlavors();
-    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public UserStyleFlavors(androidx.wear.watchface.style.data.UserStyleFlavorsWireFormat wireFormat);
     method public java.util.List<androidx.wear.watchface.style.UserStyleFlavor> getFlavors();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.UserStyleFlavorsWireFormat toWireFormat();
     property public final java.util.List<androidx.wear.watchface.style.UserStyleFlavor> flavors;
   }
 
   public final class UserStyleSchema {
     ctor public UserStyleSchema(java.util.List<? extends androidx.wear.watchface.style.UserStyleSetting> userStyleSettings);
-    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public UserStyleSchema(androidx.wear.watchface.style.data.UserStyleSchemaWireFormat wireFormat);
     method public operator androidx.wear.watchface.style.UserStyleSetting? get(androidx.wear.watchface.style.UserStyleSetting.Id settingId);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.UserStyle getDefaultUserStyle();
     method public byte[] getDigestHash();
     method public java.util.List<androidx.wear.watchface.style.UserStyleSetting> getUserStyleSettings();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.UserStyleSchemaWireFormat toWireFormat();
     property public final java.util.List<androidx.wear.watchface.style.UserStyleSetting> userStyleSettings;
   }
 
@@ -96,8 +86,6 @@
     method public androidx.wear.watchface.style.UserStyleSetting.Option getOptionForId(androidx.wear.watchface.style.UserStyleSetting.Option.Id optionId);
     method public final java.util.List<androidx.wear.watchface.style.UserStyleSetting.Option> getOptions();
     method public final androidx.wear.watchface.style.UserStyleSetting.WatchFaceEditorData? getWatchFaceEditorData();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final java.util.List<androidx.wear.watchface.style.data.OptionWireFormat> getWireFormatOptionsList();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract androidx.wear.watchface.style.data.UserStyleSettingWireFormat toWireFormat();
     property public final java.util.Collection<androidx.wear.watchface.style.WatchFaceLayer> affectedWatchFaceLayers;
     property public final androidx.wear.watchface.style.UserStyleSetting.Option defaultOption;
     property public final int defaultOptionIndex;
@@ -114,13 +102,11 @@
     ctor public UserStyleSetting.BooleanUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, boolean defaultValue, optional androidx.wear.watchface.style.UserStyleSetting.WatchFaceEditorData? watchFaceEditorData);
     ctor public UserStyleSetting.BooleanUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, boolean defaultValue);
     method public boolean getDefaultValue();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.BooleanUserStyleSettingWireFormat toWireFormat();
   }
 
   public static final class UserStyleSetting.BooleanUserStyleSetting.BooleanOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
     method public static androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting.BooleanOption from(boolean value);
     method public boolean getValue();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.BooleanOptionWireFormat toWireFormat();
     property public final boolean value;
     field public static final androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting.BooleanOption.Companion Companion;
     field public static final androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting.BooleanOption FALSE;
@@ -138,7 +124,6 @@
     ctor public UserStyleSetting.ComplicationSlotsUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption> complicationConfig, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, optional androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption defaultOption, optional androidx.wear.watchface.style.UserStyleSetting.WatchFaceEditorData? watchFaceEditorData);
     ctor public UserStyleSetting.ComplicationSlotsUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption> complicationConfig, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, optional androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption defaultOption);
     ctor public UserStyleSetting.ComplicationSlotsUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption> complicationConfig, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.ComplicationsUserStyleSettingWireFormat toWireFormat();
   }
 
   public static final class UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay {
@@ -168,7 +153,6 @@
     method public CharSequence getDisplayName();
     method public android.graphics.drawable.Icon? getIcon();
     method public androidx.wear.watchface.style.UserStyleSetting.WatchFaceEditorData? getWatchFaceEditorData();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.ComplicationsOptionWireFormat toWireFormat();
     property public final java.util.Collection<androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay> complicationSlotOverlays;
     property public final CharSequence displayName;
     property public final android.graphics.drawable.Icon? icon;
@@ -177,13 +161,11 @@
 
   public static final class UserStyleSetting.CustomValueUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
     ctor public UserStyleSetting.CustomValueUserStyleSetting(java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, byte[] defaultValue);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.CustomValueUserStyleSettingWireFormat toWireFormat();
   }
 
   public static final class UserStyleSetting.CustomValueUserStyleSetting.CustomValueOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
     ctor public UserStyleSetting.CustomValueUserStyleSetting.CustomValueOption(byte[] customValue);
     method public byte[] getCustomValue();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.CustomValueOptionWireFormat toWireFormat();
     property public final byte[] customValue;
   }
 
@@ -193,7 +175,6 @@
     method public double getDefaultValue();
     method public double getMaximumValue();
     method public double getMinimumValue();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.DoubleRangeUserStyleSettingWireFormat toWireFormat();
     property public final double defaultValue;
     property public final double maximumValue;
     property public final double minimumValue;
@@ -202,7 +183,6 @@
   public static final class UserStyleSetting.DoubleRangeUserStyleSetting.DoubleRangeOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
     ctor public UserStyleSetting.DoubleRangeUserStyleSetting.DoubleRangeOption(double value);
     method public double getValue();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.DoubleRangeOptionWireFormat toWireFormat();
     property public final double value;
   }
 
@@ -221,7 +201,6 @@
     ctor public UserStyleSetting.ListUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption> options, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, optional androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption defaultOption, optional androidx.wear.watchface.style.UserStyleSetting.WatchFaceEditorData? watchFaceEditorData);
     ctor public UserStyleSetting.ListUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption> options, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, optional androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption defaultOption);
     ctor public UserStyleSetting.ListUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption> options, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.ListUserStyleSettingWireFormat toWireFormat();
   }
 
   public static final class UserStyleSetting.ListUserStyleSetting.ListOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
@@ -230,7 +209,6 @@
     method public CharSequence getDisplayName();
     method public android.graphics.drawable.Icon? getIcon();
     method public androidx.wear.watchface.style.UserStyleSetting.WatchFaceEditorData? getWatchFaceEditorData();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.ListOptionWireFormat toWireFormat();
     property public final CharSequence displayName;
     property public final android.graphics.drawable.Icon? icon;
     property public final androidx.wear.watchface.style.UserStyleSetting.WatchFaceEditorData? watchFaceEditorData;
@@ -242,7 +220,6 @@
     method public long getDefaultValue();
     method public long getMaximumValue();
     method public long getMinimumValue();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.LongRangeUserStyleSettingWireFormat toWireFormat();
     property public final long defaultValue;
     property public final long maximumValue;
     property public final long minimumValue;
@@ -251,20 +228,17 @@
   public static final class UserStyleSetting.LongRangeUserStyleSetting.LongRangeOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
     ctor public UserStyleSetting.LongRangeUserStyleSetting.LongRangeOption(long value);
     method public long getValue();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.LongRangeOptionWireFormat toWireFormat();
     property public final long value;
   }
 
   public abstract static class UserStyleSetting.Option {
     ctor public UserStyleSetting.Option(androidx.wear.watchface.style.UserStyleSetting.Option.Id id);
     method public final androidx.wear.watchface.style.UserStyleSetting.Option.Id getId();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract androidx.wear.watchface.style.data.OptionWireFormat toWireFormat();
     property public final androidx.wear.watchface.style.UserStyleSetting.Option.Id id;
     field public static final androidx.wear.watchface.style.UserStyleSetting.Option.Companion Companion;
   }
 
   public static final class UserStyleSetting.Option.Companion {
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.UserStyleSetting.Option createFromWireFormat(androidx.wear.watchface.style.data.OptionWireFormat wireFormat);
   }
 
   public static final class UserStyleSetting.Option.Id {
@@ -286,9 +260,6 @@
   }
 
   public final class UserStyleSettingKt {
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static Integer? getIntRefAttribute(android.content.res.Resources resources, android.content.res.XmlResourceParser parser, String name);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static String? getStringRefAttribute(android.content.res.Resources resources, android.content.res.XmlResourceParser parser, String name);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void moveToStart(org.xmlpull.v1.XmlPullParser, String expectedNode);
   }
 
   public enum WatchFaceLayer {
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 f3d5457..1403622 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
@@ -26,6 +26,7 @@
 import androidx.wear.watchface.complications.IllegalNodeException
 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.test.R
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 656aa37..37aaa45 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
@@ -127,7 +127,7 @@
     )
 
     /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public fun toWireFormat(): UserStyleWireFormat = UserStyleWireFormat(toMap())
 
     /** Returns the style as a [UserStyleData]. */
@@ -370,7 +370,7 @@
     public val userStyleMap: Map<String, ByteArray>
 ) {
     /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public constructor(
         userStyle: UserStyleWireFormat
     ) : this(userStyle.mUserStyle)
@@ -386,7 +386,7 @@
     ) + "}"
 
     /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public fun toWireFormat(): UserStyleWireFormat = UserStyleWireFormat(userStyleMap)
 
     override fun equals(other: Any?): Boolean {
@@ -535,7 +535,7 @@
     }
 
     /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public constructor(wireFormat: UserStyleSchemaWireFormat) : this(
         wireFormat.mSchema.map { UserStyleSetting.createFromWireFormat(it) }
     ) {
@@ -566,7 +566,7 @@
     }
 
     /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public fun toWireFormat(): UserStyleSchemaWireFormat =
         UserStyleSchemaWireFormat(
             userStyleSettings.map { userStyleSetting ->
@@ -591,7 +591,7 @@
         )
 
     /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public fun getDefaultUserStyle() = UserStyle(
         HashMap<UserStyleSetting, UserStyleSetting.Option>().apply {
             for (setting in userStyleSettings) {
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 cacfd70..13d2457 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
@@ -21,6 +21,8 @@
 import androidx.annotation.RestrictTo
 import androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy
 import androidx.wear.watchface.complications.IllegalNodeException
+import androidx.wear.watchface.complications.getIntRefAttribute
+import androidx.wear.watchface.complications.getStringRefAttribute
 import androidx.wear.watchface.complications.hasValue
 import androidx.wear.watchface.complications.iterate
 import androidx.wear.watchface.style.data.UserStyleFlavorWireFormat
@@ -54,7 +56,7 @@
 
     /** @hide */
     @Suppress("ShowingMemberInHiddenClass")
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     constructor(wireFormat: UserStyleFlavorWireFormat) : this(
         wireFormat.mId,
         UserStyleData(wireFormat.mStyle),
@@ -64,7 +66,7 @@
 
     /** @hide */
     @Suppress("ShowingMemberInHiddenClass")
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     fun toWireFormat() =
         UserStyleFlavorWireFormat(
             id,
@@ -156,6 +158,7 @@
                         }
 
                         val policy = DefaultComplicationDataSourcePolicy.inflate(
+                            resources,
                             parser,
                             "ComplicationPolicy")
 
@@ -187,7 +190,7 @@
 
     /** @hide */
     @Suppress("ShowingMemberInHiddenClass")
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     constructor(wireFormat: UserStyleFlavorsWireFormat) : this(
         wireFormat.mFlavors.map { UserStyleFlavor(it) }
     ) {
@@ -195,7 +198,7 @@
 
     /** @hide */
     @Suppress("ShowingMemberInHiddenClass")
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     fun toWireFormat() =
         UserStyleFlavorsWireFormat(flavors.map { it.toWireFormat() })
 
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 d7ffae9..17bb965 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
@@ -36,8 +36,11 @@
 import androidx.wear.watchface.complications.NAMESPACE_ANDROID
 import androidx.wear.watchface.complications.NAMESPACE_APP
 import androidx.wear.watchface.complications.data.ComplicationType
+import androidx.wear.watchface.complications.getIntRefAttribute
+import androidx.wear.watchface.complications.getStringRefAttribute
 import androidx.wear.watchface.complications.hasValue
 import androidx.wear.watchface.complications.iterate
+import androidx.wear.watchface.complications.moveToStart
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption
 import androidx.wear.watchface.style.data.BooleanOptionWireFormat
@@ -57,11 +60,11 @@
 import androidx.wear.watchface.style.data.PerComplicationTypeMargins
 import androidx.wear.watchface.style.data.UserStyleSettingWireFormat
 import java.io.DataOutputStream
-import org.xmlpull.v1.XmlPullParser
 import java.io.InputStream
 import java.nio.ByteBuffer
 import java.security.DigestOutputStream
 import java.security.InvalidParameterException
+import org.xmlpull.v1.XmlPullParser
 
 /** Wrapper around either a [CharSequence] or a string resource. */
 internal sealed class DisplayText {
@@ -452,11 +455,11 @@
     )
 
     /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public abstract fun toWireFormat(): UserStyleSettingWireFormat
 
     /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public fun getWireFormatOptionsList(): List<OptionWireFormat> =
         options.map { it.toWireFormat() }
 
@@ -587,7 +590,7 @@
 
         public companion object {
             /** @hide */
-            @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+            @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
             public fun createFromWireFormat(
                 wireFormat: OptionWireFormat
             ): Option =
@@ -619,7 +622,7 @@
 
         /** @hide */
         @Suppress("HiddenAbstractMethod")
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
         public abstract fun toWireFormat(): OptionWireFormat
 
         override fun equals(other: Any?): Boolean {
@@ -773,7 +776,7 @@
         internal constructor(wireFormat: BooleanUserStyleSettingWireFormat) : super(wireFormat)
 
         /** @hide */
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
         override fun toWireFormat(): BooleanUserStyleSettingWireFormat =
             BooleanUserStyleSettingWireFormat(
                 id.value,
@@ -832,7 +835,7 @@
             emptyList()
         ) {
             /** @hide */
-            @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+            @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
             override fun toWireFormat(): BooleanOptionWireFormat =
                 BooleanOptionWireFormat(id.value)
 
@@ -1206,7 +1209,7 @@
         }
 
         /** @hide */
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
         override fun toWireFormat(): ComplicationsUserStyleSettingWireFormat =
             ComplicationsUserStyleSettingWireFormat(
                 id.value,
@@ -1426,7 +1429,7 @@
             }
 
             /** @hide */
-            @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+            @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
             override fun toWireFormat():
                 ComplicationsOptionWireFormat =
                 ComplicationsOptionWireFormat(
@@ -1700,7 +1703,7 @@
         internal constructor(wireFormat: DoubleRangeUserStyleSettingWireFormat) : super(wireFormat)
 
         /** @hide */
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
         override fun toWireFormat(): DoubleRangeUserStyleSettingWireFormat =
             DoubleRangeUserStyleSettingWireFormat(
                 id.value,
@@ -1741,7 +1744,7 @@
                 DoubleRangeUserStyleSetting::class.java
 
             /** @hide */
-            @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+            @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
             override fun toWireFormat(): DoubleRangeOptionWireFormat =
                 DoubleRangeOptionWireFormat(id.value)
 
@@ -1912,7 +1915,7 @@
         }
 
         /** @hide */
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
         override fun toWireFormat(): ListUserStyleSettingWireFormat =
             ListUserStyleSettingWireFormat(
                 id.value,
@@ -2130,7 +2133,7 @@
             }
 
             /** @hide */
-            @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+            @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
             override fun toWireFormat(): ListOptionWireFormat =
                 ListOptionWireFormat(
                     id.value,
@@ -2396,7 +2399,7 @@
         internal constructor(wireFormat: LongRangeUserStyleSettingWireFormat) : super(wireFormat)
 
         /** @hide */
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
         override fun toWireFormat(): LongRangeUserStyleSettingWireFormat =
             LongRangeUserStyleSettingWireFormat(
                 id.value,
@@ -2439,7 +2442,7 @@
                 LongRangeUserStyleSetting::class.java
 
             /** @hide */
-            @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+            @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
             override fun toWireFormat(): LongRangeOptionWireFormat =
                 LongRangeOptionWireFormat(id.value)
 
@@ -2519,7 +2522,7 @@
         internal constructor(wireFormat: CustomValueUserStyleSettingWireFormat) : super(wireFormat)
 
         /** @hide */
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
         override fun toWireFormat(): CustomValueUserStyleSettingWireFormat =
             CustomValueUserStyleSettingWireFormat(
                 id.value,
@@ -2557,7 +2560,7 @@
                 CustomValueUserStyleSetting::class.java
 
             /** @hide */
-            @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+            @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
             override fun toWireFormat(): CustomValueOptionWireFormat =
                 CustomValueOptionWireFormat(id.value)
 
@@ -2704,7 +2707,7 @@
 }
 
 /** @hide */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 fun getStringRefAttribute(
     resources: Resources,
     parser: XmlResourceParser,
@@ -2721,7 +2724,7 @@
 }
 
 /** @hide */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 fun getIntRefAttribute(
     resources: Resources,
     parser: XmlResourceParser,
@@ -2738,7 +2741,7 @@
 }
 
 /** @hide */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 fun XmlPullParser.moveToStart(expectedNode: String) {
     var type: Int
     do {
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 666a11c..52b49d5 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
@@ -38,8 +38,6 @@
 import com.google.common.truth.Truth.assertThat
 import org.junit.Assert.assertFalse
 import org.junit.Assert.assertTrue
-import org.junit.Assume.assumeTrue
-import org.junit.Before
 import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -81,11 +79,6 @@
         watchFaceEditorData = WatchFaceEditorData(wfIcon4)
     )
 
-    @Before
-    public fun setUp() {
-        assumeTrue("These tests require API 28", Build.VERSION.SDK_INT >= 28)
-    }
-
     @Test
     public fun parcelAndUnparcelStyleSettingAndOption() {
         val settingIcon = Icon.createWithContentUri("settingIcon")
diff --git a/wear/watchface/watchface/api/current.ignore b/wear/watchface/watchface/api/current.ignore
deleted file mode 100644
index dacf67f..0000000
--- a/wear/watchface/watchface/api/current.ignore
+++ /dev/null
@@ -1,23 +0,0 @@
-// Baseline format: 1.0
-ParameterNameChange: androidx.wear.watchface.Renderer#setAdditionalContentDescriptionLabels(java.util.Collection<kotlin.Pair<java.lang.Integer,androidx.wear.watchface.ContentDescriptionLabel>>) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.Renderer.setAdditionalContentDescriptionLabels
-ParameterNameChange: androidx.wear.watchface.Renderer#setInteractiveDrawModeUpdateDelayMillis(long) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.Renderer.setInteractiveDrawModeUpdateDelayMillis
-ParameterNameChange: androidx.wear.watchface.Renderer.CanvasRenderer#init(kotlin.coroutines.Continuation<? super kotlin.Unit>) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.Renderer.CanvasRenderer.init
-ParameterNameChange: androidx.wear.watchface.Renderer.GlesRenderer#onBackgroundThreadGlContextCreated(kotlin.coroutines.Continuation<? super kotlin.Unit>) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.Renderer.GlesRenderer.onBackgroundThreadGlContextCreated
-ParameterNameChange: androidx.wear.watchface.Renderer.GlesRenderer#onUiThreadGlSurfaceCreated(int, int, kotlin.coroutines.Continuation<? super kotlin.Unit>) parameter #2:
-    Attempted to remove parameter name from parameter arg3 in androidx.wear.watchface.Renderer.GlesRenderer.onUiThreadGlSurfaceCreated
-ParameterNameChange: androidx.wear.watchface.Renderer.GlesRenderer#runBackgroundThreadGlCommands(kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?>, kotlin.coroutines.Continuation<? super kotlin.Unit>) parameter #1:
-    Attempted to remove parameter name from parameter arg2 in androidx.wear.watchface.Renderer.GlesRenderer.runBackgroundThreadGlCommands
-ParameterNameChange: androidx.wear.watchface.Renderer.GlesRenderer#runUiThreadGlCommands(kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?>, kotlin.coroutines.Continuation<? super kotlin.Unit>) parameter #1:
-    Attempted to remove parameter name from parameter arg2 in androidx.wear.watchface.Renderer.GlesRenderer.runUiThreadGlCommands
-ParameterNameChange: androidx.wear.watchface.Renderer.GlesRenderer#setEglConfig(android.opengl.EGLConfig) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.Renderer.GlesRenderer.setEglConfig
-ParameterNameChange: androidx.wear.watchface.Renderer.GlesRenderer#setEglDisplay(android.opengl.EGLDisplay) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.Renderer.GlesRenderer.setEglDisplay
-ParameterNameChange: androidx.wear.watchface.WatchFace#setWatchFaceType(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.WatchFace.setWatchFaceType
-ParameterNameChange: androidx.wear.watchface.WatchFaceService#createWatchFace(android.view.SurfaceHolder, androidx.wear.watchface.WatchState, androidx.wear.watchface.ComplicationSlotsManager, androidx.wear.watchface.style.CurrentUserStyleRepository, kotlin.coroutines.Continuation<? super androidx.wear.watchface.WatchFace>) parameter #4:
-    Attempted to remove parameter name from parameter arg5 in androidx.wear.watchface.WatchFaceService.createWatchFace
diff --git a/wear/watchface/watchface/api/current.txt b/wear/watchface/watchface/api/current.txt
index 413672b..c206681 100644
--- a/wear/watchface/watchface/api/current.txt
+++ b/wear/watchface/watchface/api/current.txt
@@ -198,6 +198,7 @@
     method public final androidx.wear.watchface.RenderParameters getRenderParameters();
     method public final android.graphics.Rect getScreenBounds();
     method public final android.view.SurfaceHolder getSurfaceHolder();
+    method public final androidx.wear.watchface.WatchFaceColors? getWatchfaceColors();
     method @UiThread public final void invalidate();
     method @UiThread public void onDestroy();
     method @UiThread public abstract void onDump(java.io.PrintWriter writer);
@@ -205,6 +206,7 @@
     method public final void postInvalidate();
     method public final void setAdditionalContentDescriptionLabels(java.util.Collection<kotlin.Pair<java.lang.Integer,androidx.wear.watchface.ContentDescriptionLabel>>);
     method public final void setInteractiveDrawModeUpdateDelayMillis(long);
+    method public final void setWatchfaceColors(androidx.wear.watchface.WatchFaceColors?);
     method @UiThread public boolean shouldAnimate();
     property public final java.util.Collection<kotlin.Pair<java.lang.Integer,androidx.wear.watchface.ContentDescriptionLabel>> additionalContentDescriptionLabels;
     property public final float centerX;
@@ -213,6 +215,7 @@
     property public final androidx.wear.watchface.RenderParameters renderParameters;
     property public final android.graphics.Rect screenBounds;
     property public final android.view.SurfaceHolder surfaceHolder;
+    property public final androidx.wear.watchface.WatchFaceColors? watchfaceColors;
   }
 
   @Deprecated public abstract static class Renderer.CanvasRenderer extends androidx.wear.watchface.Renderer {
@@ -347,6 +350,19 @@
     method @UiThread public void onTapEvent(int tapType, androidx.wear.watchface.TapEvent tapEvent, androidx.wear.watchface.ComplicationSlot? complicationSlot);
   }
 
+  public final class WatchFaceColors {
+    ctor public WatchFaceColors(android.graphics.Color primaryColor, android.graphics.Color secondaryColor, android.graphics.Color tertiaryColor);
+    method public android.graphics.Color getPrimaryColor();
+    method public android.graphics.Color getSecondaryColor();
+    method public android.graphics.Color getTertiaryColor();
+    property public final android.graphics.Color primaryColor;
+    property public final android.graphics.Color secondaryColor;
+    property public final android.graphics.Color tertiaryColor;
+  }
+
+  public final class WatchFaceColorsKt {
+  }
+
   public final class WatchFaceKt {
   }
 
diff --git a/wear/watchface/watchface/api/public_plus_experimental_current.txt b/wear/watchface/watchface/api/public_plus_experimental_current.txt
index 4cf90dc..e2f094e 100644
--- a/wear/watchface/watchface/api/public_plus_experimental_current.txt
+++ b/wear/watchface/watchface/api/public_plus_experimental_current.txt
@@ -214,6 +214,7 @@
     method public final androidx.wear.watchface.RenderParameters getRenderParameters();
     method public final android.graphics.Rect getScreenBounds();
     method public final android.view.SurfaceHolder getSurfaceHolder();
+    method public final androidx.wear.watchface.WatchFaceColors? getWatchfaceColors();
     method @UiThread public final void invalidate();
     method @UiThread public void onDestroy();
     method @UiThread public abstract void onDump(java.io.PrintWriter writer);
@@ -221,6 +222,7 @@
     method public final void postInvalidate();
     method public final void setAdditionalContentDescriptionLabels(java.util.Collection<kotlin.Pair<java.lang.Integer,androidx.wear.watchface.ContentDescriptionLabel>>);
     method public final void setInteractiveDrawModeUpdateDelayMillis(long);
+    method public final void setWatchfaceColors(androidx.wear.watchface.WatchFaceColors?);
     method @UiThread public boolean shouldAnimate();
     property public final java.util.Collection<kotlin.Pair<java.lang.Integer,androidx.wear.watchface.ContentDescriptionLabel>> additionalContentDescriptionLabels;
     property public final float centerX;
@@ -229,6 +231,7 @@
     property public final androidx.wear.watchface.RenderParameters renderParameters;
     property public final android.graphics.Rect screenBounds;
     property public final android.view.SurfaceHolder surfaceHolder;
+    property public final androidx.wear.watchface.WatchFaceColors? watchfaceColors;
   }
 
   @Deprecated public abstract static class Renderer.CanvasRenderer extends androidx.wear.watchface.Renderer {
@@ -363,6 +366,19 @@
     method @UiThread public void onTapEvent(int tapType, androidx.wear.watchface.TapEvent tapEvent, androidx.wear.watchface.ComplicationSlot? complicationSlot);
   }
 
+  public final class WatchFaceColors {
+    ctor public WatchFaceColors(android.graphics.Color primaryColor, android.graphics.Color secondaryColor, android.graphics.Color tertiaryColor);
+    method public android.graphics.Color getPrimaryColor();
+    method public android.graphics.Color getSecondaryColor();
+    method public android.graphics.Color getTertiaryColor();
+    property public final android.graphics.Color primaryColor;
+    property public final android.graphics.Color secondaryColor;
+    property public final android.graphics.Color tertiaryColor;
+  }
+
+  public final class WatchFaceColorsKt {
+  }
+
   public final class WatchFaceKt {
   }
 
diff --git a/wear/watchface/watchface/api/restricted_current.ignore b/wear/watchface/watchface/api/restricted_current.ignore
index dacf67f..6cea676 100644
--- a/wear/watchface/watchface/api/restricted_current.ignore
+++ b/wear/watchface/watchface/api/restricted_current.ignore
@@ -1,23 +1,5 @@
 // Baseline format: 1.0
-ParameterNameChange: androidx.wear.watchface.Renderer#setAdditionalContentDescriptionLabels(java.util.Collection<kotlin.Pair<java.lang.Integer,androidx.wear.watchface.ContentDescriptionLabel>>) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.Renderer.setAdditionalContentDescriptionLabels
-ParameterNameChange: androidx.wear.watchface.Renderer#setInteractiveDrawModeUpdateDelayMillis(long) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.Renderer.setInteractiveDrawModeUpdateDelayMillis
-ParameterNameChange: androidx.wear.watchface.Renderer.CanvasRenderer#init(kotlin.coroutines.Continuation<? super kotlin.Unit>) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.Renderer.CanvasRenderer.init
-ParameterNameChange: androidx.wear.watchface.Renderer.GlesRenderer#onBackgroundThreadGlContextCreated(kotlin.coroutines.Continuation<? super kotlin.Unit>) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.Renderer.GlesRenderer.onBackgroundThreadGlContextCreated
-ParameterNameChange: androidx.wear.watchface.Renderer.GlesRenderer#onUiThreadGlSurfaceCreated(int, int, kotlin.coroutines.Continuation<? super kotlin.Unit>) parameter #2:
-    Attempted to remove parameter name from parameter arg3 in androidx.wear.watchface.Renderer.GlesRenderer.onUiThreadGlSurfaceCreated
-ParameterNameChange: androidx.wear.watchface.Renderer.GlesRenderer#runBackgroundThreadGlCommands(kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?>, kotlin.coroutines.Continuation<? super kotlin.Unit>) parameter #1:
-    Attempted to remove parameter name from parameter arg2 in androidx.wear.watchface.Renderer.GlesRenderer.runBackgroundThreadGlCommands
-ParameterNameChange: androidx.wear.watchface.Renderer.GlesRenderer#runUiThreadGlCommands(kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?>, kotlin.coroutines.Continuation<? super kotlin.Unit>) parameter #1:
-    Attempted to remove parameter name from parameter arg2 in androidx.wear.watchface.Renderer.GlesRenderer.runUiThreadGlCommands
-ParameterNameChange: androidx.wear.watchface.Renderer.GlesRenderer#setEglConfig(android.opengl.EGLConfig) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.Renderer.GlesRenderer.setEglConfig
-ParameterNameChange: androidx.wear.watchface.Renderer.GlesRenderer#setEglDisplay(android.opengl.EGLDisplay) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.Renderer.GlesRenderer.setEglDisplay
-ParameterNameChange: androidx.wear.watchface.WatchFace#setWatchFaceType(int) parameter #0:
-    Attempted to remove parameter name from parameter arg1 in androidx.wear.watchface.WatchFace.setWatchFaceType
-ParameterNameChange: androidx.wear.watchface.WatchFaceService#createWatchFace(android.view.SurfaceHolder, androidx.wear.watchface.WatchState, androidx.wear.watchface.ComplicationSlotsManager, androidx.wear.watchface.style.CurrentUserStyleRepository, kotlin.coroutines.Continuation<? super androidx.wear.watchface.WatchFace>) parameter #4:
-    Attempted to remove parameter name from parameter arg5 in androidx.wear.watchface.WatchFaceService.createWatchFace
+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():
+    Removed method androidx.wear.watchface.RenderParameters.toWireFormat()
diff --git a/wear/watchface/watchface/api/restricted_current.txt b/wear/watchface/watchface/api/restricted_current.txt
index e68df0f..c206681 100644
--- a/wear/watchface/watchface/api/restricted_current.txt
+++ b/wear/watchface/watchface/api/restricted_current.txt
@@ -143,13 +143,11 @@
     ctor public RenderParameters(androidx.wear.watchface.DrawMode drawMode, java.util.Set<? extends androidx.wear.watchface.style.WatchFaceLayer> watchFaceLayers, optional androidx.wear.watchface.RenderParameters.HighlightLayer? highlightLayer, optional java.util.Map<java.lang.Integer,androidx.wear.watchface.TapEvent> lastComplicationTapDownEvents);
     ctor public RenderParameters(androidx.wear.watchface.DrawMode drawMode, java.util.Set<? extends androidx.wear.watchface.style.WatchFaceLayer> watchFaceLayers, optional androidx.wear.watchface.RenderParameters.HighlightLayer? highlightLayer);
     ctor public RenderParameters(androidx.wear.watchface.DrawMode drawMode, java.util.Set<? extends androidx.wear.watchface.style.WatchFaceLayer> watchFaceLayers);
-    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public RenderParameters(androidx.wear.watchface.data.RenderParametersWireFormat wireFormat);
     method public androidx.wear.watchface.DrawMode getDrawMode();
     method public androidx.wear.watchface.RenderParameters.HighlightLayer? getHighlightLayer();
     method public java.util.Map<java.lang.Integer,androidx.wear.watchface.TapEvent> getLastComplicationTapDownEvents();
     method public java.util.Set<androidx.wear.watchface.style.WatchFaceLayer> getWatchFaceLayers();
     method public boolean isForScreenshot();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.data.RenderParametersWireFormat toWireFormat();
     property public final androidx.wear.watchface.DrawMode drawMode;
     property public final androidx.wear.watchface.RenderParameters.HighlightLayer? highlightLayer;
     property public final boolean isForScreenshot;
@@ -200,6 +198,7 @@
     method public final androidx.wear.watchface.RenderParameters getRenderParameters();
     method public final android.graphics.Rect getScreenBounds();
     method public final android.view.SurfaceHolder getSurfaceHolder();
+    method public final androidx.wear.watchface.WatchFaceColors? getWatchfaceColors();
     method @UiThread public final void invalidate();
     method @UiThread public void onDestroy();
     method @UiThread public abstract void onDump(java.io.PrintWriter writer);
@@ -207,6 +206,7 @@
     method public final void postInvalidate();
     method public final void setAdditionalContentDescriptionLabels(java.util.Collection<kotlin.Pair<java.lang.Integer,androidx.wear.watchface.ContentDescriptionLabel>>);
     method public final void setInteractiveDrawModeUpdateDelayMillis(long);
+    method public final void setWatchfaceColors(androidx.wear.watchface.WatchFaceColors?);
     method @UiThread public boolean shouldAnimate();
     property public final java.util.Collection<kotlin.Pair<java.lang.Integer,androidx.wear.watchface.ContentDescriptionLabel>> additionalContentDescriptionLabels;
     property public final float centerX;
@@ -215,6 +215,7 @@
     property public final androidx.wear.watchface.RenderParameters renderParameters;
     property public final android.graphics.Rect screenBounds;
     property public final android.view.SurfaceHolder surfaceHolder;
+    property public final androidx.wear.watchface.WatchFaceColors? watchfaceColors;
   }
 
   @Deprecated public abstract static class Renderer.CanvasRenderer extends androidx.wear.watchface.Renderer {
@@ -349,6 +350,19 @@
     method @UiThread public void onTapEvent(int tapType, androidx.wear.watchface.TapEvent tapEvent, androidx.wear.watchface.ComplicationSlot? complicationSlot);
   }
 
+  public final class WatchFaceColors {
+    ctor public WatchFaceColors(android.graphics.Color primaryColor, android.graphics.Color secondaryColor, android.graphics.Color tertiaryColor);
+    method public android.graphics.Color getPrimaryColor();
+    method public android.graphics.Color getSecondaryColor();
+    method public android.graphics.Color getTertiaryColor();
+    property public final android.graphics.Color primaryColor;
+    property public final android.graphics.Color secondaryColor;
+    property public final android.graphics.Color tertiaryColor;
+  }
+
+  public final class WatchFaceColorsKt {
+  }
+
   public final class WatchFaceKt {
   }
 
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 de2b16d..4ac69e0 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
@@ -20,12 +20,14 @@
 import android.content.Context
 import android.content.Intent
 import android.graphics.Canvas
+import android.graphics.Color
 import android.graphics.Paint
 import android.graphics.Path
 import android.graphics.Rect
 import android.graphics.RectF
 import android.graphics.drawable.Icon
 import android.view.SurfaceHolder
+import androidx.annotation.RequiresApi
 import androidx.wear.watchface.complications.ComplicationSlotBounds
 import androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy
 import androidx.wear.watchface.complications.SystemDataSources
@@ -37,6 +39,7 @@
 import androidx.wear.watchface.DrawMode
 import androidx.wear.watchface.Renderer
 import androidx.wear.watchface.WatchFace
+import androidx.wear.watchface.WatchFaceColors
 import androidx.wear.watchface.WatchFaceService
 import androidx.wear.watchface.WatchFaceType
 import androidx.wear.watchface.WatchState
@@ -378,6 +381,7 @@
 }
 
 @Suppress("Deprecation")
+@RequiresApi(27)
 class ExampleAnalogWatchCanvasRenderer(
     surfaceHolder: SurfaceHolder,
     private val context: Context,
@@ -445,6 +449,12 @@
                         .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)
+                )
             }
         }
     }
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 7921a53..1ff34e2 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
@@ -37,6 +37,7 @@
 import android.view.animation.AnimationUtils
 import android.view.animation.PathInterpolator
 import androidx.annotation.ColorInt
+import androidx.annotation.RequiresApi
 import androidx.wear.watchface.complications.ComplicationSlotBounds
 import androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy
 import androidx.wear.watchface.complications.SystemDataSources
@@ -48,6 +49,7 @@
 import androidx.wear.watchface.DrawMode
 import androidx.wear.watchface.Renderer
 import androidx.wear.watchface.WatchFace
+import androidx.wear.watchface.WatchFaceColors
 import androidx.wear.watchface.WatchFaceService
 import androidx.wear.watchface.WatchFaceType
 import androidx.wear.watchface.WatchState
@@ -685,6 +687,7 @@
 }
 
 @Suppress("Deprecation")
+@RequiresApi(27)
 class ExampleDigitalWatchCanvasRenderer(
     surfaceHolder: SurfaceHolder,
     private val context: Context,
@@ -812,6 +815,12 @@
                         userStyle[colorStyleSetting]!!.toString()
                     )
 
+                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
                 // drawables.
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 8b0e77d..6cc380d 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
@@ -27,6 +27,7 @@
 import android.util.Log
 import android.view.Gravity
 import android.view.SurfaceHolder
+import androidx.annotation.RequiresApi
 import androidx.wear.watchface.complications.ComplicationSlotBounds
 import androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy
 import androidx.wear.watchface.complications.SystemDataSources
@@ -36,6 +37,7 @@
 import androidx.wear.watchface.DrawMode
 import androidx.wear.watchface.Renderer
 import androidx.wear.watchface.WatchFace
+import androidx.wear.watchface.WatchFaceColors
 import androidx.wear.watchface.WatchFaceService
 import androidx.wear.watchface.WatchFaceType
 import androidx.wear.watchface.WatchState
@@ -55,6 +57,9 @@
 import java.time.ZonedDateTime
 import kotlin.math.cos
 import kotlin.math.sin
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
 
 /** Expected frame rate in interactive mode.  */
 private const val FPS: Long = 60
@@ -171,6 +176,7 @@
 }
 
 @Suppress("Deprecation")
+@RequiresApi(27)
 class ExampleOpenGLRenderer(
     surfaceHolder: SurfaceHolder,
     private val currentUserStyleRepository: CurrentUserStyleRepository,
@@ -235,6 +241,28 @@
     private lateinit var complicationTriangles: Gles2TexturedTriangleList
     private lateinit var complicationHighlightTriangles: Gles2ColoredTriangleList
 
+    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
+                }
+            }
+        }
+    }
+
     override suspend fun onBackgroundThreadGlContextCreated() {
         // Create program for drawing triangles.
         coloredTriangleProgram = Gles2ColoredTriangleList.Program()
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 46e6d89..11b7290 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
@@ -28,6 +28,7 @@
 import androidx.wear.watchface.samples.ExampleCanvasAnalogWatchFaceService
 import androidx.wear.watchface.style.CurrentUserStyleRepository
 import java.time.ZoneId
+import java.util.concurrent.CountDownLatch
 
 /** A simple canvas test analog watch face for integration tests. */
 internal class TestCanvasAnalogWatchFaceService(
@@ -37,7 +38,8 @@
     var mockZoneId: ZoneId,
     var surfaceHolderOverride: SurfaceHolder,
     var preRInitFlow: Boolean,
-    var directBootParams: WallpaperInteractiveWatchFaceInstanceParams?
+    var directBootParams: WallpaperInteractiveWatchFaceInstanceParams?,
+    val onInvalidateCountDownLatch: CountDownLatch?
 ) : WatchFaceService() {
 
     private val mutableWatchState = MutableWatchState()
@@ -112,4 +114,8 @@
         fileName: String,
         byteArray: ByteArray
     ) {}
+
+    override fun onInvalidate() {
+        onInvalidateCountDownLatch?.countDown()
+    }
 }
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 bf63d1b..a75123a 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
@@ -26,6 +26,7 @@
 import android.graphics.Color
 import android.graphics.Rect
 import android.graphics.SurfaceTexture
+import android.graphics.drawable.Icon
 import android.os.Build
 import android.os.Bundle
 import android.os.Handler
@@ -59,6 +60,7 @@
 import androidx.wear.watchface.complications.data.NoDataComplicationData
 import androidx.wear.watchface.complications.data.RangedValueComplicationData
 import androidx.wear.watchface.complications.data.SmallImage
+import androidx.wear.watchface.complications.data.SmallImageType
 import androidx.wear.watchface.control.IInteractiveWatchFace
 import androidx.wear.watchface.control.IPendingInteractiveWatchFace
 import androidx.wear.watchface.control.InteractiveInstanceManager
@@ -290,7 +292,7 @@
         pretendBinderThread.quitSafely()
     }
 
-    private fun initCanvasWatchFace() {
+    private fun initCanvasWatchFace(onInvalidateCountDownLatch: CountDownLatch? = null) {
         canvasAnalogWatchFaceService = TestCanvasAnalogWatchFaceService(
             ApplicationProvider.getApplicationContext<Context>(),
             handler,
@@ -298,7 +300,8 @@
             ZoneId.of("UTC"),
             surfaceHolder,
             true, // Not direct boot.
-            null
+            null,
+            onInvalidateCountDownLatch
         )
 
         Mockito.`when`(surfaceHolder.surfaceFrame)
@@ -554,7 +557,7 @@
         assertThat(initLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
 
         // Latch that countsDown when the complication below has been delivered.
-        val complicationReceivedLatch = CountDownLatch(1)
+        val complicationReceivedLatch = CountDownLatch(2)
         CoroutineScope(handler.asCoroutineDispatcher()).launch {
             engineWrapper.deferredWatchFaceImpl.await().complicationSlotsManager[
                 EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID
@@ -564,6 +567,15 @@
                 }
             }
         }
+        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()
+                }
+            }
+        }
 
         // This is a oneway call.
         interactiveWatchFaceInstance.updateComplicationData(
@@ -627,6 +639,83 @@
 
     @SuppressLint("NewApi")
     @Test
+    public fun testSmallImageComplications() {
+        val latch = CountDownLatch(1)
+
+        // 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)
+        }
+        assertThat(initLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
+
+        val smallImage = SmallImage.Builder(
+            Icon.createWithResource(
+                ApplicationProvider.getApplicationContext<Context>(),
+                R.drawable.color_icon
+            ),
+            SmallImageType.ICON
+        ).build()
+
+        // This is a oneway call.
+        interactiveWatchFaceInstance.updateComplicationData(
+            listOf(
+                IdAndComplicationDataWireFormat(
+                    EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
+                        ShortTextComplicationData.Builder(
+                            PlainComplicationText.Builder("Test").build(),
+                            ComplicationText.EMPTY
+                        )
+                            .setSmallImage(smallImage)
+                            .build()
+                            .asWireComplicationData()
+                ),
+                IdAndComplicationDataWireFormat(
+                    EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID,
+                        RangedValueComplicationData.Builder(
+                            25f,
+                            0f,
+                            100f,
+                            ComplicationText.EMPTY
+                        )
+                            .setSmallImage(smallImage)
+                            .build()
+                            .asWireComplicationData()
+                )
+            )
+        )
+
+        assertThat(onInvalidateCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
+
+        var bitmap: Bitmap? = null
+        pretendBinderHandler.post {
+            bitmap = SharedMemoryImage.ashmemReadImageBundle(
+                interactiveWatchFaceInstance.renderWatchFaceToBitmap(
+                    WatchFaceRenderParams(
+                        RenderParameters(
+                            DrawMode.INTERACTIVE,
+                            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                            null
+                        ).toWireFormat(),
+                        123456789,
+                        null,
+                        null
+                    )
+                )
+            )
+            latch.countDown()
+        }
+
+        assertThat(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
+        bitmap!!.assertAgainstGolden(
+            screenshotRule,
+            "smallImageComplications"
+        )
+    }
+
+    @SuppressLint("NewApi")
+    @Test
     public fun testHighlightAllComplicationsInScreenshot() {
         val latch = CountDownLatch(1)
 
@@ -836,7 +925,8 @@
                     mapOf(COLOR_STYLE_SETTING to GREEN_STYLE.encodeToByteArray())
                 ),
                 null
-            )
+            ),
+            null
         )
 
         val engineWrapper = service.onCreateEngine() as WatchFaceService.EngineWrapper
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 140be48..1ce4371 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
@@ -373,6 +373,10 @@
                 ComplicationType.RANGED_VALUE,
                 ComplicationType.SMALL_IMAGE
             ).inOrder()
+            assertThat(slotD.defaultDataSourcePolicy.primaryDataSource).isEqualTo(
+                ComponentName("com.package", "com.app.example1"))
+            assertThat(slotD.defaultDataSourcePolicy.secondaryDataSource).isEqualTo(
+                ComponentName("com.package", "com.app.example2"))
         }
     }
 }
diff --git a/wear/watchface/watchface/src/androidTest/res/drawable/color_icon.png b/wear/watchface/watchface/src/androidTest/res/drawable/color_icon.png
new file mode 100644
index 0000000..936386f
--- /dev/null
+++ b/wear/watchface/watchface/src/androidTest/res/drawable/color_icon.png
Binary files differ
diff --git a/wear/watchface/watchface/src/androidTest/res/values/strings.xml b/wear/watchface/watchface/src/androidTest/res/values/strings.xml
index 946f7e2..b213c4d 100644
--- a/wear/watchface/watchface/src/androidTest/res/values/strings.xml
+++ b/wear/watchface/watchface/src/androidTest/res/values/strings.xml
@@ -27,4 +27,6 @@
     <string name="option_time_style_minimal" translatable="false">minimal</string>
     <string name="option_time_style_seconds" translatable="false">seconds</string>
     <string name="supported_type_three" translatable="false">SHORT_TEXT|RANGED_VALUE|SMALL_IMAGE</string>
+    <string name="primary_data_source" translatable="false">com.package/com.app.example1</string>
+    <string name="secondary_data_source" translatable="false">com.package/com.app.example2</string>
 </resources>
diff --git a/wear/watchface/watchface/src/androidTest/res/xml/xml_watchface.xml b/wear/watchface/watchface/src/androidTest/res/xml/xml_watchface.xml
index cb508e7..637ccfb 100644
--- a/wear/watchface/watchface/src/androidTest/res/xml/xml_watchface.xml
+++ b/wear/watchface/watchface/src/androidTest/res/xml/xml_watchface.xml
@@ -79,6 +79,10 @@
         app:name="@string/complication_name_three"
         app:boundsType="ROUND_RECT"
         app:supportedTypes="@string/supported_type_three"
+        app:primaryDataSource="@string/primary_data_source"
+        app:primaryDataSourceDefaultType="SHORT_TEXT"
+        app:secondaryDataSource="@string/secondary_data_source"
+        app:secondaryDataSourceDefaultType="SMALL_IMAGE"
         app:systemDataSourceFallback="DATA_SOURCE_WATCH_BATTERY"
         app:systemDataSourceFallbackDefaultType="RANGED_VALUE">
         <ComplicationSlotBounds app:left="3" app:top="70" app:right="7" app:bottom="90"/>
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 3df0c1f..66dda1f 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
@@ -220,7 +220,7 @@
     }
 
     /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public constructor(wireFormat: RenderParametersWireFormat) : this(
         DrawMode.values()[wireFormat.drawMode],
         HashSet<WatchFaceLayer>().apply {
@@ -267,7 +267,7 @@
     )
 
     /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public fun toWireFormat(): RenderParametersWireFormat {
         val idAndTapEventWireFormats = lastComplicationTapDownEvents.map {
             IdAndTapEventWireFormat(
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 052ccf1..7ffd0a0 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
@@ -160,6 +160,9 @@
  * is a memory barrier between construction and rendering so no special threading primitives are
  * required.
  *
+ * It is recommended to set [watchfaceColors] with representative [WatchFaceColors] this is used by
+ * compatible systems to influence the system's color scheme.
+ *
  * 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
@@ -187,7 +190,16 @@
     @IntRange(from = 0, to = 60000)
     public var interactiveDrawModeUpdateDelayMillis: Long,
 ) {
+    private var pendingWatchFaceColors: WatchFaceColors? = null
+    private var pendingWatchFaceColorsSet = false
+
     internal var watchFaceHostApi: WatchFaceHostApi? = null
+        set(value) {
+            field = value
+            if (pendingWatchFaceColorsSet) {
+                value?.onWatchFaceColorsChanged(pendingWatchFaceColors)
+            }
+        }
 
     internal companion object {
         internal class SharedAssetsHolder {
@@ -450,6 +462,27 @@
     internal open suspend fun backgroundThreadInitInternal() {}
 
     /**
+     * Representative [WatchFaceColors] which are made available to system clients via
+     * [androidx.wear.watchface.client.InteractiveWatchFaceClient.OnWatchFaceColorsListener].
+     *
+     * Initially this value is `null` signifying that the colors are unknown. When possible the
+     * watchFace should assign `non null` [WatchFaceColors] and keep this updated when the colors
+     * change (e.g. due to a style change).
+     */
+    public var watchfaceColors: WatchFaceColors? = 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)
+           }
+       }
+
+    /**
      * 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 and shaders) between them.
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
new file mode 100644
index 0000000..3d82c36
--- /dev/null
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceColors.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.wear.watchface
+
+import android.graphics.Color
+import androidx.annotation.RestrictTo
+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.
+ */
+public class WatchFaceColors(
+    val primaryColor: Color,
+    val secondaryColor: Color,
+    val tertiaryColor: Color
+) {
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (javaClass != other?.javaClass) return false
+
+        other as WatchFaceColors
+
+        if (primaryColor != other.primaryColor) return false
+        if (secondaryColor != other.secondaryColor) return false
+        if (tertiaryColor != other.tertiaryColor) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = primaryColor.hashCode()
+        result = 31 * result + secondaryColor.hashCode()
+        result = 31 * result + tertiaryColor.hashCode()
+        return result
+    }
+
+    override fun toString(): String {
+        return "WatchfaceColors(primaryColor=$primaryColor, secondaryColor=$secondaryColor, " +
+            "tertiaryColor=$tertiaryColor)"
+    }
+
+    internal fun toWireFormat() = WatchFaceColorsWireFormat(
+        primaryColor.toArgb(),
+        secondaryColor.toArgb(),
+        tertiaryColor.toArgb()
+    )
+}
+
+/** @hide */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+fun WatchFaceColorsWireFormat.toApiFormat() = WatchFaceColors(
+    Color.valueOf(primaryColor),
+    Color.valueOf(secondaryColor),
+    Color.valueOf(tertiaryColor)
+)
\ No newline at end of file
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 76833ce..cc3d1a0 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
@@ -137,4 +137,7 @@
      */
     @UiThread
     public fun onActionTimeTick() {}
+
+    /** The engine must notify the system that the watch face's colors have changed. */
+    public fun onWatchFaceColorsChanged(watchFaceColors: WatchFaceColors?) {}
 }
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 102413f..6d2ccdc 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
@@ -60,6 +60,7 @@
 import androidx.wear.watchface.complications.data.toApiComplicationData
 import androidx.wear.watchface.complications.data.toWireTypes
 import androidx.wear.watchface.control.HeadlessWatchFaceImpl
+import androidx.wear.watchface.control.IWatchfaceListener
 import androidx.wear.watchface.control.IWatchfaceReadyListener
 import androidx.wear.watchface.control.InteractiveInstanceManager
 import androidx.wear.watchface.control.InteractiveWatchFaceImpl
@@ -359,7 +360,7 @@
                         }
                     }
                 } catch (e: Exception) {
-                    Log.e(TAG, "Operation failed", e)
+                    Log.e(TAG, "Operation $traceName failed", e)
                     throw e
                 }
             }
@@ -380,7 +381,7 @@
                         task(engine.watchFaceInitDetails.await())
                     }
                 } catch (e: Exception) {
-                    Log.e(HeadlessWatchFaceImpl.TAG, "Operation failed", e)
+                    Log.e(HeadlessWatchFaceImpl.TAG, "Operation $traceName failed", e)
                     throw e
                 }
             }
@@ -598,6 +599,9 @@
         }
     }
 
+    /** Used for testing calls to invalidate. */
+    internal open fun onInvalidate() {}
+
     /**
      * Returns the lazily constructed background thread [Handler]. During initialization
      * [createUserStyleSchema], [createComplicationSlotsManager] and [createWatchFace] are posted on
@@ -1204,6 +1208,13 @@
 
         private val mainThreadPriorityDelegate = getMainThreadPriorityDelegate()
 
+        // Members after this are protected by the lock.
+        private val lock = Any()
+
+        /** Protected by [lock]. */
+        private val listeners = HashSet<IWatchfaceListener>()
+        private var lastWatchFaceColors: WatchFaceColors? = null
+
         /**
          * Returns the [WatchFaceImpl] if [deferredWatchFaceImpl] has completed successfully or
          * `null` otherwise. Throws exception if there were problems with watchface validation.
@@ -1385,11 +1396,6 @@
             // list. NB we can't actually serialise complications anyway so that's just as well...
             params.idAndComplicationDataWireFormats = emptyList()
 
-            // Let wallpaper manager know the wallpaper has changed.
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
-                NotifyColorsChangedHelper.notifyColorsChanged(this)
-            }
-
             backgroundThreadCoroutineScope.launch {
                 writeDirectBootPrefs(_context, DIRECT_BOOT_PREFS, params)
             }
@@ -2179,6 +2185,7 @@
                     override fun onInvalidate() {
                         // This could be called on any thread.
                         uiThreadHandler.runOnHandlerWithTracing("onInvalidate") {
+                            this@WatchFaceService.onInvalidate()
                             if (initFinished) {
                                 getWatchFaceImplOrNull()?.invalidateIfNotAnimating()
                             }
@@ -2292,6 +2299,17 @@
             }
         }
 
+        override fun onWatchFaceColorsChanged(watchFaceColors: WatchFaceColors?) {
+            val listenersCopy = synchronized(lock) {
+                lastWatchFaceColors = watchFaceColors
+                HashSet<IWatchfaceListener>(listeners)
+            }
+
+            listenersCopy.forEach {
+                it.onWatchfaceColorsChanged(lastWatchFaceColors?.toWireFormat())
+            }
+        }
+
         internal fun draw() {
             try {
                 if (TRACE_DRAW) {
@@ -2473,6 +2491,26 @@
         private fun getAccessibilityManager() =
             _context.getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager
 
+        fun addWatchFaceListener(listener: IWatchfaceListener) {
+            val colors = synchronized(lock) {
+                listeners.add(listener)
+                lastWatchFaceColors
+            }
+
+            listener.onWatchfaceColorsChanged(colors?.toWireFormat())
+
+            uiThreadCoroutineScope.launch {
+                deferredWatchFaceImpl.await()
+                listener.onWatchfaceReady()
+            }
+        }
+
+        fun removeWatchFaceListener(listener: IWatchfaceListener) {
+            synchronized(lock) {
+                listeners.remove(listener)
+            }
+        }
+
         @UiThread
         internal fun dump(writer: IndentingPrintWriter) {
             require(uiThreadHandler.looper.isCurrentThread) {
@@ -2513,10 +2551,15 @@
 
             writer.println("frameCallbackPending=$frameCallbackPending")
             writer.println("destroyed=$destroyed")
+            writer.println("surfaceDestroyed=$surfaceDestroyed")
             writer.println(
                 "pendingInitialComplications=" + pendingInitialComplications?.joinToString()
             )
 
+            synchronized(lock) {
+                writer.println("listeners = " + listeners.joinToString(", "))
+            }
+
             if (!destroyed) {
                 getWatchFaceImplOrNull()?.dump(writer)
             }
@@ -2550,13 +2593,6 @@
         fun extractFromWindowInsets(insets: WindowInsets?) =
             insets?.getInsets(WindowInsets.Type.systemBars())?.bottom ?: 0
     }
-
-    @RequiresApi(27)
-    private object NotifyColorsChangedHelper {
-        fun notifyColorsChanged(engine: Engine) {
-            engine.notifyColorsChanged()
-        }
-    }
 }
 
 /**
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 a8e1279..09a0f9f 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
@@ -26,13 +26,13 @@
 import androidx.wear.watchface.complications.NAMESPACE_APP
 import androidx.wear.watchface.complications.data.ComplicationExperimental
 import androidx.wear.watchface.complications.data.ComplicationType
+import androidx.wear.watchface.complications.getIntRefAttribute
+import androidx.wear.watchface.complications.getStringRefAttribute
 import androidx.wear.watchface.complications.hasValue
+import androidx.wear.watchface.complications.moveToStart
 import androidx.wear.watchface.style.CurrentUserStyleRepository
 import androidx.wear.watchface.style.UserStyleFlavors
 import androidx.wear.watchface.style.UserStyleSchema
-import androidx.wear.watchface.style.getIntRefAttribute
-import androidx.wear.watchface.style.getStringRefAttribute
-import androidx.wear.watchface.style.moveToStart
 import org.xmlpull.v1.XmlPullParser
 import kotlin.jvm.Throws
 
@@ -184,8 +184,8 @@
                     )
                 }
 
-                val defaultComplicationDataSourcePolicy =
-                    DefaultComplicationDataSourcePolicy.inflate(parser, "ComplicationSlot")
+                val defaultComplicationDataSourcePolicy = DefaultComplicationDataSourcePolicy
+                    .inflate(resources, parser, "ComplicationSlot")
 
                 val initiallyEnabled = parser.getAttributeBooleanValue(
                     NAMESPACE_APP,
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 de725a6..173dee3 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
@@ -71,6 +71,22 @@
 
     override fun unused18() {}
 
+    override fun unused20() {}
+
+    override fun addWatchFaceListener(listener: IWatchfaceListener) {
+        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"
+        )
+    }
+
     override fun getWatchFaceOverlayStyle(): WatchFaceOverlayStyleWireFormat? =
         WatchFaceService.awaitDeferredWatchFaceAndComplicationManagerThenRunOnBinderThread(
             engine,
diff --git a/wear/watchface/watchface/src/main/res/values/config.xml b/wear/watchface/watchface/src/main/res/values/config.xml
index a313773..c74a8c7 100644
--- a/wear/watchface/watchface/src/main/res/values/config.xml
+++ b/wear/watchface/watchface/src/main/res/values/config.xml
@@ -17,5 +17,5 @@
 
 <resources>
     <bool name="watch_face_instance_service_enabled">false</bool>
-    <integer name="watch_face_xml_version">6</integer>
+    <integer name="watch_face_xml_version">7</integer>
 </resources>
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 be99c5d..1cfc5e5 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
@@ -24,6 +24,7 @@
 import android.content.Intent
 import android.graphics.Bitmap
 import android.graphics.Canvas
+import android.graphics.Color
 import android.graphics.Insets
 import android.graphics.Rect
 import android.graphics.RectF
@@ -68,6 +69,7 @@
 import androidx.wear.watchface.complications.rendering.ComplicationDrawable
 import androidx.wear.watchface.control.IInteractiveWatchFace
 import androidx.wear.watchface.control.IPendingInteractiveWatchFace
+import androidx.wear.watchface.control.IWatchfaceListener
 import androidx.wear.watchface.control.InteractiveInstanceManager
 import androidx.wear.watchface.control.data.CrashInfoParcel
 import androidx.wear.watchface.control.data.HeadlessWatchFaceInstanceParams
@@ -75,6 +77,7 @@
 import androidx.wear.watchface.data.ComplicationSlotMetadataWireFormat
 import androidx.wear.watchface.data.DeviceConfig
 import androidx.wear.watchface.data.IdAndComplicationDataWireFormat
+import androidx.wear.watchface.data.WatchFaceColorsWireFormat
 import androidx.wear.watchface.data.WatchUiState
 import androidx.wear.watchface.style.CurrentUserStyleRepository
 import androidx.wear.watchface.style.UserStyle
@@ -5512,6 +5515,125 @@
         InteractiveInstanceManager.releaseInstance(NEW_ID)
     }
 
+    @Test
+    @RequiresApi(27)
+    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))
+                    }
+
+                    override fun render(
+                        canvas: Canvas,
+                        bounds: Rect,
+                        zonedDateTime: ZonedDateTime
+                    ) { }
+
+                    override fun renderHighlightLayer(
+                        canvas: Canvas,
+                        bounds: Rect,
+                        zonedDateTime: ZonedDateTime
+                    ) {
+                    }
+                }
+                renderer
+            },
+            UserStyleSchema(emptyList()),
+            null,
+            handler,
+            null,
+            false,
+            null,
+            choreographer,
+            forceIsVisible = true
+        )
+
+        InteractiveInstanceManager
+            .getExistingInstanceOrSetPendingWallpaperInteractiveWatchFaceInstance(
+                InteractiveInstanceManager.PendingWallpaperInteractiveWatchFaceInstance(
+                    WallpaperInteractiveWatchFaceInstanceParams(
+                        SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive",
+                        DeviceConfig(
+                            false,
+                            false,
+                            0,
+                            0
+                        ),
+                        WatchUiState(false, 0),
+                        UserStyle(emptyMap()).toWireFormat(),
+                        emptyList()
+                    ),
+                    object : IPendingInteractiveWatchFace.Stub() {
+                        override fun getApiVersion() =
+                            IPendingInteractiveWatchFace.API_VERSION
+
+                        override fun onInteractiveWatchFaceCreated(
+                            iInteractiveWatchFace: IInteractiveWatchFace
+                        ) {
+                            interactiveWatchFaceInstance = iInteractiveWatchFace
+                        }
+
+                        override fun onInteractiveWatchFaceCrashed(exception: CrashInfoParcel?) {
+                            fail("WatchFace crashed: $exception")
+                        }
+                    }
+                )
+            )
+
+        var lastWatchFaceColors: WatchFaceColors? = null
+        val listener = object : IWatchfaceListener.Stub() {
+            override fun getApiVersion() = 1
+
+            override fun onWatchfaceReady() { }
+
+            override fun onWatchfaceColorsChanged(watchFaceColors: WatchFaceColorsWireFormat?) {
+                lastWatchFaceColors = watchFaceColors?.toApiFormat()
+            }
+        }
+
+        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))
+        )
+
+        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))
+        )
+
+        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))
+        )
+
+        engineWrapper.onDestroy()
+    }
+
     private fun getLeftShortTextComplicationDataText(): CharSequence {
         val complication = complicationSlotsManager[
             LEFT_COMPLICATION_ID
diff --git a/webkit/webkit/api/current.txt b/webkit/webkit/api/current.txt
index 261572f..88cad05 100644
--- a/webkit/webkit/api/current.txt
+++ b/webkit/webkit/api/current.txt
@@ -129,6 +129,7 @@
 
   public class WebSettingsCompat {
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.DISABLED_ACTION_MODE_MENU_ITEMS, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static int getDisabledActionModeMenuItems(android.webkit.WebSettings);
+    method @RequiresFeature(name=androidx.webkit.WebViewFeature.ENTERPRISE_AUTHENTICATION_APP_LINK_POLICY, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static boolean getEnterpriseAuthenticationAppLinkPolicyEnabled(android.webkit.WebSettings);
     method @Deprecated @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static int getForceDark(android.webkit.WebSettings);
     method @Deprecated @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK_STRATEGY, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static int getForceDarkStrategy(android.webkit.WebSettings);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.OFF_SCREEN_PRERASTER, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static boolean getOffscreenPreRaster(android.webkit.WebSettings);
@@ -136,6 +137,7 @@
     method @RequiresApi(android.os.Build.VERSION_CODES.Q) @RequiresFeature(name=androidx.webkit.WebViewFeature.ALGORITHMIC_DARKENING, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static boolean isAlgorithmicDarkeningAllowed(android.webkit.WebSettings);
     method @RequiresApi(android.os.Build.VERSION_CODES.Q) @RequiresFeature(name=androidx.webkit.WebViewFeature.ALGORITHMIC_DARKENING, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setAlgorithmicDarkeningAllowed(android.webkit.WebSettings, boolean);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.DISABLED_ACTION_MODE_MENU_ITEMS, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setDisabledActionModeMenuItems(android.webkit.WebSettings, int);
+    method @RequiresFeature(name=androidx.webkit.WebViewFeature.ENTERPRISE_AUTHENTICATION_APP_LINK_POLICY, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setEnterpriseAuthenticationAppLinkPolicyEnabled(android.webkit.WebSettings, boolean);
     method @Deprecated @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setForceDark(android.webkit.WebSettings, int);
     method @Deprecated @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK_STRATEGY, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setForceDarkStrategy(android.webkit.WebSettings, int);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.OFF_SCREEN_PRERASTER, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setOffscreenPreRaster(android.webkit.WebSettings, boolean);
@@ -222,6 +224,7 @@
     field public static final String ALGORITHMIC_DARKENING = "ALGORITHMIC_DARKENING";
     field public static final String CREATE_WEB_MESSAGE_CHANNEL = "CREATE_WEB_MESSAGE_CHANNEL";
     field public static final String DISABLED_ACTION_MODE_MENU_ITEMS = "DISABLED_ACTION_MODE_MENU_ITEMS";
+    field public static final String ENTERPRISE_AUTHENTICATION_APP_LINK_POLICY = "ENTERPRISE_AUTHENTICATION_APP_LINK_POLICY";
     field public static final String FORCE_DARK = "FORCE_DARK";
     field public static final String FORCE_DARK_STRATEGY = "FORCE_DARK_STRATEGY";
     field public static final String GET_VARIATIONS_HEADER = "GET_VARIATIONS_HEADER";
diff --git a/webkit/webkit/api/public_plus_experimental_current.txt b/webkit/webkit/api/public_plus_experimental_current.txt
index 261572f..88cad05 100644
--- a/webkit/webkit/api/public_plus_experimental_current.txt
+++ b/webkit/webkit/api/public_plus_experimental_current.txt
@@ -129,6 +129,7 @@
 
   public class WebSettingsCompat {
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.DISABLED_ACTION_MODE_MENU_ITEMS, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static int getDisabledActionModeMenuItems(android.webkit.WebSettings);
+    method @RequiresFeature(name=androidx.webkit.WebViewFeature.ENTERPRISE_AUTHENTICATION_APP_LINK_POLICY, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static boolean getEnterpriseAuthenticationAppLinkPolicyEnabled(android.webkit.WebSettings);
     method @Deprecated @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static int getForceDark(android.webkit.WebSettings);
     method @Deprecated @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK_STRATEGY, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static int getForceDarkStrategy(android.webkit.WebSettings);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.OFF_SCREEN_PRERASTER, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static boolean getOffscreenPreRaster(android.webkit.WebSettings);
@@ -136,6 +137,7 @@
     method @RequiresApi(android.os.Build.VERSION_CODES.Q) @RequiresFeature(name=androidx.webkit.WebViewFeature.ALGORITHMIC_DARKENING, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static boolean isAlgorithmicDarkeningAllowed(android.webkit.WebSettings);
     method @RequiresApi(android.os.Build.VERSION_CODES.Q) @RequiresFeature(name=androidx.webkit.WebViewFeature.ALGORITHMIC_DARKENING, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setAlgorithmicDarkeningAllowed(android.webkit.WebSettings, boolean);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.DISABLED_ACTION_MODE_MENU_ITEMS, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setDisabledActionModeMenuItems(android.webkit.WebSettings, int);
+    method @RequiresFeature(name=androidx.webkit.WebViewFeature.ENTERPRISE_AUTHENTICATION_APP_LINK_POLICY, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setEnterpriseAuthenticationAppLinkPolicyEnabled(android.webkit.WebSettings, boolean);
     method @Deprecated @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setForceDark(android.webkit.WebSettings, int);
     method @Deprecated @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK_STRATEGY, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setForceDarkStrategy(android.webkit.WebSettings, int);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.OFF_SCREEN_PRERASTER, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setOffscreenPreRaster(android.webkit.WebSettings, boolean);
@@ -222,6 +224,7 @@
     field public static final String ALGORITHMIC_DARKENING = "ALGORITHMIC_DARKENING";
     field public static final String CREATE_WEB_MESSAGE_CHANNEL = "CREATE_WEB_MESSAGE_CHANNEL";
     field public static final String DISABLED_ACTION_MODE_MENU_ITEMS = "DISABLED_ACTION_MODE_MENU_ITEMS";
+    field public static final String ENTERPRISE_AUTHENTICATION_APP_LINK_POLICY = "ENTERPRISE_AUTHENTICATION_APP_LINK_POLICY";
     field public static final String FORCE_DARK = "FORCE_DARK";
     field public static final String FORCE_DARK_STRATEGY = "FORCE_DARK_STRATEGY";
     field public static final String GET_VARIATIONS_HEADER = "GET_VARIATIONS_HEADER";
diff --git a/webkit/webkit/api/restricted_current.txt b/webkit/webkit/api/restricted_current.txt
index 261572f..88cad05 100644
--- a/webkit/webkit/api/restricted_current.txt
+++ b/webkit/webkit/api/restricted_current.txt
@@ -129,6 +129,7 @@
 
   public class WebSettingsCompat {
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.DISABLED_ACTION_MODE_MENU_ITEMS, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static int getDisabledActionModeMenuItems(android.webkit.WebSettings);
+    method @RequiresFeature(name=androidx.webkit.WebViewFeature.ENTERPRISE_AUTHENTICATION_APP_LINK_POLICY, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static boolean getEnterpriseAuthenticationAppLinkPolicyEnabled(android.webkit.WebSettings);
     method @Deprecated @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static int getForceDark(android.webkit.WebSettings);
     method @Deprecated @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK_STRATEGY, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static int getForceDarkStrategy(android.webkit.WebSettings);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.OFF_SCREEN_PRERASTER, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static boolean getOffscreenPreRaster(android.webkit.WebSettings);
@@ -136,6 +137,7 @@
     method @RequiresApi(android.os.Build.VERSION_CODES.Q) @RequiresFeature(name=androidx.webkit.WebViewFeature.ALGORITHMIC_DARKENING, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static boolean isAlgorithmicDarkeningAllowed(android.webkit.WebSettings);
     method @RequiresApi(android.os.Build.VERSION_CODES.Q) @RequiresFeature(name=androidx.webkit.WebViewFeature.ALGORITHMIC_DARKENING, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setAlgorithmicDarkeningAllowed(android.webkit.WebSettings, boolean);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.DISABLED_ACTION_MODE_MENU_ITEMS, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setDisabledActionModeMenuItems(android.webkit.WebSettings, int);
+    method @RequiresFeature(name=androidx.webkit.WebViewFeature.ENTERPRISE_AUTHENTICATION_APP_LINK_POLICY, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setEnterpriseAuthenticationAppLinkPolicyEnabled(android.webkit.WebSettings, boolean);
     method @Deprecated @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setForceDark(android.webkit.WebSettings, int);
     method @Deprecated @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK_STRATEGY, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setForceDarkStrategy(android.webkit.WebSettings, int);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.OFF_SCREEN_PRERASTER, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setOffscreenPreRaster(android.webkit.WebSettings, boolean);
@@ -222,6 +224,7 @@
     field public static final String ALGORITHMIC_DARKENING = "ALGORITHMIC_DARKENING";
     field public static final String CREATE_WEB_MESSAGE_CHANNEL = "CREATE_WEB_MESSAGE_CHANNEL";
     field public static final String DISABLED_ACTION_MODE_MENU_ITEMS = "DISABLED_ACTION_MODE_MENU_ITEMS";
+    field public static final String ENTERPRISE_AUTHENTICATION_APP_LINK_POLICY = "ENTERPRISE_AUTHENTICATION_APP_LINK_POLICY";
     field public static final String FORCE_DARK = "FORCE_DARK";
     field public static final String FORCE_DARK_STRATEGY = "FORCE_DARK_STRATEGY";
     field public static final String GET_VARIATIONS_HEADER = "GET_VARIATIONS_HEADER";
diff --git a/webkit/webkit/lint-baseline.xml b/webkit/webkit/lint-baseline.xml
deleted file mode 100644
index 18b21f2..0000000
--- a/webkit/webkit/lint-baseline.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 14): `setForceDark`"
-        errorLine1="            ApiHelperForQ.setForceDark(settings, forceDarkMode);"
-        errorLine2="                          ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebSettingsCompat.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 14): `getForceDark`"
-        errorLine1="            return ApiHelperForQ.getForceDark(settings);"
-        errorLine2="                                 ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebSettingsCompat.java"/>
-    </issue>
-
-</issues>
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatForceDarkTest.java b/webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatForceDarkTest.java
index 1d305cc..e495f13 100644
--- a/webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatForceDarkTest.java
+++ b/webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatForceDarkTest.java
@@ -101,6 +101,7 @@
      * i.e. web contents are always darkened by a user agent.
      */
     @SuppressWarnings("deprecation")
+    @FlakyTest(bugId = 240432254)
     @Test
     public void testForceDark_userAgentDarkeningOnly() {
         WebkitUtils.checkFeature(WebViewFeature.FORCE_DARK);
diff --git a/webkit/webkit/src/main/java/androidx/webkit/WebSettingsCompat.java b/webkit/webkit/src/main/java/androidx/webkit/WebSettingsCompat.java
index 9e97fc8..89fc14c 100644
--- a/webkit/webkit/src/main/java/androidx/webkit/WebSettingsCompat.java
+++ b/webkit/webkit/src/main/java/androidx/webkit/WebSettingsCompat.java
@@ -358,7 +358,7 @@
             enforcement = "androidx.webkit.WebViewFeature#isFeatureSupported")
     public static void setForceDark(@NonNull WebSettings settings,
             @ForceDark int forceDarkMode) {
-        ApiFeature.NoFramework feature = WebViewFeatureInternal.FORCE_DARK;
+        ApiFeature.Q feature = WebViewFeatureInternal.FORCE_DARK;
         if (feature.isSupportedByFramework()) {
             ApiHelperForQ.setForceDark(settings, forceDarkMode);
         } else if (feature.isSupportedByWebView()) {
@@ -387,7 +387,7 @@
     @RequiresFeature(name = WebViewFeature.FORCE_DARK,
             enforcement = "androidx.webkit.WebViewFeature#isFeatureSupported")
     public static @ForceDark int getForceDark(@NonNull WebSettings settings) {
-        ApiFeature.NoFramework feature = WebViewFeatureInternal.FORCE_DARK;
+        ApiFeature.Q feature = WebViewFeatureInternal.FORCE_DARK;
         if (feature.isSupportedByFramework()) {
             return ApiHelperForQ.getForceDark(settings);
         } else if (feature.isSupportedByWebView()) {
@@ -734,15 +734,16 @@
      * <p>
      * EnterpriseAuthenticationAppLinkPolicy is enabled by default.
      *
+     * <p> See <a href="https://source.chromium.org/chromium/chromium/src/+/main:components/policy/resources/policy_templates.json;l=32321?q=EnterpriseAuthenticationAppLinkPolicy%20file:policy_templates.json">
+     * this</a> for more information on EnterpriseAuthenticationAppLinkPolicy.
+     *
      * <p>
      * This method should only be called if
      * {@link WebViewFeature#isFeatureSupported(String)}
      * returns true for {@link WebViewFeature#ENTERPRISE_AUTHENTICATION_APP_LINK_POLICY}.
      *
      * @param enabled Whether EnterpriseAuthenticationAppLinkPolicy should be enabled.
-     * @hide
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
     @RequiresFeature(name = WebViewFeature.ENTERPRISE_AUTHENTICATION_APP_LINK_POLICY,
             enforcement = "androidx.webkit.WebViewFeature#isFeatureSupported")
     public static void setEnterpriseAuthenticationAppLinkPolicyEnabled(
@@ -760,6 +761,9 @@
     /**
      * Gets whether EnterpriseAuthenticationAppLinkPolicy is allowed to have any effect on WebView.
      *
+     * <p> See <a href="https://source.chromium.org/chromium/chromium/src/+/main:components/policy/resources/policy_templates.json;l=32321?q=EnterpriseAuthenticationAppLinkPolicy%20file:policy_templates.json">
+     * this</a> for more information on EnterpriseAuthenticationAppLinkPolicy.
+     *
      * <p>
      * This method should only be called if
      * {@link WebViewFeature#isFeatureSupported(String)}
@@ -767,9 +771,7 @@
      *
      * @return {@code true} if EnterpriseAuthenticationAppLinkPolicy is enabled and {@code false}
      * otherwise.
-     * @hide
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
     @RequiresFeature(name = WebViewFeature.ENTERPRISE_AUTHENTICATION_APP_LINK_POLICY,
             enforcement = "androidx.webkit.WebViewFeature#isFeatureSupported")
     public static boolean getEnterpriseAuthenticationAppLinkPolicyEnabled(
diff --git a/webkit/webkit/src/main/java/androidx/webkit/WebViewFeature.java b/webkit/webkit/src/main/java/androidx/webkit/WebViewFeature.java
index 8d50e6c..9f13c4d 100644
--- a/webkit/webkit/src/main/java/androidx/webkit/WebViewFeature.java
+++ b/webkit/webkit/src/main/java/androidx/webkit/WebViewFeature.java
@@ -498,9 +498,7 @@
      * {@link WebSettingsCompat#setEnterpriseAuthenticationAppLinkPolicyEnabled(WebSettings, boolean)}and
      * {@link WebSettingsCompat#getEnterpriseAuthenticationAppLinkPolicyEnabled(WebSettings)}.
      *
-     * @hide
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public static final String ENTERPRISE_AUTHENTICATION_APP_LINK_POLICY =
             "ENTERPRISE_AUTHENTICATION_APP_LINK_POLICY";
 
diff --git a/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewFeatureInternal.java b/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewFeatureInternal.java
index aa106c7..c3fa35b 100644
--- a/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewFeatureInternal.java
+++ b/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewFeatureInternal.java
@@ -406,7 +406,7 @@
      * {@link androidx.webkit.WebSettingsCompat#setForceDark(WebSettings, int)} and
      * {@link androidx.webkit.WebSettingsCompat#getForceDark(WebSettings)}.
      */
-    public static final ApiFeature.NoFramework FORCE_DARK = new ApiFeature.NoFramework(
+    public static final ApiFeature.Q FORCE_DARK = new ApiFeature.Q(
             WebViewFeature.FORCE_DARK, Features.FORCE_DARK);
 
     /**
diff --git a/window/extensions/extensions/api/current.txt b/window/extensions/extensions/api/current.txt
index 22679ee..8425531 100644
--- a/window/extensions/extensions/api/current.txt
+++ b/window/extensions/extensions/api/current.txt
@@ -4,7 +4,6 @@
   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();
   }
 
@@ -14,22 +13,6 @@
 
 }
 
-package androidx.window.extensions.area {
-
-  public interface WindowAreaComponent {
-    method public void addRearDisplayStatusListener(java.util.function.Consumer<java.lang.Integer!>);
-    method public void endRearDisplaySession();
-    method public void removeRearDisplayStatusListener(java.util.function.Consumer<java.lang.Integer!>);
-    method public void startRearDisplaySession(android.app.Activity, java.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 {
diff --git a/window/extensions/extensions/api/public_plus_experimental_current.txt b/window/extensions/extensions/api/public_plus_experimental_current.txt
index 22679ee..8425531 100644
--- a/window/extensions/extensions/api/public_plus_experimental_current.txt
+++ b/window/extensions/extensions/api/public_plus_experimental_current.txt
@@ -4,7 +4,6 @@
   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();
   }
 
@@ -14,22 +13,6 @@
 
 }
 
-package androidx.window.extensions.area {
-
-  public interface WindowAreaComponent {
-    method public void addRearDisplayStatusListener(java.util.function.Consumer<java.lang.Integer!>);
-    method public void endRearDisplaySession();
-    method public void removeRearDisplayStatusListener(java.util.function.Consumer<java.lang.Integer!>);
-    method public void startRearDisplaySession(android.app.Activity, java.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 {
diff --git a/window/extensions/extensions/api/restricted_current.txt b/window/extensions/extensions/api/restricted_current.txt
index 22679ee..8425531 100644
--- a/window/extensions/extensions/api/restricted_current.txt
+++ b/window/extensions/extensions/api/restricted_current.txt
@@ -4,7 +4,6 @@
   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();
   }
 
@@ -14,22 +13,6 @@
 
 }
 
-package androidx.window.extensions.area {
-
-  public interface WindowAreaComponent {
-    method public void addRearDisplayStatusListener(java.util.function.Consumer<java.lang.Integer!>);
-    method public void endRearDisplaySession();
-    method public void removeRearDisplayStatusListener(java.util.function.Consumer<java.lang.Integer!>);
-    method public void startRearDisplaySession(android.app.Activity, java.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 {
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 3425bd2..c1a9bd8 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
@@ -17,7 +17,6 @@
 package androidx.window.extensions;
 
 import androidx.annotation.Nullable;
-import androidx.window.extensions.area.WindowAreaComponent;
 import androidx.window.extensions.embedding.ActivityEmbeddingComponent;
 import androidx.window.extensions.layout.WindowLayoutComponent;
 
@@ -62,15 +61,4 @@
     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
deleted file mode 100644
index a85e35d..0000000
--- a/window/extensions/extensions/src/main/java/androidx/window/extensions/area/WindowAreaComponent.java
+++ /dev/null
@@ -1,145 +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.extensions.area;
-
-import android.app.Activity;
-
-import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
-import androidx.window.extensions.WindowExtensions;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.function.Consumer;
-
-/**
- * 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)
-    @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)
-    @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<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<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 to a more friendly interface in the library.
-     *
-     * 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.
-     */
-    @SuppressWarnings("ExecutorRegistration") // Jetpack will post it on the app-provided executor.
-    void startRearDisplaySession(@NonNull Activity activity,
-            @NonNull Consumer<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 e87736c..18c6793 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
@@ -40,9 +40,12 @@
 
     /**
      * Sets the callback that notifies WM Jetpack about changes in split states from the Extensions
-     * Sidecar implementation. The callback is registered for the lifetime of the process.
+     * 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.
      */
     @SuppressWarnings("ExecutorRegistration") // Jetpack will post it on the app-provided executor.
+    // TODO (b/241973352): Change setSplitInfoCallback to setSplitInfoListener
     void setSplitInfoCallback(@NonNull Consumer<List<SplitInfo>> consumer);
 
     /**
diff --git a/window/window-java/api/public_plus_experimental_current.txt b/window/window-java/api/public_plus_experimental_current.txt
index a56988b..709904b 100644
--- a/window/window-java/api/public_plus_experimental_current.txt
+++ b/window/window-java/api/public_plus_experimental_current.txt
@@ -1,15 +1,4 @@
 // 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 {
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
deleted file mode 100644
index 584445f..0000000
--- a/window/window-java/src/main/java/androidx/window/java/area/WindowAreaControllerJavaAdapter.kt
+++ /dev/null
@@ -1,125 +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.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-samples/src/main/AndroidManifest.xml b/window/window-samples/src/main/AndroidManifest.xml
index a93cf53..2952118 100644
--- a/window/window-samples/src/main/AndroidManifest.xml
+++ b/window/window-samples/src/main/AndroidManifest.xml
@@ -49,16 +49,6 @@
             android:exported="false"
             android:configChanges="orientation|screenSize|screenLayout|screenSize"
             android:label="@string/window_metrics"/>
-        <activity android:name=".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"
diff --git a/window/window-samples/src/main/java/androidx/window/sample/RearDisplayActivityConfigChanges.kt b/window/window-samples/src/main/java/androidx/window/sample/RearDisplayActivityConfigChanges.kt
deleted file mode 100644
index f7e839f..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/RearDisplayActivityConfigChanges.kt
+++ /dev/null
@@ -1,136 +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.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.WindowAreaSessionCallback
-import androidx.window.area.WindowAreaSession
-import androidx.window.area.WindowAreaStatus
-import androidx.window.core.ExperimentalWindowApi
-import androidx.window.java.area.WindowAreaControllerJavaAdapter
-import androidx.window.sample.databinding.ActivityRearDisplayBinding
-import androidx.window.sample.infolog.InfoLogAdapter
-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-samples/src/main/res/layout/activity_rear_display.xml b/window/window-samples/src/main/res/layout/activity_rear_display.xml
deleted file mode 100644
index 43bea60..0000000
--- a/window/window-samples/src/main/res/layout/activity_rear_display.xml
+++ /dev/null
@@ -1,42 +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"
-    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-samples/src/main/res/values/strings.xml b/window/window-samples/src/main/res/values/strings.xml
index 25d5eef..5faaae6 100644
--- a/window/window-samples/src/main/res/values/strings.xml
+++ b/window/window-samples/src/main/res/values/strings.xml
@@ -51,6 +51,4 @@
     <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="rear_display">Rear Display Mode</string>
-    <string name="rear_display_description">Demo of observing to WindowAreaStatus and enabling/disabling RearDisplay mode</string>
 </resources>
diff --git a/window/window/api/public_plus_experimental_current.txt b/window/window/api/public_plus_experimental_current.txt
index 524abfb..2e665d12 100644
--- a/window/window/api/public_plus_experimental_current.txt
+++ b/window/window/api/public_plus_experimental_current.txt
@@ -8,38 +8,6 @@
 
 }
 
-package androidx.window.area {
-
-  @androidx.window.core.ExperimentalWindowApi public interface WindowAreaController {
-    method public default static androidx.window.area.WindowAreaController getOrCreate();
-    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 {
-  }
-
-}
-
 package androidx.window.core {
 
   @kotlin.RequiresOptIn(level=kotlin.RequiresOptIn.Level.WARNING) @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface ExperimentalWindowApi {
diff --git a/window/window/src/androidTest/java/androidx/window/area/WindowAreaControllerImplTest.kt b/window/window/src/androidTest/java/androidx/window/area/WindowAreaControllerImplTest.kt
deleted file mode 100644
index a21185f..0000000
--- a/window/window/src/androidTest/java/androidx/window/area/WindowAreaControllerImplTest.kt
+++ /dev/null
@@ -1,217 +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.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 kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.flow.collect
-import kotlinx.coroutines.launch
-import org.junit.Assume.assumeTrue
-import org.junit.Rule
-import org.junit.Test
-import java.util.function.Consumer
-import kotlin.test.assertFailsWith
-import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.UnconfinedTestDispatcher
-import kotlinx.coroutines.test.runTest
-import org.junit.Ignore
-
-@OptIn(ExperimentalCoroutinesApi::class, ExperimentalWindowApi::class)
-class WindowAreaControllerImplTest {
-
-    @get:Rule
-    public val activityScenario: ActivityScenarioRule<TestActivity> =
-        ActivityScenarioRule(TestActivity::class.java)
-
-    private val testScope = TestScope(UnconfinedTestDispatcher())
-
-    @Ignore // todo(b/222407443)
-    @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 {
-                repo.rearDisplayStatus().collect(collector::accept)
-            }
-            collector.assertValue(WindowAreaStatus.UNAVAILABLE)
-            extensionComponent
-                .updateStatusListeners(WindowAreaComponent.STATUS_AVAILABLE)
-            collector.assertValues(
-                WindowAreaStatus.UNAVAILABLE,
-                WindowAreaStatus.AVAILABLE
-            )
-        }
-    }
-
-    @Ignore // todo(b/222407443)
-    @Test
-    public fun testRearDisplayStatusNullComponent(): Unit = testScope.runTest {
-        activityScenario.scenario.onActivity {
-            val repo = EmptyWindowAreaControllerImpl()
-            val collector = TestConsumer<WindowAreaStatus>()
-            testScope.launch {
-                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.
-     */
-    @Ignore // todo(b/222407443)
-    @TargetApi(Build.VERSION_CODES.N)
-    @Test
-    public fun testRearDisplayMode(): Unit = testScope.runTest {
-        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)
-        }
-    }
-
-    @Ignore // todo(b/222407443)
-    @TargetApi(Build.VERSION_CODES.N)
-    @Test
-    public fun testRearDisplayModeReturnsError(): Unit = testScope.runTest {
-        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) }
-            )
-        }
-    }
-
-    @Ignore // todo(b/222407443)
-    @Test
-    public fun testRearDisplayModeNullComponent(): Unit = testScope.runTest {
-        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 WindowAreaController.REAR_DISPLAY_ERROR
-            }
-            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()
-    }
-}
\ No newline at end of file
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 c389acf..0ebd08a 100644
--- a/window/window/src/androidTest/java/androidx/window/embedding/ActivityFilterTest.kt
+++ b/window/window/src/androidTest/java/androidx/window/embedding/ActivityFilterTest.kt
@@ -34,6 +34,7 @@
     private val component1 = ComponentName("a.b.c", "a.b.c.TestActivity")
     private val component2 = ComponentName("d.e.f", "d.e.f.TestActivity")
     private val wildcard = ComponentName("*", "*")
+    private val classWildcard = ComponentName("a.b.c", "*")
     private val intent = Intent()
     private val activity = mock<Activity> {
         on { intent } doReturn intent
@@ -94,4 +95,15 @@
             "of null component")
             .that(filter.matchesActivity(activity)).isTrue()
     }
+
+    @Test
+    fun testMatchActivity_MatchIntentWithPackage() {
+        val filter = ActivityFilter(classWildcard, null /* intentAction */)
+
+        intent.component = null
+        intent.`package` = classWildcard.packageName
+
+        assertWithMessage("#matchActivity must be true because intent.package matches")
+            .that(filter.matchesActivity(activity)).isTrue()
+    }
 }
\ 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
new file mode 100644
index 0000000..0ac37b0
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/embedding/SplitPairFilterTest.kt
@@ -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.window.embedding
+
+import android.app.Activity
+import android.content.ComponentName
+import android.content.Intent
+import androidx.window.core.ExperimentalWindowApi
+import com.google.common.truth.Truth.assertWithMessage
+import com.nhaarman.mockitokotlin2.doReturn
+import com.nhaarman.mockitokotlin2.mock
+import org.junit.Test
+
+@OptIn(ExperimentalWindowApi::class)
+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 filter =
+        SplitPairFilter(component1, intentClassWildcard, null /* secondaryActivityIntentAction */)
+
+    @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()
+    }
+
+    @Test
+    fun testMatchActivityIntentPair_MatchIntentPackage() {
+        intent.`package` = intentClassWildcard.packageName
+
+        assertWithMessage("#matchesActivityIntentPair must be true because intent.package matches")
+            .that(filter.matchesActivityIntentPair(activity, intent)).isTrue()
+
+        intent.component = component1
+
+        assertWithMessage("#matchesActivityIntentPair must be false because intent.component" +
+            " doesn't match")
+            .that(filter.matchesActivityIntentPair(activity, intent)).isFalse()
+    }
+}
\ 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
deleted file mode 100644
index 996c7ad..0000000
--- a/window/window/src/main/java/androidx/window/area/EmptyWindowAreaControllerImpl.kt
+++ /dev/null
@@ -1,42 +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.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
-    ) {
-        throw WindowAreaController.REAR_DISPLAY_ERROR
-    }
-}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/area/RearDisplaySessionImpl.kt b/window/window/src/main/java/androidx/window/area/RearDisplaySessionImpl.kt
deleted file mode 100644
index 9a5bbd3..0000000
--- a/window/window/src/main/java/androidx/window/area/RearDisplaySessionImpl.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.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/WindowAreaController.kt b/window/window/src/main/java/androidx/window/area/WindowAreaController.kt
deleted file mode 100644
index 05aa96e..0000000
--- a/window/window/src/main/java/androidx/window/area/WindowAreaController.kt
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.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.SpecificationComputer
-import androidx.window.extensions.WindowExtensionsProvider
-import androidx.window.extensions.area.WindowAreaComponent
-import kotlinx.coroutines.flow.Flow
-import java.util.concurrent.Executor
-import kotlin.jvm.Throws
-
-/**
- * An interface to provide the information and behavior around moving windows between
- * displays or display areas on a device.
- */
-@ExperimentalWindowApi
-interface WindowAreaController {
-
-    /*
-    Marked with RestrictTo as we iterate and define the
-    Kotlin API we want to provide.
-     */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public fun rearDisplayStatus(): Flow<WindowAreaStatus>
-
-    /*
-    Marked with RestrictTo as we iterate and define the
-    Kotlin API we want to provide.
-     */
-    @Throws(UnsupportedOperationException::class)
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public fun rearDisplayMode(
-        activity: Activity,
-        executor: Executor,
-        windowAreaSessionCallback: WindowAreaSessionCallback
-    )
-
-    public companion object {
-        internal val REAR_DISPLAY_ERROR =
-            UnsupportedOperationException("Rear Display mode cannot be enabled currently")
-
-        private val TAG = WindowAreaController::class.simpleName
-
-        private var decorator: WindowAreaControllerDecorator = EmptyDecorator
-
-        /**
-         * Provides an instance of [WindowAreaController].
-         */
-        @JvmName("getOrCreate")
-        @JvmStatic
-        public fun getOrCreate(): WindowAreaController {
-            var windowAreaComponentExtensions: WindowAreaComponent?
-            try {
-                windowAreaComponentExtensions = WindowExtensionsProvider
-                    .getWindowExtensions()
-                    .windowAreaComponent
-            } catch (t: Throwable) {
-                if (BuildConfig.verificationMode == SpecificationComputer.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)
-        public fun overrideDecorator(overridingDecorator: WindowAreaControllerDecorator) {
-            decorator = overridingDecorator
-        }
-
-        @JvmStatic
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-        public fun reset() {
-            decorator = EmptyDecorator
-        }
-    }
-}
-
-/**
- * Decorator that allows us to provide different functionality
- * in our window-testing artifact.
- */
-@ExperimentalWindowApi
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public 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
deleted file mode 100644
index 0e156818..0000000
--- a/window/window/src/main/java/androidx/window/area/WindowAreaControllerImpl.kt
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.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.SpecificationComputer
-import androidx.window.extensions.area.WindowAreaComponent
-import kotlinx.coroutines.channels.BufferOverflow
-import kotlinx.coroutines.channels.Channel
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.distinctUntilChanged
-import kotlinx.coroutines.flow.flow
-import java.util.concurrent.Executor
-import java.util.function.Consumer
-
-/**
- * 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 lateinit var rearDisplaySessionConsumer: Consumer<Int>
-    private var currentStatus: WindowAreaStatus? = null
-
-    override fun rearDisplayStatus(): Flow<WindowAreaStatus> {
-        return flow {
-            val channel = Channel<WindowAreaStatus>(
-                capacity = BUFFER_CAPACITY,
-                onBufferOverflow = BufferOverflow.DROP_OLDEST
-            )
-            val listener = Consumer<Int> { status ->
-                currentStatus = WindowAreaStatus.translate(status)
-                channel.trySend(currentStatus ?: WindowAreaStatus.UNSUPPORTED)
-            }
-            windowAreaComponent.addRearDisplayStatusListener(listener)
-            try {
-                for (item in channel) {
-                    emit(item)
-                }
-            } finally {
-                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 WindowAreaController.REAR_DISPLAY_ERROR
-        }
-        rearDisplaySessionConsumer =
-            RearDisplaySessionConsumer(windowAreaSessionCallback, windowAreaComponent)
-        windowAreaComponent.startRearDisplaySession(activity, rearDisplaySessionConsumer)
-    }
-
-    internal class RearDisplaySessionConsumer(
-        private val appCallback: WindowAreaSessionCallback,
-        private val extensionsComponent: WindowAreaComponent
-    ) : Consumer<Int> {
-
-        private var session: WindowAreaSession? = null
-
-        override fun accept(sessionStatus: Int) {
-            when (sessionStatus) {
-                WindowAreaComponent.SESSION_STATE_ACTIVE -> onSessionStarted()
-                WindowAreaComponent.SESSION_STATE_INACTIVE -> onSessionFinished()
-                else -> {
-                    if (BuildConfig.verificationMode ==
-                            SpecificationComputer.VerificationMode.STRICT) {
-                        Log.d(TAG, "Received an unknown session status value: $sessionStatus")
-                    }
-                    onSessionFinished()
-                }
-            }
-        }
-
-        private fun onSessionStarted() {
-            session = RearDisplaySessionImpl(extensionsComponent)
-            session?.let { appCallback.onSessionStarted(it) }
-        }
-
-        private fun onSessionFinished() {
-            session = null
-            appCallback.onSessionEnded()
-        }
-    }
-
-    internal companion object {
-        private val TAG = WindowAreaControllerImpl::class.simpleName
-        /*
-        Chosen as 10 for a base default value. We shouldn't be receiving
-        many changes to window area status so this is enough capacity
-        to not end up blocking.
-         */
-        private const val BUFFER_CAPACITY = 10
-    }
-}
diff --git a/window/window/src/main/java/androidx/window/area/WindowAreaSession.kt b/window/window/src/main/java/androidx/window/area/WindowAreaSession.kt
deleted file mode 100644
index 6cdbd12..0000000
--- a/window/window/src/main/java/androidx/window/area/WindowAreaSession.kt
+++ /dev/null
@@ -1,29 +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.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
deleted file mode 100644
index 80842c4..0000000
--- a/window/window/src/main/java/androidx/window/area/WindowAreaSessionCallback.kt
+++ /dev/null
@@ -1,31 +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.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
deleted file mode 100644
index f60d8f5..0000000
--- a/window/window/src/main/java/androidx/window/area/WindowAreaStatus.kt
+++ /dev/null
@@ -1,62 +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.area
-
-import androidx.window.core.ExperimentalWindowApi
-import androidx.window.extensions.area.WindowAreaComponent
-
-/**
- * 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")
-
-        @JvmStatic
-        internal fun translate(status: Int): WindowAreaStatus {
-            return when (status) {
-                WindowAreaComponent.STATUS_AVAILABLE -> AVAILABLE
-                WindowAreaComponent.STATUS_UNAVAILABLE -> UNAVAILABLE
-                else -> UNSUPPORTED
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/ActivityFilter.kt b/window/window/src/main/java/androidx/window/embedding/ActivityFilter.kt
index 06ff616..fd3d828 100644
--- a/window/window/src/main/java/androidx/window/embedding/ActivityFilter.kt
+++ b/window/window/src/main/java/androidx/window/embedding/ActivityFilter.kt
@@ -72,7 +72,7 @@
 
     fun matchesIntent(intent: Intent): Boolean {
         val match =
-            if (!MatcherUtils.areComponentsMatching(intent.component, componentName)) {
+            if (!MatcherUtils.isIntentMatching(intent, componentName)) {
                 false
             } else {
                 intentAction == null || intentAction == intent.action
@@ -89,7 +89,7 @@
 
     fun matchesActivity(activity: Activity): Boolean {
         val match =
-            MatcherUtils.areActivityOrIntentComponentsMatching(activity, componentName) &&
+            MatcherUtils.isActivityOrIntentMatching(activity, componentName) &&
                 (intentAction == null || intentAction == activity.intent?.action)
         if (sDebugMatchers) {
             val matchString = if (match) "MATCH" else "NO MATCH"
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 712c94f..2574912 100644
--- a/window/window/src/main/java/androidx/window/embedding/MatcherUtils.kt
+++ b/window/window/src/main/java/androidx/window/embedding/MatcherUtils.kt
@@ -17,6 +17,7 @@
 
 import android.app.Activity
 import android.content.ComponentName
+import android.content.Intent
 import android.util.Log
 import androidx.window.core.ExperimentalWindowApi
 
@@ -54,20 +55,36 @@
     }
 
     /**
-     * Returns `true` if [Activity.getComponentName] match or
-     * [Component][android.content.Intent.getComponent] of [Activity.getIntent] match allowing
+     * Returns `true` if [Activity.getComponentName] match or [Activity.getIntent] match allowing
      * wildcard patterns.
      */
-    internal fun areActivityOrIntentComponentsMatching(
+    internal fun isActivityOrIntentMatching(
         activity: Activity,
         ruleComponent: ComponentName
     ): Boolean {
         if (areComponentsMatching(activity.componentName, ruleComponent)) {
             return true
         }
-        // Returns false if activity's intent doesn't exist or its intent's Component doesn't match.
-        return activity.intent?.component ?.let {
-                component -> areComponentsMatching(component, ruleComponent) } ?: false
+        // Returns false if activity's intent doesn't exist or its intent doesn't match.
+        return activity.intent ?.let { intent -> isIntentMatching(intent, ruleComponent) } ?: false
+    }
+
+    /**
+     * Returns `true` if [Intent.getComponent] match or [Intent.getPackage] match allowing wildcard
+     * patterns.
+     */
+    internal fun isIntentMatching(
+        intent: Intent,
+        ruleComponent: ComponentName
+    ): Boolean {
+        if (intent.component != null) {
+            // Compare the component if set.
+            return areComponentsMatching(intent.component, ruleComponent)
+        }
+        // Check if there is wildcard match for Intent that only specifies the packageName.
+        val packageName = intent.`package` ?: return false
+        return (packageName == ruleComponent.packageName ||
+            wildcardMatch(packageName, ruleComponent.packageName)) && ruleComponent.className == "*"
     }
 
     /**
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 c633a0e..f13ddd5 100644
--- a/window/window/src/main/java/androidx/window/embedding/SplitPairFilter.kt
+++ b/window/window/src/main/java/androidx/window/embedding/SplitPairFilter.kt
@@ -21,6 +21,7 @@
 import android.util.Log
 import androidx.window.core.ExperimentalWindowApi
 import androidx.window.embedding.MatcherUtils.areComponentsMatching
+import androidx.window.embedding.MatcherUtils.isIntentMatching
 import androidx.window.embedding.MatcherUtils.sDebugMatchers
 import androidx.window.embedding.MatcherUtils.sMatchersTag
 
@@ -85,7 +86,7 @@
         ) {
             false
         } else if (
-            !areComponentsMatching(secondaryActivityIntent.component, secondaryActivityName)
+            !isIntentMatching(secondaryActivityIntent, secondaryActivityName)
         ) {
             false
         } else {
diff --git a/window/window/src/test/java/androidx/window/area/WindowAreaStatusUnitTest.kt b/window/window/src/test/java/androidx/window/area/WindowAreaStatusUnitTest.kt
deleted file mode 100644
index 04d3702..0000000
--- a/window/window/src/test/java/androidx/window/area/WindowAreaStatusUnitTest.kt
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.window.area
-
-import androidx.window.core.ExperimentalWindowApi
-import androidx.window.extensions.area.WindowAreaComponent
-import org.junit.Test
-
-/**
- * Unit tests for [WindowAreaStatus] that run on the JVM.
- */
-@OptIn(ExperimentalWindowApi::class)
-class WindowAreaStatusUnitTest {
-
-    @Test
-    fun testWindowAreaStatusTranslateValueAvailable() {
-        val expected = WindowAreaStatus.AVAILABLE
-        val translateValue = WindowAreaStatus.translate(WindowAreaComponent.STATUS_AVAILABLE)
-        assert(expected == translateValue)
-    }
-
-    @Test
-    fun testWindowAreaStatusTranslateValueUnavailable() {
-        val expected = WindowAreaStatus.UNAVAILABLE
-        val translateValue = WindowAreaStatus.translate(WindowAreaComponent.STATUS_UNAVAILABLE)
-        assert(expected == translateValue)
-    }
-
-    @Test
-    fun testWindowAreaStatusTranslateValueUnsupported() {
-        val expected = WindowAreaStatus.UNSUPPORTED
-        val translateValue = WindowAreaStatus.translate(WindowAreaComponent.STATUS_UNSUPPORTED)
-        assert(expected == translateValue)
-    }
-}
\ No newline at end of file
diff --git a/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/RemoteWorker.kt b/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/RemoteWorker.kt
index 7694892..51c604c 100644
--- a/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/RemoteWorker.kt
+++ b/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/RemoteWorker.kt
@@ -22,6 +22,7 @@
 import android.app.NotificationManager
 import android.content.Context
 import android.os.Build
+import android.os.Looper
 import android.util.Log
 import androidx.annotation.RequiresApi
 import androidx.concurrent.futures.CallbackToFutureAdapter
@@ -51,6 +52,10 @@
     override fun startRemoteWork(): ListenableFuture<Result> {
         return CallbackToFutureAdapter.getFuture { completer ->
             Log.d(TAG, "Starting Remote Worker.")
+            if (Looper.getMainLooper().thread != Thread.currentThread()) {
+                completer.set(Result.failure())
+                return@getFuture "startRemoteWork"
+            }
             val scope = CoroutineScope(Dispatchers.Default)
             job = scope.launch {
                 for (i in 1..10) {
@@ -65,6 +70,7 @@
                 Log.d(TAG, "Done.")
                 completer.set(Result.success())
             }
+            return@getFuture "startRemoteWork"
         }
     }
 
diff --git a/work/work-multiprocess/src/androidTest/java/androidx/work/multiprocess/ParcelableWorkInfoTest.kt b/work/work-multiprocess/src/androidTest/java/androidx/work/multiprocess/ParcelableWorkInfoTest.kt
index b77d969..eaf97da 100644
--- a/work/work-multiprocess/src/androidTest/java/androidx/work/multiprocess/ParcelableWorkInfoTest.kt
+++ b/work/work-multiprocess/src/androidTest/java/androidx/work/multiprocess/ParcelableWorkInfoTest.kt
@@ -48,7 +48,8 @@
             Data.EMPTY,
             listOf("tag1", "tag2"),
             Data.EMPTY,
-            1
+            1,
+            1,
         )
         assertOn(workInfo)
     }
@@ -72,7 +73,8 @@
             data,
             listOf("tag1", "tag2"),
             Data.EMPTY,
-            1
+            1,
+            3,
         )
         assertOn(workInfo)
     }
@@ -96,7 +98,8 @@
             data,
             listOf("tag1", "tag2"),
             Data.EMPTY,
-            1
+            1,
+            0,
         )
 
         assertOn(listOf(workInfo, workInfo))
@@ -135,5 +138,6 @@
         assertEquals(first.tags, second.tags)
         assertEquals(first.progress, second.progress)
         assertEquals(first.runAttemptCount, second.runAttemptCount)
+        assertEquals(first.generation, second.generation)
     }
 }
diff --git a/work/work-multiprocess/src/androidTest/java/androidx/work/multiprocess/RemoteListenableWorkerTest.kt b/work/work-multiprocess/src/androidTest/java/androidx/work/multiprocess/RemoteListenableWorkerTest.kt
index 7a62ee7..95714ec 100644
--- a/work/work-multiprocess/src/androidTest/java/androidx/work/multiprocess/RemoteListenableWorkerTest.kt
+++ b/work/work-multiprocess/src/androidTest/java/androidx/work/multiprocess/RemoteListenableWorkerTest.kt
@@ -207,6 +207,7 @@
             emptyList(),
             WorkerParameters.RuntimeExtras(),
             0,
+            0,
             mConfiguration.executor,
             mTaskExecutor,
             mConfiguration.workerFactory,
diff --git a/work/work-multiprocess/src/main/java/androidx/work/multiprocess/ListenableWorkerImpl.java b/work/work-multiprocess/src/main/java/androidx/work/multiprocess/ListenableWorkerImpl.java
index 34ff4ad..29c813b 100644
--- a/work/work-multiprocess/src/main/java/androidx/work/multiprocess/ListenableWorkerImpl.java
+++ b/work/work-multiprocess/src/main/java/androidx/work/multiprocess/ListenableWorkerImpl.java
@@ -177,31 +177,32 @@
         synchronized (sLock) {
             mFutureMap.put(id, future);
         }
+        mTaskExecutor.getMainThreadExecutor().execute(() -> {
+            try {
+                ListenableWorker worker = mConfiguration.getWorkerFactory()
+                        .createWorkerWithDefaultFallback(mContext, workerClassName,
+                                workerParameters);
+                if (worker == null) {
+                    String message = "Unable to create an instance of " + workerClassName;
+                    Logger.get().error(TAG, message);
+                    future.setException(new IllegalStateException(message));
+                    return;
+                }
 
-        ListenableWorker worker = mConfiguration.getWorkerFactory()
-                .createWorkerWithDefaultFallback(mContext, workerClassName, workerParameters);
+                if (!(worker instanceof RemoteListenableWorker)) {
+                    String message = workerClassName + " does not extend "
+                            + RemoteListenableWorker.class.getName();
+                    Logger.get().error(TAG, message);
+                    future.setException(new IllegalStateException(message));
+                    return;
+                }
 
-        if (worker == null) {
-            String message = "Unable to create an instance of " + workerClassName;
-            Logger.get().error(TAG, message);
-            future.setException(new IllegalStateException(message));
-            return future;
-        }
-
-        if (!(worker instanceof RemoteListenableWorker)) {
-            String message =
-                    workerClassName + " does not extend " + RemoteListenableWorker.class.getName();
-            Logger.get().error(TAG, message);
-            future.setException(new IllegalStateException(message));
-            return future;
-        }
-
-        try {
-            RemoteListenableWorker remoteListenableWorker = (RemoteListenableWorker) worker;
-            future.setFuture(remoteListenableWorker.startRemoteWork());
-        } catch (Throwable throwable) {
-            future.setException(throwable);
-        }
+                RemoteListenableWorker remoteListenableWorker = (RemoteListenableWorker) worker;
+                future.setFuture(remoteListenableWorker.startRemoteWork());
+            } catch (Throwable throwable) {
+                future.setException(throwable);
+            }
+        });
 
         return future;
     }
diff --git a/work/work-multiprocess/src/main/java/androidx/work/multiprocess/parcelable/ParcelableWorkInfo.java b/work/work-multiprocess/src/main/java/androidx/work/multiprocess/parcelable/ParcelableWorkInfo.java
index a37f194..0db9d9a 100644
--- a/work/work-multiprocess/src/main/java/androidx/work/multiprocess/parcelable/ParcelableWorkInfo.java
+++ b/work/work-multiprocess/src/main/java/androidx/work/multiprocess/parcelable/ParcelableWorkInfo.java
@@ -66,7 +66,8 @@
         Data progress = parcelableProgressData.getData();
         // runAttemptCount
         int runAttemptCount = parcel.readInt();
-        mWorkInfo = new WorkInfo(id, state, output, tags, progress, runAttemptCount);
+        int generation = parcel.readInt();
+        mWorkInfo = new WorkInfo(id, state, output, tags, progress, runAttemptCount, generation);
     }
 
     @NonNull
@@ -110,5 +111,6 @@
         parcelableProgress.writeToParcel(parcel, flags);
         // runAttemptCount
         parcel.writeInt(mWorkInfo.getRunAttemptCount());
+        parcel.writeInt(mWorkInfo.getGeneration());
     }
 }
diff --git a/work/work-multiprocess/src/main/java/androidx/work/multiprocess/parcelable/ParcelableWorkerParameters.java b/work/work-multiprocess/src/main/java/androidx/work/multiprocess/parcelable/ParcelableWorkerParameters.java
index 3d8f03e..328f3fe 100644
--- a/work/work-multiprocess/src/main/java/androidx/work/multiprocess/parcelable/ParcelableWorkerParameters.java
+++ b/work/work-multiprocess/src/main/java/androidx/work/multiprocess/parcelable/ParcelableWorkerParameters.java
@@ -57,6 +57,7 @@
     @NonNull
     private final WorkerParameters.RuntimeExtras mRuntimeExtras;
     private final int mRunAttemptCount;
+    private final int mGeneration;
 
     public ParcelableWorkerParameters(@NonNull WorkerParameters parameters) {
         mId = parameters.getId();
@@ -64,6 +65,7 @@
         mTags = parameters.getTags();
         mRuntimeExtras = parameters.getRuntimeExtras();
         mRunAttemptCount = parameters.getRunAttemptCount();
+        mGeneration = parameters.getGeneration();
     }
 
     public static final Creator<ParcelableWorkerParameters> CREATOR =
@@ -94,6 +96,8 @@
         mRuntimeExtras = parcelableRuntimeExtras.getRuntimeExtras();
         // runAttemptCount
         mRunAttemptCount = in.readInt();
+        // generation
+        mGeneration = in.readInt();
     }
 
     @Override
@@ -117,6 +121,8 @@
         parcelableRuntimeExtras.writeToParcel(parcel, flags);
         // runAttemptCount
         parcel.writeInt(mRunAttemptCount);
+        // generation
+        parcel.writeInt(mGeneration);
     }
 
     @NonNull
@@ -178,6 +184,7 @@
                 mTags,
                 mRuntimeExtras,
                 mRunAttemptCount,
+                mGeneration,
                 configuration.getExecutor(),
                 taskExecutor,
                 configuration.getWorkerFactory(),
diff --git a/work/work-runtime-ktx/src/androidTest/java/androidx/work/CoroutineWorkerTest.kt b/work/work-runtime-ktx/src/androidTest/java/androidx/work/CoroutineWorkerTest.kt
index cf636b480..a37928b 100644
--- a/work/work-runtime-ktx/src/androidTest/java/androidx/work/CoroutineWorkerTest.kt
+++ b/work/work-runtime-ktx/src/androidTest/java/androidx/work/CoroutineWorkerTest.kt
@@ -109,18 +109,7 @@
         val worker = workerFactory.createWorkerWithDefaultFallback(
             context,
             SynchronousCoroutineWorker::class.java.name,
-            WorkerParameters(
-                UUID.randomUUID(),
-                Data.EMPTY,
-                emptyList(),
-                WorkerParameters.RuntimeExtras(),
-                1,
-                configuration.executor,
-                workManagerImpl.workTaskExecutor,
-                workerFactory,
-                progressUpdater,
-                mForegroundUpdater
-            )
+            WorkerParameters(workerFactory)
         ) as SynchronousCoroutineWorker
 
         assertThat(worker.job.isCompleted, `is`(false))
@@ -145,18 +134,7 @@
         val worker = workerFactory.createWorkerWithDefaultFallback(
             context,
             SynchronousCoroutineWorker::class.java.name,
-            WorkerParameters(
-                UUID.randomUUID(),
-                Data.EMPTY,
-                emptyList(),
-                WorkerParameters.RuntimeExtras(),
-                1,
-                configuration.executor,
-                workManagerImpl.workTaskExecutor,
-                workerFactory,
-                progressUpdater,
-                mForegroundUpdater
-            )
+            WorkerParameters(workerFactory)
         ) as SynchronousCoroutineWorker
 
         assertThat(worker.job.isCancelled, `is`(false))
@@ -175,16 +153,9 @@
             context,
             ProgressUpdatingWorker::class.java.name,
             WorkerParameters(
-                workRequest.id,
-                Data.EMPTY,
-                emptyList(),
-                WorkerParameters.RuntimeExtras(),
-                1,
-                configuration.executor,
-                workManagerImpl.workTaskExecutor,
                 workerFactory,
+                workRequest.id,
                 progressUpdater,
-                mForegroundUpdater
             )
         ) as ProgressUpdatingWorker
 
@@ -219,16 +190,9 @@
             context,
             ProgressUpdatingWorker::class.java.name,
             WorkerParameters(
-                workRequest.id,
-                Data.EMPTY,
-                emptyList(),
-                WorkerParameters.RuntimeExtras(),
-                1,
-                configuration.executor,
-                workManagerImpl.workTaskExecutor,
                 workerFactory,
+                workRequest.id,
                 progressUpdater,
-                mForegroundUpdater
             )
         ) as ProgressUpdatingWorker
 
@@ -280,4 +244,22 @@
         @Deprecated(message = "use withContext(...) inside doWork() instead.")
         override val coroutineContext = SynchronousExecutor().asCoroutineDispatcher()
     }
+
+    fun WorkerParameters(
+        workerFactory: WorkerFactory,
+        id: UUID = UUID.randomUUID(),
+        progressUpdater: ProgressUpdater = this.progressUpdater,
+    ) = WorkerParameters(
+        id,
+        Data.EMPTY,
+        emptyList(),
+        WorkerParameters.RuntimeExtras(),
+        1,
+        1,
+        configuration.executor,
+        workManagerImpl.workTaskExecutor,
+        workerFactory,
+        progressUpdater,
+        mForegroundUpdater
+    )
 }
\ No newline at end of file
diff --git a/work/work-runtime/api/current.txt b/work/work-runtime/api/current.txt
index 61ec45d..4519d02 100644
--- a/work/work-runtime/api/current.txt
+++ b/work/work-runtime/api/current.txt
@@ -16,6 +16,7 @@
   public final class Configuration {
     method public String? getDefaultProcessName();
     method public java.util.concurrent.Executor getExecutor();
+    method public androidx.work.InitializationExceptionHandler? getInitializationExceptionHandler();
     method public androidx.work.InputMergerFactory getInputMergerFactory();
     method public int getMaxJobSchedulerId();
     method public int getMinJobSchedulerId();
@@ -31,6 +32,7 @@
     method public androidx.work.Configuration build();
     method public androidx.work.Configuration.Builder setDefaultProcessName(String);
     method public androidx.work.Configuration.Builder setExecutor(java.util.concurrent.Executor);
+    method public androidx.work.Configuration.Builder setInitializationExceptionHandler(androidx.work.InitializationExceptionHandler);
     method public androidx.work.Configuration.Builder setInputMergerFactory(androidx.work.InputMergerFactory);
     method public androidx.work.Configuration.Builder setJobSchedulerJobIdRange(int, int);
     method public androidx.work.Configuration.Builder setMaxSchedulerLimit(int);
@@ -171,6 +173,10 @@
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setForegroundAsync(android.content.Context, java.util.UUID, androidx.work.ForegroundInfo);
   }
 
+  public interface InitializationExceptionHandler {
+    method public void handleException(Throwable);
+  }
+
   public abstract class InputMerger {
     ctor public InputMerger();
     method public abstract androidx.work.Data merge(java.util.List<androidx.work.Data!>);
@@ -318,6 +324,7 @@
   }
 
   public final class WorkInfo {
+    method public int getGeneration();
     method public java.util.UUID getId();
     method public androidx.work.Data getOutputData();
     method public androidx.work.Data getProgress();
@@ -449,6 +456,7 @@
   }
 
   public final class WorkerParameters {
+    method @IntRange(from=0) public int getGeneration();
     method public java.util.UUID getId();
     method public androidx.work.Data getInputData();
     method @RequiresApi(28) public android.net.Network? getNetwork();
diff --git a/work/work-runtime/api/public_plus_experimental_current.txt b/work/work-runtime/api/public_plus_experimental_current.txt
index 61ec45d..4519d02 100644
--- a/work/work-runtime/api/public_plus_experimental_current.txt
+++ b/work/work-runtime/api/public_plus_experimental_current.txt
@@ -16,6 +16,7 @@
   public final class Configuration {
     method public String? getDefaultProcessName();
     method public java.util.concurrent.Executor getExecutor();
+    method public androidx.work.InitializationExceptionHandler? getInitializationExceptionHandler();
     method public androidx.work.InputMergerFactory getInputMergerFactory();
     method public int getMaxJobSchedulerId();
     method public int getMinJobSchedulerId();
@@ -31,6 +32,7 @@
     method public androidx.work.Configuration build();
     method public androidx.work.Configuration.Builder setDefaultProcessName(String);
     method public androidx.work.Configuration.Builder setExecutor(java.util.concurrent.Executor);
+    method public androidx.work.Configuration.Builder setInitializationExceptionHandler(androidx.work.InitializationExceptionHandler);
     method public androidx.work.Configuration.Builder setInputMergerFactory(androidx.work.InputMergerFactory);
     method public androidx.work.Configuration.Builder setJobSchedulerJobIdRange(int, int);
     method public androidx.work.Configuration.Builder setMaxSchedulerLimit(int);
@@ -171,6 +173,10 @@
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setForegroundAsync(android.content.Context, java.util.UUID, androidx.work.ForegroundInfo);
   }
 
+  public interface InitializationExceptionHandler {
+    method public void handleException(Throwable);
+  }
+
   public abstract class InputMerger {
     ctor public InputMerger();
     method public abstract androidx.work.Data merge(java.util.List<androidx.work.Data!>);
@@ -318,6 +324,7 @@
   }
 
   public final class WorkInfo {
+    method public int getGeneration();
     method public java.util.UUID getId();
     method public androidx.work.Data getOutputData();
     method public androidx.work.Data getProgress();
@@ -449,6 +456,7 @@
   }
 
   public final class WorkerParameters {
+    method @IntRange(from=0) public int getGeneration();
     method public java.util.UUID getId();
     method public androidx.work.Data getInputData();
     method @RequiresApi(28) public android.net.Network? getNetwork();
diff --git a/work/work-runtime/api/restricted_current.txt b/work/work-runtime/api/restricted_current.txt
index 61ec45d..4519d02 100644
--- a/work/work-runtime/api/restricted_current.txt
+++ b/work/work-runtime/api/restricted_current.txt
@@ -16,6 +16,7 @@
   public final class Configuration {
     method public String? getDefaultProcessName();
     method public java.util.concurrent.Executor getExecutor();
+    method public androidx.work.InitializationExceptionHandler? getInitializationExceptionHandler();
     method public androidx.work.InputMergerFactory getInputMergerFactory();
     method public int getMaxJobSchedulerId();
     method public int getMinJobSchedulerId();
@@ -31,6 +32,7 @@
     method public androidx.work.Configuration build();
     method public androidx.work.Configuration.Builder setDefaultProcessName(String);
     method public androidx.work.Configuration.Builder setExecutor(java.util.concurrent.Executor);
+    method public androidx.work.Configuration.Builder setInitializationExceptionHandler(androidx.work.InitializationExceptionHandler);
     method public androidx.work.Configuration.Builder setInputMergerFactory(androidx.work.InputMergerFactory);
     method public androidx.work.Configuration.Builder setJobSchedulerJobIdRange(int, int);
     method public androidx.work.Configuration.Builder setMaxSchedulerLimit(int);
@@ -171,6 +173,10 @@
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setForegroundAsync(android.content.Context, java.util.UUID, androidx.work.ForegroundInfo);
   }
 
+  public interface InitializationExceptionHandler {
+    method public void handleException(Throwable);
+  }
+
   public abstract class InputMerger {
     ctor public InputMerger();
     method public abstract androidx.work.Data merge(java.util.List<androidx.work.Data!>);
@@ -318,6 +324,7 @@
   }
 
   public final class WorkInfo {
+    method public int getGeneration();
     method public java.util.UUID getId();
     method public androidx.work.Data getOutputData();
     method public androidx.work.Data getProgress();
@@ -449,6 +456,7 @@
   }
 
   public final class WorkerParameters {
+    method @IntRange(from=0) public int getGeneration();
     method public java.util.UUID getId();
     method public androidx.work.Data getInputData();
     method @RequiresApi(28) public android.net.Network? getNetwork();
diff --git a/work/work-runtime/src/androidTest/java/androidx/work/DefaultWorkerFactoryTest.java b/work/work-runtime/src/androidTest/java/androidx/work/DefaultWorkerFactoryTest.java
index 81e56cc..943906b 100644
--- a/work/work-runtime/src/androidTest/java/androidx/work/DefaultWorkerFactoryTest.java
+++ b/work/work-runtime/src/androidTest/java/androidx/work/DefaultWorkerFactoryTest.java
@@ -70,6 +70,7 @@
                         work.getTags(),
                         new WorkerParameters.RuntimeExtras(),
                         1,
+                        0,
                         executor,
                         new WorkManagerTaskExecutor(executor),
                         mDefaultWorkerFactory,
@@ -97,6 +98,7 @@
                         work.getTags(),
                         new WorkerParameters.RuntimeExtras(),
                         1,
+                        0,
                         executor,
                         new WorkManagerTaskExecutor(executor),
                         mDefaultWorkerFactory,
diff --git a/work/work-runtime/src/androidTest/java/androidx/work/DelegatingWorkerFactoryTest.kt b/work/work-runtime/src/androidTest/java/androidx/work/DelegatingWorkerFactoryTest.kt
index cc68256..b89ef48 100644
--- a/work/work-runtime/src/androidTest/java/androidx/work/DelegatingWorkerFactoryTest.kt
+++ b/work/work-runtime/src/androidTest/java/androidx/work/DelegatingWorkerFactoryTest.kt
@@ -96,6 +96,7 @@
         listOf<String>(),
         WorkerParameters.RuntimeExtras(),
         1,
+        0,
         SynchronousExecutor(),
         WorkManagerTaskExecutor(SynchronousExecutor()),
         factory,
diff --git a/work/work-runtime/src/androidTest/java/androidx/work/WorkDatabaseMigrationTest.java b/work/work-runtime/src/androidTest/java/androidx/work/WorkDatabaseMigrationTest.java
index 749d102..0fee427 100644
--- a/work/work-runtime/src/androidTest/java/androidx/work/WorkDatabaseMigrationTest.java
+++ b/work/work-runtime/src/androidTest/java/androidx/work/WorkDatabaseMigrationTest.java
@@ -25,6 +25,7 @@
 import static androidx.work.impl.WorkDatabaseVersions.VERSION_12;
 import static androidx.work.impl.WorkDatabaseVersions.VERSION_14;
 import static androidx.work.impl.WorkDatabaseVersions.VERSION_15;
+import static androidx.work.impl.WorkDatabaseVersions.VERSION_16;
 import static androidx.work.impl.WorkDatabaseVersions.VERSION_2;
 import static androidx.work.impl.WorkDatabaseVersions.VERSION_3;
 import static androidx.work.impl.WorkDatabaseVersions.VERSION_4;
@@ -61,6 +62,7 @@
 import androidx.work.Constraints.ContentUriTrigger;
 import androidx.work.impl.Migration_11_12;
 import androidx.work.impl.Migration_12_13;
+import androidx.work.impl.Migration_15_16;
 import androidx.work.impl.Migration_1_2;
 import androidx.work.impl.Migration_3_4;
 import androidx.work.impl.Migration_4_5;
@@ -122,6 +124,11 @@
     private static final String TRIGGER_MAX_CONTENT_DELAY = "trigger_max_content_delay";
     private static final String REQUIRED_NETWORK_TYPE = "required_network_type";
     private static final String CONTENT_URI_TRIGGERS = "content_uri_triggers";
+
+    private static final String PERIOD_COUNT = "period_count";
+
+    private static final String LAST_ENQUEUE_TIME = "last_enqueue_time";
+
     private Context mContext;
     private File mDatabasePath;
 
@@ -558,11 +565,44 @@
         assertThat(enqueueTimes.get(secondPeriodId), is(1000L));
 
         assertThat(periodCounts.get(oneTimeId), is(0));
-        assertThat(periodCounts.get(firstPeriodId),  is(0));
+        assertThat(periodCounts.get(firstPeriodId), is(0));
         assertThat(periodCounts.get(secondPeriodId), is(1));
         database.close();
     }
 
+    @Test
+    @MediumTest
+    public void testMigrationVersion15_16() throws IOException {
+        SupportSQLiteDatabase database =
+                mMigrationTestHelper.createDatabase(TEST_DATABASE, VERSION_15);
+        database.execSQL("PRAGMA foreign_keys = FALSE");
+        String id = UUID.randomUUID().toString();
+        ContentValues values = contentValuesPre16(id);
+        database.insert("workspec", CONFLICT_FAIL, values);
+        ContentValues existingSystemIdInfo = new ContentValues();
+        existingSystemIdInfo.put("system_id", 1);
+        existingSystemIdInfo.put("work_spec_id", id);
+        database.insert("SystemIdInfo", CONFLICT_FAIL, existingSystemIdInfo);
+        ContentValues nonExistingSystemIdInfo = new ContentValues();
+        nonExistingSystemIdInfo.put("system_id", 2);
+        nonExistingSystemIdInfo.put("work_spec_id", "aaaaabbbb");
+        database.insert("SystemIdInfo", CONFLICT_FAIL, nonExistingSystemIdInfo);
+        mMigrationTestHelper.runMigrationsAndValidate(TEST_DATABASE, VERSION_16, true,
+                Migration_15_16.INSTANCE);
+        checkColumnExists(database, "workspec", "generation");
+        Cursor systemIdInfos = database.query("SELECT system_id, work_spec_id FROM SystemIdInfo");
+        assertThat(systemIdInfos.getCount(), is(1));
+        assertThat(systemIdInfos.moveToFirst(), is(true));
+
+        assertThat(systemIdInfos.getString(systemIdInfos.getColumnIndex("work_spec_id")),
+                is(id));
+        Cursor cursor = database.query("PRAGMA foreign_key_check(`SystemIdInfo`)");
+        if (cursor.getCount() > 0) {
+            throw new AssertionError("failed check");
+        }
+        database.close();
+    }
+
     // doesn't have COLUMN_RUN_IN_FOREGROUND
     @NonNull
     private ContentValues contentValuesPre8(String workSpecId) {
@@ -603,6 +643,18 @@
         return contentValues;
     }
 
+    private ContentValues contentValuesPre16(String workSpecId) {
+        ContentValues contentValues = contentValuesPre15(workSpecId);
+        contentValues.put(REQUIRED_NETWORK_TYPE, 0);
+        contentValues.put(COLUMN_RUN_IN_FOREGROUND, false);
+        contentValues.put(COLUMN_OUT_OF_QUOTA_POLICY, 0);
+        contentValues.put(TRIGGER_CONTENT_UPDATE_DELAY, -1);
+        contentValues.put(TRIGGER_MAX_CONTENT_DELAY, -1);
+        contentValues.remove("period_start_time");
+        contentValues.put(LAST_ENQUEUE_TIME, 0L);
+        return contentValues;
+    }
+
     private boolean checkExists(SupportSQLiteDatabase database, String tableName) {
         Cursor cursor = null;
         try {
diff --git a/work/work-runtime/src/androidTest/java/androidx/work/WorkForegroundRunnableTest.kt b/work/work-runtime/src/androidTest/java/androidx/work/WorkForegroundRunnableTest.kt
index b464e93..7b40234 100644
--- a/work/work-runtime/src/androidTest/java/androidx/work/WorkForegroundRunnableTest.kt
+++ b/work/work-runtime/src/androidTest/java/androidx/work/WorkForegroundRunnableTest.kt
@@ -173,6 +173,7 @@
         listOf<String>(),
         WorkerParameters.RuntimeExtras(),
         1,
+        0,
         executor,
         taskExecutor,
         configuration.mWorkerFactory,
diff --git a/work/work-runtime/src/androidTest/java/androidx/work/WorkUpdateTest.kt b/work/work-runtime/src/androidTest/java/androidx/work/WorkUpdateTest.kt
index ea3ad1f..37070da 100644
--- a/work/work-runtime/src/androidTest/java/androidx/work/WorkUpdateTest.kt
+++ b/work/work-runtime/src/androidTest/java/androidx/work/WorkUpdateTest.kt
@@ -471,6 +471,25 @@
             .isEqualTo(RetryWorker::class.java.name)
     }
 
+    @Test
+    @MediumTest
+    fun updateWorkerGeneration() {
+        val oneTimeWorkRequest = OneTimeWorkRequest.Builder(WorkerWithParam::class.java)
+            .setInitialDelay(10, TimeUnit.DAYS)
+            .build()
+        workManager.enqueue(oneTimeWorkRequest).result.get()
+
+        val updatedWorkRequest = OneTimeWorkRequest.Builder(WorkerWithParam::class.java)
+            .setId(oneTimeWorkRequest.id)
+            .build()
+
+        assertThat(workManager.updateWork(updatedWorkRequest).get()).isEqualTo(APPLIED_IMMEDIATELY)
+        val worker = workerFactory.awaitWorker(oneTimeWorkRequest.id) as WorkerWithParam
+        assertThat(worker.generation).isEqualTo(1)
+        val workInfo = workManager.getWorkInfoById(oneTimeWorkRequest.id).get()
+        assertThat(workInfo.generation).isEqualTo(1)
+    }
+
     @After
     fun tearDown() {
         workManager.cancelAllWork()
@@ -478,6 +497,14 @@
     }
 }
 
+class WorkerWithParam(
+    context: Context,
+    workerParams: WorkerParameters
+) : Worker(context, workerParams) {
+    val generation = workerParams.generation
+    override fun doWork(): Result = Result.success()
+}
+
 private fun WorkManagerImpl.awaitSuccess(id: UUID) =
     getWorkInfoByIdLiveData(id).awaitSuccess(workTaskExecutor)
 
diff --git a/work/work-runtime/src/androidTest/java/androidx/work/impl/WorkManagerImplTest.java b/work/work-runtime/src/androidTest/java/androidx/work/impl/WorkManagerImplTest.java
index 4ece5a4..eacd522 100644
--- a/work/work-runtime/src/androidTest/java/androidx/work/impl/WorkManagerImplTest.java
+++ b/work/work-runtime/src/androidTest/java/androidx/work/impl/WorkManagerImplTest.java
@@ -1206,6 +1206,7 @@
                 Data.EMPTY,
                 Collections.singletonList(TestWorker.class.getName()),
                 Data.EMPTY,
+                0,
                 0);
         WorkInfo workInfo1 = new WorkInfo(
                 work1.getId(),
@@ -1213,6 +1214,7 @@
                 Data.EMPTY,
                 Collections.singletonList(TestWorker.class.getName()),
                 Data.EMPTY,
+                0,
                 0);
         assertThat(captor.getValue(), containsInAnyOrder(workInfo0, workInfo1));
 
@@ -1229,6 +1231,7 @@
                 Data.EMPTY,
                 Collections.singletonList(TestWorker.class.getName()),
                 Data.EMPTY,
+                0,
                 0);
         assertThat(captor.getValue(), containsInAnyOrder(workInfo0, workInfo1));
 
@@ -1245,6 +1248,7 @@
                 Data.EMPTY,
                 Collections.singletonList(TestWorker.class.getName()),
                 Data.EMPTY,
+                0,
                 0);
         assertThat(captor.getValue(), containsInAnyOrder(workInfo0, workInfo1));
 
@@ -1280,6 +1284,7 @@
                 Data.EMPTY,
                 Arrays.asList(TestWorker.class.getName(), firstTag, secondTag),
                 Data.EMPTY,
+                0,
                 0);
         WorkInfo workInfo1 = new WorkInfo(
                 work1.getId(),
@@ -1287,6 +1292,7 @@
                 Data.EMPTY,
                 Arrays.asList(TestWorker.class.getName(), firstTag),
                 Data.EMPTY,
+                0,
                 0);
         WorkInfo workInfo2 = new WorkInfo(
                 work2.getId(),
@@ -1294,6 +1300,7 @@
                 Data.EMPTY,
                 Arrays.asList(TestWorker.class.getName(), secondTag),
                 Data.EMPTY,
+                0,
                 0);
 
         List<WorkInfo> workInfos = mWorkManagerImpl.getWorkInfosByTag(firstTag).get();
@@ -1330,6 +1337,7 @@
                 Data.EMPTY,
                 Collections.singletonList(InfiniteTestWorker.class.getName()),
                 Data.EMPTY,
+                0,
                 0);
         WorkInfo workInfo1 = new WorkInfo(
                 work1.getId(),
@@ -1337,6 +1345,7 @@
                 Data.EMPTY,
                 Collections.singletonList(InfiniteTestWorker.class.getName()),
                 Data.EMPTY,
+                0,
                 0);
         WorkInfo workInfo2 = new WorkInfo(
                 work2.getId(),
@@ -1344,6 +1353,7 @@
                 Data.EMPTY,
                 Collections.singletonList(InfiniteTestWorker.class.getName()),
                 Data.EMPTY,
+                0,
                 0);
 
         List<WorkInfo> workInfos = mWorkManagerImpl.getWorkInfosForUniqueWork(uniqueName).get();
@@ -1391,6 +1401,7 @@
                 Data.EMPTY,
                 Collections.singletonList(InfiniteTestWorker.class.getName()),
                 Data.EMPTY,
+                0,
                 0);
         WorkInfo workInfo1 = new WorkInfo(
                 work1.getId(),
@@ -1398,6 +1409,7 @@
                 Data.EMPTY,
                 Collections.singletonList(InfiniteTestWorker.class.getName()),
                 Data.EMPTY,
+                0,
                 0);
         WorkInfo workInfo2 = new WorkInfo(
                 work2.getId(),
@@ -1405,6 +1417,7 @@
                 Data.EMPTY,
                 Collections.singletonList(InfiniteTestWorker.class.getName()),
                 Data.EMPTY,
+                0,
                 0);
         assertThat(captor.getValue(), containsInAnyOrder(workInfo0, workInfo1, workInfo2));
 
@@ -1420,6 +1433,7 @@
                 Data.EMPTY,
                 Collections.singletonList(InfiniteTestWorker.class.getName()),
                 Data.EMPTY,
+                0,
                 0);
         assertThat(captor.getValue(), containsInAnyOrder(workInfo0, workInfo1, workInfo2));
 
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 a652619..fd20bb7 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
@@ -217,6 +217,7 @@
                                 work.getTags(),
                                 new WorkerParameters.RuntimeExtras(),
                                 1,
+                                0,
                                 mSynchronousExecutor,
                                 mWorkTaskExecutor,
                                 mConfiguration.getWorkerFactory(),
@@ -804,6 +805,7 @@
                         work.getTags(),
                         new WorkerParameters.RuntimeExtras(),
                         1,
+                        0,
                         mSynchronousExecutor,
                         mWorkTaskExecutor,
                         mConfiguration.getWorkerFactory(),
@@ -832,6 +834,7 @@
                         work.getTags(),
                         new WorkerParameters.RuntimeExtras(),
                         1,
+                        0,
                         mSynchronousExecutor,
                         mWorkTaskExecutor,
                         mConfiguration.getWorkerFactory(),
@@ -851,6 +854,7 @@
                         work.getTags(),
                         new WorkerParameters.RuntimeExtras(),
                         1,
+                        0,
                         mSynchronousExecutor,
                         mWorkTaskExecutor,
                         mConfiguration.getWorkerFactory(),
@@ -879,6 +883,7 @@
                         Arrays.asList("one", "two", "three"),
                         new WorkerParameters.RuntimeExtras(),
                         1,
+                        0,
                         mSynchronousExecutor,
                         mWorkTaskExecutor,
                         mConfiguration.getWorkerFactory(),
@@ -908,6 +913,7 @@
                         work.getTags(),
                         runtimeExtras,
                         1,
+                        0,
                         mSynchronousExecutor,
                         mWorkTaskExecutor,
                         mConfiguration.getWorkerFactory(),
@@ -1017,6 +1023,7 @@
                                 work.getTags(),
                                 new WorkerParameters.RuntimeExtras(),
                                 1,
+                                0,
                                 backgroundExecutor,
                                 mWorkTaskExecutor,
                                 mConfiguration.getWorkerFactory(),
@@ -1062,6 +1069,7 @@
                         work.getTags(),
                         new WorkerParameters.RuntimeExtras(),
                         1,
+                        0,
                         mSynchronousExecutor,
                         mWorkTaskExecutor,
                         mConfiguration.getWorkerFactory(),
@@ -1097,6 +1105,7 @@
                         Collections.<String>emptyList(),
                         new WorkerParameters.RuntimeExtras(),
                         1,
+                        0,
                         mSynchronousExecutor,
                         mWorkTaskExecutor,
                         mConfiguration.getWorkerFactory(),
diff --git a/work/work-runtime/src/androidTest/java/androidx/work/impl/workers/ConstraintTrackingWorkerTest.java b/work/work-runtime/src/androidTest/java/androidx/work/impl/workers/ConstraintTrackingWorkerTest.java
index d5380aa..16bc27d 100644
--- a/work/work-runtime/src/androidTest/java/androidx/work/impl/workers/ConstraintTrackingWorkerTest.java
+++ b/work/work-runtime/src/androidTest/java/androidx/work/impl/workers/ConstraintTrackingWorkerTest.java
@@ -345,6 +345,7 @@
                         Collections.<String>emptyList(),
                         new WorkerParameters.RuntimeExtras(),
                         1,
+                        0,
                         executor,
                         mWorkTaskExecutor,
                         workerFactory,
diff --git a/work/work-runtime/src/main/java/androidx/work/Configuration.java b/work/work-runtime/src/main/java/androidx/work/Configuration.java
index 2867fb8..1a7a5c1 100644
--- a/work/work-runtime/src/main/java/androidx/work/Configuration.java
+++ b/work/work-runtime/src/main/java/androidx/work/Configuration.java
@@ -252,9 +252,7 @@
     /**
      * @return the {@link InitializationExceptionHandler} that can be used to intercept
      * exceptions caused when trying to initialize {@link WorkManager}.
-     * @hide
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     @Nullable
     public InitializationExceptionHandler getInitializationExceptionHandler() {
         return mExceptionHandler;
@@ -492,9 +490,7 @@
          *
          * @param exceptionHandler The {@link InitializationExceptionHandler} instance.
          * @return This {@link Builder} instance
-         * @hide
          */
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
         @NonNull
         public Builder setInitializationExceptionHandler(
                 @NonNull InitializationExceptionHandler exceptionHandler) {
diff --git a/work/work-runtime/src/main/java/androidx/work/InitializationExceptionHandler.java b/work/work-runtime/src/main/java/androidx/work/InitializationExceptionHandler.java
index d125787..b6e23ca 100644
--- a/work/work-runtime/src/main/java/androidx/work/InitializationExceptionHandler.java
+++ b/work/work-runtime/src/main/java/androidx/work/InitializationExceptionHandler.java
@@ -17,17 +17,13 @@
 package androidx.work;
 
 import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
 
 /**
  * An Exception Handler that can be used to determine if there were issues when trying
  * to initialize {@link WorkManager}.
  * <p>
  * This usually happens when WorkManager cannot access its internal datastore.
- *
- * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public interface InitializationExceptionHandler {
     /**
      * Allows the application to handle a {@link Throwable} throwable typically caused when
diff --git a/work/work-runtime/src/main/java/androidx/work/WorkInfo.java b/work/work-runtime/src/main/java/androidx/work/WorkInfo.java
index c1417ee..19a9821 100644
--- a/work/work-runtime/src/main/java/androidx/work/WorkInfo.java
+++ b/work/work-runtime/src/main/java/androidx/work/WorkInfo.java
@@ -40,6 +40,7 @@
     private @NonNull Data mProgress;
     private int mRunAttemptCount;
 
+    private final int mGeneration;
     /**
      * @hide
      */
@@ -50,13 +51,15 @@
             @NonNull Data outputData,
             @NonNull List<String> tags,
             @NonNull Data progress,
-            int runAttemptCount) {
+            int runAttemptCount,
+            int generation) {
         mId = id;
         mState = state;
         mOutputData = outputData;
         mTags = new HashSet<>(tags);
         mProgress = progress;
         mRunAttemptCount = runAttemptCount;
+        mGeneration = generation;
     }
 
     /**
@@ -116,6 +119,24 @@
         return mRunAttemptCount;
     }
 
+    /**
+     * Gets the latest generation of this Worker.
+     * <p>
+     * A work has multiple generations, if it was updated via
+     * {@link WorkManager#updateWork(WorkRequest)} or
+     * {@link WorkManager#enqueueUniquePeriodicWork(String,
+     * ExistingPeriodicWorkPolicy, PeriodicWorkRequest)} using
+     * {@link ExistingPeriodicWorkPolicy#UPDATE}.
+     * <p>
+     * If this worker is currently running, it can possibly be of an older generation rather than
+     * returned by this function if an update has happened during an execution of this worker.
+     *
+     * @return a generation of this work.
+     */
+    public int getGeneration() {
+        return mGeneration;
+    }
+
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
diff --git a/work/work-runtime/src/main/java/androidx/work/WorkManager.java b/work/work-runtime/src/main/java/androidx/work/WorkManager.java
index 3989b44..d77cce0 100644
--- a/work/work-runtime/src/main/java/androidx/work/WorkManager.java
+++ b/work/work-runtime/src/main/java/androidx/work/WorkManager.java
@@ -596,7 +596,9 @@
             @NonNull WorkQuery workQuery);
 
     /**
-     * Updates the work with the new specification.
+     * Updates the work with the new specification. A {@link WorkRequest} passed as parameter
+     * must have an id set with {@link WorkRequest.Builder#setId(UUID)} that matches an id of the
+     * previously enqueued work.
      * <p>
      * It preserves enqueue time, e.g. if a work was enqueued 3 hours ago and had 6 hours long
      * initial delay, after the update it would be still eligible for run in 3 hours, assuming
diff --git a/work/work-runtime/src/main/java/androidx/work/WorkerParameters.java b/work/work-runtime/src/main/java/androidx/work/WorkerParameters.java
index cf6a772..1ef249b 100644
--- a/work/work-runtime/src/main/java/androidx/work/WorkerParameters.java
+++ b/work/work-runtime/src/main/java/androidx/work/WorkerParameters.java
@@ -50,6 +50,7 @@
     private @NonNull WorkerFactory mWorkerFactory;
     private @NonNull ProgressUpdater mProgressUpdater;
     private @NonNull ForegroundUpdater mForegroundUpdater;
+    private int mGeneration;
 
     /**
      * @hide
@@ -61,6 +62,7 @@
             @NonNull Collection<String> tags,
             @NonNull RuntimeExtras runtimeExtras,
             @IntRange(from = 0) int runAttemptCount,
+            @IntRange(from = 0) int generation,
             @NonNull Executor backgroundExecutor,
             @NonNull TaskExecutor workTaskExecutor,
             @NonNull WorkerFactory workerFactory,
@@ -71,6 +73,7 @@
         mTags = new HashSet<>(tags);
         mRuntimeExtras = runtimeExtras;
         mRunAttemptCount = runAttemptCount;
+        mGeneration = generation;
         mBackgroundExecutor = backgroundExecutor;
         mWorkTaskExecutor = workTaskExecutor;
         mWorkerFactory = workerFactory;
@@ -155,6 +158,24 @@
     }
 
     /**
+     * Gets the generation of this Worker.
+     * <p>
+     * A work has multiple generations, if it was updated via
+     * {@link WorkManager#updateWork(WorkRequest)} or
+     * {@link WorkManager#enqueueUniquePeriodicWork(String,
+     * ExistingPeriodicWorkPolicy, PeriodicWorkRequest)} using
+     * {@link ExistingPeriodicWorkPolicy#UPDATE}.
+     * This worker can possibly be of an older generation rather than latest known,
+     * if an update has happened while this worker is running.
+     *
+     * @return a generation of this work.
+     */
+    @IntRange(from = 0)
+    public int getGeneration() {
+        return mGeneration;
+    }
+
+    /**
      * @hide
      */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/WorkDatabase.kt b/work/work-runtime/src/main/java/androidx/work/impl/WorkDatabase.kt
index 584f910..5b5efed 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/WorkDatabase.kt
+++ b/work/work-runtime/src/main/java/androidx/work/impl/WorkDatabase.kt
@@ -64,7 +64,6 @@
     autoMigrations = [
         AutoMigration(from = 13, to = 14),
         AutoMigration(from = 14, to = 15, spec = AutoMigration_14_15::class),
-        AutoMigration(from = 15, to = 16),
     ],
     version = 16
 )
@@ -155,6 +154,7 @@
                 .addMigrations(RescheduleMigration(context, VERSION_10, VERSION_11))
                 .addMigrations(Migration_11_12)
                 .addMigrations(Migration_12_13)
+                .addMigrations(Migration_15_16)
                 .fallbackToDestructiveMigration()
                 .build()
         }
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/WorkDatabaseMigrations.kt b/work/work-runtime/src/main/java/androidx/work/impl/WorkDatabaseMigrations.kt
index 16784c0..f8be26f 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/WorkDatabaseMigrations.kt
+++ b/work/work-runtime/src/main/java/androidx/work/impl/WorkDatabaseMigrations.kt
@@ -28,6 +28,8 @@
 import androidx.work.impl.WorkDatabaseVersions.VERSION_11
 import androidx.work.impl.WorkDatabaseVersions.VERSION_12
 import androidx.work.impl.WorkDatabaseVersions.VERSION_13
+import androidx.work.impl.WorkDatabaseVersions.VERSION_15
+import androidx.work.impl.WorkDatabaseVersions.VERSION_16
 import androidx.work.impl.WorkDatabaseVersions.VERSION_2
 import androidx.work.impl.WorkDatabaseVersions.VERSION_3
 import androidx.work.impl.WorkDatabaseVersions.VERSION_4
@@ -66,6 +68,9 @@
 
     // renaming period_start_time to last_enqueue_time and adding period_count
     const val VERSION_15 = 15
+
+    // adding generation column to WorkSpec and SystemIdInfo tables
+    const val VERSION_16 = 16
 }
 
 private const val CREATE_SYSTEM_ID_INFO =
@@ -215,6 +220,7 @@
         )
     }
 }
+
 /**
  * A [WorkDatabase] migration that reschedules all eligible Workers.
  */
@@ -250,4 +256,38 @@
         PreferenceUtils.migrateLegacyPreferences(context, database)
         migrateLegacyIdGenerator(context, database)
     }
-}
\ No newline at end of file
+}
+
+object Migration_15_16 : Migration(VERSION_15, VERSION_16) {
+    override fun migrate(database: SupportSQLiteDatabase) {
+        // b/239543214: unclear how data got corrupted,
+        // but foreign key check on SystemIdInfo fails,
+        // meaning SystemIdInfo has work_spec_id that doesn't exist in WorkSpec table.
+        database.execSQL(
+            "DELETE FROM SystemIdInfo WHERE work_spec_id IN " +
+                "(SELECT work_spec_id FROM SystemIdInfo " +
+                "LEFT JOIN WorkSpec ON work_spec_id = id WHERE WorkSpec.id IS NULL)"
+        )
+
+        database.execSQL(
+            "ALTER TABLE `WorkSpec` ADD COLUMN `generation` " +
+                "INTEGER NOT NULL DEFAULT 0"
+        )
+        database.execSQL(
+            """CREATE TABLE IF NOT EXISTS `_new_SystemIdInfo` (
+            `work_spec_id` TEXT NOT NULL, 
+            `generation` INTEGER NOT NULL DEFAULT 0, 
+            `system_id` INTEGER NOT NULL, 
+            PRIMARY KEY(`work_spec_id`, `generation`), 
+            FOREIGN KEY(`work_spec_id`) REFERENCES `WorkSpec`(`id`) 
+                ON UPDATE CASCADE ON DELETE CASCADE )
+               """.trimIndent()
+        )
+        database.execSQL(
+            "INSERT INTO `_new_SystemIdInfo` (`work_spec_id`,`system_id`) " +
+                "SELECT `work_spec_id`,`system_id` FROM `SystemIdInfo`"
+        )
+        database.execSQL("DROP TABLE `SystemIdInfo`")
+        database.execSQL("ALTER TABLE `_new_SystemIdInfo` RENAME TO `SystemIdInfo`")
+    }
+}
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/WorkerUpdater.kt b/work/work-runtime/src/main/java/androidx/work/impl/WorkerUpdater.kt
index 6cf3c1e..5e5cb9d 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/WorkerUpdater.kt
+++ b/work/work-runtime/src/main/java/androidx/work/impl/WorkerUpdater.kt
@@ -63,6 +63,7 @@
             state = oldWorkSpec.state,
             runAttemptCount = oldWorkSpec.runAttemptCount,
             lastEnqueueTime = oldWorkSpec.lastEnqueueTime,
+            generation = oldWorkSpec.generation + 1,
         )
 
         workSpecDao.updateWorkSpec(wrapInConstraintTrackingWorkerIfNeeded(schedulers, updatedSpec))
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/WorkerWrapper.java b/work/work-runtime/src/main/java/androidx/work/impl/WorkerWrapper.java
index b2a0d12..91d2284 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/WorkerWrapper.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/WorkerWrapper.java
@@ -230,6 +230,7 @@
                 mTags,
                 mRuntimeExtras,
                 mWorkSpec.runAttemptCount,
+                mWorkSpec.getGeneration(),
                 mConfiguration.getExecutor(),
                 mWorkTaskExecutor,
                 mConfiguration.getWorkerFactory(),
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/model/WorkSpec.kt b/work/work-runtime/src/main/java/androidx/work/impl/model/WorkSpec.kt
index 1869db8..1e1cfc1 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/model/WorkSpec.kt
+++ b/work/work-runtime/src/main/java/androidx/work/impl/model/WorkSpec.kt
@@ -351,6 +351,9 @@
         @ColumnInfo(name = "run_attempt_count")
         var runAttemptCount: Int,
 
+        @ColumnInfo(name = "generation")
+        val generation: Int,
+
         @Relation(
             parentColumn = "id",
             entityColumn = "work_spec_id",
@@ -382,7 +385,8 @@
                 output,
                 tags,
                 progress,
-                runAttemptCount
+                runAttemptCount,
+                generation
             )
         }
     }
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/model/WorkSpecDao.kt b/work/work-runtime/src/main/java/androidx/work/impl/model/WorkSpecDao.kt
index b698d46..d24c710 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/model/WorkSpecDao.kt
+++ b/work/work-runtime/src/main/java/androidx/work/impl/model/WorkSpecDao.kt
@@ -148,7 +148,7 @@
      * @return A list of [WorkSpec.WorkInfoPojo]
      */
     @Transaction
-    @Query("SELECT id, state, output, run_attempt_count FROM workspec WHERE id=:id")
+    @Query("SELECT id, state, output, run_attempt_count, generation FROM workspec WHERE id=:id")
     fun getWorkStatusPojoForId(id: String): WorkSpec.WorkInfoPojo?
 
     /**
@@ -159,7 +159,8 @@
      * @return A [List] of [WorkSpec.WorkInfoPojo]
      */
     @Transaction
-    @Query("SELECT id, state, output, run_attempt_count FROM workspec WHERE id IN (:ids)")
+    @Query("SELECT id, state, output, run_attempt_count, generation " +
+        "FROM workspec WHERE id IN (:ids)")
     fun getWorkStatusPojoForIds(ids: List<String>): List<WorkSpec.WorkInfoPojo>
 
     /**
@@ -170,7 +171,8 @@
      * @return A [LiveData] list of [WorkSpec.WorkInfoPojo]
      */
     @Transaction
-    @Query("SELECT id, state, output, run_attempt_count FROM workspec WHERE id IN (:ids)")
+    @Query("SELECT id, state, output, run_attempt_count, generation " +
+        "FROM workspec WHERE id IN (:ids)")
     fun getWorkStatusPojoLiveDataForIds(ids: List<String>): LiveData<List<WorkSpec.WorkInfoPojo>>
 
     /**
@@ -181,7 +183,7 @@
      */
     @Transaction
     @Query(
-        """SELECT id, state, output, run_attempt_count FROM workspec WHERE id IN
+        """SELECT id, state, output, run_attempt_count, generation FROM workspec WHERE id IN
             (SELECT work_spec_id FROM worktag WHERE tag=:tag)"""
     )
     fun getWorkStatusPojoForTag(tag: String): List<WorkSpec.WorkInfoPojo>
@@ -195,7 +197,7 @@
      */
     @Transaction
     @Query(
-        """SELECT id, state, output, run_attempt_count FROM workspec WHERE id IN
+        """SELECT id, state, output, run_attempt_count, generation FROM workspec WHERE id IN
             (SELECT work_spec_id FROM worktag WHERE tag=:tag)"""
     )
     fun getWorkStatusPojoLiveDataForTag(tag: String): LiveData<List<WorkSpec.WorkInfoPojo>>
@@ -208,7 +210,7 @@
      */
     @Transaction
     @Query(
-        "SELECT id, state, output, run_attempt_count FROM workspec WHERE id IN " +
+        "SELECT id, state, output, run_attempt_count, generation FROM workspec WHERE id IN " +
             "(SELECT work_spec_id FROM workname WHERE name=:name)"
     )
     fun getWorkStatusPojoForName(name: String): List<WorkSpec.WorkInfoPojo>
@@ -222,7 +224,7 @@
      */
     @Transaction
     @Query(
-        "SELECT id, state, output, run_attempt_count FROM workspec WHERE id IN " +
+        "SELECT id, state, output, run_attempt_count, generation FROM workspec WHERE id IN " +
             "(SELECT work_spec_id FROM workname WHERE name=:name)"
     )
     fun getWorkStatusPojoLiveDataForName(name: String): LiveData<List<WorkSpec.WorkInfoPojo>>
diff --git a/work/work-rxjava2/src/test/java/androidx/work/RxForegroundInfoTest.kt b/work/work-rxjava2/src/test/java/androidx/work/RxForegroundInfoTest.kt
index d523094..892795f 100644
--- a/work/work-rxjava2/src/test/java/androidx/work/RxForegroundInfoTest.kt
+++ b/work/work-rxjava2/src/test/java/androidx/work/RxForegroundInfoTest.kt
@@ -92,6 +92,7 @@
     emptyList(),
     WorkerParameters.RuntimeExtras(),
     1,
+    0,
     executor,
     RxWorkerTest.InstantWorkTaskExecutor(),
     WorkerFactory.getDefaultWorkerFactory(),
diff --git a/work/work-rxjava2/src/test/java/androidx/work/RxWorkerTest.kt b/work/work-rxjava2/src/test/java/androidx/work/RxWorkerTest.kt
index a890589..5bb80f0 100644
--- a/work/work-rxjava2/src/test/java/androidx/work/RxWorkerTest.kt
+++ b/work/work-rxjava2/src/test/java/androidx/work/RxWorkerTest.kt
@@ -125,6 +125,7 @@
         emptyList(),
         WorkerParameters.RuntimeExtras(),
         1,
+        0,
         executor,
         InstantWorkTaskExecutor(),
         WorkerFactory.getDefaultWorkerFactory(),
diff --git a/work/work-rxjava2/src/test/java/androidx/work/SetCompletableProgressTest.kt b/work/work-rxjava2/src/test/java/androidx/work/SetCompletableProgressTest.kt
index c5b98f8..f8e2c28 100644
--- a/work/work-rxjava2/src/test/java/androidx/work/SetCompletableProgressTest.kt
+++ b/work/work-rxjava2/src/test/java/androidx/work/SetCompletableProgressTest.kt
@@ -62,6 +62,7 @@
         emptyList(),
         WorkerParameters.RuntimeExtras(),
         1,
+        0,
         executor,
         RxWorkerTest.InstantWorkTaskExecutor(),
         WorkerFactory.getDefaultWorkerFactory(),
diff --git a/work/work-rxjava3/src/test/java/androidx/work/rxjava3/RxForegroundInfoTest.kt b/work/work-rxjava3/src/test/java/androidx/work/rxjava3/RxForegroundInfoTest.kt
index 1a3ef91..89c230b 100644
--- a/work/work-rxjava3/src/test/java/androidx/work/rxjava3/RxForegroundInfoTest.kt
+++ b/work/work-rxjava3/src/test/java/androidx/work/rxjava3/RxForegroundInfoTest.kt
@@ -98,6 +98,7 @@
     emptyList(),
     WorkerParameters.RuntimeExtras(),
     1,
+    0,
     executor,
     RxWorkerTest.InstantWorkTaskExecutor(),
     WorkerFactory.getDefaultWorkerFactory(),
diff --git a/work/work-rxjava3/src/test/java/androidx/work/rxjava3/RxWorkerTest.kt b/work/work-rxjava3/src/test/java/androidx/work/rxjava3/RxWorkerTest.kt
index 3b81ca6..2f7d422 100644
--- a/work/work-rxjava3/src/test/java/androidx/work/rxjava3/RxWorkerTest.kt
+++ b/work/work-rxjava3/src/test/java/androidx/work/rxjava3/RxWorkerTest.kt
@@ -131,6 +131,7 @@
         emptyList(),
         WorkerParameters.RuntimeExtras(),
         1,
+        0,
         executor,
         InstantWorkTaskExecutor(),
         WorkerFactory.getDefaultWorkerFactory(),
diff --git a/work/work-rxjava3/src/test/java/androidx/work/rxjava3/SetCompletableProgressTest.kt b/work/work-rxjava3/src/test/java/androidx/work/rxjava3/SetCompletableProgressTest.kt
index 7365743..ee837b8 100644
--- a/work/work-rxjava3/src/test/java/androidx/work/rxjava3/SetCompletableProgressTest.kt
+++ b/work/work-rxjava3/src/test/java/androidx/work/rxjava3/SetCompletableProgressTest.kt
@@ -67,6 +67,7 @@
         emptyList(),
         WorkerParameters.RuntimeExtras(),
         1,
+        0,
         executor,
         RxWorkerTest.InstantWorkTaskExecutor(),
         WorkerFactory.getDefaultWorkerFactory(),
diff --git a/work/work-testing/src/main/java/androidx/work/testing/TestListenableWorkerBuilder.java b/work/work-testing/src/main/java/androidx/work/testing/TestListenableWorkerBuilder.java
index 363626e..674e453 100644
--- a/work/work-testing/src/main/java/androidx/work/testing/TestListenableWorkerBuilder.java
+++ b/work/work-testing/src/main/java/androidx/work/testing/TestListenableWorkerBuilder.java
@@ -21,6 +21,7 @@
 import android.net.Network;
 import android.net.Uri;
 
+import androidx.annotation.IntRange;
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
@@ -61,6 +62,7 @@
     private Executor mExecutor;
     private ProgressUpdater mProgressUpdater;
     private ForegroundUpdater mForegroundUpdater;
+    private int mGeneration;
 
     TestListenableWorkerBuilder(@NonNull Context context, @NonNull Class<W> workerClass) {
         mContext = context;
@@ -288,6 +290,20 @@
     }
 
     /**
+     * Sets a generation for this work.
+     *
+     * See {@link WorkerParameters#getGeneration()} for details.
+     *
+     * @param generation generation
+     * @return The current {@link TestListenableWorkerBuilder}
+     */
+    @NonNull
+    TestListenableWorkerBuilder<W> setGeneration(@IntRange(from = 0) int generation) {
+        mGeneration = generation;
+        return this;
+    }
+
+    /**
      * Builds the {@link ListenableWorker}.
      *
      * @return the instance of a {@link ListenableWorker}.
@@ -302,6 +318,7 @@
                         mTags,
                         getRuntimeExtras(),
                         mRunAttemptCount,
+                        mGeneration,
                         // This is unused for ListenableWorker
                         getExecutor(),
                         getTaskExecutor(),